use crate::link::reconcile::DesiredState;
use crate::types::{Action, Button, Key, MediaKey, Usage};
#[test]
fn default_is_idle() {
let d = DesiredState::default();
assert!(d.is_idle());
assert_eq!(d.held().count(), 0);
}
#[test]
fn press_is_held_and_non_idle() {
let mut d = DesiredState::default();
d.apply(Button::Left.into(), Action::Press);
assert!(!d.is_idle());
assert_eq!(
d.held().collect::<Vec<_>>(),
vec![(Usage::from(Button::Left), Action::Press)]
);
}
#[test]
fn force_release_is_held() {
let mut d = DesiredState::default();
d.apply(Button::Right.into(), Action::ForceRelease);
assert!(!d.is_idle());
assert_eq!(
d.held().collect::<Vec<_>>(),
vec![(Usage::from(Button::Right), Action::ForceRelease)]
);
}
#[test]
fn soft_release_clears_the_override() {
let mut d = DesiredState::default();
d.apply(Button::Middle.into(), Action::Press);
d.apply(Button::Middle.into(), Action::SoftRelease);
assert!(d.is_idle());
}
#[test]
fn clear_resets_all() {
let mut d = DesiredState::default();
d.apply(Button::Left.into(), Action::Press);
d.apply(Button::Side2.into(), Action::ForceRelease);
assert!(!d.is_idle());
d.clear();
assert!(d.is_idle());
assert_eq!(d.held().count(), 0);
}
#[test]
fn held_preserves_identity_in_class_then_id_order() {
let mut d = DesiredState::default();
d.apply(Button::Left.into(), Action::Press);
d.apply(Button::Side1.into(), Action::ForceRelease);
assert_eq!(
d.held().collect::<Vec<_>>(),
vec![
(Usage::from(Button::Left), Action::Press),
(Usage::from(Button::Side1), Action::ForceRelease),
]
);
}
#[test]
fn key_press_is_held_and_non_idle() {
let mut d = DesiredState::default();
d.apply(Key::A.into(), Action::Press);
assert!(!d.is_idle());
assert_eq!(
d.held().collect::<Vec<_>>(),
vec![(Usage::from(Key::A), Action::Press)]
);
}
#[test]
fn key_soft_release_clears_the_override() {
let mut d = DesiredState::default();
d.apply(Key::LEFT_SHIFT.into(), Action::Press);
d.apply(Key::LEFT_SHIFT.into(), Action::SoftRelease);
assert!(d.is_idle());
assert_eq!(d.held().count(), 0);
}
#[test]
fn media_press_is_held() {
let mut d = DesiredState::default();
d.apply(MediaKey::VOLUME_UP.into(), Action::Press);
assert!(!d.is_idle());
assert_eq!(
d.held().collect::<Vec<_>>(),
vec![(Usage::from(MediaKey::VOLUME_UP), Action::Press)]
);
}
#[test]
fn media_soft_release_clears_the_override() {
let mut d = DesiredState::default();
d.apply(MediaKey::MUTE.into(), Action::Press);
d.apply(MediaKey::MUTE.into(), Action::SoftRelease);
assert!(d.is_idle());
}
#[test]
fn one_store_holds_every_class_and_orders_by_class_then_id() {
let mut d = DesiredState::default();
d.apply(MediaKey::VOLUME_UP.into(), Action::Press);
d.apply(Button::Left.into(), Action::Press);
d.apply(Key::A.into(), Action::Press);
assert_eq!(
d.held().map(|(u, _)| u).collect::<Vec<_>>(),
vec![
Usage::from(Button::Left),
Usage::from(Key::A),
Usage::from(MediaKey::VOLUME_UP),
]
);
d.clear();
assert!(d.is_idle());
assert_eq!(d.held().count(), 0);
}
#[test]
fn idle_requires_every_class_empty() {
let mut d = DesiredState::default();
d.apply(Key::ESCAPE.into(), Action::Press);
assert!(!d.is_idle());
d.apply(Key::ESCAPE.into(), Action::SoftRelease);
assert!(d.is_idle());
d.apply(MediaKey::PLAY_PAUSE.into(), Action::ForceRelease);
assert!(!d.is_idle());
}