use vyre::ir::BufferAccess;
use vyre_primitives::graph::program_graph::ProgramGraphShape;
use weir::ifds;
use weir::ifds_gpu;
#[test]
fn ifds_reach_step_emits_frontier_buffers() {
let shape = ProgramGraphShape::new(64, 64);
let prog = ifds::ifds_reach_step(shape, "frontier_in", "frontier_out");
let names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
assert!(
names.contains(&"frontier_in"),
"missing frontier_in in {names:?}"
);
assert!(
names.contains(&"frontier_out"),
"missing frontier_out in {names:?}"
);
let fin = prog
.buffers()
.iter()
.find(|b| b.name() == "frontier_in")
.expect("frontier_in declared");
assert_eq!(fin.access, BufferAccess::ReadOnly);
assert!(!prog.entry().is_empty());
}
#[test]
fn ifds_reach_step_renames_per_call() {
let shape = ProgramGraphShape::new(64, 64);
let one = ifds::ifds_reach_step(shape, "fin_one", "fout_one");
let two = ifds::ifds_reach_step(shape, "fin_two", "fout_two");
let names_one: Vec<&str> = one.buffers().iter().map(|b| b.name()).collect();
let names_two: Vec<&str> = two.buffers().iter().map(|b| b.name()).collect();
assert!(names_one.contains(&"fin_one") && !names_one.contains(&"fin_two"));
assert!(names_two.contains(&"fin_two") && !names_two.contains(&"fin_one"));
}
#[test]
fn ifds_gpu_program_emits_frontier_buffers() {
let prog = ifds_gpu::ifds_gpu("exploded_adj", "frontier_in", "frontier_out")
.expect("IFDS GPU compatibility shim must build");
let names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
assert!(names.contains(&"frontier_in"));
assert!(names.contains(&"frontier_out"));
assert!(!prog.entry().is_empty());
}