2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.hdpowerview;
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.mockito.Mockito.mock;
18 import java.util.ArrayList;
19 import java.util.Base64;
20 import java.util.List;
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.HDPowerViewBindingConstants;
26 import org.openhab.binding.hdpowerview.internal.HDPowerViewTranslationProvider;
27 import org.openhab.binding.hdpowerview.internal.api.responses.SceneCollections.SceneCollection;
28 import org.openhab.binding.hdpowerview.internal.api.responses.Scenes.Scene;
29 import org.openhab.binding.hdpowerview.internal.api.responses.ScheduledEvents;
30 import org.openhab.binding.hdpowerview.internal.api.responses.ScheduledEvents.ScheduledEvent;
31 import org.openhab.binding.hdpowerview.internal.builders.AutomationChannelBuilder;
32 import org.openhab.binding.hdpowerview.providers.MockedLocaleProvider;
33 import org.openhab.binding.hdpowerview.providers.MockedTranslationProvider;
34 import org.openhab.core.thing.Channel;
35 import org.openhab.core.thing.ChannelGroupUID;
36 import org.openhab.core.thing.ThingUID;
37 import org.osgi.framework.Bundle;
38 import org.slf4j.LoggerFactory;
40 import ch.qos.logback.classic.Level;
41 import ch.qos.logback.classic.Logger;
44 * Unit tests for {@link AutomationChannelBuilder}.
46 * @author Jacob Laursen - Initial contribution
49 public class AutomationChannelBuilderTest {
51 private static final ChannelGroupUID CHANNEL_GROUP_UID = new ChannelGroupUID(
52 new ThingUID(HDPowerViewBindingConstants.BINDING_ID, AutomationChannelBuilderTest.class.getSimpleName()),
53 HDPowerViewBindingConstants.CHANNELTYPE_AUTOMATION_ENABLED);
55 private static final HDPowerViewTranslationProvider TRANSLATION_PROVIDER = new HDPowerViewTranslationProvider(
56 mock(Bundle.class), new MockedTranslationProvider(), new MockedLocaleProvider());
58 private AutomationChannelBuilder builder = AutomationChannelBuilder.create(TRANSLATION_PROVIDER, CHANNEL_GROUP_UID);
59 private List<Scene> scenes = new ArrayList<>();
60 private List<SceneCollection> sceneCollections = new ArrayList<>();
63 private void setUp() {
64 final Logger logger = (Logger) LoggerFactory.getLogger(AutomationChannelBuilder.class);
65 logger.setLevel(Level.OFF);
66 builder = AutomationChannelBuilder.create(TRANSLATION_PROVIDER, CHANNEL_GROUP_UID);
68 Scene scene = new Scene();
70 scene.name = Base64.getEncoder().encodeToString(("TestScene").getBytes());
71 scenes = new ArrayList<>(List.of(scene));
73 SceneCollection sceneCollection = new SceneCollection();
74 sceneCollection.id = 2;
75 sceneCollection.name = Base64.getEncoder().encodeToString(("TestSceneCollection").getBytes());
76 sceneCollections = new ArrayList<>(List.of(sceneCollection));
80 public void sceneSunriseWeekends() {
81 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
82 scheduledEvent.daySaturday = true;
83 scheduledEvent.daySunday = true;
85 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
86 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
88 assertEquals(1, channels.size());
89 assertEquals("TestScene, At sunrise, Weekends", channels.get(0).getLabel());
93 public void sceneSunsetWeekdays() {
94 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNSET);
95 scheduledEvent.dayMonday = true;
96 scheduledEvent.dayTuesday = true;
97 scheduledEvent.dayWednesday = true;
98 scheduledEvent.dayThursday = true;
99 scheduledEvent.dayFriday = true;
101 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
102 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
104 assertEquals(1, channels.size());
105 assertEquals("TestScene, At sunset, Weekdays", channels.get(0).getLabel());
109 public void sceneTimeAllDays() {
110 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_TIME);
111 scheduledEvent.dayMonday = true;
112 scheduledEvent.dayTuesday = true;
113 scheduledEvent.dayWednesday = true;
114 scheduledEvent.dayThursday = true;
115 scheduledEvent.dayFriday = true;
116 scheduledEvent.daySaturday = true;
117 scheduledEvent.daySunday = true;
118 scheduledEvent.hour = 6;
119 scheduledEvent.minute = 30;
121 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
122 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
124 assertEquals(1, channels.size());
125 assertEquals("TestScene, 06:30, All days", channels.get(0).getLabel());
129 public void sceneMinutesBeforeSunriseMondayTuesday() {
130 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
131 scheduledEvent.dayMonday = true;
132 scheduledEvent.dayTuesday = true;
133 scheduledEvent.minute = -15;
135 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
136 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
138 assertEquals(1, channels.size());
139 assertEquals("TestScene, 15m before sunrise, Mon, Tue", channels.get(0).getLabel());
143 public void sceneHoursMinutesAfterSunriseMonday() {
144 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
145 scheduledEvent.dayMonday = true;
146 scheduledEvent.minute = 61;
148 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
149 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
151 assertEquals(1, channels.size());
152 assertEquals("TestScene, 1hr 1m after sunrise, Mon", channels.get(0).getLabel());
156 public void sceneMinutesBeforeSunsetWednesdayThursdayFriday() {
157 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNSET);
158 scheduledEvent.dayWednesday = true;
159 scheduledEvent.dayThursday = true;
160 scheduledEvent.dayFriday = true;
161 scheduledEvent.minute = -59;
163 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
164 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
166 assertEquals(1, channels.size());
167 assertEquals("TestScene, 59m before sunset, Wed, Thu, Fri", channels.get(0).getLabel());
171 public void sceneHourAfterSunsetFridaySaturdaySunday() {
172 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNSET);
173 scheduledEvent.dayFriday = true;
174 scheduledEvent.daySaturday = true;
175 scheduledEvent.daySunday = true;
176 scheduledEvent.minute = 60;
178 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
179 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
181 assertEquals(1, channels.size());
182 assertEquals("TestScene, 1hr after sunset, Fri, Sat, Sun", channels.get(0).getLabel());
186 public void sceneCollection() {
187 ScheduledEvent scheduledEvent = createScheduledEventWithSceneCollection(
188 ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
190 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
191 List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
194 assertEquals(1, channels.size());
195 assertEquals("TestSceneCollection, At sunrise, ", channels.get(0).getLabel());
199 public void suppliedListIsUsed() {
200 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
201 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
202 List<Channel> existingChannels = new ArrayList<>(0);
203 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents)
204 .withChannels(existingChannels).build();
206 assertEquals(existingChannels, channels);
210 public void emptyListWhenNoScheduledEvents() {
211 List<Channel> channels = builder.build();
213 assertEquals(0, channels.size());
217 public void emptyListWhenNoScenesOrSceneCollections() {
218 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
219 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
220 List<Channel> channels = builder.withScheduledEvents(scheduledEvents).build();
222 assertEquals(0, channels.size());
226 public void emptyListWhenNoSceneForScheduledEvent() {
227 ScheduledEvent scheduledEvent = createScheduledEventWithSceneCollection(
228 ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
229 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
230 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
232 assertEquals(0, channels.size());
236 public void emptyListWhenNoSceneCollectionForScheduledEvent() {
237 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
238 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
240 List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
243 assertEquals(0, channels.size());
247 public void groupAndIdAreCorrect() {
248 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvents.SCHEDULED_EVENT_TYPE_SUNRISE);
249 scheduledEvent.id = 42;
250 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
251 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
253 assertEquals(1, channels.size());
254 assertEquals(CHANNEL_GROUP_UID.getId(), channels.get(0).getUID().getGroupId());
255 assertEquals(Integer.toString(scheduledEvent.id), channels.get(0).getUID().getIdWithoutGroup());
258 private ScheduledEvent createScheduledEventWithScene(int eventType) {
259 ScheduledEvent scheduledEvent = new ScheduledEvent();
260 scheduledEvent.id = 1;
261 scheduledEvent.sceneId = scenes.get(0).id;
262 scheduledEvent.eventType = eventType;
263 return scheduledEvent;
266 private ScheduledEvent createScheduledEventWithSceneCollection(int eventType) {
267 ScheduledEvent scheduledEvent = new ScheduledEvent();
268 scheduledEvent.id = 1;
269 scheduledEvent.sceneCollectionId = sceneCollections.get(0).id;
270 scheduledEvent.eventType = eventType;
271 return scheduledEvent;