/**
* 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.knx.internal.config;
import static junit.framework.Assert.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.openhab.binding.knx.internal.config.KNXGenericBindingProvider.KNXBindingConfig;
import org.openhab.binding.knx.internal.config.KNXGenericBindingProvider.KNXBindingConfigItem;
import org.openhab.core.items.GenericItem;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.DateTimeItem;
import org.openhab.core.library.types.PercentType;
import org.openhab.core.library.types.StopMoveType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.library.types.UpDownType;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
import org.openhab.model.item.binding.BindingConfigParseException;
import tuwien.auto.calimero.GroupAddress;
import tuwien.auto.calimero.datapoint.CommandDP;
import tuwien.auto.calimero.datapoint.Datapoint;
import tuwien.auto.calimero.datapoint.StateDP;
import tuwien.auto.calimero.exception.KNXFormatException;
/**
* @author Thomas.Eichstaedt-Engelen
* @author Kai Kreuzer
* @since 1.0.0
*/
public class KNXGenericBindingProviderTest {
private KNXGenericBindingProvider provider;
private Item item1;
private Item item2;
@Before
public void init() {
provider = new KNXGenericBindingProvider();
item1 = new TestItem("item1");
item2 = new TestItem("item2");
}
@Test(expected = BindingConfigParseException.class)
public void testParseBindingConfig_tooManyArguments() throws BindingConfigParseException {
provider.parseBindingConfigString(new TestItem(), "0/0/0, 0/0/0, 0/0/0, 0/0/0, 0/0/0");
}
@Test
public void testParseBindingConfig_DateTimeAcceptsTwoGAs() throws BindingConfigParseException {
provider.parseBindingConfigString(new DateTimeItem("DateTest"), "11.001:15/7/11, 10.001:15/7/10");
}
@Test
public void testParseBindingConfig() throws BindingConfigParseException, KNXFormatException {
// method under Test
KNXBindingConfig bindingConfigs = provider.parseBindingConfigString(item1,
"<4/2/10+0/2/10, 5.005:4/2/11+0/2/11, +4/2/12, 4/2/13");
// Assertions
assertEquals(4, bindingConfigs.size());
for (KNXBindingConfigItem bindingConfig : bindingConfigs) {
assertEquals("item1", bindingConfig.itemName);
}
assertNotNull(bindingConfigs.get(0).readableDataPoint);
assertNull(bindingConfigs.get(1).readableDataPoint);
assertNull(bindingConfigs.get(2).readableDataPoint);
assertNull(bindingConfigs.get(3).readableDataPoint);
assertTrue(bindingConfigs.get(0).allDataPoints.contains(new GroupAddress("4/2/10")));
assertTrue(bindingConfigs.get(0).allDataPoints.contains(new GroupAddress("0/2/10")));
assertTrue(bindingConfigs.get(1).allDataPoints.contains(new GroupAddress("4/2/11")));
assertTrue(bindingConfigs.get(1).allDataPoints.contains(new GroupAddress("0/2/11")));
assertTrue(bindingConfigs.get(2).allDataPoints.contains(new GroupAddress("4/2/12")));
assertTrue(bindingConfigs.get(3).allDataPoints.contains(new GroupAddress("4/2/13")));
assertEquals(true, bindingConfigs.get(0).mainDataPoint instanceof CommandDP);
assertEquals(true, bindingConfigs.get(1).mainDataPoint instanceof CommandDP);
assertEquals(true, bindingConfigs.get(2).mainDataPoint instanceof StateDP);
assertEquals(true, bindingConfigs.get(3).mainDataPoint instanceof CommandDP);
}
@Test
public void testIsCommandGA() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "<4/2/10+0/2/10, 5.005:4/2/11+0/2/11, +4/2/12, 4/2/13");
// method under Test
assertEquals(true, provider.isCommandGA(new GroupAddress("4/2/10")));
assertEquals(true, provider.isCommandGA(new GroupAddress("4/2/11")));
assertEquals(true, provider.isCommandGA(new GroupAddress("4/2/13")));
assertEquals(false, provider.isCommandGA(new GroupAddress("0/2/10")));
assertEquals(false, provider.isCommandGA(new GroupAddress("0/2/11")));
assertEquals(false, provider.isCommandGA(new GroupAddress("4/2/12")));
}
@Test
public void testReadFlagWithDPT() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "<5.001:4/2/10");
// method under Test
Iterator<Datapoint> readableDatapoints = provider.getReadableDatapoints().iterator();
assertEquals(true, readableDatapoints.hasNext());
assertEquals(true, readableDatapoints.next().getDPT().equals("5.001"));
}
@Test
public void testReadFromThirdGA() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "2/1/5+2/4/5, 2/2/5, <0/3/5");
// method under Test
Iterator<Datapoint> readableDatapoints = provider.getReadableDatapoints().iterator();
assertEquals(true, readableDatapoints.hasNext());
assertEquals(0, readableDatapoints.next().getMainAddress().getMainGroup());
}
@Test
public void testReadFromListeningGA() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "2/1/5+<0/4/5");
// method under Test
Iterator<Datapoint> readableDatapoints = provider.getReadableDatapoints().iterator();
assertEquals(true, readableDatapoints.hasNext());
assertEquals(0, readableDatapoints.next().getMainAddress().getMainGroup());
}
@Test
public void testAutoUpdate() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "<4/2/10+0/2/10, 5.005:4/2/11+0/2/11, +4/2/12, 4/2/13");
provider.processBindingConfiguration("text", item2, "<4/2/10, 5.005:4/2/11,, 4/2/13");
// method under Test
assertEquals(Boolean.FALSE, provider.autoUpdate(item1.getName()));
assertEquals(null, provider.autoUpdate(item2.getName()));
}
@Test
public void testProvidesBindingFor() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "<4/2/10+0/2/10, 5.005:4/2/11+0/2/11, +4/2/12, 4/2/13");
provider.processBindingConfiguration("text", item2, "<4/2/10, 5.005:4/2/11,, 4/2/13");
// method under Test
assertEquals(true, provider.providesBindingFor(item1.getName()));
assertEquals(true, provider.providesBindingFor(item1.getName()));
assertEquals(false, provider.providesBindingFor("someotheritem"));
}
@Test
public void testIsStartStopGA() throws BindingConfigParseException, KNXFormatException {
provider.processBindingConfiguration("text", item1, "<4/2/10+0/2/10, 5.005:4/2/11+0/2/11, +4/2/12ss, 4/2/13ss");
// method under Test
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/10")));
assertFalse(provider.isStartStopGA(new GroupAddress("0/2/10")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/11")));
assertFalse(provider.isStartStopGA(new GroupAddress("0/2/11")));
assertTrue(provider.isStartStopGA(new GroupAddress("4/2/12")));
assertTrue(provider.isStartStopGA(new GroupAddress("4/2/13")));
provider.processBindingConfiguration("text", item1, "<4/2/10ss+0/2/10, 5.005:4/2/11+0/2/11ss, +4/2/12, 4/2/13");
// method under Test
assertTrue(provider.isStartStopGA(new GroupAddress("4/2/10")));
assertFalse(provider.isStartStopGA(new GroupAddress("0/2/10")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/11")));
assertTrue(provider.isStartStopGA(new GroupAddress("0/2/11")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/12")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/13")));
provider.processBindingConfiguration("text", item1, "<4/2/10+0/2/10ss, 5.005:4/2/11ss+0/2/11, +4/2/12, 4/2/13");
// method under Test
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/10")));
assertTrue(provider.isStartStopGA(new GroupAddress("0/2/10")));
assertTrue(provider.isStartStopGA(new GroupAddress("4/2/11")));
assertFalse(provider.isStartStopGA(new GroupAddress("0/2/11")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/12")));
assertFalse(provider.isStartStopGA(new GroupAddress("4/2/13")));
}
private class TestItem extends GenericItem {
private List<Class<? extends State>> acceptedDataTypes = new ArrayList<Class<? extends State>>();
private List<Class<? extends Command>> acceptedCommandTypes = new ArrayList<Class<? extends Command>>();
public TestItem() {
this("TestItem");
}
public TestItem(String itemName) {
super(itemName);
acceptedDataTypes.add(UnDefType.class);
acceptedDataTypes.add(UpDownType.class);
acceptedDataTypes.add(PercentType.class);
acceptedDataTypes.add(StringType.class);
acceptedCommandTypes.add(UpDownType.class);
acceptedCommandTypes.add(StopMoveType.class);
acceptedCommandTypes.add(PercentType.class);
acceptedCommandTypes.add(StringType.class);
}
@Override
public List<Class<? extends State>> getAcceptedDataTypes() {
return acceptedDataTypes;
}
@Override
public List<Class<? extends Command>> getAcceptedCommandTypes() {
return acceptedCommandTypes;
}
}
}