use crossterm::event::{KeyCode, KeyModifiers};
use dotstate::keymap::{Action, KeyBinding, Keymap, KeymapPreset};
#[test]
fn test_override_shadows_preset_binding() {
let keymap = Keymap {
preset: KeymapPreset::Vim,
overrides: vec![KeyBinding::new("w", Action::MoveUp)],
};
assert_eq!(
keymap.get_action(KeyCode::Char('w'), KeyModifiers::NONE),
Some(Action::MoveUp)
);
assert_eq!(
keymap.get_action(KeyCode::Char('k'), KeyModifiers::NONE),
None
);
assert_eq!(
keymap.get_action(KeyCode::Char('j'), KeyModifiers::NONE),
Some(Action::MoveDown)
);
}
#[test]
fn test_display_reflects_overrides() {
let keymap = Keymap {
preset: KeymapPreset::Vim,
overrides: vec![
KeyBinding::new("w", Action::MoveUp),
KeyBinding::new("x", Action::Quit),
],
};
let nav_display = keymap.navigation_display();
assert!(
nav_display.contains('W') || nav_display.contains('w'),
"nav_display should contain 'w', got: '{nav_display}'"
);
assert!(
nav_display.contains('j') || nav_display.contains('J'),
"nav_display should contain 'j', got: '{nav_display}'"
);
assert!(
!nav_display.contains('k') && !nav_display.contains('K'),
"nav_display should not contain 'k' since it's shadowed, got: '{nav_display}'"
);
let quit_display = keymap.quit_display();
assert!(
quit_display.contains('x') || quit_display.contains('X'),
"quit_display should contain 'x', got: '{quit_display}'"
);
assert_eq!(keymap.get_key_display_for_action(Action::MoveUp), "W");
assert_eq!(keymap.get_key_display_for_action(Action::Quit), "X");
let confirm_display = keymap.confirm_display();
assert!(
confirm_display.contains("Enter") || confirm_display.contains("enter"),
"confirm_display should contain 'Enter', got: '{confirm_display}'"
);
}