use crate::ops::workgroup::primitives::visitor::{VisitError, VisitStatus, WorkgroupVisitor};
#[test]
pub fn first_visit_emits_and_marks_visited() {
let mut v = WorkgroupVisitor::new(8, 8);
assert_eq!(v.visit(3), Ok(VisitStatus::FirstVisit));
assert!(v.is_visited(3));
assert_eq!(v.emitted(), &[3]);
}
#[test]
pub fn second_visit_is_already_visited_and_does_not_reemit() {
let mut v = WorkgroupVisitor::new(8, 8);
v.visit(3).unwrap();
assert_eq!(v.visit(3), Ok(VisitStatus::AlreadyVisited));
assert_eq!(v.emitted(), &[3], "repeated visit must not re-emit");
}
#[test]
pub fn visit_out_of_range_errors() {
let mut v = WorkgroupVisitor::new(4, 8);
assert_eq!(v.visit(4), Err(VisitError::OutOfRange));
assert_eq!(v.emitted(), &[] as &[u32]);
}
#[test]
pub fn emission_preserves_first_visit_order() {
let mut v = WorkgroupVisitor::new(8, 8);
v.visit(2).unwrap();
v.visit(5).unwrap();
v.visit(2).unwrap(); v.visit(1).unwrap();
assert_eq!(v.emitted(), &[2, 5, 1]);
}
#[test]
pub fn emit_buffer_truncates_at_capacity() {
let mut v = WorkgroupVisitor::new(16, 2);
v.visit(1).unwrap();
v.visit(2).unwrap();
v.visit(3).unwrap(); assert!(v.is_visited(3));
assert_eq!(v.emitted(), &[1, 2]);
}
#[test]
pub fn reset_clears_marks_and_emit_buffer() {
let mut v = WorkgroupVisitor::new(8, 8);
v.visit(1).unwrap();
v.visit(2).unwrap();
v.reset();
assert!(!v.is_visited(1));
assert!(v.emitted().is_empty());
assert_eq!(v.visit(1), Ok(VisitStatus::FirstVisit));
}
#[test]
pub fn wgsl_kernel_source_exposes_the_expected_entry_point() {
let wgsl = crate::ops::workgroup::primitives::visitor::lowering::WGSL;
assert!(
wgsl.contains("workgroup_visitor_visit"),
"WGSL lowering must expose the registered entry point"
);
assert!(
wgsl.contains("atomicOr"),
"visitor lowering must use atomicOr on the visited bitmap"
);
}