From 28d490c5eb7ae20a2d1fb03e88d7347ffcc1020d Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Sun, 12 Apr 2026 20:08:45 -0300 Subject: [PATCH] testing: expand input aggregator state-machine contracts --- testing/tests/client_inputs_contract.rs | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/testing/tests/client_inputs_contract.rs b/testing/tests/client_inputs_contract.rs index 2e1bf17..0ef939f 100644 --- a/testing/tests/client_inputs_contract.rs +++ b/testing/tests/client_inputs_contract.rs @@ -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); + } }