use super::*;
#[test]
fn untouched_spinner_is_a_noop_and_enter_closes_silently() {
let s = panel();
assert!(s.is_noop(), "fresh panel: nothing to apply");
assert_eq!(close_outcome(true, &s), PanelClose::cancelled());
assert_eq!(close_outcome(false, &s), PanelClose::cancelled());
}
#[test]
fn spinner_dials_named_then_kind_fallbacks_with_markers_and_clamp() {
let mut s = panel();
assert!(
s.pick_label().contains("dgx1") && s.pick_label().contains("(active)"),
"opens on the active backend: {}",
s.pick_label()
);
s.cycle(1); assert!(!s.is_noop(), "a touched spinner is a pick");
assert!(s.pick_label().contains("gpu-runner") && s.pick_label().contains("(pending)"));
assert_eq!(
close_outcome(true, &s).apply,
Some(BackendSelection::Named("gpu-runner".to_string()))
);
s.cycle(1);
s.cycle(1);
assert_eq!(
close_outcome(true, &s).apply,
Some(BackendSelection::Kind("ollama"))
);
s.cycle(1);
s.cycle(1);
s.cycle(1);
assert_eq!(
close_outcome(true, &s).apply,
Some(BackendSelection::Kind("openai"))
);
assert_eq!(close_outcome(false, &s), PanelClose::cancelled());
}
#[test]
fn touched_back_to_active_is_still_a_deliberate_reapply() {
let mut s = panel();
s.cycle(1);
s.cycle(-1);
assert!(!s.is_noop());
assert_eq!(
close_outcome(true, &s).apply,
Some(BackendSelection::Named("dgx1".to_string()))
);
}
#[test]
fn the_spinner_stays_in_range_however_many_options_are_removed() {
let mut state = panel();
let mut removals = 0;
for _ in 0..state.options.len() {
state.cycle(1);
}
while let Some(name) = state
.options
.iter()
.find(|o| o.editable())
.map(|o| o.name.clone())
{
let idx = state.named_index(&name).expect("just found it");
state.remove_option(idx);
removals += 1;
assert!(
!state.options.is_empty(),
"the kind fallbacks are unremovable, so the list cannot empty"
);
assert!(
state.pick.value() < state.options.len(),
"the spinner points past the end after removing `{name}` \
({} of {})",
state.pick.value(),
state.options.len()
);
let _ = state.selected();
}
assert!(
removals >= 2,
"the fixture has removable options to exhaust"
);
assert!(
state.options.iter().all(|o| !o.editable()),
"what remains is exactly what cannot be removed"
);
assert!(state.options.len() >= 2, "at least the two kind fallbacks");
state.cycle(1);
state.cycle(-1);
let _ = state.selected();
}
#[test]
fn chooser_rows_render_the_selected_backend_and_kind_fallback_details() {
let mut s = panel();
let rows = s.chooser_rows();
assert_eq!(rows[0].label, "backend");
assert!(rows[0].value.contains("dgx1"));
assert!(rows
.iter()
.any(|r| r.label == "url" && r.value == "http://dgx1:11434"));
assert!(rows.iter().any(|r| r.label == "auth" && r.value == "—"));
s.cycle(1);
s.cycle(1);
s.cycle(1); let rows = s.chooser_rows();
assert!(rows[0].value.contains("wire kind"));
assert_eq!(rows[0].provenance, "session-only toggle");
assert!(!rows.iter().any(|r| r.label == "url"));
}