use crate::app::Focus;
use crate::editor::EditorMode;
use crate::test_utils::test_helpers::{app_with_query, key, key_with_mods};
use crossterm::event::{KeyCode, KeyModifiers};
#[test]
fn test_history_popup_does_not_open_when_empty() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
assert_eq!(app.history.total_count(), 0);
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
assert!(!app.history.is_visible());
}
#[test]
fn test_history_popup_navigation() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".foo");
app.history.add_entry_in_memory(".bar");
app.history.add_entry_in_memory(".baz");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
assert!(app.history.is_visible());
assert_eq!(app.history.selected_index(), 0);
app.handle_key_event(key(KeyCode::Up));
assert_eq!(app.history.selected_index(), 1);
app.handle_key_event(key(KeyCode::Down));
assert_eq!(app.history.selected_index(), 0); }
#[test]
fn test_history_popup_escape_closes() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".test");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
assert!(app.history.is_visible());
app.handle_key_event(key(KeyCode::Esc));
assert!(!app.history.is_visible());
assert_eq!(app.query(), "");
}
#[test]
fn test_history_popup_enter_selects() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".selected_query");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
app.handle_key_event(key(KeyCode::Enter));
assert!(!app.history.is_visible());
assert_eq!(app.query(), ".selected_query");
}
#[test]
fn test_history_popup_tab_selects() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".tab_selected");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
app.handle_key_event(key(KeyCode::Tab));
assert!(!app.history.is_visible());
assert_eq!(app.query(), ".tab_selected");
}
#[test]
fn test_history_popup_search_filters() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".apple");
app.history.add_entry_in_memory(".banana");
app.history.add_entry_in_memory(".apricot");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
app.handle_key_event(key(KeyCode::Char('a')));
app.handle_key_event(key(KeyCode::Char('p')));
assert_eq!(app.history.search_query(), "ap");
assert!(app.history.filtered_count() < app.history.total_count());
}
#[test]
fn test_history_popup_backspace_removes_search_char() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".test");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
app.handle_key_event(key(KeyCode::Char('a')));
app.handle_key_event(key(KeyCode::Char('b')));
assert_eq!(app.history.search_query(), "ab");
app.handle_key_event(key(KeyCode::Backspace));
assert_eq!(app.history.search_query(), "a");
}
#[test]
fn test_shift_tab_closes_history_popup() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".test");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
assert!(app.history.is_visible());
app.handle_key_event(key(KeyCode::BackTab));
assert!(!app.history.is_visible());
assert_eq!(app.focus, Focus::ResultsPane);
}
#[test]
fn test_up_arrow_opens_history_when_cursor_at_start() {
let mut app = app_with_query(".existing");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".history_item");
app.input
.textarea
.move_cursor(tui_textarea::CursorMove::Head);
assert_eq!(app.input.textarea.cursor().1, 0);
app.handle_key_event(key(KeyCode::Up));
assert!(app.history.is_visible());
}
#[test]
fn test_up_arrow_opens_history_when_input_empty() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".history_item");
app.handle_key_event(key(KeyCode::Up));
assert!(app.history.is_visible());
}
#[test]
fn test_ctrl_p_cycles_to_previous_history() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".first");
app.history.add_entry_in_memory(".second");
app.history.add_entry_in_memory(".third");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".third");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".second");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".first");
}
#[test]
fn test_ctrl_n_cycles_to_next_history() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".first");
app.history.add_entry_in_memory(".second");
app.history.add_entry_in_memory(".third");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".first");
app.handle_key_event(key_with_mods(KeyCode::Char('n'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".second");
app.handle_key_event(key_with_mods(KeyCode::Char('n'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".third");
}
#[test]
fn test_ctrl_n_at_most_recent_clears_input() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".test");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".test");
app.handle_key_event(key_with_mods(KeyCode::Char('n'), KeyModifiers::CONTROL));
assert_eq!(app.query(), "");
}
#[test]
fn test_typing_resets_history_cycling() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".first");
app.history.add_entry_in_memory(".second");
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".second");
app.handle_key_event(key(KeyCode::Char('x')));
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".second");
}
#[test]
fn test_ctrl_p_with_empty_history_does_nothing() {
let mut app = app_with_query(".existing");
app.input.editor_mode = EditorMode::Insert;
assert_eq!(app.history.total_count(), 0);
app.handle_key_event(key_with_mods(KeyCode::Char('p'), KeyModifiers::CONTROL));
assert_eq!(app.query(), ".existing");
}
#[test]
fn test_filter_with_no_matches() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".apple");
app.history.add_entry_in_memory(".banana");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
app.handle_key_event(key(KeyCode::Char('x')));
app.handle_key_event(key(KeyCode::Char('y')));
app.handle_key_event(key(KeyCode::Char('z')));
assert_eq!(app.history.filtered_count(), 0);
}
#[test]
fn test_backspace_on_empty_search() {
let mut app = app_with_query("");
app.input.editor_mode = EditorMode::Insert;
app.history.add_entry_in_memory(".test");
app.handle_key_event(key_with_mods(KeyCode::Char('r'), KeyModifiers::CONTROL));
assert_eq!(app.history.search_query(), "");
app.handle_key_event(key(KeyCode::Backspace));
assert_eq!(app.history.search_query(), "");
}