vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
use super::{
    fnv1a_u64, freeze_goldens, generate_50_inputs, load_goldens, replay_goldens, sanitize,
    sha256_hex, Golden,
};
use std::{fs, io};

#[test]
fn sha256_known_vectors() {
    // Empty string
    assert_eq!(
        sha256_hex(b""),
        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    );
    // "abc"
    assert_eq!(
        sha256_hex(b"abc"),
        "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
    );
}

#[test]
fn sanitize_replaces_dots() {
    assert_eq!(sanitize("primitive.bitwise.xor"), "primitive_bitwise_xor");
}

#[test]
fn fnv1a_is_deterministic() {
    assert_eq!(fnv1a_u64(b"hello"), fnv1a_u64(b"hello"));
}

#[test]
fn generate_50_inputs_hits_target() {
    let spec = crate::spec::primitive::xor::spec();
    let inputs = generate_50_inputs(&spec, 42);
    assert_eq!(inputs.len(), 50);
}

#[test]
fn freeze_and_load_roundtrip() -> io::Result<()> {
    let dir = std::env::temp_dir().join("vyre_conform_golden_test");
    let _ = fs::remove_dir_all(&dir);
    fs::create_dir_all(&dir)?;

    let spec = crate::spec::primitive::xor::spec();
    let frozen = freeze_goldens(&[spec], &dir)?;
    assert_eq!(frozen, 50, "expected 50 frozen goldens");

    let goldens = load_goldens(&dir)?;
    assert_eq!(goldens.len(), 50);

    let _ = fs::remove_dir_all(&dir);
    Ok(())
}

#[test]
fn replay_detects_breaking_change() {
    let golden = Golden {
        op_id: "primitive.bitwise.xor".to_string(),
        spec_version: 1,
        input: vec![0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00],
        output: vec![0xAB, 0xCD, 0xEF, 0x00], // wrong on purpose
    };
    let specs = crate::spec::op_registry::all_specs();
    let report = replay_goldens(&[golden], &specs);
    assert_eq!(report.tested, 1);
    assert_eq!(report.passed, 0);
    assert_eq!(report.failures.len(), 1);
}

#[test]
fn idempotency_skips_existing() -> io::Result<()> {
    let dir = std::env::temp_dir().join("vyre_conform_golden_idempotent");
    let _ = fs::remove_dir_all(&dir);

    let spec = crate::spec::primitive::xor::spec();
    let first = freeze_goldens(std::slice::from_ref(&spec), &dir)?;
    assert_eq!(first, 50);

    let second = freeze_goldens(&[spec], &dir)?;
    assert_eq!(second, 0, "re-freeze should write nothing");

    let _ = fs::remove_dir_all(&dir);
    Ok(())
}