mod focus;
mod walk;
use super::{moved, walk};
use crate::paint_probe::frame::{Window, press};
use crate::test_support::window::{conv, own, seated, wall};
use crate::ui::{Channel, Chunk, Model, Notice, roster};
pub(super) fn stocked() -> Model {
Model {
roster: vec![
own(),
Chunk {
channel: Channel {
name: "elsewhere".to_owned(),
named_there: Some("theirs".to_owned()),
dials: None,
},
walls: vec![wall("theirs"), wall("not-ours")],
..Chunk::default()
},
],
convs: vec![conv("a", "one"), conv("b", "two")],
..seated()
}
}
pub(super) fn typed(model: &mut Model, keys: &[egui::Key]) -> String {
let window = Window::new();
let mut painted = String::new();
for key in keys {
painted = crate::paint_probe::text_of(&window.frame(vec![press(*key)], |ctx| {
crate::ui::render(ctx, model);
}));
}
painted
}
#[test]
fn escape_puts_the_notice_down() {
let mut model = Model {
notice: Some(Notice::Refused("unknown workspace".to_owned())),
..stocked()
};
let painted = typed(&mut model, &[egui::Key::Escape]);
assert_eq!(model.notice, None);
assert!(
!painted.contains("the engine refused"),
"the bar is off the glass:\n{painted}"
);
}
#[test]
fn nothing_is_bound_while_a_box_is_taking_text() {
const STOPS: usize = 64;
let mut model = stocked();
let window = Window::new();
let mut body = |ctx: &egui::Context| crate::ui::render(ctx, &mut model);
window.frame(Vec::new(), &mut body);
let mut wanted = false;
for _ in 0..STOPS {
window.frame(vec![press(egui::Key::Tab)], &mut body);
wanted = window.focused() == Some(egui::Id::new(super::BOX_ID));
if wanted {
break;
}
}
assert!(wanted, "the composer's box never took the keyboard");
window.frame(vec![press(egui::Key::ArrowDown)], &mut body);
window.frame(Vec::new(), &mut body);
assert_eq!(
model.conversation.as_deref(),
seated().conversation.as_deref(),
"the arrow went into the draft, not into a list"
);
}
#[test]
fn a_cursor_saturates_and_an_empty_list_has_nowhere_to_go() {
assert_eq!(moved(0, None, 1), None);
assert_eq!(moved(3, None, -1), Some(0), "an unentered list opens at 0");
assert_eq!(moved(3, Some(0), -1), Some(0));
assert_eq!(moved(3, Some(2), 1), Some(2));
assert_eq!(moved(3, Some(1), 1), Some(2));
}
#[test]
fn a_fresh_window_has_nothing_to_walk() {
let mut model = Model::default();
assert_eq!(
roster::track(&model),
Vec::new(),
"a box that has been asked nothing offers no row to walk"
);
walk(&mut model, 1);
assert!(!model.reveal, "and a walk over nothing moves nothing");
assert_eq!(model.aim, None);
}
#[test]
fn the_two_parameter_boxes_stand_the_arrows_down_as_the_draft_does() {
for (fill, id) in [
(crate::ui::Fill::Reason, super::REASON_ID),
(crate::ui::Fill::Arming, super::ARM_ID),
] {
let mut model = stocked();
model.fill_in("a", fill);
let window = Window::new();
let mut body = |ctx: &egui::Context| crate::ui::render(ctx, &mut model);
window.frame(Vec::new(), &mut body);
assert_eq!(
window.focused(),
Some(egui::Id::new(id)),
"the box took the keyboard"
);
window.frame(vec![press(egui::Key::ArrowDown)], &mut body);
window.frame(Vec::new(), &mut body);
assert_eq!(
model.conversation.as_deref(),
Some("a"),
"the arrow went into the box, not into the list"
);
}
}