]> git.basschouten.com Git - openhab-addons.git/blob
cf1e88dbf531bb6e39cee2ac65636b7fbbf90bc4
[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.io.hueemulation.internal.automation;
14
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertThrows;
18
19 import java.time.LocalDateTime;
20 import java.util.Collections;
21 import java.util.Map;
22 import java.util.Random;
23 import java.util.TreeMap;
24
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;
45
46 /**
47  * Test the {@link HueRuleConditionHandler}.
48  *
49  * @author David Graeff - Initial contribution
50  */
51 @NonNullByDefault
52 public class RuleConditionHandlerTests {
53     protected @NonNullByDefault({}) HueDataStore ds;
54
55     private static class HueRuleConditionHandlerEx extends HueRuleConditionHandler {
56         LocalDateTime dt = LocalDateTime.of(2019, 04, 12, 12, 12, 12);
57
58         public HueRuleConditionHandlerEx(Condition module, HueDataStore ds) {
59             super(module, ds);
60         }
61
62         @Override
63         protected LocalDateTime getNow() {
64             return dt;
65         }
66     }
67
68     @BeforeEach
69     public void setUp() {
70         ds = new HueDataStore();
71
72         ds.lights.put("1", new HueLightEntry(new SwitchItem("switch"), "switch", DeviceType.SwitchType));
73
74         ds.sensors.put("2", new HueSensorEntry(new ContactItem("contact")));
75
76         ds.groups.put("10",
77                 new HueGroupEntry("name", new GroupItem("white", new NumberItem("number")), DeviceType.SwitchType));
78     }
79
80     @AfterEach
81     public void tearDown() {
82         RuleUtils.random = new Random();
83     }
84
85     @Test
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));
94     }
95
96     @Test
97     public void itemAccept() {
98         Condition c;
99         Configuration configuration = new Configuration();
100         configuration.put("operator", "dx");
101         configuration.put("value", "");
102
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);
107
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);
112
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);
117     }
118
119     @Test
120     public void timeRangeAccept() {
121         Condition c;
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));
130
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));
138     }
139
140     @Test
141     public void equalOperator() {
142         Map<String, Object> context = new TreeMap<>();
143
144         HueRuleConditionHandler subject;
145         Condition c;
146         Configuration configuration = new Configuration();
147         configuration.put("operator", "eq");
148
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));
157
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));
166
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));
175     }
176
177     @Test
178     public void gtOperator() {
179         Map<String, Object> context = new TreeMap<>();
180
181         HueRuleConditionHandler subject;
182         Condition c;
183         Configuration configuration = new Configuration();
184         configuration.put("operator", "gt");
185
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));
194     }
195
196     @Test
197     public void ltOperator() {
198         Map<String, Object> context = new TreeMap<>();
199
200         HueRuleConditionHandler subject;
201         Condition c;
202         Configuration configuration = new Configuration();
203         configuration.put("operator", "lt");
204
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));
213     }
214 }