/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.nikobus.internal; import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.internal.util.reflection.Whitebox; import org.mockito.runners.MockitoJUnitRunner; import org.openhab.binding.nikobus.internal.config.Button; import org.openhab.binding.nikobus.internal.config.ModuleChannel; import org.openhab.binding.nikobus.internal.core.NikobusCommandReceiver; import org.openhab.core.items.Item; import org.openhab.core.library.items.SwitchItem; import org.openhab.model.item.binding.BindingConfigParseException; /** * @author Davy Vanherbergen * @since 1.3.0 */ @RunWith(MockitoJUnitRunner.class) public class NikobusGenericBindingProviderTest { private NikobusGenericBindingProvider provider = new NikobusGenericBindingProvider(); @Mock private NikobusCommandReceiver receiver; @Mock private NikobusBinding binding; @Test public void canParseValidButtonConfig() throws BindingConfigParseException { // test parsing of regular buttons parseButton("btn-cfg1", "#NA0914D", Button.PressType.SHORT, "#NA0914D"); parseButton("btn-cfg2", "#N003334:SHORT", Button.PressType.SHORT, "#N003334"); parseButton("btn-cfg3", "#N003335:LONG", Button.PressType.LONG, "#N003335"); parseButton("btn-cfg4", "#N003333", Button.PressType.SHORT, "#N003333"); } @Test public void canParseValidButtonConfigWithRefresh() throws BindingConfigParseException { // test parsing of regular buttons parseButtonWithRefresh("btn-cfg1", "#NA0914D[1973-1,1824-2]", Button.PressType.SHORT, "#NA0914D", new String[] { "1973-1", "1824-2" }); parseButtonWithRefresh("btn-cfg1", "#NA0914D[1973-1,1824-2,55DC-2,884E-1]", Button.PressType.SHORT, "#NA0914D", new String[] { "1973-1", "1824-2", "55DC-2", "884E-1" }); parseButtonWithRefresh("btn-cfg1", "#NA0914D[1973-1]", Button.PressType.SHORT, "#NA0914D", new String[] { "1973-1" }); parseButtonWithRefresh("btn-cfg2", "#N003334:SHORT[1233-1]", Button.PressType.SHORT, "#N003334", new String[] { "1233-1" }); parseButtonWithRefresh("btn-cfg3", "#N003335:LONG[1973-1,1824-2]", Button.PressType.LONG, "#N003335", new String[] { "1973-1", "1824-2" }); parseButtonWithRefresh("btn-cfg4", "#N003333[1973-1,1824-2]", Button.PressType.SHORT, "#N003333", new String[] { "1973-1", "1824-2" }); } private void parseButtonWithRefresh(String name, String config, Button.PressType type, String address, String[] groups) throws BindingConfigParseException { Item item = new SwitchItem(name); provider.processBindingConfiguration("context", item, config); Button button = (Button) provider.getItemConfig(name); assertEquals(name, button.getName()); assertEquals(address, button.getAddress()); assertEquals(type, button.getType()); String[] modules = (String[]) Whitebox.getInternalState(button, "impactedModules"); assertEquals(groups.length, modules.length); for (int i = 0; i < groups.length; i++) { assertEquals(groups[i], modules[i]); } } @Test public void canDetectInvalidButtonConfig() { parseInvalidButton("#NA0914"); parseInvalidButton("#NA0914dd"); parseInvalidButton("#NA09-14D"); parseInvalidButton("#NA0914D::SHORT"); parseInvalidButton("#NA0914DSHORT"); parseInvalidButton("#MA0914D:SHORT"); parseInvalidButton("NA0914D:SHORT"); parseInvalidButton("#NA0*14D:SHORT"); parseInvalidButton("#NA0*14D[123]"); parseInvalidButton("#NA0*14D[1234-5"); parseInvalidButton("#NA0*14D2"); parseInvalidButton("#NA0*14D[123111]"); parseInvalidButton("#NA0*14D[1231-35-2]"); parseInvalidButton("#NA0*14D[1234-46,]"); parseInvalidButton("#NA0*14D[1234-46,12]"); parseInvalidButton("#NA0914D[1973-4,1824-2,55DC-2,884E-1]"); parseInvalidButton("#NA0914D[1973-4]"); } private void parseInvalidButton(String config) { try { parseButton("invalidbutton", config, null, ""); // missing error here fail("Missing exception.."); } catch (BindingConfigParseException e) { // this is expected.. assertNull(provider.getItemConfig("invalidbutton")); } } private void parseButton(String name, String config, Button.PressType type, String address) throws BindingConfigParseException { Item item = new SwitchItem(name); provider.processBindingConfiguration("context", item, config); Button button = (Button) provider.getItemConfig(name); assertEquals(name, button.getName()); assertEquals(address, button.getAddress()); assertEquals(type, button.getType()); } @Test public void canParseValidSwitchModuleChannelConfig() throws BindingConfigParseException { parseChannelConfig("ch-cfg-1", "ABCD:1", "ABCD", 1); parseChannelConfig("ch-cfg-2", "1234:12", "1234", 12); parseChannelConfig("ch-cfg-3", "A11D:3", "A11D", 3); parseChannelConfig("ch-cfg-4", "ABCF:5", "ABCF", 5); parseChannelConfig("ch-cfg-5", "ABFD:7", "ABFD", 7); } private void parseChannelConfig(String name, String config, String address, int channel) throws BindingConfigParseException { Item item = new SwitchItem(name); provider.processBindingConfiguration("context", item, config); ModuleChannel c = (ModuleChannel) provider.getItemConfig(name); assertEquals(name, c.getName()); assertEquals(address, c.getAddress()); } @Test public void canDetectInvalidSwitchModuleChannelConfig() { parseInvalidChannelConfig("ABC:1"); parseInvalidChannelConfig("ABCDE:1"); parseInvalidChannelConfig("ABCD:0"); parseInvalidChannelConfig("ABCD:13"); parseInvalidChannelConfig("ABCDEE"); parseInvalidChannelConfig("ABCD"); parseInvalidChannelConfig("ABCD-1"); } private void parseInvalidChannelConfig(String config) { try { parseChannelConfig("invalidChannel", config, null, 0); // missing error here fail("Missing exception.."); } catch (BindingConfigParseException e) { // this is expected.. assertNull(provider.getItemConfig("invalidChannel")); } } }