diff --git a/solitaire_engine/src/leaderboard_plugin.rs b/solitaire_engine/src/leaderboard_plugin.rs index aa2649e..07830e3 100644 --- a/solitaire_engine/src/leaderboard_plugin.rs +++ b/solitaire_engine/src/leaderboard_plugin.rs @@ -586,4 +586,25 @@ mod tests { fn format_secs_above_minute() { assert_eq!(format_secs(183), "3:03"); } + + #[test] + fn format_secs_zero() { + assert_eq!(format_secs(0), "0s"); + } + + #[test] + fn format_secs_59_stays_below_minute() { + assert_eq!(format_secs(59), "59s"); + } + + #[test] + fn format_secs_60_crosses_into_minutes() { + assert_eq!(format_secs(60), "1:00"); + } + + #[test] + fn format_secs_pads_seconds_with_leading_zero() { + // 65 seconds = 1:05, not 1:5 + assert_eq!(format_secs(65), "1:05"); + } } diff --git a/solitaire_engine/src/pause_plugin.rs b/solitaire_engine/src/pause_plugin.rs index 105a46e..f5ed585 100644 --- a/solitaire_engine/src/pause_plugin.rs +++ b/solitaire_engine/src/pause_plugin.rs @@ -151,4 +151,28 @@ mod tests { 0 ); } + + #[test] + fn toggle_is_symmetric_for_multiple_cycles() { + let mut app = headless_app(); + // Third press re-pauses after resume. + press_esc(&mut app); + app.update(); + press_esc(&mut app); + app.update(); + press_esc(&mut app); + app.update(); + assert!( + app.world().resource::().0, + "third Esc must re-pause" + ); + assert_eq!( + app.world_mut() + .query::<&PauseScreen>() + .iter(app.world()) + .count(), + 1, + "third Esc must re-spawn PauseScreen" + ); + } }