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: BufLen uses truncating division, omitting partial elements — vector: a buffer
/// with a trailing partial element under-reports its length, causing programs that trust
/// BufLen to miss accessible data.
#[test]
fn buf_len_counts_partial_elements() {
    let program = Program::new(
        vec![
            BufferDecl::read("in", 0, DataType::U32),
            BufferDecl::read_write("out", 1, DataType::U32),
        ],
        [1, 1, 1],
        vec![Node::store("out", Expr::u32(0), Expr::buf_len("in"))],
    );

    // 5 bytes = 1 complete U32 element + 1 partial byte.
    // Per spec, BufLen should return 2 (ceiling of 5/4).
    let outputs = interp::run(
        &program,
        &[
            Value::Bytes(vec![0x01, 0x02, 0x03, 0x04, 0x05]),
            Value::Bytes(vec![0; 4]),
        ],
    )
    .expect("buf_len must account for partial elements");

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