1use std::ops::{Deref, DerefMut};
2
3use crate::*;
4
5use super::VimTestContext;
6
7pub struct VimBindingTestContext<'a, const COUNT: usize> {
8 cx: VimTestContext<'a>,
9 keystrokes_under_test: [&'static str; COUNT],
10 mode_before: Mode,
11 mode_after: Mode,
12}
13
14impl<'a, const COUNT: usize> VimBindingTestContext<'a, COUNT> {
15 pub fn new(
16 keystrokes_under_test: [&'static str; COUNT],
17 mode_before: Mode,
18 mode_after: Mode,
19 cx: VimTestContext<'a>,
20 ) -> Self {
21 Self {
22 cx,
23 keystrokes_under_test,
24 mode_before,
25 mode_after,
26 }
27 }
28
29 pub fn binding<const NEW_COUNT: usize>(
30 self,
31 keystrokes_under_test: [&'static str; NEW_COUNT],
32 ) -> VimBindingTestContext<'a, NEW_COUNT> {
33 VimBindingTestContext {
34 keystrokes_under_test,
35 cx: self.cx,
36 mode_before: self.mode_before,
37 mode_after: self.mode_after,
38 }
39 }
40
41 pub fn assert(&mut self, initial_state: &str, state_after: &str) {
42 self.cx.assert_binding(
43 self.keystrokes_under_test,
44 initial_state,
45 self.mode_before,
46 state_after,
47 self.mode_after,
48 )
49 }
50}
51
52impl<'a, const COUNT: usize> Deref for VimBindingTestContext<'a, COUNT> {
53 type Target = VimTestContext<'a>;
54
55 fn deref(&self) -> &Self::Target {
56 &self.cx
57 }
58}
59
60impl<'a, const COUNT: usize> DerefMut for VimBindingTestContext<'a, COUNT> {
61 fn deref_mut(&mut self) -> &mut Self::Target {
62 &mut self.cx
63 }
64}