shared/
test.rs

1pub struct Keypad<'a>(
2    core::slice::Iter<'a, crate::KeyEvent>,
3    Option<embassy_time::Instant>,
4    bool,
5);
6
7#[cfg(test)]
8impl<'a> Keypad<'a> {
9    pub fn new(events: &'a [crate::KeyEvent]) -> Self {
10        let driver = embassy_time::MockDriver::get();
11        driver.reset();
12        Self(events.iter(), None, false)
13    }
14
15    pub fn pending(&mut self) {
16        self.2 = true;
17    }
18
19    pub fn advance_by_millis(&self, millis: u64) {
20        embassy_time::MockDriver::get().advance(embassy_time::Duration::from_millis(millis));
21    }
22}
23
24impl<'a> crate::Keypad for Keypad<'a> {
25    async fn event(&mut self) -> crate::KeyEvent {
26        if self.2 {
27            core::future::pending().await
28        } else {
29            let result = self.0.next().unwrap().clone();
30            self.1.replace(embassy_time::Instant::now());
31
32            result
33        }
34    }
35
36    fn last_pressed(&mut self) -> Option<embassy_time::Duration> {
37        if let Some(last_time_pressed) = self.1 {
38            return Some(embassy_time::Instant::now() - last_time_pressed);
39        }
40        None
41    }
42}
43
44#[cfg(test)]
45mod test {
46    use futures_executor::block_on;
47
48    use crate::Keypad;
49
50    #[test]
51    fn test_keypad() {
52        block_on(async {
53            let mut keypad = super::Keypad::new(&[
54                crate::KeyEvent::Down(crate::Key::Two),
55                crate::KeyEvent::Down(crate::Key::Three),
56            ]);
57
58            assert_eq!(keypad.last_pressed(), None);
59            assert_eq!(keypad.event().await, crate::KeyEvent::Down(crate::Key::Two));
60            assert_eq!(
61                keypad.last_pressed(),
62                Some(embassy_time::Duration::from_secs(0))
63            );
64            assert_eq!(
65                keypad.event().await,
66                crate::KeyEvent::Down(crate::Key::Three)
67            );
68            keypad.advance_by_millis(1000);
69            assert_eq!(
70                keypad.last_pressed(),
71                Some(embassy_time::Duration::from_millis(1000))
72            );
73        });
74    }
75}