use super::*;
#[test]
fn analysis_matrix_range() {
let mut cases = 0u64;
for size in [0, 1, 10, 100, 1000, 10_000] {
let seeds = match size {
0 => 10,
1 | 10 | 100 => 40,
1000 => 30,
10_000 => 15,
_ => 5,
};
for seed in 0..seeds {
let slots = (size as usize).saturating_mul(2);
let mut defs = vec![0u32; slots];
let mut edges = vec![0u32; slots];
let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
for i in 0..slots {
defs[i] = rng.random::<u32>();
edges[i] = rng.random::<u32>();
}
assert!(!weir::range::range_propagate("defs", "edges", "out")
.entry()
.is_empty());
record_case();
cases += 1;
assert!(!weir::range::range_propagate("d", "e", "o")
.entry()
.is_empty());
record_case();
cases += 1;
if size > 0 {
let fake = FakeResidentBackend::new();
let r = weir::range::range_propagate_borrowed_via(
&fake_dispatch_borrowed(&fake),
&defs,
&edges,
size,
);
assert!(r.is_err());
record_case();
cases += 1;
#[cfg(feature = "cpu-parity")]
{
let cpu = weir::oracle::summary::range_propagate(&defs, &edges, size);
assert_eq!(cpu.len(), slots);
record_case();
cases += 1;
}
}
#[cfg(feature = "gpu-telemetry")]
{
let _scratch = weir::range::RangePropagateScratch::default();
record_case();
cases += 1;
}
}
}
eprintln!("analysis_matrix_range: {cases} cases");
assert!(cases >= 500, "expected ≥500 cases, got {cases}");
}
#[test]
fn analysis_matrix_callgraph() {
let mut cases = 0u64;
for size in [0, 1, 10, 100, 1000, 10_000] {
let seeds = match size {
0 => 10,
1 | 10 | 100 => 30,
1000 => 20,
10_000 => 10,
_ => 5,
};
let words = ((size as usize).saturating_add(31)) / 32;
for seed in 0..seeds {
let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
let direct: Vec<u32> = (0..words).map(|_| rng.random::<u32>()).collect();
let indirect: Vec<u32> = (0..words).map(|_| rng.random::<u32>()).collect();
let pts: Vec<u32> = (0..words).map(|_| rng.random::<u32>()).collect();
assert!(!weir::callgraph::callgraph_build("d", "i", "p", "o")
.entry()
.is_empty());
record_case();
cases += 1;
assert!(
!weir::callgraph::callgraph_build("direct", "indirect", "pts", "out")
.entry()
.is_empty()
);
record_case();
cases += 1;
assert!(!weir::callgraph::callgraph_build("a", "b", "c", "d")
.entry()
.is_empty());
record_case();
cases += 1;
if size > 0 {
let fake = FakeResidentBackend::new();
let r = weir::callgraph::callgraph_build_borrowed_via(
&fake_dispatch_borrowed(&fake),
&direct,
&indirect,
&pts,
size,
);
assert!(r.is_err());
record_case();
cases += 1;
#[cfg(feature = "cpu-parity")]
{
let cpu = weir::oracle::graph::callgraph_build(&direct, &indirect, &pts, size);
assert_eq!(cpu.len(), words);
record_case();
cases += 1;
}
}
let _scratch = weir::callgraph::CallgraphBuildScratch::default();
record_case();
cases += 1;
}
}
eprintln!("analysis_matrix_callgraph: {cases} cases");
assert!(cases >= 500, "expected ≥500 cases, got {cases}");
}