vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
use vyre::ir::{BufferDecl, DataType, Expr, Node, Program};
use vyre_conform::{reference::interp, spec::value::Value};

/// ADVERSARIAL: Cast to Vec2U32 discards second component — vector: a two-word vector source
/// loses its second u32, returning zero in its place.
#[test]
fn cast_to_vec2u32_preserves_both_components() {
    let program = Program {
        entry_op_id: None,
        buffers: vec![
            BufferDecl::read("v2_in", 0, DataType::Vec2U32),
            BufferDecl::read_write("v2_out", 1, DataType::Vec2U32),
        ],
        workgroup_size: [1, 1, 1],
        entry: vec![Node::store(
            "v2_out",
            Expr::u32(0),
            Expr::Cast {
                target: DataType::Vec2U32,
                value: Box::new(Expr::load("v2_in", Expr::u32(0))),
            },
        )],
    };

    let bytes = vec![0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00];
    let input = Value::Bytes(bytes.clone());
    let outputs = interp::run(&program, &[input, Value::Bytes(vec![0; 8])])
        .expect("cast must preserve both vec2 components");

    assert_eq!(outputs, vec![Value::Bytes(bytes)]);
}