weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
use super::*;

fn dummy_attrs(n: usize) -> Vec<NodeAttr> {
    (0..n as u32)
        .map(|i| NodeAttr {
            byte_start: i * 10,
            byte_end: (i + 1) * 10,
            file_idx: 0,
        })
        .collect()
}

#[test]
fn exploded_reachability_decodes_to_statement_mask() {
    let nodes = vec![
        vyre_primitives::graph::exploded::encode_node(0, 0, 7).expect("valid node"),
        vyre_primitives::graph::exploded::encode_node(0, 1, 7).expect("valid node"),
        vyre_primitives::graph::exploded::encode_node(1, 0, 3).expect("valid node"),
    ];
    let block_to_statement = vec![2, 5, 8, 13];
    let mask = exploded_reachability_to_statement_mask(&nodes, 2, &block_to_statement, Some(7), 16)
        .expect("valid exploded reachability must decode");

    assert!(super::bit_is_set(&mask, 2));
    assert!(super::bit_is_set(&mask, 5));
    assert!(!super::bit_is_set(&mask, 8));
    assert!(!super::bit_is_set(&mask, 13));
}

#[test]
fn exploded_reachability_rejects_missing_block_map_slot() {
    let node = vyre_primitives::graph::exploded::encode_node(2, 3, 0).expect("valid node");
    let err = exploded_reachability_to_statement_mask(&[node], 4, &[0, 1], None, 8)
        .expect_err("missing block map slot must surface");
    assert_eq!(
        err,
        ExplodedDecodeError::BlockOutOfBounds {
            proc_id: 2,
            block_id: 3,
            slot: 11,
            slot_count: 2,
        }
    );
}

#[test]
fn exploded_reachability_rejects_statement_oob() {
    let node = vyre_primitives::graph::exploded::encode_node(0, 0, 0).expect("valid node");
    let err = exploded_reachability_to_statement_mask(&[node], 1, &[9], None, 4)
        .expect_err("statement map must stay inside statement table");
    assert_eq!(
        err,
        ExplodedDecodeError::StatementOutOfBounds {
            statement: 9,
            statement_count: 4,
        }
    );
}

#[test]
fn checked_witness_graph_rejects_bad_offset_count() {
    let attrs = dummy_attrs(2);
    let files = vec!["a.c".to_string()];
    let descs = vec!["a".to_string(), "b".to_string()];
    let err = try_prepare_witness_graph(
        &[0, 1],
        &[1],
        &[vyre_primitives::predicate::edge_kind::ASSIGNMENT],
        &attrs,
        &files,
        &descs,
        "c-c11",
    )
    .expect_err("checked witness graph preparation must reject short CSR offsets");
    assert_eq!(
        err,
        PrepareWitnessGraphError::InvalidOffsetCount {
            offsets: 2,
            expected: 3,
        }
    );
}

#[test]
fn checked_witness_graph_rejects_non_monotonic_offsets() {
    let attrs = dummy_attrs(2);
    let files = vec!["a.c".to_string()];
    let descs = vec!["a".to_string(), "b".to_string()];
    let err = try_prepare_witness_graph(
        &[0, 2, 1],
        &[1],
        &[vyre_primitives::predicate::edge_kind::ASSIGNMENT],
        &attrs,
        &files,
        &descs,
        "c-c11",
    )
    .expect_err("checked witness graph preparation must reject non-monotonic CSR rows");
    assert_eq!(
        err,
        PrepareWitnessGraphError::NonMonotonicOffsets {
            source: 1,
            start: 2,
            end: 1,
        }
    );
}

#[test]
fn checked_witness_graph_rejects_edge_array_length_mismatch() {
    let attrs = dummy_attrs(2);
    let files = vec!["a.c".to_string()];
    let descs = vec!["a".to_string(), "b".to_string()];
    let err = try_prepare_witness_graph(&[0, 1, 1], &[1], &[], &attrs, &files, &descs, "c-c11")
        .expect_err("checked witness graph preparation must reject target/kind length mismatch");
    assert_eq!(
        err,
        PrepareWitnessGraphError::EdgeArrayLengthMismatch {
            targets: 1,
            kinds: 0,
        }
    );
}

#[test]
fn checked_witness_graph_rejects_terminal_edge_mismatch() {
    let attrs = dummy_attrs(2);
    let files = vec!["a.c".to_string()];
    let descs = vec!["a".to_string(), "b".to_string()];
    let err = try_prepare_witness_graph(
        &[0, 1, 2],
        &[1],
        &[vyre_primitives::predicate::edge_kind::ASSIGNMENT],
        &attrs,
        &files,
        &descs,
        "c-c11",
    )
    .expect_err("checked witness graph preparation must reject mismatched terminal offset");
    assert_eq!(
        err,
        PrepareWitnessGraphError::TerminalOffsetMismatch {
            terminal: 2,
            edges: 1,
        }
    );
}