Added unittest
This commit is contained in:
parent
cd54773b70
commit
a165558875
@ -112,7 +112,114 @@ impl<'a, const R: usize, const C: usize, const N: usize> ButtonMatrix<'a, R, C,
|
|||||||
///
|
///
|
||||||
/// For small `N` this copy is cheap. If needed, the API could be extended to
|
/// For small `N` this copy is cheap. If needed, the API could be extended to
|
||||||
/// return a reference in the future.
|
/// return a reference in the future.
|
||||||
pub fn buttons_pressed(&mut self) -> [bool; N] {
|
pub fn buttons_pressed(&mut self) -> [bool; N] {
|
||||||
self.pressed
|
self.pressed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(test, feature = "std"))]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use core::cell::Cell;
|
||||||
|
use embedded_hal::digital::ErrorType;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
struct MockInputPin {
|
||||||
|
state: Rc<Cell<bool>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MockInputPin {
|
||||||
|
fn new(state: Rc<Cell<bool>>) -> Self {
|
||||||
|
Self { state }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ErrorType for MockInputPin {
|
||||||
|
type Error = Infallible;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InputPin for MockInputPin {
|
||||||
|
fn is_high(&mut self) -> Result<bool, Self::Error> {
|
||||||
|
Ok(!self.state.get())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_low(&mut self) -> Result<bool, Self::Error> {
|
||||||
|
Ok(self.state.get())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MockOutputPin {
|
||||||
|
state: Rc<Cell<bool>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MockOutputPin {
|
||||||
|
fn new(state: Rc<Cell<bool>>) -> Self {
|
||||||
|
Self { state }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ErrorType for MockOutputPin {
|
||||||
|
type Error = Infallible;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OutputPin for MockOutputPin {
|
||||||
|
fn set_high(&mut self) -> Result<(), Self::Error> {
|
||||||
|
self.state.set(true);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_low(&mut self) -> Result<(), Self::Error> {
|
||||||
|
self.state.set(false);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn matrix_fixture() -> (
|
||||||
|
ButtonMatrix<'static, 1, 1, 1>,
|
||||||
|
Rc<Cell<bool>>,
|
||||||
|
Rc<Cell<bool>>,
|
||||||
|
) {
|
||||||
|
let row_state = Rc::new(Cell::new(false));
|
||||||
|
let col_state = Rc::new(Cell::new(false));
|
||||||
|
|
||||||
|
let row_pin: &'static mut dyn InputPin<Error = Infallible> =
|
||||||
|
Box::leak(Box::new(MockInputPin::new(row_state.clone())));
|
||||||
|
let col_pin: &'static mut dyn OutputPin<Error = Infallible> =
|
||||||
|
Box::leak(Box::new(MockOutputPin::new(col_state.clone())));
|
||||||
|
|
||||||
|
let rows: &'static mut [&'static mut dyn InputPin<Error = Infallible>; 1] =
|
||||||
|
Box::leak(Box::new([row_pin]));
|
||||||
|
let cols: &'static mut [&'static mut dyn OutputPin<Error = Infallible>; 1] =
|
||||||
|
Box::leak(Box::new([col_pin]));
|
||||||
|
|
||||||
|
let matrix = ButtonMatrix::new(rows, cols, 2);
|
||||||
|
|
||||||
|
(matrix, row_state, col_state)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn init_pins_sets_columns_high() {
|
||||||
|
let (mut matrix, _row_state, col_state) = matrix_fixture();
|
||||||
|
assert!(!col_state.get());
|
||||||
|
matrix.init_pins();
|
||||||
|
assert!(col_state.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn process_column_obeys_debounce() {
|
||||||
|
let (mut matrix, row_state, _col_state) = matrix_fixture();
|
||||||
|
let mut states = matrix.buttons_pressed();
|
||||||
|
assert!(!states[0]);
|
||||||
|
row_state.set(true);
|
||||||
|
matrix.process_column(0);
|
||||||
|
matrix.process_column(0);
|
||||||
|
states = matrix.buttons_pressed();
|
||||||
|
assert!(states[0]);
|
||||||
|
|
||||||
|
row_state.set(false);
|
||||||
|
matrix.process_column(0);
|
||||||
|
matrix.process_column(0);
|
||||||
|
states = matrix.buttons_pressed();
|
||||||
|
assert!(!states[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -163,3 +163,41 @@ pub fn configure_button_mappings(buttons: &mut [Button]) {
|
|||||||
buttons[BUTTON_FRONT_LEFT_EXTRA].usb_button = USB_BUTTON_30;
|
buttons[BUTTON_FRONT_LEFT_EXTRA].usb_button = USB_BUTTON_30;
|
||||||
buttons[BUTTON_FRONT_RIGHT_EXTRA].usb_button = USB_BUTTON_31;
|
buttons[BUTTON_FRONT_RIGHT_EXTRA].usb_button = USB_BUTTON_31;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(test, feature = "std"))]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use crate::buttons::{Button, TOTAL_BUTTONS};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn front_buttons_have_expected_mappings() {
|
||||||
|
let mut buttons = [Button::default(); TOTAL_BUTTONS];
|
||||||
|
configure_button_mappings(&mut buttons);
|
||||||
|
|
||||||
|
assert_eq!(buttons[BUTTON_FRONT_LEFT_LOWER].usb_button, USB_BUTTON_29);
|
||||||
|
assert_eq!(buttons[BUTTON_FRONT_RIGHT_UPPER].usb_button, USB_BUTTON_1);
|
||||||
|
assert_eq!(buttons[BUTTON_FRONT_CONFIG].usb_button_long, USB_BUTTON_3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn long_press_flags_set_correctly() {
|
||||||
|
let mut buttons = [Button::default(); TOTAL_BUTTONS];
|
||||||
|
configure_button_mappings(&mut buttons);
|
||||||
|
|
||||||
|
assert!(buttons[BUTTON_TOP_LEFT_LOW].enable_long_press);
|
||||||
|
assert!(buttons[BUTTON_TOP_LEFT_LOW].enable_long_hold);
|
||||||
|
assert!(buttons[BUTTON_TOP_RIGHT_LOW].enable_long_press);
|
||||||
|
assert!(!buttons[BUTTON_TOP_RIGHT_LOW].enable_long_hold);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hat_buttons_map_to_expected_ids() {
|
||||||
|
let mut buttons = [Button::default(); TOTAL_BUTTONS];
|
||||||
|
configure_button_mappings(&mut buttons);
|
||||||
|
|
||||||
|
assert_eq!(buttons[BUTTON_TOP_RIGHT_HAT_UP].usb_button, USB_HAT_UP);
|
||||||
|
assert_eq!(buttons[BUTTON_TOP_RIGHT_HAT_RIGHT].usb_button, USB_HAT_RIGHT);
|
||||||
|
assert_eq!(buttons[BUTTON_TOP_RIGHT_HAT_DOWN].usb_button, USB_HAT_DOWN);
|
||||||
|
assert_eq!(buttons[BUTTON_TOP_RIGHT_HAT_LEFT].usb_button, USB_HAT_LEFT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user