2 * Copyright (c) 2010-2020 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.junit.Assert.assertThat;
18 import java.time.LocalDateTime;
19 import java.util.Collections;
21 import java.util.Random;
22 import java.util.TreeMap;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.openhab.core.config.core.Configuration;
26 import org.openhab.core.items.GroupItem;
27 import org.openhab.core.library.items.ContactItem;
28 import org.openhab.core.library.items.NumberItem;
29 import org.openhab.core.library.items.SwitchItem;
30 import org.openhab.core.library.types.DecimalType;
31 import org.openhab.core.library.types.OnOffType;
32 import org.openhab.core.library.types.OpenClosedType;
33 import org.junit.After;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.openhab.core.automation.Condition;
37 import org.openhab.core.automation.util.ConditionBuilder;
38 import org.openhab.io.hueemulation.internal.DeviceType;
39 import org.openhab.io.hueemulation.internal.RuleUtils;
40 import org.openhab.io.hueemulation.internal.dto.HueDataStore;
41 import org.openhab.io.hueemulation.internal.dto.HueGroupEntry;
42 import org.openhab.io.hueemulation.internal.dto.HueLightEntry;
43 import org.openhab.io.hueemulation.internal.dto.HueSensorEntry;
46 * Test the {@link HueRuleConditionHandler}.
48 * @author David Graeff - Initial contribution
51 public class RuleConditionHandlerTests {
52 protected @NonNullByDefault({}) HueDataStore ds;
54 private static class HueRuleConditionHandlerEx extends HueRuleConditionHandler {
55 LocalDateTime dt = LocalDateTime.of(2019, 04, 12, 12, 12, 12);
57 public HueRuleConditionHandlerEx(Condition module, HueDataStore ds) {
62 protected LocalDateTime getNow() {
69 ds = new HueDataStore();
71 ds.lights.put("1", new HueLightEntry(new SwitchItem("switch"), "switch", DeviceType.SwitchType));
73 ds.sensors.put("2", new HueSensorEntry(new ContactItem("contact")));
76 new HueGroupEntry("name", new GroupItem("white", new NumberItem("number")), DeviceType.SwitchType));
80 public void tearDown() {
81 RuleUtils.random = new Random();
84 @Test(expected = IllegalStateException.class)
85 public void itemNotExisting() {
86 Configuration configuration = new Configuration();
87 configuration.put("address", "/groups/9/action");
88 configuration.put("operator", "dx");
89 configuration.put("value", "");
90 Condition c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
91 .withConfiguration(configuration).build();
92 new HueRuleConditionHandler(c, ds);
96 public void itemAccept() {
98 Configuration configuration = new Configuration();
99 configuration.put("operator", "dx");
100 configuration.put("value", "");
102 configuration.put("address", "/groups/10/action");
103 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
104 .withConfiguration(configuration).build();
105 new HueRuleConditionHandler(c, ds);
107 configuration.put("address", "/lights/1/state");
108 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
109 .withConfiguration(configuration).build();
110 new HueRuleConditionHandler(c, ds);
112 configuration.put("address", "/sensors/2/state");
113 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
114 .withConfiguration(configuration).build();
115 new HueRuleConditionHandler(c, ds);
119 public void timeRangeAccept() {
121 Configuration configuration = new Configuration();
122 configuration.put("address", "/config/localtime");
123 configuration.put("operator", "in");
124 configuration.put("value", "T12:12:10/T12:12:50");
125 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
126 .withConfiguration(configuration).build();
127 HueRuleConditionHandlerEx subject = new HueRuleConditionHandlerEx(c, ds);
128 assertThat(subject.isSatisfied(Collections.emptyMap()), is(true));
130 configuration.put("address", "/config/localtime");
131 configuration.put("operator", "not_in");
132 configuration.put("value", "W8/T12:12:10/T12:12:50");
133 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
134 .withConfiguration(configuration).build();
135 subject = new HueRuleConditionHandlerEx(c, ds);
136 assertThat(subject.isSatisfied(Collections.emptyMap()), is(false));
140 public void equalOperator() {
141 Map<String, Object> context = new TreeMap<>();
143 HueRuleConditionHandler subject;
145 Configuration configuration = new Configuration();
146 configuration.put("operator", "eq");
148 context.put("newState", OnOffType.ON);
149 context.put("oldState", OnOffType.OFF);
150 configuration.put("value", "true");
151 configuration.put("address", "/lights/1/state");
152 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
153 .withConfiguration(configuration).build();
154 subject = new HueRuleConditionHandler(c, ds);
155 assertThat(subject.isSatisfied(context), is(true));
157 context.put("newState", OpenClosedType.OPEN);
158 context.put("oldState", OpenClosedType.CLOSED);
159 configuration.put("value", "true");
160 configuration.put("address", "/sensors/2/state");
161 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
162 .withConfiguration(configuration).build();
163 subject = new HueRuleConditionHandler(c, ds);
164 assertThat(subject.isSatisfied(context), is(true));
166 context.put("newState", new DecimalType(12));
167 context.put("oldState", new DecimalType(0));
168 configuration.put("value", "12");
169 configuration.put("address", "/groups/10/action");
170 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
171 .withConfiguration(configuration).build();
172 subject = new HueRuleConditionHandler(c, ds);
173 assertThat(subject.isSatisfied(context), is(true));
177 public void gtOperator() {
178 Map<String, Object> context = new TreeMap<>();
180 HueRuleConditionHandler subject;
182 Configuration configuration = new Configuration();
183 configuration.put("operator", "gt");
185 context.put("newState", new DecimalType(12));
186 context.put("oldState", new DecimalType(0));
187 configuration.put("value", "10");
188 configuration.put("address", "/groups/10/action");
189 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
190 .withConfiguration(configuration).build();
191 subject = new HueRuleConditionHandler(c, ds);
192 assertThat(subject.isSatisfied(context), is(true));
196 public void ltOperator() {
197 Map<String, Object> context = new TreeMap<>();
199 HueRuleConditionHandler subject;
201 Configuration configuration = new Configuration();
202 configuration.put("operator", "lt");
204 context.put("newState", new DecimalType(12));
205 context.put("oldState", new DecimalType(0));
206 configuration.put("value", "15");
207 configuration.put("address", "/groups/10/action");
208 c = ConditionBuilder.create().withId("a").withTypeUID(HueRuleConditionHandler.MODULE_TYPE_ID)
209 .withConfiguration(configuration).build();
210 subject = new HueRuleConditionHandler(c, ds);
211 assertThat(subject.isSatisfied(context), is(true));