use crate::ir::model::expr::Expr;
use crate::ir::model::node::Node;
use crate::ir::model::program::{BufferDecl, Program};
use crate::ir::model::types::DataType;
use crate::lower::wgsl::{lower, lower_anonymous};
#[test]
#[inline]
pub fn i32_div_and_negate_lower_correctly() -> crate::error::Result<()> {
let program = Program::new(
vec![BufferDecl::read_write("out", 0, DataType::I32)],
[1, 1, 1],
vec![
Node::let_bind("x", Expr::i32(5)),
Node::store(
"out",
Expr::u32(0),
Expr::div(Expr::negate(Expr::var("x")), Expr::i32(0)),
),
],
)
.with_entry_op_id("primitive.math.div");
let wgsl = lower(&program)?;
assert!(
wgsl.contains("_vyre_safe_div_i32"),
"expected signed division helper for I32, got:\n{wgsl}"
);
assert!(
wgsl.contains("-_v_x"),
"expected unary minus for I32 negate, got:\n{wgsl}"
);
Ok(())
}
#[test]
#[inline]
pub fn no_atomic_program_emits_no_atomic_helpers() -> crate::error::Result<()> {
let program = Program::new(
vec![
BufferDecl::read("input", 0, DataType::U32),
BufferDecl::read_write("out", 1, DataType::U32),
],
[1, 1, 1],
vec![
Node::let_bind("x", Expr::load("input", Expr::u32(0))),
Node::store("out", Expr::u32(0), Expr::var("x")),
],
);
let wgsl = lower_anonymous(&program)?;
assert!(
!wgsl.contains("atomicLoad")
&& !wgsl.contains("atomicStore")
&& !wgsl.contains("_vyre_atomic_"),
"non-atomic program emitted atomic helpers:\n{wgsl}"
);
Ok(())
}