use super::{ACCEPT, FEWER, GOAL_HINT, MORE, RELEASE, SPREAD, SUMMARY_HINT};
use crate::paint_probe::frame::Window;
use crate::test_support::window::{click, fleeting, pane};
use crate::ui::Model;
#[test]
fn a_candidate_and_a_claim_each_wear_the_acts_they_earn() {
let mut model = fleeting();
let painted = pane(|ui| {
super::super::render(ui, &mut model);
});
for word in [ACCEPT, RELEASE, GOAL_HINT, SUMMARY_HINT, "spread it over 3"] {
assert!(painted.contains(word), "{word:?}:\n{painted}");
}
}
#[test]
fn the_count_steps_and_floors_at_two() {
let window = Window::new();
let mut model = fleeting();
for _ in 0..4 {
click(&window, FEWER, |ctx| crate::ui::render(ctx, &mut model));
}
assert_eq!(model.fleet.as_ref().map(|held| held.spread), Some(2));
click(&window, MORE, |ctx| crate::ui::render(ctx, &mut model));
assert_eq!(model.fleet.as_ref().map(|held| held.spread), Some(3));
}
#[test]
fn accepting_a_candidate_composes_the_delivery_addressed_to_one_channel() {
let window = Window::new();
let mut model = fleeting();
if let Some(fleet) = model.fleet.as_mut() {
fleet.summary = "take the winner".to_owned();
}
click(&window, ACCEPT, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("one act");
assert_eq!(posted.envelope["op"], "deliver");
assert_eq!(posted.envelope["ball"], "bl-3");
assert_eq!(posted.envelope["handle"], "at-0badcafe");
assert_eq!(posted.envelope["summary"], "take the winner");
assert_eq!(
posted.channel.as_ref().map(|held| held.name.clone()),
model.aim.as_ref().map(|aim| aim.channel.clone())
);
}
#[test]
fn an_acceptance_with_no_subject_composes_nothing() {
let window = Window::new();
let mut model = fleeting();
click(&window, ACCEPT, |ctx| crate::ui::render(ctx, &mut model));
assert!(model.outbox.is_empty());
}
#[test]
fn releasing_a_worktree_composes_the_retirement() {
let window = Window::new();
let mut model = fleeting();
click(&window, RELEASE, |ctx| crate::ui::render(ctx, &mut model));
let posted = model.outbox.first().expect("one act");
assert_eq!(posted.envelope["op"], "retire");
assert_eq!(posted.envelope["handle"], "at-0badcafe");
assert!(posted.channel.is_some(), "addressed, never fanned");
}
#[test]
fn spreading_a_claim_stages_the_start_the_fan_will_carry() {
let window = Window::new();
let mut model = fleeting();
if let Some(fleet) = model.fleet.as_mut() {
fleet.goal = "try three ways".to_owned();
}
click(&window, &format!("{SPREAD} 3"), |ctx| {
crate::ui::render(ctx, &mut model);
});
let posted = model.outbox.first().expect("one act");
assert_eq!(posted.envelope["op"], "prepare");
assert_eq!(posted.envelope["workspace"], "home");
let spread = model
.start
.as_ref()
.and_then(|start| start.spread.clone())
.expect("the obligation is held");
assert_eq!(spread.ball, "bl-2", "off the claim row, never a box");
assert_eq!(spread.n, 3);
}
#[test]
fn a_spread_with_no_goal_composes_nothing() {
let window = Window::new();
let mut model = fleeting();
click(&window, &format!("{SPREAD} 3"), |ctx| {
crate::ui::render(ctx, &mut model);
});
assert!(model.outbox.is_empty());
assert_eq!(model.start, None);
}
#[test]
fn a_shut_pane_paints_no_listing() {
let mut model = Model {
fleet: None,
..fleeting()
};
let painted = pane(|ui| {
super::render(ui, &mut model, &[]);
});
assert!(!painted.contains(ACCEPT), "{painted}");
}