]> git.basschouten.com Git - openhab-addons.git/blob
d4f13caf25b762851f1e478292c97f027f920828
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.hdpowerview.internal;
14
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.mockito.Mockito.mock;
17
18 import java.util.ArrayList;
19 import java.util.Base64;
20 import java.util.List;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.junit.jupiter.api.BeforeEach;
24 import org.junit.jupiter.api.Test;
25 import org.openhab.binding.hdpowerview.internal.builders.AutomationChannelBuilder;
26 import org.openhab.binding.hdpowerview.internal.dto.Scene;
27 import org.openhab.binding.hdpowerview.internal.dto.SceneCollection;
28 import org.openhab.binding.hdpowerview.internal.dto.ScheduledEvent;
29 import org.openhab.binding.hdpowerview.internal.providers.MockedLocaleProvider;
30 import org.openhab.binding.hdpowerview.internal.providers.MockedTranslationProvider;
31 import org.openhab.core.thing.Channel;
32 import org.openhab.core.thing.ChannelGroupUID;
33 import org.openhab.core.thing.ThingUID;
34 import org.osgi.framework.Bundle;
35 import org.slf4j.LoggerFactory;
36
37 import ch.qos.logback.classic.Level;
38 import ch.qos.logback.classic.Logger;
39
40 /**
41  * Unit tests for {@link AutomationChannelBuilder}.
42  *
43  * @author Jacob Laursen - Initial contribution
44  */
45 @NonNullByDefault
46 public class AutomationChannelBuilderTest {
47
48     private static final ChannelGroupUID CHANNEL_GROUP_UID = new ChannelGroupUID(
49             new ThingUID(HDPowerViewBindingConstants.BINDING_ID, AutomationChannelBuilderTest.class.getSimpleName()),
50             HDPowerViewBindingConstants.CHANNELTYPE_AUTOMATION_ENABLED);
51
52     private static final HDPowerViewTranslationProvider TRANSLATION_PROVIDER = new HDPowerViewTranslationProvider(
53             mock(Bundle.class), new MockedTranslationProvider(), new MockedLocaleProvider());
54
55     private AutomationChannelBuilder builder = AutomationChannelBuilder.create(TRANSLATION_PROVIDER, CHANNEL_GROUP_UID);
56     private List<Scene> scenes = new ArrayList<>();
57     private List<SceneCollection> sceneCollections = new ArrayList<>();
58
59     @BeforeEach
60     public void setUp() {
61         final Logger logger = (Logger) LoggerFactory.getLogger(AutomationChannelBuilder.class);
62         logger.setLevel(Level.OFF);
63         builder = AutomationChannelBuilder.create(TRANSLATION_PROVIDER, CHANNEL_GROUP_UID);
64
65         Scene scene = new Scene();
66         scene.id = 1;
67         scene.name = Base64.getEncoder().encodeToString(("TestScene").getBytes());
68         scenes = new ArrayList<>(List.of(scene));
69
70         SceneCollection sceneCollection = new SceneCollection();
71         sceneCollection.id = 2;
72         sceneCollection.name = Base64.getEncoder().encodeToString(("TestSceneCollection").getBytes());
73         sceneCollections = new ArrayList<>(List.of(sceneCollection));
74     }
75
76     @Test
77     public void sceneSunriseWeekends() {
78         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
79         scheduledEvent.daySaturday = true;
80         scheduledEvent.daySunday = true;
81
82         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
83         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
84
85         assertEquals(1, channels.size());
86         assertEquals("TestScene, At sunrise, Weekends", channels.get(0).getLabel());
87     }
88
89     @Test
90     public void sceneSunsetWeekdays() {
91         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNSET);
92         scheduledEvent.dayMonday = true;
93         scheduledEvent.dayTuesday = true;
94         scheduledEvent.dayWednesday = true;
95         scheduledEvent.dayThursday = true;
96         scheduledEvent.dayFriday = true;
97
98         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
99         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
100
101         assertEquals(1, channels.size());
102         assertEquals("TestScene, At sunset, Weekdays", channels.get(0).getLabel());
103     }
104
105     @Test
106     public void sceneTimeAllDays() {
107         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_TIME);
108         scheduledEvent.dayMonday = true;
109         scheduledEvent.dayTuesday = true;
110         scheduledEvent.dayWednesday = true;
111         scheduledEvent.dayThursday = true;
112         scheduledEvent.dayFriday = true;
113         scheduledEvent.daySaturday = true;
114         scheduledEvent.daySunday = true;
115         scheduledEvent.hour = 6;
116         scheduledEvent.minute = 30;
117
118         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
119         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
120
121         assertEquals(1, channels.size());
122         assertEquals("TestScene, 06:30, All days", channels.get(0).getLabel());
123     }
124
125     @Test
126     public void sceneMinutesBeforeSunriseMondayTuesday() {
127         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
128         scheduledEvent.dayMonday = true;
129         scheduledEvent.dayTuesday = true;
130         scheduledEvent.minute = -15;
131
132         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
133         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
134
135         assertEquals(1, channels.size());
136         assertEquals("TestScene, 15m before sunrise, Mon, Tue", channels.get(0).getLabel());
137     }
138
139     @Test
140     public void sceneHoursMinutesAfterSunriseMonday() {
141         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
142         scheduledEvent.dayMonday = true;
143         scheduledEvent.minute = 61;
144
145         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
146         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
147
148         assertEquals(1, channels.size());
149         assertEquals("TestScene, 1hr 1m after sunrise, Mon", channels.get(0).getLabel());
150     }
151
152     @Test
153     public void sceneMinutesBeforeSunsetWednesdayThursdayFriday() {
154         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNSET);
155         scheduledEvent.dayWednesday = true;
156         scheduledEvent.dayThursday = true;
157         scheduledEvent.dayFriday = true;
158         scheduledEvent.minute = -59;
159
160         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
161         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
162
163         assertEquals(1, channels.size());
164         assertEquals("TestScene, 59m before sunset, Wed, Thu, Fri", channels.get(0).getLabel());
165     }
166
167     @Test
168     public void sceneHourAfterSunsetFridaySaturdaySunday() {
169         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNSET);
170         scheduledEvent.dayFriday = true;
171         scheduledEvent.daySaturday = true;
172         scheduledEvent.daySunday = true;
173         scheduledEvent.minute = 60;
174
175         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
176         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
177
178         assertEquals(1, channels.size());
179         assertEquals("TestScene, 1hr after sunset, Fri, Sat, Sun", channels.get(0).getLabel());
180     }
181
182     @Test
183     public void sceneCollection() {
184         ScheduledEvent scheduledEvent = createScheduledEventWithSceneCollection(
185                 ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
186
187         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
188         List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
189                 .build();
190
191         assertEquals(1, channels.size());
192         assertEquals("TestSceneCollection, At sunrise, ", channels.get(0).getLabel());
193     }
194
195     @Test
196     public void suppliedListIsUsed() {
197         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
198         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
199         List<Channel> existingChannels = new ArrayList<>(0);
200         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents)
201                 .withChannels(existingChannels).build();
202
203         assertEquals(existingChannels, channels);
204     }
205
206     @Test
207     public void emptyListWhenNoScheduledEvents() {
208         List<Channel> channels = builder.build();
209
210         assertEquals(0, channels.size());
211     }
212
213     @Test
214     public void emptyListWhenNoScenesOrSceneCollections() {
215         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
216         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
217         List<Channel> channels = builder.withScheduledEvents(scheduledEvents).build();
218
219         assertEquals(0, channels.size());
220     }
221
222     @Test
223     public void emptyListWhenNoSceneForScheduledEvent() {
224         ScheduledEvent scheduledEvent = createScheduledEventWithSceneCollection(
225                 ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
226         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
227         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
228
229         assertEquals(0, channels.size());
230     }
231
232     @Test
233     public void emptyListWhenNoSceneCollectionForScheduledEvent() {
234         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
235         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
236
237         List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
238                 .build();
239
240         assertEquals(0, channels.size());
241     }
242
243     @Test
244     public void groupAndIdAreCorrect() {
245         ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
246         scheduledEvent.id = 42;
247         List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
248         List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
249
250         assertEquals(1, channels.size());
251         assertEquals(CHANNEL_GROUP_UID.getId(), channels.get(0).getUID().getGroupId());
252         assertEquals(Integer.toString(scheduledEvent.id), channels.get(0).getUID().getIdWithoutGroup());
253     }
254
255     private ScheduledEvent createScheduledEventWithScene(int eventType) {
256         ScheduledEvent scheduledEvent = new ScheduledEvent();
257         scheduledEvent.id = 1;
258         scheduledEvent.sceneId = scenes.get(0).id;
259         scheduledEvent.eventType = eventType;
260         return scheduledEvent;
261     }
262
263     private ScheduledEvent createScheduledEventWithSceneCollection(int eventType) {
264         ScheduledEvent scheduledEvent = new ScheduledEvent();
265         scheduledEvent.id = 1;
266         scheduledEvent.sceneCollectionId = sceneCollections.get(0).id;
267         scheduledEvent.eventType = eventType;
268         return scheduledEvent;
269     }
270 }