Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

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",
    );
}