2 * Copyright (c) 2010-2024 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.broadlink.internal.handler;
15 import static org.junit.Assert.fail;
16 import static org.junit.jupiter.api.Assertions.assertEquals;
17 import static org.mockito.Mockito.*;
18 import static org.openhab.binding.broadlink.internal.BroadlinkBindingConstants.*;
19 import static org.openhab.binding.broadlink.internal.handler.BroadlinkSocketModel3Handler.mergeOnOffBits;
21 import java.io.IOException;
22 import java.util.List;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.junit.jupiter.api.BeforeEach;
26 import org.junit.jupiter.api.Test;
27 import org.mockito.ArgumentCaptor;
28 import org.mockito.ArgumentMatchers;
29 import org.mockito.Mockito;
30 import org.mockito.MockitoAnnotations;
31 import org.openhab.binding.broadlink.internal.BroadlinkBindingConstants;
32 import org.openhab.core.library.types.OnOffType;
33 import org.openhab.core.thing.ChannelUID;
34 import org.openhab.core.types.State;
37 * Tests the Socket Model 3 handler.
39 * @author John Marshall - Initial contribution
42 public class BroadlinkSocketModel3HandlerTest extends AbstractBroadlinkThingHandlerTest {
44 private final byte[] response = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
52 private final BroadlinkSocketModel3Handler model3;
54 public BroadlinkSocketModel3HandlerTest() {
56 configureUnderlyingThing(BroadlinkBindingConstants.THING_TYPE_SP3, "sp3-test");
57 model3 = new BroadlinkSocketModel3Handler(thing);
62 public void setUp() throws Exception {
63 MockitoAnnotations.openMocks(this).close();
64 Mockito.when(mockSocket.sendAndReceive(ArgumentMatchers.any(byte[].class), ArgumentMatchers.anyString()))
65 .thenReturn(response);
69 public void mergeOnOffBitsAllZero() {
70 int result = mergeOnOffBits(OnOffType.OFF, OnOffType.OFF);
71 assertEquals(0x00, result);
75 public void mergeOnOffBitsPowerOn() {
76 int result = mergeOnOffBits(OnOffType.ON, OnOffType.OFF);
77 assertEquals(0x01, result);
81 public void mergeOnOffBitsNightlightOn() {
82 int result = mergeOnOffBits(OnOffType.OFF, OnOffType.ON);
83 assertEquals(0x02, result);
87 public void mergeOnOffBitsAllOn() {
88 int result = mergeOnOffBits(OnOffType.ON, OnOffType.ON);
89 assertEquals(0x03, result);
93 public void deriveNightLightStateBitsOff() {
94 byte[] payload = { 0x00, 0x00, 0x00, 0x00, 0x00 };
95 OnOffType result = model3.deriveNightLightStateFromStatusBytes(payload);
96 assertEquals(OnOffType.OFF, result);
100 public void deriveNightLightStateBitsOn2() {
101 byte[] payload = { 0x00, 0x00, 0x00, 0x00, 0x02 };
102 OnOffType result = model3.deriveNightLightStateFromStatusBytes(payload);
103 assertEquals(OnOffType.ON, result);
107 public void deriveNightLightStateBitsOn3() {
108 byte[] payload = { 0x00, 0x00, 0x00, 0x00, 0x03 };
109 OnOffType result = model3.deriveNightLightStateFromStatusBytes(payload);
110 assertEquals(OnOffType.ON, result);
114 public void deriveNightLightStateBitsOnFF() {
115 byte[] payload = { 0x00, 0x00, 0x00, 0x00, (byte) 0xFF };
116 OnOffType result = model3.deriveNightLightStateFromStatusBytes(payload);
117 assertEquals(OnOffType.ON, result);
121 public void setsThePowerChannelAndNightlightAfterGettingStatusOnSP3() {
122 Mockito.when(mockSocket.sendAndReceive(ArgumentMatchers.any(byte[].class), ArgumentMatchers.anyString()))
123 .thenReturn(response);
124 setMocksForTesting(model3);
129 model3.getStatusFromDevice();
130 } catch (IOException e) {
131 fail("Unexpected exception: " + e.getClass().getCanonicalName());
134 ArgumentCaptor<ChannelUID> channelCaptor = ArgumentCaptor.forClass(ChannelUID.class);
135 ArgumentCaptor<State> stateCaptor = ArgumentCaptor.forClass(State.class);
136 verify(mockCallback, Mockito.times(2)).stateUpdated(channelCaptor.capture(), stateCaptor.capture());
138 List<ChannelUID> channels = channelCaptor.getAllValues();
139 List<State> states = stateCaptor.getAllValues();
141 ChannelUID expectedPowerChannel = new ChannelUID(thing.getUID(), COMMAND_POWER_ON);
142 assertEquals(expectedPowerChannel, channels.get(0));
144 assertEquals(OnOffType.ON, states.get(0));
146 ChannelUID expectedNightlightChannel = new ChannelUID(thing.getUID(), COMMAND_NIGHTLIGHT);
147 assertEquals(expectedNightlightChannel, channels.get(1));
149 assertEquals(OnOffType.OFF, states.get(1));