summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2024-02-12 19:26:07 -0330
committerTim Oram <dev@mitmaro.ca>2024-02-15 20:27:06 -0330
commita9b55386d5f74c80b182b7fc13fabf29f98aaef2 (patch)
tree97aaad9efd1234e0286f38170c31d70f9992d32c
parent5ae7493431d7a1a127309e3f9acb0f7dab04983b (diff)
Move input testutils into test_helpers
-rw-r--r--src/application.rs4
-rw-r--r--src/components/confirm/tests.rs3
-rw-r--r--src/input.rs2
-rw-r--r--src/input/event_handler.rs2
-rw-r--r--src/input/testutil.rs136
-rw-r--r--src/input/thread.rs3
-rw-r--r--src/module/tests.rs2
-rw-r--r--src/test_helpers.rs6
-rw-r--r--src/test_helpers/create_event_reader.rs42
-rw-r--r--src/test_helpers/create_test_keybindings.rs53
-rw-r--r--src/test_helpers/with_event_handler.rs33
-rw-r--r--src/testutil/module_test.rs5
-rw-r--r--src/testutil/process_test.rs5
-rw-r--r--src/testutil/test_module_provider.rs3
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,
};