summaryrefslogtreecommitdiffstats
path: root/src/core/src/testutil/test_module.rs
blob: 61e897599d16ae039b088fe7dff51994a4c0cae0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use input::Event;
use todo_file::TodoFile;
use view::{RenderContext, ViewData, ViewSender};

use crate::module::{Module, ProcessResult};

pub(crate) struct TestModule<'module> {
	event_callback: Box<dyn Fn(Event, &ViewSender, &mut TodoFile) -> ProcessResult + Send + 'module>,
	view_data: ViewData,
	view_data_callback: Box<dyn Fn(&mut ViewData) + Send + 'module>,
}

impl<'module> TestModule<'module> {
	pub(crate) fn new() -> Self {
		Self {
			event_callback: Box::new(|event, _, _| ProcessResult::from(event)),
			view_data: ViewData::new(|_| {}),
			view_data_callback: Box::new(|_| {}),
		}
	}

	pub(crate) fn event_callback<EC>(&mut self, callback: EC)
	where
		EC: Fn(Event, &ViewSender, &mut TodoFile) -> ProcessResult,
		EC: Send + 'module,
	{
		self.event_callback = Box::new(callback);
	}

	pub(crate) fn view_data_callback<VDC>(&mut self, callback: VDC)
	where
		VDC: Fn(&mut ViewData),
		VDC: Send + 'module,
	{
		self.view_data_callback = Box::new(callback);
	}
}

impl Module for TestModule<'_> {
	fn build_view_data(&mut self, _render_context: &RenderContext, _rebase_todo: &TodoFile) -> &ViewData {
		(self.view_data_callback)(&mut self.view_data);
		&self.view_data
	}

	fn handle_event(&mut self, event: Event, view_sender: &ViewSender, todo_file: &mut TodoFile) -> ProcessResult {
		(self.event_callback)(event, view_sender, todo_file)
	}
}