facett-plandag/tests/a11y_priority.rs
use egui_kittest::{
Harness,
kittest::{NodeT, Queryable},
};
use facett_core::Facet;
const COUNT: usize = 2_100;
fn name(i: usize) -> String {
format!("late-node-{i:04}")
}
use facett_plandag::{Msg, PlanDagView, PlanModel, PlanNode, PlanVersion};
#[test]
fn selected_and_focused_late_node_remains_named_within_budget() {
let mut view = PlanDagView::new(
"crowded",
PlanModel::new(PlanVersion::new(
"initial",
(0..COUNT)
.map(|i| PlanNode::new(name(i), name(i)))
.collect(),
vec![],
)),
);
view.load_state(&serde_json::json!({"selected":format!("node:{}",name(COUNT-1)),"show_constraints":false,"nav":{"scale":0.1,"offset":[100.0,100.0],"min_scale":0.05,"max_scale":64.0},"fitted":true}));
let mut h = Harness::builder()
.with_size(egui::vec2(900.0, 30_000.0))
.build_ui_state(|ui, view: &mut PlanDagView| Facet::ui(view, ui), view);
h.run();
let late = format!("{} · done", name(COUNT - 1));
assert_eq!(
h.get_by_label(&late).accesskit_node().toggled(),
Some(egui::accesskit::Toggled::True)
);
let count = |h: &Harness<'_, PlanDagView>| {
h.get_all_by_role(egui::accesskit::Role::Button)
.filter(|node| {
node.accesskit_node()
.label()
.unwrap_or_default()
.starts_with("late-node-")
})
.count()
};
assert_eq!(
count(&h),
2_000,
"all nodes visible; semantic budget remains bounded"
);
h.get_by_label(&late).focus();
h.run();
view_select_early(h.state_mut());
h.run();
assert!(
h.get_by_label(&late).accesskit_node().label().is_some(),
"focus retains late node after selection moves away"
);
assert_eq!(count(&h), 2_000);
}
fn view_select_early(view: &mut PlanDagView) {
view.update(Msg::Select(format!("node:{}",name(0))));
}