@@ -830,6 +830,72 @@ void autoSceneStates_withManualSceneStates_onRename_removesAndReschedules() {
830830 );
831831 }
832832
833+ @ Test
834+ void autoSceneStates_overlappingGroups_onDelete_removesAdditionalDelayOnReschedule () {
835+ enableAutoSceneStates ();
836+ mockDefaultGroupCapabilities (1 );
837+ mockDefaultGroupCapabilities (2 );
838+ mockGroupLightsForId (1 , 5 , 6 , 7 );
839+ mockGroupLightsForId (2 , 5 , 6 );
840+ mockAssignedGroups (5 , 1 , 2 );
841+ mockAssignedGroups (6 , 1 , 2 );
842+ mockAssignedGroups (7 , 1 );
843+ Identifier scene1 = mockSceneLightStates (1 , 1 , "TestScene1" ,
844+ ScheduledLightState .builder ()
845+ .id ("/lights/5" )
846+ .bri (100 ),
847+ ScheduledLightState .builder ()
848+ .id ("/lights/6" )
849+ .bri (50 ),
850+ ScheduledLightState .builder ()
851+ .id ("/lights/7" )
852+ .bri (20 ));
853+ mockSceneLightStates (2 , 2 , "TestScene2" ,
854+ ScheduledLightState .builder ()
855+ .id ("/lights/5" )
856+ .bri (100 ),
857+ ScheduledLightState .builder ()
858+ .id ("/lights/6" )
859+ .bri (50 ));
860+ addState ("g1" , now , "scene:TestScene1" );
861+ addState ("g2" , now , "scene:TestScene2" );
862+ addState ("g1" , now .plusMinutes (10 ), "scene:TestScene1" , "bri:50%" );
863+ addState ("g2" , now .plusMinutes (10 ), "scene:TestScene2" , "bri:50%" );
864+
865+ List <ScheduledRunnable > states = startScheduler (
866+ expectedRunnable (now , now .plusMinutes (10 )), // g1
867+ expectedRunnable (now .plusSeconds (1 ), now .plusMinutes (10 )), // g2
868+ expectedRunnable (now .plusMinutes (10 ), now .plusDays (1 )),
869+ expectedRunnable (now .plusMinutes (10 ).plusSeconds (1 ), now .plusDays (1 ))
870+ );
871+
872+ simulateSceneDeletion (scene1 .id ());
873+
874+ ensureScheduledStates (0 );
875+
876+ advanceTimeAndRunAndAssertScenePutCalls (states .get (0 ), 1 ); // g1.1 was canceled
877+
878+ // g2.1 unaffected
879+ advanceTimeAndRunAndAssertScenePutCalls (states .get (1 ), 2 ,
880+ expectedPutCall (5 ).bri (100 ),
881+ expectedPutCall (6 ).bri (50 )
882+ );
883+
884+ // Next day does not have any offset anymore
885+ ensureRunnable (initialNow .plusDays (1 ), initialNow .plusDays (1 ).plusMinutes (10 ));
886+
887+ advanceTimeAndRunAndAssertScenePutCalls (states .get (2 ), 1 ); // g1.2 was canceled
888+
889+ // g2.2 unaffected
890+ advanceTimeAndRunAndAssertScenePutCalls (states .get (3 ), 2 ,
891+ expectedPutCall (5 ).bri (50 ),
892+ expectedPutCall (6 ).bri (25 )
893+ );
894+
895+ // Next day does not have any offset anymore
896+ ensureRunnable (initialNow .plusDays (1 ).plusMinutes (10 ), initialNow .plusDays (2 ));
897+ }
898+
833899 private void mockGetAllScenes (Identifier ... scenes ) {
834900 when (mockedHueApi .getAllScenes ()).thenReturn (Arrays .asList (scenes ));
835901 }
0 commit comments