testing: expand input aggregator state-machine contracts

This commit is contained in:
Brad Stein 2026-04-12 20:08:45 -03:00
parent e44ab7feb0
commit 28d490c5eb

View File

@ -78,6 +78,12 @@ mod inputs_contract {
open_virtual_device(&mut vdev)
}
fn new_aggregator() -> InputAggregator {
let (kbd_tx, _) = tokio::sync::broadcast::channel(32);
let (mou_tx, _) = tokio::sync::broadcast::channel(32);
InputAggregator::new(false, kbd_tx, mou_tx, None)
}
#[test]
#[serial]
fn classify_device_recognizes_keyboard_and_mouse_capabilities() {
@ -89,4 +95,42 @@ mod inputs_contract {
assert!(matches!(classify_device(&mouse), DeviceKind::Mouse));
}
}
#[test]
fn toggle_grab_switches_into_local_control_mode() {
let mut agg = new_aggregator();
agg.toggle_grab();
assert!(agg.pending_release);
assert!(!agg.released);
}
#[test]
fn toggle_grab_switches_back_to_remote_control_when_released() {
let mut agg = new_aggregator();
agg.released = true;
agg.pending_release = false;
agg.toggle_grab();
assert!(!agg.released);
assert!(!agg.pending_release);
}
#[test]
fn toggle_grab_ignores_requests_while_release_is_pending() {
let mut agg = new_aggregator();
agg.pending_release = true;
agg.toggle_grab();
assert!(agg.pending_release);
assert!(!agg.released);
}
#[tokio::test(flavor = "current_thread")]
async fn run_returns_once_pending_kill_chord_is_released() {
let mut agg = new_aggregator();
agg.pending_kill = true;
let result = tokio::time::timeout(Duration::from_millis(200), agg.run()).await;
assert!(result.is_ok(), "run should resolve instead of looping forever");
assert!(result.expect("timeout result").is_ok());
assert!(agg.released);
}
}