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,
}
);
}