input_manager/button/
button.rs

1use change::ButtonChange;
2
3#[derive(Default, Debug, PartialEq)]
4pub struct Button {
5    pub pressed: bool,
6    pub new_event: bool,
7}
8
9pub trait IButton {
10    fn apply(&mut self, ButtonChange);
11    fn tick(&mut self);
12}
13
14impl IButton for Button {
15    fn apply(&mut self, change: ButtonChange) {
16        if self.pressed != change.0 {
17            self.new_event = true;
18        }
19        self.pressed = change.0;
20    }
21    fn tick(&mut self) {
22        self.new_event = false;
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    #[test]
30    fn can_apply() {
31        let mut button = Button::default();
32        button.apply(ButtonChange(true));
33        assert_eq!(button.pressed, true);
34        button.apply(ButtonChange(false));
35        assert_eq!(button.pressed, false);
36    }
37    #[test]
38    fn new_event_on_change() {
39        let mut button = Button::default();
40        button.apply(ButtonChange(true));
41        assert_eq!(button.new_event, true);
42        button.apply(ButtonChange(false));
43        assert_eq!(button.new_event, true);
44    }
45    #[test]
46    fn new_event_only_on_change() {
47        let mut button = Button::default();
48        button.apply(ButtonChange(false));
49        assert_eq!(button.new_event, false);
50        button = Button {
51            pressed: true,
52            new_event: false,
53        };
54        button.apply(ButtonChange(true));
55        assert_eq!(button.new_event, false);
56    }
57    #[test]
58    fn new_event_cleared_by_tick() {
59        let mut button = Button {
60            pressed: true,
61            new_event: true,
62        };
63        button.tick();
64        assert_eq!(button.new_event, false);
65    }
66}