[fix] keyboard bug
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user