facett-graph/tests/a11y.rs
//! **FC-4 + FC-5** interaction proof for `DepGraphView`. Each painted node box is
//! now a queryable AccessKit Button keyed on its stable **label**; clicking it
//! selects/deselects by that label (not a list index), so reorder/insert can't
//! re-point the selection.
use egui::Color32;
use egui_kittest::Harness;
use egui_kittest::kittest::{NodeT, Queryable};
use facett_core::Facet;
use facett_graph::{DepEdge, DepGraphView, DepNode};
fn node(l: &str, sub: Option<&str>) -> DepNode {
DepNode { label: l.into(), sublabel: sub.map(Into::into), color: Color32::GRAY }
}
fn sample() -> DepGraphView {
DepGraphView::new(
vec![node("alpha", Some("v1")), node("beta", None), node("gamma", Some("v3"))],
vec![DepEdge { from: 0, to: 1, via: vec!["x".into()] }, DepEdge { from: 1, to: 2, via: vec![] }],
)
}
#[test]
fn nodes_are_queryable_buttons_by_label() {
let mut view = sample();
let mut harness = Harness::builder().with_size(egui::vec2(900.0, 400.0)).build_ui(move |ui| view.ui(ui));
harness.run();
// The painted box "alpha · v1" is now an AccessKit Button findable by label.
let alpha = harness.get_by_label("alpha · v1").accesskit_node();
assert_eq!(alpha.role(), egui::accesskit::Role::Button);
// A label-less sublabel node still queryable by its bare label.
let beta = harness.get_by_label("beta").accesskit_node();
assert_eq!(beta.role(), egui::accesskit::Role::Button);
#[cfg(feature = "testmatrix")]
facett_core::testmatrix::emit(
"DepGraphView",
"fc4_nodes_are_buttons",
alpha.role() == egui::accesskit::Role::Button && beta.role() == egui::accesskit::Role::Button,
"node 'alpha · v1' + 'beta' queryable as Button a11y nodes",
);
}
#[test]
fn clicking_a_node_selects_it_by_stable_label() {
use std::cell::RefCell;
use std::rc::Rc;
let view = Rc::new(RefCell::new(sample()));
let v2 = view.clone();
let mut harness = Harness::builder().with_size(egui::vec2(900.0, 400.0)).build_ui(move |ui| v2.borrow_mut().ui(ui));
harness.run();
// Click the "beta" node → it becomes selected, keyed on the label "beta".
harness.get_by_label("beta").click();
harness.run();
assert_eq!(view.borrow().selected(), Some("beta"), "selection keyed on the stable label");
assert_eq!(view.borrow().state_json()["selected"], "beta");
// Click again → toggles off (the existing behaviour, now label-keyed).
harness.get_by_label("beta").click();
harness.run();
assert!(view.borrow().selected().is_none(), "second click deselects");
#[cfg(feature = "testmatrix")]
facett_core::testmatrix::emit(
"DepGraphView",
"fc5_click_selects_by_label",
view.borrow().selected().is_none(),
"click 'beta' selected by stable label then re-click deselected",
);
}