diff options
author | Tim Oram <dev@mitmaro.ca> | 2024-02-12 19:26:07 -0330 |
---|---|---|
committer | Tim Oram <dev@mitmaro.ca> | 2024-02-15 20:27:06 -0330 |
commit | a9b55386d5f74c80b182b7fc13fabf29f98aaef2 (patch) | |
tree | 97aaad9efd1234e0286f38170c31d70f9992d32c | |
parent | 5ae7493431d7a1a127309e3f9acb0f7dab04983b (diff) |
Move input testutils into test_helpers
-rw-r--r-- | src/application.rs | 4 | ||||
-rw-r--r-- | src/components/confirm/tests.rs | 3 | ||||
-rw-r--r-- | src/input.rs | 2 | ||||
-rw-r--r-- | src/input/event_handler.rs | 2 | ||||
-rw-r--r-- | src/input/testutil.rs | 136 | ||||
-rw-r--r-- | src/input/thread.rs | 3 | ||||
-rw-r--r-- | src/module/tests.rs | 2 | ||||
-rw-r--r-- | src/test_helpers.rs | 6 | ||||
-rw-r--r-- | src/test_helpers/create_event_reader.rs | 42 | ||||
-rw-r--r-- | src/test_helpers/create_test_keybindings.rs | 53 | ||||
-rw-r--r-- | src/test_helpers/with_event_handler.rs | 33 | ||||
-rw-r--r-- | src/testutil/module_test.rs | 5 | ||||
-rw-r--r-- | src/testutil/process_test.rs | 5 | ||||
-rw-r--r-- | src/testutil/test_module_provider.rs | 3 |
14 files changed, 150 insertions, 149 deletions
diff --git a/src/application.rs b/src/application.rs index 97a983b..174ce7d 100644 --- a/src/application.rs +++ b/src/application.rs @@ -194,10 +194,10 @@ mod tests { use super::*; use crate::{ display::Size, - input::{testutil::create_event_reader, Event, KeyCode, KeyEvent, KeyModifiers}, + input::{Event, KeyCode, KeyEvent, KeyModifiers}, module::Modules, runtime::{Installer, RuntimeError}, - test_helpers::mocks::crossterm::CrossTerm, + test_helpers::{create_event_reader, mocks::crossterm::CrossTerm}, testutil::{set_git_directory, DefaultTestModule, TestModuleProvider}, }; diff --git a/src/components/confirm/tests.rs b/src/components/confirm/tests.rs index f53269c..609d2e2 100644 --- a/src/components/confirm/tests.rs +++ b/src/components/confirm/tests.rs @@ -3,7 +3,8 @@ use rstest::rstest; use super::*; use crate::{ assert_rendered_output, - input::{testutil::create_test_keybindings, StandardEvent}, + input::StandardEvent, + test_helpers::create_test_keybindings, view::testutil::AssertRenderOptions, }; diff --git a/src/input.rs b/src/input.rs index a330813..a4e8d96 100644 --- a/src/input.rs +++ b/src/input.rs @@ -15,8 +15,6 @@ mod input_options; mod key_bindings; mod key_event; mod standard_event; -#[cfg(test)] -pub(crate) mod testutil; mod thread; pub(crate) use crossterm::event::{KeyCode, KeyModifiers, MouseEvent, MouseEventKind}; diff --git a/src/input/event_handler.rs b/src/input/event_handler.rs index a26c22e..02d163c 100644 --- a/src/input/event_handler.rs +++ b/src/input/event_handler.rs @@ -142,7 +142,7 @@ mod tests { use rstest::rstest; use super::*; - use crate::input::{map_keybindings, testutil::create_test_keybindings}; + use crate::{input::map_keybindings, test_helpers::create_test_keybindings}; #[rstest] #[case::standard(Event::Key(KeyEvent { diff --git a/src/input/testutil.rs b/src/input/testutil.rs deleted file mode 100644 index ae6e96a..0000000 --- a/src/input/testutil.rs +++ /dev/null @@ -1,136 +0,0 @@ -//! Utilities for writing tests that interact with input events. - -use anyhow::Result; -use crossterm::event as c_event; - -use crate::input::{ - map_keybindings, - Event, - EventHandler, - EventReaderFn, - KeyBindings, - KeyCode, - KeyEvent, - KeyModifiers, - State, -}; - -/// Create a mocked version of `KeyBindings`. -#[must_use] -pub(crate) fn create_test_keybindings() -> KeyBindings { - KeyBindings { - redo: vec![Event::from(KeyEvent::new(KeyCode::Char('y'), KeyModifiers::CONTROL))], - undo: vec![Event::from(KeyEvent::new(KeyCode::Char('z'), KeyModifiers::CONTROL))], - scroll_down: map_keybindings(&[String::from("Down")]), - scroll_end: map_keybindings(&[String::from("End")]), - scroll_home: map_keybindings(&[String::from("Home")]), - scroll_left: map_keybindings(&[String::from("Left")]), - scroll_right: map_keybindings(&[String::from("Right")]), - scroll_up: map_keybindings(&[String::from("Up")]), - scroll_step_down: map_keybindings(&[String::from("PageDown")]), - scroll_step_up: map_keybindings(&[String::from("PageUp")]), - help: map_keybindings(&[String::from("?")]), - search_start: map_keybindings(&[String::from("/")]), - search_next: map_keybindings(&[String::from("n")]), - search_previous: map_keybindings(&[String::from("N")]), - abort: map_keybindings(&[String::from("q")]), - action_break: map_keybindings(&[String::from("b")]), - action_drop: map_keybindings(&[String::from("d")]), - action_edit: map_keybindings(&[String::from("e")]), - action_fixup: map_keybindings(&[String::from("f")]), - action_pick: map_keybindings(&[String::from("p")]), - action_reword: map_keybindings(&[String::from("r")]), - action_squash: map_keybindings(&[String::from("s")]), - confirm_yes: map_keybindings(&[String::from("y")]), - edit: map_keybindings(&[String::from("E")]), - force_abort: map_keybindings(&[String::from("Q")]), - force_rebase: map_keybindings(&[String::from("W")]), - insert_line: map_keybindings(&[String::from("I")]), - move_down: map_keybindings(&[String::from("Down")]), - move_down_step: map_keybindings(&[String::from("PageDown")]), - move_end: map_keybindings(&[String::from("End")]), - move_home: map_keybindings(&[String::from("Home")]), - move_left: map_keybindings(&[String::from("Left")]), - move_right: map_keybindings(&[String::from("Right")]), - move_selection_down: map_keybindings(&[String::from("j")]), - move_selection_up: map_keybindings(&[String::from("k")]), - move_up: map_keybindings(&[String::from("Up")]), - move_up_step: map_keybindings(&[String::from("PageUp")]), - open_in_external_editor: map_keybindings(&[String::from('!')]), - rebase: map_keybindings(&[String::from('w')]), - remove_line: map_keybindings(&[String::from("Delete")]), - show_commit: map_keybindings(&[String::from("c")]), - show_diff: map_keybindings(&[String::from("d")]), - toggle_visual_mode: map_keybindings(&[String::from("v")]), - fixup_keep_message: map_keybindings(&[String::from("u")]), - fixup_keep_message_with_editor: map_keybindings(&[String::from("U")]), - } -} - -/// Context for a `EventHandler` based test. -#[derive(Debug)] -#[non_exhaustive] -pub(crate) struct TestContext { - /// The `EventHandler` instance. - pub(crate) event_handler: EventHandler, - /// The sender instance. - pub(crate) state: State, - /// The number of known available events. - pub(crate) number_events: usize, -} - -/// Provide an `EventHandler` instance for use within a test. -#[allow(clippy::missing_panics_doc)] -pub(crate) fn with_event_handler<C>(events: &[Event], callback: C) -where C: FnOnce(TestContext) { - let event_handler = EventHandler::new(create_test_keybindings()); - let state = State::new(); - - for event in events { - state.enqueue_event(*event); - } - - callback(TestContext { - event_handler, - state, - number_events: events.len(), - }); -} - -/// Create an event reader that will map the provided events to the internal representation of the -/// events. This allows for mocking of event input when testing at the highest level of the application. -/// -/// This function does not accept any `Event::MetaEvent` or `Event::StandardEvent` event types, instead -/// use other event types that will map to the expected value using the keybindings. -/// -/// This function should be used sparingly, and instead `with_event_handler` should be used where possible. -/// -/// # Panics -/// If provided an event generator that returns a `Event::MetaEvent` or `Event::StandardEvent` event type. -#[allow(clippy::panic)] -pub(crate) fn create_event_reader<EventGeneratorFunction>( - event_generator: EventGeneratorFunction, -) -> impl EventReaderFn -where EventGeneratorFunction: Fn() -> Result<Option<Event>> + Sync + Send + 'static { - move || { - match event_generator()? { - None => Ok(None), - Some(event) => { - match event { - Event::Key(key) => { - Ok(Some(c_event::Event::Key(c_event::KeyEvent::new( - key.code, - key.modifiers, - )))) - }, - Event::Mouse(mouse_event) => Ok(Some(c_event::Event::Mouse(mouse_event))), - Event::None => Ok(None), - Event::Resize(width, height) => Ok(Some(c_event::Event::Resize(width, height))), - Event::Standard(_) => { - panic!("MetaEvent and Standard are not supported, please use other event types") - }, - } - }, - } - } -} diff --git a/src/input/thread.rs b/src/input/thread.rs index d22ff7c..7a91413 100644 --- a/src/input/thread.rs +++ b/src/input/thread.rs @@ -95,8 +95,9 @@ mod tests { use super::*; use crate::{ - input::{testutil::create_event_reader, KeyEvent}, + input::KeyEvent, runtime::{testutils::ThreadableTester, Status}, + test_helpers::create_event_reader, }; #[test] diff --git a/src/module/tests.rs b/src/module/tests.rs index 85aeb5a..0e1ae0f 100644 --- a/src/module/tests.rs +++ b/src/module/tests.rs @@ -1,8 +1,8 @@ use anyhow::anyhow; use crate::{ - input::testutil::create_test_keybindings, module::{Event, InputOptions, Module, State}, + test_helpers::create_test_keybindings, testutil::module_test, }; diff --git a/src/test_helpers.rs b/src/test_helpers.rs index 6850d6e..23f7f89 100644 --- a/src/test_helpers.rs +++ b/src/test_helpers.rs @@ -1,8 +1,11 @@ pub(crate) mod builders; mod create_commit; +mod create_event_reader; mod create_invalid_utf; +mod create_test_keybindings; pub(crate) mod mocks; mod shared; +mod with_event_handler; mod with_git_config; mod with_temp_bare_repository; mod with_temp_repository; @@ -11,7 +14,10 @@ pub(crate) static JAN_2021_EPOCH: i64 = 1_609_459_200; pub(crate) use self::{ create_commit::{create_commit, CreateCommitOptions}, + create_event_reader::create_event_reader, create_invalid_utf::invalid_utf, + create_test_keybindings::create_test_keybindings, + with_event_handler::{with_event_handler, EventHandlerTestContext}, with_git_config::with_git_config, with_temp_bare_repository::with_temp_bare_repository, with_temp_repository::with_temp_repository, diff --git a/src/test_helpers/create_event_reader.rs b/src/test_helpers/create_event_reader.rs new file mode 100644 index 0000000..3c2117c --- /dev/null +++ b/src/test_helpers/create_event_reader.rs @@ -0,0 +1,42 @@ +use anyhow::Result; +use crossterm::event as c_event; + +use crate::input::{Event, EventReaderFn}; + +/// Create an event reader that will map the provided events to the internal representation of the +/// events. This allows for mocking of event input when testing at the highest level of the application. +/// +/// This function does not accept any `Event::MetaEvent` or `Event::StandardEvent` event types, instead +/// use other event types that will map to the expected value using the keybindings. +/// +/// This function should be used sparingly, and instead `with_event_handler` should be used where possible. +/// +/// # Panics +/// If provided an event generator that returns a `Event::MetaEvent` or `Event::StandardEvent` event type. +#[allow(clippy::panic)] +pub(crate) fn create_event_reader<EventGeneratorFunction>( + event_generator: EventGeneratorFunction, +) -> impl EventReaderFn +where EventGeneratorFunction: Fn() -> Result<Option<Event>> + Sync + Send + 'static { + move || { + match event_generator()? { + None => Ok(None), + Some(event) => { + match event { + Event::Key(key) => { + Ok(Some(c_event::Event::Key(c_event::KeyEvent::new( + key.code, + key.modifiers, + )))) + }, + Event::Mouse(mouse_event) => Ok(Some(c_event::Event::Mouse(mouse_event))), + Event::None => Ok(None), + Event::Resize(width, height) => Ok(Some(c_event::Event::Resize(width, height))), + Event::Standard(_) => { + panic!("MetaEvent and Standard are not supported, please use other event types") + }, + } + }, + } + } +} diff --git a/src/test_helpers/create_test_keybindings.rs b/src/test_helpers/create_test_keybindings.rs new file mode 100644 index 0000000..1c7e743 --- /dev/null +++ b/src/test_helpers/create_test_keybindings.rs @@ -0,0 +1,53 @@ +use crate::input::{map_keybindings, KeyBindings}; + +/// Create a mocked version of `KeyBindings`. +#[must_use] +pub(crate) fn create_test_keybindings() -> KeyBindings { + KeyBindings { + redo: map_keybindings(&[String::from("Controly")]), + undo: map_keybindings(&[String::from("Controlz")]), + scroll_down: map_keybindings(&[String::from("Down")]), + scroll_end: map_keybindings(&[String::from("End")]), + scroll_home: map_keybindings(&[String::from("Home")]), + scroll_left: map_keybindings(&[String::from("Left")]), + scroll_right: map_keybindings(&[String::from("Right")]), + scroll_up: map_keybindings(&[String::from("Up")]), + scroll_step_down: map_keybindings(&[String::from("PageDown")]), + scroll_step_up: map_keybindings(&[String::from("PageUp")]), + help: map_keybindings(&[String::from("?")]), + search_start: map_keybindings(&[String::from("/")]), + search_next: map_keybindings(&[String::from("n")]), + search_previous: map_keybindings(&[String::from("N")]), + abort: map_keybindings(&[String::from("q")]), + action_break: map_keybindings(&[String::from("b")]), + action_drop: map_keybindings(&[String::from("d")]), + action_edit: map_keybindings(&[String::from("e")]), + action_fixup: map_keybindings(&[String::from("f")]), + action_pick: map_keybindings(&[String::from("p")]), + action_reword: map_keybindings(&[String::from("r")]), + action_squash: map_keybindings(&[String::from("s")]), + confirm_yes: map_keybindings(&[String::from("y")]), + edit: map_keybindings(&[String::from("E")]), + force_abort: map_keybindings(&[String::from("Q")]), + force_rebase: map_keybindings(&[String::from("W")]), + insert_line: map_keybindings(&[String::from("I")]), + move_down: map_keybindings(&[String::from("Down")]), + move_down_step: map_keybindings(&[String::from("PageDown")]), + move_end: map_keybindings(&[String::from("End")]), + move_home: map_keybindings(&[String::from("Home")]), + move_left: map_keybindings(&[String::from("Left")]), + move_right: map_keybindings(&[String::from("Right")]), + move_selection_down: map_keybindings(&[String::from("j")]), + move_selection_up: map_keybindings(&[String::from("k")]), + move_up: map_keybindings(&[String::from("Up")]), + move_up_step: map_keybindings(&[String::from("PageUp")]), + open_in_external_editor: map_keybindings(&[String::from('!')]), + rebase: map_keybindings(&[String::from('w')]), + remove_line: map_keybindings(&[String::from("Delete")]), + show_commit: map_keybindings(&[String::from("c")]), + show_diff: map_keybindings(&[String::from("d")]), + toggle_visual_mode: map_keybindings(&[String::from("v")]), + fixup_keep_message: map_keybindings(&[String::from("u")]), + fixup_keep_message_with_editor: map_keybindings(&[String::from("U")]), + } +} diff --git a/src/test_helpers/with_event_handler.rs b/src/test_helpers/with_event_handler.rs new file mode 100644 index 0000000..f3ab500 --- /dev/null +++ b/src/test_helpers/with_event_handler.rs @@ -0,0 +1,33 @@ +use crate::{ + input::{Event, EventHandler, State}, + test_helpers::create_test_keybindings, +}; + +/// Context for a `EventHandler` based test. +#[derive(Debug)] +#[non_exhaustive] +pub(crate) struct EventHandlerTestContext { + /// The `EventHandler` instance. + pub(crate) event_handler: EventHandler, + /// The sender instance. + pub(crate) state: State, + /// The number of known available events. + pub(crate) number_events: usize, +} + +/// Provide an `EventHandler` instance for use within a test. +pub(crate) fn with_event_handler<C>(events: &[Event], callback: C) +where C: FnOnce(EventHandlerTestContext) { + let event_handler = EventHandler::new(create_test_keybindings()); + let state = State::new(); + + for event in events { + state.enqueue_event(*event); + } + + callback(EventHandlerTestContext { + event_handler, + state, + number_events: events.len(), + }); +} diff --git a/src/testutil/module_test.rs b/src/testutil/module_test.rs index 8761c92..c84c117 100644 --- a/src/testutil/module_test.rs +++ b/src/testutil/module_test.rs @@ -1,9 +1,10 @@ use captur::capture; use crate::{ - input::{testutil::with_event_handler, Event}, + input::Event, module::{Module, State}, process::Results, + test_helpers::{with_event_handler, EventHandlerTestContext}, todo_file::{testutil::with_todo_file, TodoFile}, view::{ testutil::{with_view_state, TestContext as ViewContext}, @@ -13,7 +14,7 @@ use crate::{ }; pub(crate) struct TestContext { - pub(crate) event_handler_context: crate::input::testutil::TestContext, + pub(crate) event_handler_context: EventHandlerTestContext, pub(crate) render_context: RenderContext, pub(crate) view_context: ViewContext, todo_file: Option<TodoFile>, diff --git a/src/testutil/process_test.rs b/src/testutil/process_test.rs index d15fbba..5c26308 100644 --- a/src/testutil/process_test.rs +++ b/src/testutil/process_test.rs @@ -4,17 +4,18 @@ use parking_lot::Mutex; use crate::{ display::Size, - input::{testutil::with_event_handler, Event}, + input::Event, module::{self, ModuleHandler}, process::Process, runtime::ThreadStatuses, + test_helpers::{with_event_handler, EventHandlerTestContext}, testutil::{with_search, SearchTestContext}, todo_file::testutil::with_todo_file, view::testutil::{with_view_state, TestContext as ViewContext}, }; pub(crate) struct TestContext<ModuleProvider: module::ModuleProvider + Send + 'static> { - pub(crate) event_handler_context: crate::input::testutil::TestContext, + pub(crate) event_handler_context: EventHandlerTestContext, pub(crate) process: Process<ModuleProvider>, pub(crate) search_context: SearchTestContext, pub(crate) todo_file_path: PathBuf, diff --git a/src/testutil/test_module_provider.rs b/src/testutil/test_module_provider.rs index 5c98a5d..4b29257 100644 --- a/src/testutil/test_module_provider.rs +++ b/src/testutil/test_module_provider.rs @@ -5,8 +5,9 @@ use parking_lot::Mutex; use crate::{ config::Config, git::Repository, - input::{testutil::create_test_keybindings, EventHandler}, + input::EventHandler, module::{Module, ModuleHandler, ModuleProvider, State}, + test_helpers::create_test_keybindings, todo_file::TodoFile, }; |