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.io.hueemulation.internal.automation;
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertThrows;
19 import java.time.LocalDateTime;
20 import java.util.Collections;
22 import java.util.Random;
23 import java.util.TreeMap;
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.junit.jupiter.api.AfterEach;
27 import org.junit.jupiter.api.BeforeEach;
28 import org.junit.jupiter.api.Test;
29 import org.openhab.core.automation.Condition;
30 import org.openhab.core.automation.util.ConditionBuilder;
31 import org.openhab.core.config.core.Configuration;
32 import org.openhab.core.items.GroupItem;
33 import org.openhab.core.library.items.ContactItem;
34 import org.openhab.core.library.items.NumberItem;
35 import org.openhab.core.library.items.SwitchItem;
36 import org.openhab.core.library.types.DecimalType;
37 import org.openhab.core.library.types.OnOffType;
38 import org.openhab.core.library.types.OpenClosedType;
39 import org.openhab.io.hueemulation.internal.DeviceType;
40 import org.openhab.io.hueemulation.internal.RuleUtils;
41 import org.openhab.io.hueemulation.internal.dto.HueDataStore;
42 import org.openhab.io.hueemulation.internal.dto.HueGroupEntry;
43 import org.openhab.io.hueemulation.internal.dto.HueLightEntry;
44 import org.openhab.io.hueemulation.internal.dto.HueSensorEntry;
47 * Test the {@link HueRuleConditionHandler}.
49 * @author David Graeff - Initial contribution
52 public class RuleConditionHandlerTests {
53 protected @NonNullByDefault({}) HueDataStore ds;
55 private static class HueRuleConditionHandlerEx extends HueRuleConditionHandler {
56 LocalDateTime dt = LocalDateTime.of(2019, 04, 12, 12, 12, 12);
58 public HueRuleConditionHandlerEx(Condition module, HueDataStore ds) {
63 protected LocalDateTime getNow() {
70 ds = new HueDataStore();
72 ds.lights.put("1", new HueLightEntry(new SwitchItem("switch"), "switch", DeviceType.SwitchType));
74 ds.sensors.put("2", new HueSensorEntry(new ContactItem("contact")));
77 new HueGroupEntry("name", new GroupItem("white", new NumberItem("number")), DeviceType.SwitchType));
81 public void tearDown() {
82 RuleUtils.random = new Random();
86 public void itemNotExisting() {
87 Configuration configuration = new Configuration();
88 configuration.put("address", "/groups/9/action");
89 configuration.put("operator", "dx");
90 configuration.put("value", "");
91 Condition c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
92 .withConfiguration(configuration).build();
93 assertThrows(IllegalStateException.class, () -> new HueRuleConditionHandler(c, ds));
97 public void itemAccept() {
99 Configuration configuration = new Configuration();
100 configuration.put("operator", "dx");
101 configuration.put("value", "");
103 configuration.put("address", "/groups/10/action");
104 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
105 .withConfiguration(configuration).build();
106 new HueRuleConditionHandler(c, ds);
108 configuration.put("address", "/lights/1/state");
109 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
110 .withConfiguration(configuration).build();
111 new HueRuleConditionHandler(c, ds);
113 configuration.put("address", "/sensors/2/state");
114 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
115 .withConfiguration(configuration).build();
116 new HueRuleConditionHandler(c, ds);
120 public void timeRangeAccept() {
122 Configuration configuration = new Configuration();
123 configuration.put("address", "/config/localtime");
124 configuration.put("operator", "in");
125 configuration.put("value", "T12:12:10/T12:12:50");
126 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
127 .withConfiguration(configuration).build();
128 HueRuleConditionHandlerEx subject = new HueRuleConditionHandlerEx(c, ds);
129 assertThat(subject.isSatisfied(Collections.emptyMap()), is(true));
131 configuration.put("address", "/config/localtime");
132 configuration.put("operator", "not_in");
133 configuration.put("value", "W8/T12:12:10/T12:12:50");
134 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
135 .withConfiguration(configuration).build();
136 subject = new HueRuleConditionHandlerEx(c, ds);
137 assertThat(subject.isSatisfied(Collections.emptyMap()), is(false));
141 public void equalOperator() {
142 Map<String, Object> context = new TreeMap<>();
144 HueRuleConditionHandler subject;
146 Configuration configuration = new Configuration();
147 configuration.put("operator", "eq");
149 context.put("newState", OnOffType.ON);
150 context.put("oldState", OnOffType.OFF);
151 configuration.put("value", "true");
152 configuration.put("address", "/lights/1/state");
153 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
154 .withConfiguration(configuration).build();
155 subject = new HueRuleConditionHandler(c, ds);
156 assertThat(subject.isSatisfied(context), is(true));
158 context.put("newState", OpenClosedType.OPEN);
159 context.put("oldState", OpenClosedType.CLOSED);
160 configuration.put("value", "true");
161 configuration.put("address", "/sensors/2/state");
162 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
163 .withConfiguration(configuration).build();
164 subject = new HueRuleConditionHandler(c, ds);
165 assertThat(subject.isSatisfied(context), is(true));
167 context.put("newState", new DecimalType(12));
168 context.put("oldState", new DecimalType(0));
169 configuration.put("value", "12");
170 configuration.put("address", "/groups/10/action");
171 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
172 .withConfiguration(configuration).build();
173 subject = new HueRuleConditionHandler(c, ds);
174 assertThat(subject.isSatisfied(context), is(true));
178 public void gtOperator() {
179 Map<String, Object> context = new TreeMap<>();
181 HueRuleConditionHandler subject;
183 Configuration configuration = new Configuration();
184 configuration.put("operator", "gt");
186 context.put("newState", new DecimalType(12));
187 context.put("oldState", new DecimalType(0));
188 configuration.put("value", "10");
189 configuration.put("address", "/groups/10/action");
190 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
191 .withConfiguration(configuration).build();
192 subject = new HueRuleConditionHandler(c, ds);
193 assertThat(subject.isSatisfied(context), is(true));
197 public void ltOperator() {
198 Map<String, Object> context = new TreeMap<>();
200 HueRuleConditionHandler subject;
202 Configuration configuration = new Configuration();
203 configuration.put("operator", "lt");
205 context.put("newState", new DecimalType(12));
206 context.put("oldState", new DecimalType(0));
207 configuration.put("value", "15");
208 configuration.put("address", "/groups/10/action");
209 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
210 .withConfiguration(configuration).build();
211 subject = new HueRuleConditionHandler(c, ds);
212 assertThat(subject.isSatisfied(context), is(true));