use vyre::ir::{AtomicOp, BufferDecl, DataType, Expr, Node, Program};
use vyre_conform::{reference::interp, spec::value::Value};
#[test]
fn atomic_on_u64_buffer_uses_element_stride() {
let program = Program {
entry_op_id: None,
buffers: vec![BufferDecl::read_write("u64_buf", 0, DataType::U64)],
workgroup_size: [1, 1, 1],
entry: vec![Node::store(
"u64_buf",
Expr::u32(0),
Expr::Atomic {
op: AtomicOp::Add,
buffer: "u64_buf".to_string(),
index: Box::new(Expr::u32(1)),
expected: None,
value: Box::new(Expr::u32(1)),
},
)],
};
let bytes = vec![
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
];
let outputs = interp::run(&program, &[Value::Bytes(bytes)])
.expect("atomic add must use correct element stride");
let expected = vec![
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
];
assert_eq!(outputs, vec![Value::Bytes(expected)]);
}