facett-core/tests/a11y.rs
//! **FC-4 interaction-layer proof.** Render a custom-painted element through the
//! `facett_core::a11y::node` helper under `egui_kittest` and assert the AccessKit
//! tree actually contains a queryable node carrying the right role + label +
//! numeric value + selection. If this passes, the helper makes painted elements
//! findable by a robot driver / screen reader / `get_by_label` — the whole point
//! of FC-4. (This is what previously could not exist: zero accesskit nodes.)
use egui::accesskit::{Role, Toggled};
use egui_kittest::Harness;
use egui_kittest::kittest::{NodeT, Queryable};
use facett_core::a11y::{Semantics, node};
#[test]
fn painted_button_node_is_queryable_with_value() {
let base = egui::Id::new("a11y-test");
let mut harness = Harness::new_ui(move |ui| {
// Pretend we just painted a value-bearing element; ride a labelled,
// value-carrying AccessKit node alongside it.
let rect = egui::Rect::from_min_size(egui::pos2(10.0, 10.0), egui::vec2(80.0, 24.0));
let _ = node(
ui,
base,
"node-7", // stable domain key, not a loop index
egui::Sense::click(),
rect,
Semantics::button("worker · running · 42 rows").value(42.0),
);
});
harness.run();
// The painted element is now retrievable by its label.
let n = harness.get_by_label("worker · running · 42 rows").accesskit_node();
assert_eq!(n.role(), Role::Button, "painted element should expose a Button role");
assert_eq!(
n.numeric_value(),
Some(42.0),
"the cell/node value must ride into the AccessKit tree as numeric_value"
);
#[cfg(feature = "testmatrix")]
facett_core::testmatrix::emit(
"a11y::node",
"fc4_button_value",
n.role() == Role::Button && n.numeric_value() == Some(42.0),
"painted node queryable: Button role, value=42",
);
}
#[test]
fn painted_list_item_carries_selection_toggle() {
let base = egui::Id::new("a11y-sel");
let mut harness = Harness::new_ui(move |ui| {
let r0 = egui::Rect::from_min_size(egui::pos2(0.0, 0.0), egui::vec2(120.0, 18.0));
let r1 = egui::Rect::from_min_size(egui::pos2(0.0, 20.0), egui::vec2(120.0, 18.0));
let _ = node(ui, base, "row-a", egui::Sense::click(), r0, Semantics::list_item("alpha.txt", false));
let _ = node(ui, base, "row-b", egui::Sense::click(), r1, Semantics::list_item("beta.txt", true));
});
harness.run();
let selected = harness.get_by_label("beta.txt").accesskit_node();
assert_eq!(selected.toggled(), Some(Toggled::True), "the selected row must report Toggled::True");
let unselected = harness.get_by_label("alpha.txt").accesskit_node();
assert_eq!(unselected.toggled(), Some(Toggled::False), "the unselected row must report Toggled::False");
#[cfg(feature = "testmatrix")]
facett_core::testmatrix::emit(
"a11y::node",
"fc4_list_item_toggle",
selected.toggled() == Some(Toggled::True) && unselected.toggled() == Some(Toggled::False),
"list items: selected=Toggled::True, unselected=Toggled::False",
);
}