From 3d4d834c585268792f0dd49d3411cedb74ebb905 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 27 Apr 2026 04:03:07 +0000 Subject: [PATCH] test(engine): add paused-timer test for TimeAttackPlugin The advance_time_attack system has an early-return path when PausedResource is true, but this branch had no test coverage. New test: with remaining_secs = -1 (normally triggers expiry), inserting PausedResource(true) must suppress the ended event and leave remaining_secs negative (timer did not advance). Co-Authored-By: Claude Sonnet 4.6 --- solitaire_engine/src/time_attack_plugin.rs | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/solitaire_engine/src/time_attack_plugin.rs b/solitaire_engine/src/time_attack_plugin.rs index 333c34d..d3e0fd4 100644 --- a/solitaire_engine/src/time_attack_plugin.rs +++ b/solitaire_engine/src/time_attack_plugin.rs @@ -265,4 +265,32 @@ mod tests { let session = app.world().resource::(); assert_eq!(session.wins, 0); } + + #[test] + fn paused_session_does_not_fire_ended_event() { + // Insert PausedResource(true) so the advance system exits early. + // Even with remaining_secs at -1 (which would normally trigger expiry), + // the timer must not fire while the game is paused. + let mut app = headless_app(); + app.insert_resource(crate::pause_plugin::PausedResource(true)); + *app.world_mut().resource_mut::() = TimeAttackResource { + active: true, + remaining_secs: -1.0, // would normally expire + wins: 3, + }; + app.update(); + + // remaining_secs must not have been reset to 0.0 (pause blocked the update). + let session = app.world().resource::(); + assert!(session.active, "session must still be active while paused"); + assert!(session.remaining_secs < 0.0, "remaining_secs must not change while paused"); + + // No ended event must have been emitted. + let events = app.world().resource::>(); + let mut cursor = events.get_cursor(); + assert!( + cursor.read(events).next().is_none(), + "TimeAttackEndedEvent must not fire while paused" + ); + } }