use super::{
ATTEMPTS, CHANGES, CLOSE, DISARM, DISBAND, FEWER, HEADING, MODEL_HINT, MORE, NOT_ANSWERED,
NOTHING, OPEN, PROJECT_HINT, RUN, SCAN, WATCH,
};
use crate::paint_probe::frame::Window;
use crate::test_support::window::{click, fleeting, painted, seated};
use crate::ui::Model;
#[test]
fn the_wall_s_control_opens_the_pane() {
let mut model = seated();
let window = Window::new();
click(&window, OPEN, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.fleet.is_some(), "the control opened nothing");
let glass = painted(&mut model);
assert!(glass.contains(HEADING), "{glass}");
assert!(!glass.contains(OPEN), "{glass}");
}
#[test]
fn the_close_puts_the_pane_down() {
let mut model = fleeting();
let window = Window::new();
click(&window, CLOSE, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.fleet.is_none());
}
#[test]
fn the_two_acts_that_carry_a_word_are_dead_until_it_is_typed() {
let mut model = seated();
model.begin_fleet();
let glass = painted(&mut model);
for said in [RUN, DISBAND, WATCH, DISARM, SCAN, PROJECT_HINT, MODEL_HINT] {
assert!(glass.contains(said), "{said:?} is on no row: {glass}");
}
let window = Window::new();
click(&window, RUN, |ctx| crate::ui::render(ctx, &mut model));
click(&window, WATCH, |ctx| crate::ui::render(ctx, &mut model));
assert!(
model.outbox.is_empty(),
"a control with no word to carry fired"
);
}
#[test]
fn the_three_wordless_acts_compose_their_own_gestures() {
for (word, op) in [(DISBAND, "disband"), (DISARM, "disarm"), (SCAN, "scan")] {
let mut model = fleeting();
let window = Window::new();
click(&window, word, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("a gesture");
assert_eq!(posted.envelope["op"], op);
assert_eq!(posted.envelope["workspace"], "home");
assert!(posted.act, "{op} is an act");
}
}
#[test]
fn the_two_worded_acts_carry_the_words_the_pane_holds() {
let mut model = fleeting();
let window = Window::new();
click(&window, RUN, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("a gesture").clone();
assert_eq!(posted.envelope["op"], "fleet");
assert_eq!(posted.envelope["project"], "lernie");
assert_eq!(posted.envelope["cap"], 4);
let mut watching = fleeting();
click(&window, WATCH, |ctx| crate::ui::render(ctx, &mut watching));
let armed = watching.outbox.first().expect("a gesture");
assert_eq!(armed.envelope["op"], "arm");
assert_eq!(armed.envelope["model"], "claude-haiku-4-5");
}
#[test]
fn the_cap_moves_under_its_own_two_controls_and_never_below_one() {
let mut model = fleeting();
let window = Window::new();
click(&window, MORE, |ctx| crate::ui::render(ctx, &mut model));
assert_eq!(model.fleet.as_ref().expect("open").cap, 5);
click(&window, FEWER, |ctx| crate::ui::render(ctx, &mut model));
assert_eq!(model.fleet.as_ref().expect("open").cap, 4);
let mut floored = seated();
floored.begin_fleet();
click(&window, FEWER, |ctx| crate::ui::render(ctx, &mut floored));
assert_eq!(floored.fleet.as_ref().expect("open").cap, 1);
}
#[test]
fn each_listing_says_which_emptiness_it_is_in() {
let mut waiting = seated();
waiting.begin_fleet();
let glass = painted(&mut waiting);
assert!(glass.contains(NOT_ANSWERED), "{glass}");
assert!(glass.contains(ATTEMPTS), "{glass}");
assert!(glass.contains(CHANGES), "{glass}");
let mut empty = Model {
attempts: Some(Vec::new()),
work: Some(Vec::new()),
..waiting
};
let glass = painted(&mut empty);
assert!(glass.contains(NOTHING), "{glass}");
assert!(!glass.contains(NOT_ANSWERED), "{glass}");
}
#[test]
fn every_line_the_pane_paints_reaches_the_glass() {
let mut model = fleeting();
let glass = painted(&mut model);
for said in [
"fleet: it is standing",
"ship it",
"judge-one — candidate B reads cleaner",
"accepted at ccc",
"work/bl-3 → main",
"no such ref: work/bl-2",
"src/a.rs +3 −1",
"assets/x.png binary",
] {
assert!(glass.contains(said), "{said:?} is on no row: {glass}");
}
}