use crate::channel::Reach;
use crate::paint_probe::frame::{Window, press};
use crate::paint_probe::{Seen, seen_of};
use crate::reply::{Outcome, Read, Reply};
use crate::test_support::window::{own, said, seated};
use crate::ui::Model;
use crate::ui::theme;
const WORDS: &str = "ship it";
fn sent(model: &mut Model, window: &Window) -> Vec<Seen> {
model.draft = WORDS.to_owned();
window.frame(Vec::new(), |ctx| crate::ui::render(ctx, model));
window.focus(egui::Id::new(crate::ui::keys::BOX_ID));
seen_of(&window.frame(vec![press(egui::Key::Enter)], |ctx| {
crate::ui::render(ctx, model);
}))
}
fn inks(shown: &[Seen]) -> Vec<egui::Color32> {
shown
.iter()
.filter(|run| run.text == WORDS)
.map(|run| run.ink)
.collect()
}
fn painted(model: &mut Model, window: &Window) -> Vec<egui::Color32> {
inks(&seen_of(
&window.frame(Vec::new(), |ctx| crate::ui::render(ctx, model)),
))
}
fn ok() -> Read {
Read::Answer(Reply::Outcome(Outcome {
exit: 0,
stdout: String::new(),
stderr: String::new(),
}))
}
#[test]
fn the_words_are_on_the_glass_the_frame_enter_is_pressed() {
let mut model = seated();
let window = Window::sized(1400.0, 900.0);
let shown = sent(&mut model, &window);
assert_eq!(inks(&shown), vec![theme::INK, theme::INK_WEAK], "{shown:?}");
assert!(model.draft.is_empty(), "and the box cleared");
let flat = own().channel;
model.receipt(&flat, crate::verbs::MESSAGE.word, ok());
assert_eq!(painted(&mut model, &window), vec![theme::INK]);
model.absorb(
&flat,
Read::Answer(Reply::Transcript(crate::reply::transcript::Transcript {
entries: vec![said("op", "port it"), said("user", WORDS)],
})),
);
assert_eq!(
painted(&mut model, &window),
vec![theme::INK],
"one row, not two"
);
assert!(model.sent.is_empty());
}
#[test]
fn a_refusal_puts_the_words_back_in_the_box_and_takes_the_row_down() {
let mut model = seated();
let window = Window::sized(1400.0, 900.0);
sent(&mut model, &window);
model.receipt(
&own().channel,
crate::verbs::MESSAGE.word,
Read::Refusal("the engine said no".to_owned()),
);
assert_eq!(model.draft, WORDS);
let shown = seen_of(&window.frame(Vec::new(), |ctx| crate::ui::render(ctx, &mut model)));
assert_eq!(
inks(&shown).len(),
1,
"the box's copy and no row: {shown:?}"
);
assert!(model.sent.is_empty());
}
#[test]
fn another_conversation_does_not_paint_this_one_s_row() {
let mut model = seated();
let window = Window::sized(1400.0, 900.0);
sent(&mut model, &window);
model.select("20260830T052000Z-b2c3");
assert!(painted(&mut model, &window).is_empty());
model.select("20260830T051200Z-a1b2");
assert_eq!(painted(&mut model, &window), vec![theme::INK_WEAK]);
}
#[test]
fn a_lost_reply_leaves_the_row_standing_in_the_pending_ink() {
let mut model = seated();
let window = Window::sized(1400.0, 900.0);
sent(&mut model, &window);
model.acted(
crate::verbs::MESSAGE.word,
&Reach::Unanswered("read: timed out".to_owned()),
Some(WORDS.to_owned()),
);
assert_eq!(painted(&mut model, &window), vec![theme::INK_WEAK]);
assert!(model.draft.is_empty());
}