2 * Copyright (c) 2010-2023 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.internal;
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.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;
37 import ch.qos.logback.classic.Level;
38 import ch.qos.logback.classic.Logger;
41 * Unit tests for {@link AutomationChannelBuilder}.
43 * @author Jacob Laursen - Initial contribution
46 public class AutomationChannelBuilderTest {
48 private static final ChannelGroupUID CHANNEL_GROUP_UID = new ChannelGroupUID(
49 new ThingUID(HDPowerViewBindingConstants.BINDING_ID, AutomationChannelBuilderTest.class.getSimpleName()),
50 HDPowerViewBindingConstants.CHANNELTYPE_AUTOMATION_ENABLED);
52 private static final HDPowerViewTranslationProvider TRANSLATION_PROVIDER = new HDPowerViewTranslationProvider(
53 mock(Bundle.class), new MockedTranslationProvider(), new MockedLocaleProvider());
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<>();
60 private 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);
65 Scene scene = new Scene();
67 scene.name = Base64.getEncoder().encodeToString(("TestScene").getBytes());
68 scenes = new ArrayList<>(List.of(scene));
70 SceneCollection sceneCollection = new SceneCollection();
71 sceneCollection.id = 2;
72 sceneCollection.name = Base64.getEncoder().encodeToString(("TestSceneCollection").getBytes());
73 sceneCollections = new ArrayList<>(List.of(sceneCollection));
77 public void sceneSunriseWeekends() {
78 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
79 scheduledEvent.daySaturday = true;
80 scheduledEvent.daySunday = true;
82 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
83 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
85 assertEquals(1, channels.size());
86 assertEquals("TestScene, At sunrise, Weekends", channels.get(0).getLabel());
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;
98 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
99 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
101 assertEquals(1, channels.size());
102 assertEquals("TestScene, At sunset, Weekdays", channels.get(0).getLabel());
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;
118 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
119 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
121 assertEquals(1, channels.size());
122 assertEquals("TestScene, 06:30, All days", channels.get(0).getLabel());
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;
132 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
133 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
135 assertEquals(1, channels.size());
136 assertEquals("TestScene, 15m before sunrise, Mon, Tue", channels.get(0).getLabel());
140 public void sceneHoursMinutesAfterSunriseMonday() {
141 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
142 scheduledEvent.dayMonday = true;
143 scheduledEvent.minute = 61;
145 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
146 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
148 assertEquals(1, channels.size());
149 assertEquals("TestScene, 1hr 1m after sunrise, Mon", channels.get(0).getLabel());
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;
160 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
161 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
163 assertEquals(1, channels.size());
164 assertEquals("TestScene, 59m before sunset, Wed, Thu, Fri", channels.get(0).getLabel());
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;
175 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
176 List<Channel> channels = builder.withScenes(scenes).withScheduledEvents(scheduledEvents).build();
178 assertEquals(1, channels.size());
179 assertEquals("TestScene, 1hr after sunset, Fri, Sat, Sun", channels.get(0).getLabel());
183 public void sceneCollection() {
184 ScheduledEvent scheduledEvent = createScheduledEventWithSceneCollection(
185 ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
187 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
188 List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
191 assertEquals(1, channels.size());
192 assertEquals("TestSceneCollection, At sunrise, ", channels.get(0).getLabel());
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();
203 assertEquals(existingChannels, channels);
207 public void emptyListWhenNoScheduledEvents() {
208 List<Channel> channels = builder.build();
210 assertEquals(0, channels.size());
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();
219 assertEquals(0, channels.size());
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();
229 assertEquals(0, channels.size());
233 public void emptyListWhenNoSceneCollectionForScheduledEvent() {
234 ScheduledEvent scheduledEvent = createScheduledEventWithScene(ScheduledEvent.SCHEDULED_EVENT_TYPE_SUNRISE);
235 List<ScheduledEvent> scheduledEvents = new ArrayList<>(List.of(scheduledEvent));
237 List<Channel> channels = builder.withSceneCollections(sceneCollections).withScheduledEvents(scheduledEvents)
240 assertEquals(0, channels.size());
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();
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());
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;
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;