use super::{ARM, armed, control};
use crate::paint_probe::frame::Window;
use crate::reply::agent::{Agent, Offer};
use crate::test_support::window::{click, own_row, pane, recorded};
use crate::ui::Model;
fn word() -> &'static str {
crate::ui::records::header::word(Offer::Children)
}
#[test]
fn the_offered_cascade_paints_its_box_and_its_word() {
let mut model = recorded();
let row = own_row();
let text = pane(|ui| control(ui, &mut model, &row));
for said in [ARM, word()] {
assert!(text.contains(said), "{said:?}:\n{text}");
}
}
#[test]
fn a_row_with_no_children_offer_carries_no_control() {
let mut model = recorded();
let lone = Agent {
offers: vec![Offer::Nudge, Offer::Stop],
..own_row()
};
let text = pane(|ui| control(ui, &mut model, &lone));
assert!(!text.contains(word()), "{text}");
assert!(!text.contains(ARM), "{text}");
}
#[test]
fn the_arming_is_the_name_back_with_whitespace_forgiven() {
let row = own_row();
assert!(!armed(&row, ""));
assert!(!armed(&row, "port the paint prob"));
assert!(armed(&row, "port the paint probe"));
assert!(armed(&row, " port the paint probe \n"));
}
#[test]
fn the_armed_control_fires_the_stop_that_takes_the_children() {
let window = Window::new();
let mut model = recorded();
click(&window, word(), |ctx| {
crate::ui::render(ctx, &mut model);
});
assert!(model.outbox.is_empty(), "an unarmed control fires nothing");
model.cascade = own_row().display;
click(&window, word(), |ctx| {
crate::ui::render(ctx, &mut model);
});
assert_eq!(model.outbox.len(), 1, "the armed control fires once");
let envelope = &model.outbox[0].envelope;
assert_eq!(envelope["op"], crate::verbs::STOP.word);
assert_eq!(envelope["agent"], "20260830T051200Z-a1b2");
assert_eq!(
envelope["children"], true,
"the cascade, and not the bare form the composer fires"
);
assert_eq!(model.cascade, own_row().display);
}
#[test]
fn moving_the_subject_takes_the_arming_with_it() {
let mut model = Model {
cascade: own_row().display,
..recorded()
};
model.select("another");
assert_eq!(model.cascade, "");
}
#[test]
fn a_cascade_with_no_subject_composes_nothing() {
let mut nowhere = Model {
cascade: own_row().display,
aim: None,
..recorded()
};
nowhere.post_cascade();
assert!(nowhere.outbox.is_empty(), "nothing is aimed at");
let mut unselected = Model {
cascade: own_row().display,
conversation: None,
..recorded()
};
unselected.post_cascade();
assert!(unselected.outbox.is_empty(), "nothing is selected");
}
#[test]
fn an_unanswered_row_arms_nothing() {
let mut model = Model {
cascade: own_row().display,
records: crate::ui::Records {
agent: None,
..recorded().records
},
..recorded()
};
model.post_cascade();
assert!(model.outbox.is_empty());
}