vim_binding_test_context.rs

 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}