use super::super::{now_unix, render};
use super::fixture::world_titled;
use super::input;
use crate::cli_outbound::Cli;
use crate::monitor::{Check, Verdict};
use crate::nav::convs::{ConvRow, Flight};
#[test]
fn the_titles_left_edge_is_the_same_on_a_flagged_row_and_a_quiet_one() {
let (lernie, bl, bz) = (Cli::new("lernie"), Cli::new("bl"), Cli::new("bz"));
let mut world = world_titled("hello");
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_root("c-2", "quiet-root");
world.quiet("c-2");
let ws = world.ws.clone();
world.model.mark_dirty([ws]);
world.converge();
let ctx = egui::Context::default();
let painted = {
let mut frame = || {
ctx.run(input(), |ctx| {
render(ctx, &mut world.model, &mut world.state, &lernie, &bl, &bz);
})
};
let _ = frame();
let _ = frame();
crate::paint_probe::painted_of(&frame())
};
let rows = world.model.conversations(now_unix());
assert_eq!(rows.len(), 2, "two roots must reach the list: {rows:?}");
let flagged = rows.iter().filter(|r| r.attention > 0).count();
assert_eq!(flagged, 1, "exactly one row must bear attention: {rows:?}");
let leftmost = |needle: &str| {
painted
.iter()
.filter(|(text, _)| text == needle)
.map(|(_, rect)| rect.min.x)
.fold(f32::INFINITY, f32::min)
};
let mut edges = Vec::new();
for row in &rows {
let name = row.display_name();
let left = leftmost(&name);
assert!(left.is_finite(), "row {name:?} must paint its title");
edges.push((name, row.attention, left));
}
let (_, _, first) = edges[0];
for (name, attention, left) in &edges {
assert!(
(left - first).abs() < 0.5,
"the title's left edge is the prefix's, not attention's: \
{edges:?} — {name:?} (attention {attention}) sits at {left}, not {first}"
);
}
let flag = leftmost("⚑");
assert!(flag.is_finite(), "the flagged row must paint its ⚑");
assert!(
flag > first,
"the flag rides the trailing group, right of the title: {flag} <= {first}"
);
}
fn one_conditional_each() -> [ConvRow; 4] {
let base = |name: &str| ConvRow {
root_id: format!("c-{name}"),
state: crate::git_tree::AgentState::Quiescent,
uncertain: false,
preview: String::new(),
age_secs: 0,
flight: None,
attention: 0,
members: 1,
depth: 0,
direct: 0,
ball: None,
name: Some(name.to_owned()),
name_display_only: false,
verdict: None,
tone: crate::transcript::Tone::Plain,
};
[
base("plain"),
ConvRow {
uncertain: true,
..base("uncertain")
},
ConvRow {
flight: Some(Flight::Tools),
..base("flying")
},
ConvRow {
verdict: Some(Check {
workspace: "w".into(),
agent: "a".into(),
verdict: Verdict::Drifting,
sha: "deadbeef".into(),
reason: "wandered".into(),
model: "m".into(),
input_tokens: None,
output_tokens: None,
}),
..base("judged")
},
]
}
#[test]
fn no_conditional_mark_moves_the_name_column_and_all_of_them_ride_right() {
let built = one_conditional_each();
let rows: Vec<&ConvRow> = built.iter().collect();
let (lernie, bl) = (Cli::new("lernie"), Cli::new("bl"));
let mut world = world_titled("hello");
world.converge();
let ctx = egui::Context::default();
let mut frame = || {
ctx.run(crate::paint_probe::screen_sized(360.0, 400.0), |c| {
egui::CentralPanel::default().show(c, |ui| {
let row_ctx = super::super::conv_row::RowCtx::of(&world.model, world.ws.clone());
for row in &rows {
super::super::conv_row::conversation_row(
ui,
&mut world.model,
&mut world.state,
&lernie,
&bl,
row,
&row_ctx,
);
}
});
})
};
let _ = frame();
let seen = crate::paint_probe::seen_of(&frame());
let shown = |needle: &str| {
seen.iter()
.filter(|s| s.text == needle)
.map(|s| s.shown)
.reduce(|a, b| if a.left() <= b.left() { a } else { b })
};
let title = |name: &str| {
shown(name).unwrap_or_else(|| {
panic!(
"row {name:?} must paint its title:\n{:?}",
seen.iter().map(|s| &s.text).collect::<Vec<_>>()
)
})
};
let edges: Vec<(&str, f32)> = ["plain", "uncertain", "flying", "judged"]
.into_iter()
.map(|n| (n, title(n).left()))
.collect();
let first = edges[0].1;
for (name, left) in &edges {
assert!(
(left - first).abs() < 0.5,
"the title's left edge is the prefix's, not any conditional mark's: \
{edges:?} — {name} sits at {left}, not {first}"
);
}
let (chip, _, _) = crate::theme::flight_badge(Flight::Tools);
let (badge, _, _) = crate::theme::verdict_badge(Verdict::Drifting);
for (mark, owner) in [(chip, "flying"), (badge, "judged"), ("?", "uncertain")] {
let seat = shown(mark)
.unwrap_or_else(|| panic!("{owner} must paint {mark:?} somewhere on the glass"));
let row = title(owner);
assert!(
(seat.center().y - row.center().y).abs() < row.height(),
"{mark:?} belongs to {owner}'s row: {seat:?} vs {row:?}"
);
assert!(
seat.left() > first,
"{mark:?} rides the trailing group, right of every title: {} <= {first}",
seat.left()
);
}
let plain_row = title("plain");
for mark in [chip, badge, "?"] {
assert!(
!seen.iter().any(|s| s.text == mark
&& (s.shown.center().y - plain_row.center().y).abs() < plain_row.height()),
"the plain row carries no {mark:?}"
);
}
}