weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! Feature-gate contract tests.
//!
//! Verify that optional capabilities are strictly behind their feature flags.

use std::fs;
use std::path::Path;

fn lib_rs_source() -> String {
    fs::read_to_string(
        Path::new(env!("CARGO_MANIFEST_DIR"))
            .join("src")
            .join("lib.rs"),
    )
    .expect("src/lib.rs should be readable")
}

#[test]
fn cpu_parity_gates_all_cpu_oracle_code() {
    let lib_rs = lib_rs_source();
    let lines: Vec<&str> = lib_rs.lines().collect();

    // CPU oracle modules must be behind cpu-parity in lib.rs
    let required_gated_modules = ["bitset_closure_oracle", "ifds_cpu_oracle", "oracle"];

    for module in &required_gated_modules {
        let mod_line = lines
            .iter()
            .position(|line| {
                let t = line.trim();
                t == format!("pub mod {module};") || t == format!("mod {module};")
            })
            .unwrap_or_else(|| panic!("CPU oracle module `{module}` must be declared in lib.rs"));

        let context_start = mod_line.saturating_sub(10);
        let context = lines[context_start..=mod_line].join("\n");
        assert!(
            context.contains("cfg(any(test, feature = \"cpu-parity\"))")
                || context.contains("cfg(feature = \"cpu-parity\")"),
            "CPU oracle module `{module}` must be gated by `cpu-parity` feature in lib.rs"
        );
    }
}

#[test]
fn serde_gates_all_serialization_code() {
    let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("src");
    let mut files = Vec::new();
    let mut stack = vec![manifest_dir];
    while let Some(dir) = stack.pop() {
        for entry in fs::read_dir(&dir).unwrap() {
            let entry = entry.unwrap();
            let path = entry.path();
            if path.is_dir() {
                stack.push(path);
                continue;
            }
            if path.extension().and_then(|s| s.to_str()) == Some("rs") {
                let content = fs::read_to_string(&path).unwrap();
                files.push(content);
            }
        }
    }

    let mut violations = Vec::new();
    for content in files {
        for (line_no, line) in content.lines().enumerate() {
            let trimmed = line.trim();
            if (trimmed.contains("serde::Serialize") || trimmed.contains("serde::Deserialize"))
                && !trimmed.starts_with("//")
                && !trimmed.starts_with("///")
            {
                let start = line_no.saturating_sub(3);
                let context = content.lines().collect::<Vec<_>>()[start..=line_no].join("\n");
                let gated = context.contains("cfg_attr(feature = \"serde\"")
                    || context.contains("cfg(feature = \"serde\")");
                if !gated {
                    violations.push(format!("line {}: {}", line_no + 1, trimmed));
                }
            }
        }
    }

    assert!(
        violations.is_empty(),
        "serde code must be behind `serde` feature gate:\n{}",
        violations.join("\n")
    );
}

#[test]
fn gpu_telemetry_gates_all_gpu_telemetry_code() {
    let lib_rs = lib_rs_source();

    // Any gpu-telemetry module declarations in lib.rs must be gated
    for line in lib_rs.lines() {
        let trimmed = line.trim();
        if trimmed.contains("gpu-telemetry") && trimmed.starts_with("pub mod") {
            panic!("gpu-telemetry module `{trimmed}` must be cfg-gated in lib.rs");
        }
    }

    // Verify that no unconditional gpu-telemetry fields exist in public structs in lib.rs
    assert!(
        !lib_rs.contains("pub mod telemetry")
            || lib_rs.contains("cfg(feature = \"gpu-telemetry\")"),
        "telemetry module must be behind gpu-telemetry feature gate"
    );
}

#[test]
fn simd_oracle_gates_all_simd_oracle_code() {
    let lib_rs = lib_rs_source();

    // SIMD oracle code is only in bitset_closure_oracle which is already cpu-parity gated
    // Verify no standalone simd-oracle module declarations in lib.rs
    for line in lib_rs.lines() {
        let trimmed = line.trim();
        if trimmed.contains("simd-oracle") && trimmed.starts_with("pub mod") {
            panic!("simd-oracle module `{trimmed}` must be cfg-gated in lib.rs");
        }
    }
}

#[test]
fn test_harness_gates_all_test_fixture_code() {
    let lib_rs = lib_rs_source();

    // Verify test_harness module declaration is feature-gated
    let test_harness_line = lib_rs
        .lines()
        .enumerate()
        .find(|(_, line)| line.contains("pub mod test_harness"))
        .expect("test_harness module must be declared in lib.rs");

    let start = test_harness_line.0.saturating_sub(10);
    let context = lib_rs.lines().collect::<Vec<_>>()[start..=test_harness_line.0].join("\n");
    assert!(
        context.contains("cfg(any(test, feature = \"test-harness\"))"),
        "test_harness module must be behind `test-harness` feature gate"
    );

    // Verify no unconditional test_harness re-exports in lib.rs
    assert!(
        !lib_rs.contains("pub use test_harness::")
            || lib_rs.contains("cfg(any(test, feature = \"test-harness\"))"),
        "test_harness re-exports must be behind `test-harness` feature gate"
    );
}