use super::*;
use crossterm::event::Event;
use test_support::{ctrl, key, special, RecordingSink};
#[cfg(unix)]
#[test]
fn every_ladder_claimant_is_reachable_from_the_editors_own_state() {
let reach: &[(&str, &[KeyEvent])] = &[
("vi-insert", &[]),
("palette", &[key('/')]),
("vi-pending", &[special(KeyCode::Esc), key('d')]),
("vi-ex", &[special(KeyCode::Esc), key(':')]),
(
"vi-confirm",
&[
special(KeyCode::Esc),
key(':'),
key('w'),
key('q'),
special(KeyCode::Enter),
],
),
];
for (claimant, keys) in reach {
let mut mounted = MountedEditor::new(Edit::Vi, Some(1), Vec::new(), "");
let mut sink = RecordingSink::default();
for k in *keys {
mounted.on_event(Event::Key(*k), &mut sink).unwrap();
}
assert!(
mounted.claim_set().is_live(claimant),
"`{claimant}` is a rung in assets/esc_ladder.toml but nothing \
in Vi::claims / Editor::claims / MountedEditor::claim_set \
reports it — the rung can never fire"
);
}
let mut reachable: Vec<&str> = reach.iter().map(|(name, _)| *name).collect();
reachable.sort_unstable();
let mut table: Vec<&str> = crate::esc_ladder::ESC_LADDER.claimants().collect();
table.sort_unstable();
assert_eq!(
reachable, table,
"the ladder's claimants and the states this test can reach have \
drifted apart"
);
let mut normal = MountedEditor::new(Edit::Vi, Some(1), Vec::new(), "");
let mut sink = RecordingSink::default();
normal
.on_event(Event::Key(special(KeyCode::Esc)), &mut sink)
.unwrap();
assert_eq!(
normal.claim_set().names().collect::<Vec<_>>(),
Vec::<&str>::new(),
"vi NORMAL with nothing pending must decline Esc — that decline IS \
rung 7"
);
for (name, edit) in [("emacs", Edit::Emacs), ("nano", Edit::Nano)] {
let mounted = MountedEditor::new(edit, Some(1), Vec::new(), "");
assert_eq!(
mounted.claim_set().names().collect::<Vec<_>>(),
Vec::<&str>::new(),
"{name} carries a Vi in INSERT; it must not claim Esc"
);
}
}
#[cfg(unix)]
#[test]
fn every_vi_pending_contributor_claims_esc() {
for (what, keys) in [
("a pending operator", vec![special(KeyCode::Esc), key('d')]),
("a building count", vec![special(KeyCode::Esc), key('2')]),
("i_CTRL-O", vec![ctrl('o')]),
] {
let mut mounted = MountedEditor::new(Edit::Vi, Some(1), Vec::new(), "");
let mut sink = RecordingSink::default();
for k in keys {
mounted.on_event(Event::Key(k), &mut sink).unwrap();
}
assert_eq!(
mounted.claim_set().names().collect::<Vec<_>>(),
vec!["vi-pending"],
"{what} must claim rung 6 alone — not nothing (the turn dies \
mid-sequence) and not vi-insert as well"
);
}
}