#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub struct Button {
pub pressed: bool,
pub released: bool,
pub held: bool,
}
impl Button {
pub fn new(state: bool) -> Self {
Self {
pressed: state,
released: false,
held: state,
}
}
pub fn update(&mut self, state: bool) {
self.pressed = state && !self.held;
self.released = !state && self.held;
self.held = state;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_initial_state() {
assert_eq!(
Button::new(false),
Button {
pressed: false,
released: false,
held: false
}
);
assert_eq!(
Button::new(true),
Button {
pressed: true,
released: false,
held: true
}
);
}
#[test]
fn test_update_state() {
let mut btn = Button::new(false);
btn.update(true);
assert_eq!(
btn,
Button {
pressed: true,
released: false,
held: true,
}
);
btn.update(true);
assert_eq!(
btn,
Button {
pressed: false,
released: false,
held: true,
}
);
btn.update(false);
assert_eq!(
btn,
Button {
pressed: false,
released: true,
held: false,
}
);
btn.update(false);
assert_eq!(
btn,
Button {
pressed: false,
released: false,
held: false,
}
);
}
}