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

nordisk/facett

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