]> git.basschouten.com Git - openhab-addons.git/blob
146a5ce80c802902167cfb3a9c1c0dbcf7b79d9a
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.junit.Assert.assertThat;
17
18 import java.time.LocalDateTime;
19 import java.util.Collections;
20 import java.util.Map;
21 import java.util.Random;
22 import java.util.TreeMap;
23
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;
44
45 /**
46  * Test the {@link HueRuleConditionHandler}.
47  *
48  * @author David Graeff - Initial contribution
49  */
50 @NonNullByDefault
51 public class RuleConditionHandlerTests {
52     protected @NonNullByDefault({}) HueDataStore ds;
53
54     private static class HueRuleConditionHandlerEx extends HueRuleConditionHandler {
55         LocalDateTime dt = LocalDateTime.of(2019, 04, 12, 12, 12, 12);
56
57         public HueRuleConditionHandlerEx(Condition module, HueDataStore ds) {
58             super(module, ds);
59         }
60
61         @Override
62         protected LocalDateTime getNow() {
63             return dt;
64         }
65     }
66
67     @Before
68     public void setUp() {
69         ds = new HueDataStore();
70
71         ds.lights.put("1", new HueLightEntry(new SwitchItem("switch"), "switch", DeviceType.SwitchType));
72
73         ds.sensors.put("2", new HueSensorEntry(new ContactItem("contact")));
74
75         ds.groups.put("10",
76                 new HueGroupEntry("name", new GroupItem("white", new NumberItem("number")), DeviceType.SwitchType));
77     }
78
79     @After
80     public void tearDown() {
81         RuleUtils.random = new Random();
82     }
83
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);
93     }
94
95     @Test
96     public void itemAccept() {
97         Condition c;
98         Configuration configuration = new Configuration();
99         configuration.put("operator", "dx");
100         configuration.put("value", "");
101
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);
106
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);
111
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);
116     }
117
118     @Test
119     public void timeRangeAccept() {
120         Condition c;
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));
129
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));
137     }
138
139     @Test
140     public void equalOperator() {
141         Map<String, Object> context = new TreeMap<>();
142
143         HueRuleConditionHandler subject;
144         Condition c;
145         Configuration configuration = new Configuration();
146         configuration.put("operator", "eq");
147
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));
156
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));
165
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));
174     }
175
176     @Test
177     public void gtOperator() {
178         Map<String, Object> context = new TreeMap<>();
179
180         HueRuleConditionHandler subject;
181         Condition c;
182         Configuration configuration = new Configuration();
183         configuration.put("operator", "gt");
184
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));
193     }
194
195     @Test
196     public void ltOperator() {
197         Map<String, Object> context = new TreeMap<>();
198
199         HueRuleConditionHandler subject;
200         Condition c;
201         Configuration configuration = new Configuration();
202         configuration.put("operator", "lt");
203
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));
212     }
213 }