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 mode_after(mut self, mode_after: Mode) -> Self {
42 self.mode_after = mode_after;
43 self
44 }
45
46 pub fn assert(&mut self, initial_state: &str, state_after: &str) {
47 self.cx.assert_binding(
48 self.keystrokes_under_test,
49 initial_state,
50 self.mode_before,
51 state_after,
52 self.mode_after,
53 )
54 }
55}
56
57impl<'a, const COUNT: usize> Deref for VimBindingTestContext<'a, COUNT> {
58 type Target = VimTestContext<'a>;
59
60 fn deref(&self) -> &Self::Target {
61 &self.cx
62 }
63}
64
65impl<'a, const COUNT: usize> DerefMut for VimBindingTestContext<'a, COUNT> {
66 fn deref_mut(&mut self) -> &mut Self::Target {
67 &mut self.cx
68 }
69}