use super::{
ACT, AMEND, ARM_HINT, CLAIM, DELIVER, DONE, FILE, FILE_IT, NEW, NOTE_HINT, PROJECT_HINT,
RELEASE, UNAMENDABLE, UNARMED, UNFILEABLE,
};
use crate::paint_probe::frame::Window;
use crate::test_support::window::{boarded, click, painted};
use crate::ui::Model;
fn amending() -> Model {
let mut model = boarded();
let ball = model
.holding
.clone()
.and_then(|rows| rows.first().cloned())
.expect("the boarded fixture holds one ball");
model.begin_amending(&ball);
model
}
#[test]
fn the_wall_s_control_opens_a_block_on_a_ball_that_does_not_exist_yet() {
let mut model = boarded();
let window = Window::new();
click(&window, FILE, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.authoring.is_some(), "the control opened nothing");
let glass = painted(&mut model);
assert!(glass.contains(NEW), "{glass}");
assert!(glass.contains(PROJECT_HINT), "{glass}");
assert!(!glass.contains(NOTE_HINT), "{glass}");
assert!(!glass.contains(ARM_HINT), "{glass}");
}
#[test]
fn a_held_row_s_control_opens_the_block_on_that_ball() {
let mut model = boarded();
let window = Window::new();
click(&window, ACT, |ctx| crate::ui::render(ctx, &mut model));
let glass = painted(&mut model);
assert!(glass.contains("bl-1 in lernie as home"), "{glass}");
assert!(glass.contains(NOTE_HINT), "{glass}");
assert!(!glass.contains(PROJECT_HINT), "{glass}");
}
#[test]
fn the_way_out_puts_the_block_down_and_leaves_the_pane() {
let mut model = amending();
let window = Window::new();
click(&window, DONE, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.authoring.is_none());
assert!(model.boarding(), "the pane went down with the block");
assert!(model.outbox.is_empty(), "the way out sent something");
}
#[test]
fn escape_puts_the_block_down_before_the_pane() {
let mut model = amending();
model.escape();
assert!(model.authoring.is_none());
assert!(model.boarding());
model.escape();
assert!(!model.boarding());
}
#[test]
fn each_refusal_is_spelled_beside_its_dark_control() {
let mut model = boarded();
model.begin_filing();
let glass = painted(&mut model);
assert!(
glass.contains(FILE_IT) && glass.contains(UNFILEABLE),
"{glass}"
);
let mut model = amending();
let glass = painted(&mut model);
assert!(
glass.contains(AMEND) && glass.contains(UNAMENDABLE),
"{glass}"
);
assert!(
glass.contains(DELIVER) && glass.contains(UNARMED),
"{glass}"
);
assert!(glass.contains(RELEASE), "{glass}");
}
#[test]
fn filing_composes_a_create_down_one_channel() {
let mut model = boarded();
model.begin_filing();
if let Some(block) = model.authoring.as_mut() {
block.project = "lernie".to_owned();
block.title = "a title".to_owned();
}
let window = Window::new();
click(&window, FILE_IT, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("one gesture");
assert_eq!(posted.envelope["op"], "create");
assert!(posted.channel.is_some(), "a create must never fan");
}
#[test]
fn the_held_ball_s_three_acts_each_compose_their_own_verb() {
for (word, op, arm) in [
(AMEND, "update", ""),
(RELEASE, "release", ""),
(DELIVER, "close", "bl-1"),
] {
let mut model = amending();
if let Some(block) = model.authoring.as_mut() {
block.note = "a note".to_owned();
block.arm = arm.to_owned();
}
let window = Window::new();
click(&window, word, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("one gesture");
assert_eq!(posted.envelope["op"], op, "{word}");
assert!(posted.channel.is_some(), "{word} must never fan");
}
}
#[test]
fn the_board_row_s_claim_composes_an_assign() {
let mut model = boarded();
let window = Window::new();
click(&window, CLAIM, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("one gesture");
assert_eq!(posted.envelope["op"], "assign");
assert_eq!(posted.envelope["id"], "bl-2");
assert!(posted.channel.is_some(), "an assign must never fan");
}
#[test]
fn a_block_whose_channel_has_gone_paints_nothing() {
let mut model = amending();
model.roster.clear();
let glass = painted(&mut model);
assert!(!glass.contains(DELIVER), "{glass}");
}