use super::{CLOSE, HEADING, NOT_ANSWERED, NOTHING, OPEN, headline, output, provenance, standing};
use crate::paint_probe::frame::Window;
use crate::test_support::window::{click, own, painted, seated, trailed, trailing};
use crate::ui::{Model, Trail};
#[test]
fn the_roster_s_control_opens_the_pane() {
let mut model = Model::default();
let window = Window::new();
click(&window, OPEN, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.trailing(), "the control opened nothing");
let glass = painted(&mut model);
assert!(glass.contains(HEADING), "{glass}");
assert!(!glass.lines().any(|line| line == OPEN), "{glass}");
}
#[test]
fn each_emptiness_says_which_one_it_is() {
let mut unheard = Model {
lookup: Some(crate::ui::Lookup::Trailing),
..seated()
};
let glass = painted(&mut unheard);
assert!(glass.contains(NOT_ANSWERED), "{glass}");
let mut quiet = Model {
trails: vec![Trail {
channel: own().channel,
rows: Vec::new(),
}],
..unheard.clone()
};
let glass = painted(&mut quiet);
assert!(glass.contains(NOTHING), "{glass}");
assert!(!glass.contains(NOT_ANSWERED), "{glass}");
let mut answered = trailing();
let glass = painted(&mut answered);
assert!(glass.contains("bl close bl-1"), "{glass}");
assert!(!glass.contains(NOTHING), "{glass}");
}
#[test]
fn a_channel_holding_nothing_gets_no_header() {
let mut model = trailing();
let quiet = crate::ui::Channel {
name: "elsewhere".to_owned(),
..own().channel
};
model.trails.push(Trail {
channel: quiet.clone(),
rows: Vec::new(),
});
let glass = painted(&mut model);
assert!(!glass.contains("elsewhere"), "{glass}");
}
#[test]
fn the_row_paints_the_engine_s_own_reading_of_how_it_ended() {
let mut model = trailing();
let glass = painted(&mut model);
for said in [
"bl close bl-1",
"exit 1",
"live",
"the gate said no",
"detached — handed off, no exit to observe",
"quarantined",
] {
assert!(
glass.contains(said),
"{said:?} is not on the glass:\n{glass}"
);
}
}
#[test]
fn a_clean_row_says_nothing_and_every_other_standing_says_itself() {
assert_eq!(
standing(&trailed("bl list", crate::reply::ops::CLEAN)),
None
);
assert_eq!(
standing(&trailed("bl close x", "live")),
Some("live".to_owned())
);
assert_eq!(
standing(&trailed("bz login", "quarantined")),
Some("quarantined".to_owned())
);
}
#[test]
fn the_headline_is_the_command_and_the_label_and_the_detail_carries_the_rest() {
let row = trailed("bl close x", "live");
assert_eq!(headline(&row), "bl close x [exit 1]");
let said = provenance(&row);
for part in ["1700", "balls", "/ws/home", "exit 1"] {
assert!(said.contains(part), "{said}");
}
assert!(said.contains("by local"), "{said}");
let phone = crate::reply::ops::OpRow {
client: "phone-1".to_owned(),
..row
};
assert!(provenance(&phone).contains("by phone-1"), "{said}");
}
#[test]
fn a_row_that_printed_nothing_gets_no_line_and_one_that_did_leads_with_why() {
assert_eq!(output(&trailed("bl list", "clean")), None);
let both = crate::reply::ops::OpRow {
stdout: "listed".to_owned(),
stderr: "the gate said no".to_owned(),
..trailed("bl close x", "live")
};
assert_eq!(
output(&both),
Some("the gate said no\nlisted".to_owned()),
"the complaint leads"
);
}
#[test]
fn the_pane_s_close_stands_it_down() {
let mut model = trailing();
let window = Window::new();
click(&window, CLOSE, |ctx| crate::ui::render(ctx, &mut model));
assert!(!model.trailing());
assert_eq!(model.trails.len(), 1);
}
#[test]
fn the_watermark_is_one_control_and_it_fans() {
let mut model = trailing();
let window = Window::new();
click(&window, super::ACK, |ctx| {
crate::ui::render(ctx, &mut model);
});
let posted = model.outbox.first().expect("a gesture");
assert_eq!(posted.envelope, serde_json::json!({ "op": "ack" }));
assert!(posted.act, "a watermark is an act");
}
#[test]
fn the_watermark_is_dead_where_no_row_has_crossed() {
let mut model = Model {
lookup: Some(crate::ui::Lookup::Trailing),
trails: vec![Trail {
channel: own().channel,
rows: Vec::new(),
}],
..seated()
};
let window = Window::new();
click(&window, super::ACK, |ctx| {
crate::ui::render(ctx, &mut model);
});
assert!(model.outbox.is_empty(), "a watermark with no trail fired");
}