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.lcn.internal.subhandler;
15 import static org.mockito.ArgumentMatchers.any;
16 import static org.mockito.Mockito.*;
18 import java.math.BigDecimal;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.junit.jupiter.api.BeforeEach;
22 import org.junit.jupiter.api.Test;
23 import org.openhab.binding.lcn.internal.common.DimmerOutputCommand;
24 import org.openhab.binding.lcn.internal.common.LcnChannelGroup;
25 import org.openhab.binding.lcn.internal.common.LcnDefs;
26 import org.openhab.binding.lcn.internal.common.LcnException;
27 import org.openhab.core.library.types.OnOffType;
28 import org.openhab.core.library.types.PercentType;
29 import org.openhab.core.library.types.StringType;
30 import org.openhab.core.library.types.UpDownType;
35 * @author Fabian Wolter - Initial contribution
38 public class LcnModuleOutputSubHandlerTest extends AbstractTestLcnModuleSubHandler {
39 private @NonNullByDefault({}) LcnModuleOutputSubHandler l;
46 l = new LcnModuleOutputSubHandler(handler, info);
50 public void testStatusOutput1OffPercent() {
51 tryParseAllHandlers(":M000005A1000");
52 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "1", new PercentType(0));
53 verify(handler).updateChannel(any(), any(), any());
57 public void testStatusOutput2OffPercent() {
58 tryParseAllHandlers(":M000005A2000");
59 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "2", new PercentType(0));
60 verify(handler).updateChannel(any(), any(), any());
64 public void testStatusOutput1OffNative() {
65 tryParseAllHandlers(":M000005O1000");
66 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "1", new PercentType(0));
67 verify(handler).updateChannel(any(), any(), any());
71 public void testStatusOutput2OffNative() {
72 tryParseAllHandlers(":M000005O2000");
73 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "2", new PercentType(0));
74 verify(handler).updateChannel(any(), any(), any());
78 public void testStatusOutput1OnPercent() {
79 tryParseAllHandlers(":M000005A1100");
80 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "1", new PercentType(100));
81 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.UP);
82 verify(handler, times(2)).updateChannel(any(), any(), any());
86 public void testStatusOutput2OnPercent() {
87 tryParseAllHandlers(":M000005A2100");
88 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "2", new PercentType(100));
89 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.DOWN);
90 verify(handler, times(2)).updateChannel(any(), any(), any());
94 public void testStatusOutput1OnNative() {
95 tryParseAllHandlers(":M000005O1200");
96 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "1", new PercentType(100));
97 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.UP);
98 verify(handler, times(2)).updateChannel(any(), any(), any());
102 public void testStatusOutput2OnNative() {
103 tryParseAllHandlers(":M000005O2200");
104 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "2", new PercentType(100));
105 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.DOWN);
106 verify(handler, times(2)).updateChannel(any(), any(), any());
110 public void testStatusOutput2On50Percent() {
111 tryParseAllHandlers(":M000005A2050");
112 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "2", new PercentType(50));
113 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.DOWN);
114 verify(handler, times(2)).updateChannel(any(), any(), any());
118 public void testStatusOutput1On50Native() {
119 tryParseAllHandlers(":M000005O1100");
120 verify(handler).updateChannel(LcnChannelGroup.OUTPUT, "1", new PercentType(50));
121 verify(handler).updateChannel(LcnChannelGroup.ROLLERSHUTTEROUTPUT, "1", UpDownType.UP);
122 verify(handler, times(2)).updateChannel(any(), any(), any());
126 public void testHandleCommandOutput1On() throws LcnException {
127 l.handleCommandOnOff(OnOffType.ON, LcnChannelGroup.OUTPUT, 0);
128 verify(handler).sendPck("A1DI100000");
132 public void testHandleCommandOutput2On() throws LcnException {
133 l.handleCommandOnOff(OnOffType.ON, LcnChannelGroup.OUTPUT, 1);
134 verify(handler).sendPck("A2DI100000");
138 public void testHandleCommandOutput1Off() throws LcnException {
139 l.handleCommandOnOff(OnOffType.OFF, LcnChannelGroup.OUTPUT, 0);
140 verify(handler).sendPck("A1DI000000");
144 public void testHandleCommandOutput2Off() throws LcnException {
145 l.handleCommandOnOff(OnOffType.OFF, LcnChannelGroup.OUTPUT, 1);
146 verify(handler).sendPck("A2DI000000");
150 public void testHandleCommandOutput1Percent10() throws LcnException {
151 l.handleCommandPercent(new PercentType(99), LcnChannelGroup.OUTPUT, 0);
152 verify(handler).sendPck("A1DI099000");
156 public void testHandleCommandOutput2Percent1() throws LcnException {
157 l.handleCommandPercent(new PercentType(1), LcnChannelGroup.OUTPUT, 1);
158 verify(handler).sendPck("A2DI001000");
162 public void testHandleCommandOutput1Percent995() throws LcnException {
163 l.handleCommandPercent(new PercentType(BigDecimal.valueOf(99.5)), LcnChannelGroup.OUTPUT, 0);
164 verify(handler).sendPck("O1DI199000");
168 public void testHandleCommandOutput2Percent05() throws LcnException {
169 l.handleCommandPercent(new PercentType(BigDecimal.valueOf(0.5)), LcnChannelGroup.OUTPUT, 1);
170 verify(handler).sendPck("O2DI001000");
174 public void testHandleCommandDimmerOutputAll60FixedRamp() throws LcnException {
175 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(60), true, false, LcnDefs.FIXED_RAMP_MS),
177 verify(handler).sendPck("AH060");
181 public void testHandleCommandDimmerOutputAll40CustomRamp() throws LcnException {
182 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(40), true, false, 1000), 0);
183 verify(handler).sendPck("OY080080080080004");
187 public void testHandleCommandDimmerOutput12Value100FixedRamp() throws LcnException {
188 l.handleCommandDimmerOutput(
189 new DimmerOutputCommand(BigDecimal.valueOf(100), false, true, LcnDefs.FIXED_RAMP_MS), 0);
190 verify(handler).sendPck("X2001200200");
194 public void testHandleCommandDimmerOutput12Value0FixedRamp() throws LcnException {
195 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(0), false, true, LcnDefs.FIXED_RAMP_MS),
197 verify(handler).sendPck("X2001000000");
201 public void testHandleCommandDimmerOutput12Value100NoRamp() throws LcnException {
202 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(100), false, true, 0), 0);
203 verify(handler).sendPck("X2001253253");
207 public void testHandleCommandDimmerOutput12Value0NoRamp() throws LcnException {
208 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(0), false, true, 0), 0);
209 verify(handler).sendPck("X2001252252");
213 public void testHandleCommandDimmerOutput12Value40() throws LcnException {
214 l.handleCommandDimmerOutput(new DimmerOutputCommand(BigDecimal.valueOf(40), false, true, 0), 0);
215 verify(handler).sendPck("AY040040");
219 public void testHandleCommandTuneableWhite0() throws LcnException {
220 l.handleCommandString(new StringType("DISABLE"), 0);
221 verify(handler).sendPck("AW0");
225 public void testHandleCommandTuneableWhite1() throws LcnException {
226 l.handleCommandString(new StringType("OUTPUT1"), 0);
227 verify(handler).sendPck("AW1");
231 public void testHandleCommandTuneableWhite2() throws LcnException {
232 l.handleCommandString(new StringType("BOTH"), 0);
233 verify(handler).sendPck("AW2");