use super::hover::lex::skeleton;
use super::hover::scan::{args_of, rust_files, sites};
use crate::cli_outbound::Cli;
use std::path::Path;
const PAINTS: &[&str] = &[
"ui.label(",
"ui.heading(",
"ui.weak(",
"ui.strong(",
"ui.small(",
"ui.monospace(",
"ui.colored_label(",
"ui.selectable_label(",
"ui.selectable_value(",
"ui.button(",
"ui.small_button(",
"RichText::new(",
];
const ID_IDENTS: &[&str] = &["agent_id", "root_id"];
#[test]
fn no_paint_seat_spells_an_agent_id_as_its_text() {
let mut leaks = Vec::new();
let mut seen = 0usize;
for file in rust_files(&Path::new(env!("CARGO_MANIFEST_DIR")).join("src")) {
let source = std::fs::read_to_string(&file).unwrap();
let skeleton = skeleton(&source);
for (at, paint) in sites(&skeleton, PAINTS) {
seen += 1;
if ID_IDENTS
.iter()
.any(|ident| args_of(&skeleton, at).contains(ident))
{
leaks.push(format!("{}: {paint}", file.display()));
}
}
}
assert!(
seen > 50,
"the scan matched {seen} paint calls — the pattern list has rotted"
);
assert!(
leaks.is_empty(),
"these seats paint an agent id as display text — §3.3: every title rides \
the display ladder, and the id's seats are the ladder's floor and the \
hover:\n{}",
leaks.join("\n")
);
}
#[test]
fn a_nameless_chained_child_row_shows_its_terminal_segment_and_hovers_the_full_id() {
let (lernie, bl) = (Cli::new("lernie"), Cli::new("bl"));
let mut world = super::fixture::world();
let ws = world.ws.clone();
std::fs::write(
world.model.state_root().join("cadence.yaml"),
"cadence:\n watcher:\n debounce_ms: 0\n",
)
.unwrap();
world.model.after_lernie_verb();
world.converge();
world.add_child("c-1", "c-1-20260803T045643Z-1e5f99d4");
world.model.mark_dirty([ws.clone()]);
world.converge();
world.model.focus_agent(&ws, "c-1");
world.state.expanded.insert("c-1".to_owned());
let out = super::painted(&mut world, &lernie, &bl);
assert!(
out.contains("20260803T045643Z-1e5f99d4"),
"the child's row titles it by its terminal generation:\n{out}"
);
assert!(
!out.contains("c-1-20260803T045643Z-1e5f99d4"),
"the row never re-spells the lineage — the indent and its elbow state it:\n{out}"
);
let bz = Cli::new("bz");
let ctx = egui::Context::default();
ctx.memory_mut(|m| m.set_everything_is_visible(true));
let mut frame = || {
let full = ctx.run(super::input(), |ctx| {
super::super::render(ctx, &mut world.model, &mut world.state, &lernie, &bl, &bz);
});
crate::paint_probe::text_of(&full)
};
frame();
let hovered = frame();
assert!(
hovered.contains("c-1-20260803T045643Z-1e5f99d4"),
"the full chained id rides the hover:\n{hovered}"
);
}