#[test]
fn test_neg() {
use vyre::ir::{BufferDecl, DataType, Expr, Node, Program};
use vyre_conform::{reference::interp, spec::value::Value};
let program = Program::new(
vec![
BufferDecl::read("a", 0, DataType::I32),
BufferDecl::output("out", 1, DataType::I32),
],
[1, 1, 1],
vec![Node::store(
"out",
Expr::u32(0),
Expr::call(
"primitive.math.neg",
vec![Expr::load("a", Expr::u32(0))],
),
)],
);
let cases: &[(i32, i32, &str)] = &[
(0, 0, "zero"),
(1, -1, "one"),
(-1, 1, "negative one"),
(i32::MAX, i32::MIN + 1, "max negation"),
(i32::MIN, i32::MIN, "min overflow wrap"),
(42, -42, "positive"),
(-42, 42, "negative"),
];
for &(a, expected, note) in cases {
let outputs = interp::run(&program, &[Value::I32(a)]).unwrap();
assert_eq!(outputs.len(), 1);
assert_eq!(
outputs[0],
Value::I32(expected),
"primitive.math.neg: a={} expected={} — {}",
a,
expected,
note
);
}
}
#[test]
fn test_sign() {
use vyre::ir::{BufferDecl, DataType, Expr, Node, Program};
use vyre_conform::{reference::interp, spec::value::Value};
let program = Program::new(
vec![
BufferDecl::read("a", 0, DataType::I32),
BufferDecl::output("out", 1, DataType::I32),
],
[1, 1, 1],
vec![Node::store(
"out",
Expr::u32(0),
Expr::call(
"primitive.math.sign",
vec![Expr::load("a", Expr::u32(0))],
),
)],
);
let cases: &[(i32, i32, &str)] = &[
(0, 0, "zero"),
(1, 1, "positive one"),
(-1, -1, "negative one"),
(i32::MAX, 1, "max"),
(i32::MIN, -1, "min"),
(42, 1, "positive"),
(-42, -1, "negative"),
];
for &(a, expected, note) in cases {
let outputs = interp::run(&program, &[Value::I32(a)]).unwrap();
assert_eq!(outputs.len(), 1);
assert_eq!(
outputs[0],
Value::I32(expected),
"primitive.math.sign: a={} expected={} — {}",
a,
expected,
note
);
}
}