use super::{Hits, Lookup, Pages};
use crate::reply::search::Found;
use crate::test_support::window::{helped, hit, own, seated};
use crate::ui::{Channel, Model};
fn other() -> Channel {
Channel {
name: "elsewhere".to_owned(),
named_there: None,
dials: None,
}
}
#[test]
fn opening_the_commands_pane_composes_the_ask_and_closing_keeps_the_rows() {
let mut model = seated();
model.begin_commands();
assert!(model.commanding());
assert_eq!(
model.outbox,
vec![crate::ui::Posted::read(crate::verbs::window::help())]
);
model.paged(&own().channel, vec![helped("scan", "control")]);
model.close_lookup();
assert!(!model.commanding());
assert_eq!(model.pages.len(), 1, "the rows survive the close");
}
#[test]
fn a_channels_answer_replaces_only_its_own_section() {
let mut model = seated();
model.paged(&own().channel, vec![helped("scan", "control")]);
model.paged(&other(), vec![helped("ops", "machine")]);
model.paged(&own().channel, vec![helped("nudge", "control")]);
assert_eq!(
model.pages,
vec![
Pages {
channel: own().channel,
rows: vec![helped("nudge", "control")],
},
Pages {
channel: other(),
rows: vec![helped("ops", "machine")],
},
]
);
}
#[test]
fn a_channels_hits_replace_only_its_own_section() {
let answered = |needle: &str| Found {
needle: needle.to_owned(),
rows: vec![hit("conversation")],
unreadable: Vec::new(),
};
let mut model = seated();
model.hit(&own().channel, answered("one"));
model.hit(&other(), answered("two"));
model.hit(&own().channel, answered("three"));
assert_eq!(
model.found,
vec![
Hits {
channel: own().channel,
found: answered("three"),
},
Hits {
channel: other(),
found: answered("two"),
},
]
);
}
#[test]
fn opening_the_find_pane_asks_nothing() {
let mut model = seated();
model.begin_finding();
assert!(model.finding());
assert!(model.outbox.is_empty());
model.close_lookup();
assert!(!model.finding());
}
#[test]
fn the_needle_enables_the_act_and_whitespace_is_not_one() {
let mut model = seated();
assert!(!model.needled());
model.post_search();
assert!(model.outbox.is_empty(), "an empty needle composes nothing");
model.needle = " ".to_owned();
assert!(!model.needled());
model.post_search();
assert!(model.outbox.is_empty(), "whitespace composes nothing");
model.needle = " gate ".to_owned();
assert!(model.needled());
model.post_search();
assert_eq!(
model.outbox,
vec![crate::ui::Posted::read(crate::verbs::search(
"gate".to_owned()
))]
);
assert_eq!(model.needle, " gate ", "the box is not spent on firing");
}
#[test]
fn the_refresh_asks_every_channel_again_and_drops_nothing() {
let mut model = seated();
model.refresh_roster();
assert_eq!(
model.outbox,
vec![crate::ui::Posted::read(crate::verbs::workspaces())]
);
assert_eq!(model.roster.len(), 1, "what stands keeps standing");
}
#[test]
fn aiming_and_selecting_leave_both_panes_standing() {
let mut model = Model {
lookup: Some(Lookup::Commands),
..seated()
};
model.aim_at("(this box's own engine)", "home");
model.select("c-9");
assert!(model.commanding(), "neither is about an aim or a selection");
}
#[test]
fn both_kinds_land_through_the_one_door() {
let mut model = seated();
model.absorb(
&own().channel,
crate::reply::read(&serde_json::json!({
"kind": "help", "ok": true,
"rows": [{"verb": "scan", "usage": "/scan", "summary": "sweep",
"detail": "one sweep", "surface": "control"}]})),
);
assert_eq!(model.pages.len(), 1);
assert_eq!(model.pages[0].rows[0].verb, "scan");
model.absorb(
&own().channel,
crate::reply::read(&serde_json::json!({
"kind": "search", "ok": true, "needle": "gate",
"rows": [], "unreadable": []})),
);
assert_eq!(model.found.len(), 1);
assert_eq!(model.found[0].found.needle, "gate");
}
#[test]
fn escape_closes_whichever_of_the_two_is_standing() {
for open in [Lookup::Commands, Lookup::Finding] {
let mut model = Model {
lookup: Some(open),
..seated()
};
model.escape();
assert_eq!(model.lookup, None, "{open:?}");
}
}