From c4bbe2015f14c1453dec1d463ce25e5113200500 Mon Sep 17 00:00:00 2001 From: demenik Date: Wed, 10 Dec 2025 19:50:25 +0100 Subject: [PATCH 1/2] fix: `SessionTracker` now updates at the same time berries are granted (#54) --- src/features/phase/mod.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/features/phase/mod.rs b/src/features/phase/mod.rs index d730262..baf6397 100644 --- a/src/features/phase/mod.rs +++ b/src/features/phase/mod.rs @@ -135,6 +135,7 @@ fn grant_focus_rewards( berries as i32, ); session_tracker.total_berries_earned += berries; + session_tracker.completed_focus_phases += 1; let berries_name = match berries { 1 => ItemType::Berry.singular(&game_config), @@ -179,14 +180,12 @@ fn handle_pause( /// Transitions to the next phase based on current state. pub fn next_phase( current_phase: &mut CurrentPhase, - session_tracker: &mut SessionTracker, + session_tracker: &SessionTracker, settings: &TimerSettings, ) { if let Phase::Finished { completed_phase } = ¤t_phase.0 { match **completed_phase { Phase::Focus { .. } => { - session_tracker.completed_focus_phases += 1; - let is_long_break = session_tracker.completed_focus_phases > 0 && session_tracker.completed_focus_phases % settings.long_break_interval == 0; @@ -214,7 +213,7 @@ pub fn next_phase( pub fn handle_continue( mut messages: MessageReader, mut phase_res: ResMut, - mut session_tracker: ResMut, + session_tracker: Res, settings: Res, mut tile_query: Query<&mut TileState>, game_config: Res, @@ -226,7 +225,7 @@ pub fn handle_continue( false }; - next_phase(&mut phase_res, &mut session_tracker, &settings); + next_phase(&mut phase_res, &session_tracker, &settings); if entering_break { println!("Growing crops and resetting watered state."); From 24cecb582a3966ffcbd819a1df9201c25ec8f3b8 Mon Sep 17 00:00:00 2001 From: demenik Date: Wed, 10 Dec 2025 20:00:07 +0100 Subject: [PATCH 2/2] test: Update session test to reflect `SessionTracker` bug fix --- tests/session.rs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tests/session.rs b/tests/session.rs index ce8c486..b17efec 100644 --- a/tests/session.rs +++ b/tests/session.rs @@ -11,9 +11,13 @@ fn test_session_tracker_focus_to_short_break() { }), }); let timer_settings = TimerSettings::default(); - let mut session_tracker = SessionTracker::default(); + // Simulate that grant_focus_rewards has already incremented the counter + let session_tracker = SessionTracker { + completed_focus_phases: 1, + total_berries_earned: 0, + }; - next_phase(&mut current_phase, &mut session_tracker, &timer_settings); + next_phase(&mut current_phase, &session_tracker, &timer_settings); assert_eq!( session_tracker.completed_focus_phases, 1, @@ -37,16 +41,17 @@ fn test_session_tracker_focus_to_long_break() { }), }); let timer_settings = TimerSettings::default(); - let mut session_tracker = SessionTracker { - completed_focus_phases: timer_settings.long_break_interval - 1, + // Simulate that grant_focus_rewards has already incremented the counter to the interval + let session_tracker = SessionTracker { + completed_focus_phases: timer_settings.long_break_interval, total_berries_earned: 0, - }; // To trigger long break on next phase + }; - next_phase(&mut current_phase, &mut session_tracker, &timer_settings); + next_phase(&mut current_phase, &session_tracker, &timer_settings); assert_eq!( session_tracker.completed_focus_phases, timer_settings.long_break_interval, - "Completed focus phases should reach long break interval" + "Completed focus phases should remain at long break interval" ); if let Phase::Break { duration } = current_phase.0 { assert_eq!( @@ -65,13 +70,13 @@ fn test_session_tracker_break_to_focus() { duration: 5.0 * 60.0, }), }); - let mut session_tracker = SessionTracker { + let session_tracker = SessionTracker { completed_focus_phases: 1, total_berries_earned: 0, }; // Arbitrary value, should not change let timer_settings = TimerSettings::default(); - next_phase(&mut current_phase, &mut session_tracker, &timer_settings); + next_phase(&mut current_phase, &session_tracker, &timer_settings); assert_eq!( session_tracker.completed_focus_phases, 1, @@ -91,7 +96,7 @@ fn test_session_tracker_break_to_focus() { fn test_session_tracker_not_finished_phase_no_change() { // Test that nothing changes if the phase is not `Finished` let mut current_phase = CurrentPhase(Phase::Focus { duration: 100.0 }); - let mut session_tracker = SessionTracker { + let session_tracker = SessionTracker { completed_focus_phases: 0, total_berries_earned: 0, }; @@ -100,7 +105,7 @@ fn test_session_tracker_not_finished_phase_no_change() { let initial_phase = current_phase.0.clone(); let initial_completed_focus = session_tracker.completed_focus_phases; - next_phase(&mut current_phase, &mut session_tracker, &timer_settings); + next_phase(&mut current_phase, &session_tracker, &timer_settings); assert_eq!( current_phase.0, initial_phase, @@ -111,3 +116,4 @@ fn test_session_tracker_not_finished_phase_no_change() { "Session tracker should not change if phase not Finished" ); } +