diff --git a/src/device/keyboard.rs b/src/device/keyboard.rs index 562e41b..78840c5 100644 --- a/src/device/keyboard.rs +++ b/src/device/keyboard.rs @@ -50,7 +50,7 @@ impl Keyboard { /// Query if key is down pub fn query_key_down(&self, key_num: u8) -> bool { - (self.bitflags | 1 << key_num) == (1 << key_num) + (self.bitflags & (1 << key_num)) == (1 << key_num) } fn update_keyboard_state(&mut self, keyboard_event: KeyboardEvent) { @@ -67,11 +67,53 @@ impl Keyboard { #[cfg(test)] mod tests { - use super::Key; + use super::{Key, Keyboard}; #[test] fn test_key_assignment(){ assert_eq!(0,Key::K0 as u16); assert_eq!(15,Key::KF as u16); } + + #[test] + fn test_key_at_nothing_pressed(){ + let (_sender,receiver) = std::sync::mpsc::sync_channel(1); + let keyboard = Keyboard::new(receiver); + assert_no_key_pressed(&keyboard); + + } + + #[test] + fn test_key_down_then_up(){ + let (sender,receiver) = std::sync::mpsc::sync_channel(1); + let mut keyboard = Keyboard::new(receiver); + assert_no_key_pressed(&keyboard); + + + sender.try_send(super::KeyboardEvent::KeyDown(Key::K0)).expect("Could not send"); + keyboard.update_keyboard_registers().expect("Could not update keyboard"); + + + assert_eq!(1,keyboard.bitflags); + assert_eq!(true,keyboard.query_key_down(0)); + for i in 1..=0xF { + assert_eq!(false,keyboard.query_key_down(i)); + } + + + + sender.try_send(super::KeyboardEvent::KeyUp(Key::K0)).expect("Could not send"); + keyboard.update_keyboard_registers().expect("Could not update keyboard"); + assert_no_key_pressed(&keyboard); + } + + fn assert_no_key_pressed(keyboard: &Keyboard){ + assert_eq!(0,keyboard.bitflags); + for i in 0..=0xF { + assert_eq!(false,keyboard.query_key_down(i),"Failed to match at index {}, bitflags at {}",i,keyboard.bitflags); + } + } + + + }