use super::Harness;
use crate::ui_state::Panel;
fn is(size: f32, want: f32) -> bool {
(size - want).abs() < 0.5
}
const WINDOW: f32 = 1600.0;
#[test]
fn an_undragged_panel_opens_at_its_default() {
let h = Harness::new();
let (_c, model) = h.model();
for panel in [Panel::Conversations, Panel::ActivityTrail, Panel::StartGoal] {
assert!(
is(model.panel_size(panel, WINDOW), panel.default_size()),
"{panel:?}"
);
}
}
#[test]
fn a_dragged_boundary_survives_a_relaunch() {
let h = Harness::new();
let (_c, mut model) = h.model();
model.settle_panel_size(Panel::Conversations, 412.0, WINDOW, true);
model.settle_panel_size(Panel::ActivityTrail, 333.0, WINDOW, true);
drop(model);
let (_c2, relaunched) = h.model();
assert!(is(
relaunched.panel_size(Panel::Conversations, WINDOW),
412.0
));
assert!(is(
relaunched.panel_size(Panel::ActivityTrail, WINDOW),
333.0
));
assert!(
is(
relaunched.panel_size(Panel::StartGoal, WINDOW),
Panel::StartGoal.default_size()
),
"an untouched boundary keeps its default"
);
}
#[test]
fn only_a_settled_move_writes() {
let h = Harness::new();
let (_c, mut model) = h.model();
let opened = model.panel_size(Panel::Conversations, WINDOW);
model.settle_panel_size(Panel::Conversations, 500.0, WINDOW, false);
assert!(
is(model.panel_size(Panel::Conversations, WINDOW), opened),
"mid-drag"
);
model.settle_panel_size(Panel::Conversations, opened + 0.4, WINDOW, true);
assert!(
is(model.panel_size(Panel::Conversations, WINDOW), opened),
"wobble"
);
model.settle_panel_size(Panel::Conversations, 500.0, WINDOW, true);
assert!(
is(model.panel_size(Panel::Conversations, WINDOW), 500.0),
"released"
);
}
#[test]
fn a_too_wide_stored_width_recovers_at_the_next_launch() {
let h = Harness::new();
let ui = h.roots.ui_json();
std::fs::write(&ui, br#"{"panels":{"conversations":690}}"#).unwrap();
let (_c, mut model) = h.model();
assert!(
is(model.panel_size(Panel::Conversations, 800.0), 400.0),
"clamped on read"
);
assert!(is(model.panel_size(Panel::Conversations, 1600.0), 690.0));
model.settle_panel_size(Panel::Conversations, 3000.0, 800.0, true);
let stored = crate::ui_state::UiState::open(ui).panel_size(Panel::Conversations);
assert_eq!(stored, Some(690.0), "the stored width stays the operator's");
}
#[test]
fn a_runaway_row_can_store_no_more_than_the_ceiling() {
let h = Harness::new();
let (_c, mut model) = h.model();
model.settle_panel_size(Panel::Conversations, 3000.0, 800.0, true);
assert!(is(model.panel_size(Panel::Conversations, 800.0), 400.0));
}
#[test]
fn the_floor_holds_against_a_drag_and_a_hand_edit() {
let h = Harness::new();
let (_c, mut model) = h.model();
let floor = Panel::ActivityTrail.min_size();
model.settle_panel_size(Panel::ActivityTrail, 0.0, WINDOW, true);
assert!(
is(model.panel_size(Panel::ActivityTrail, WINDOW), floor),
"dragged"
);
let ui = h.roots.ui_json();
std::fs::write(&ui, br#"{"panels":{"activity_trail":-40}}"#).unwrap();
let (_c2, reopened) = h.model();
assert!(
is(reopened.panel_size(Panel::ActivityTrail, WINDOW), floor),
"edited"
);
}