Skip to content

Commit f265cfd

Browse files
committed
Remove lightStates map entry if no states remain
1 parent bfce8cb commit f265cfd

3 files changed

Lines changed: 74 additions & 1 deletion

File tree

src/main/java/at/sv/hue/SceneStateDiscoveryService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ private String removeAffectedStates(String sceneId) {
139139

140140
private void rescheduleGroupStates(String affectedGroup) {
141141
List<ScheduledState> states = stateRegistry.findStatesForId(affectedGroup);
142+
if (states == null) {
143+
return;
144+
}
142145
states.forEach(ScheduledState::invalidate);
143146
states.forEach(state -> manualOverrideReset.accept(state.getId()));
144147
initialSchedule.accept(states, currentTime.get());

src/main/java/at/sv/hue/ScheduledStateRegistry.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ public synchronized void addState(ScheduledState state) {
3838
}
3939

4040
public synchronized void remove(ScheduledState state) {
41-
lightStates.get(state.getId()).remove(state);
41+
List<ScheduledState> states = lightStates.get(state.getId());
42+
states.remove(state);
43+
if (states.isEmpty()) {
44+
lightStates.remove(state.getId());
45+
}
4246
}
4347

4448
public synchronized ScheduledStateSnapshot getPreviousState(ScheduledStateSnapshot currentStateSnapshot) {

src/test/java/at/sv/hue/HueSchedulerSceneStateTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)