@@ -558,3 +558,60 @@ async def test_timer_skip_missed_and_drift(
558558 drift = await timer .receive ()
559559 assert event_loop .time () == pytest .approx (interval * 14 + tolerance * 3 + 0.001 )
560560 assert drift == pytest .approx (timedelta (seconds = 0.0 ))
561+
562+
563+ async def test_timer_reset_with_new_interval (
564+ event_loop : async_solipsism .EventLoop , # pylint: disable=redefined-outer-name
565+ ) -> None :
566+ """Test resetting the timer with a new interval."""
567+ initial_interval = timedelta (seconds = 1.0 )
568+ new_interval = timedelta (seconds = 2.0 )
569+ timer = Timer (initial_interval , TriggerAllMissed ())
570+
571+ # Wait for the first tick
572+ drift = await timer .receive ()
573+ assert drift == timedelta (seconds = 0.0 )
574+ assert event_loop .time () == pytest .approx (1.0 )
575+
576+ # Reset the timer with a new interval
577+ timer .reset (interval = new_interval )
578+
579+ # The next tick should occur after the new interval
580+ drift = await timer .receive ()
581+ assert drift == timedelta (seconds = 0.0 )
582+ assert event_loop .time () == pytest .approx (3.0 )
583+
584+ # Ensure the timer continues with the new interval
585+ drift = await timer .receive ()
586+ assert drift == timedelta (seconds = 0.0 )
587+ assert event_loop .time () == pytest .approx (5.0 )
588+
589+
590+ async def test_timer_immediate_interruption_on_reset () -> None :
591+ """Test that the timer is interrupted immediately upon reset."""
592+ timer1 = Timer (timedelta (seconds = 5.0 ), TriggerAllMissed ())
593+ timer2 = Timer (timedelta (seconds = 1.0 ), TriggerAllMissed ())
594+ timer3 = Timer (timedelta (seconds = 4.0 ), TriggerAllMissed ())
595+
596+ timer_trigger_order = []
597+
598+ async def reset_timer1 () -> None :
599+ await timer2 .receive ()
600+ timer_trigger_order .append (2 )
601+ timer1 .reset (interval = timedelta (seconds = 1.0 ))
602+ timer2 .stop ()
603+
604+ async def receive_timer2 () -> None :
605+ await timer1 .receive ()
606+ timer_trigger_order .append (1 )
607+
608+ async def receive_timer3 () -> None :
609+ await timer3 .receive ()
610+ timer_trigger_order .append (3 )
611+
612+ task1 = asyncio .create_task (reset_timer1 ())
613+ task2 = asyncio .create_task (receive_timer2 ())
614+ task3 = asyncio .create_task (receive_timer3 ())
615+
616+ await asyncio .wait ([task1 , task2 , task3 ])
617+ assert timer_trigger_order == [2 , 1 , 3 ]
0 commit comments