/**
* Copyright (c) 2014-2017 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.eclipse.smarthome.core.library.types;
import static org.junit.Assert.assertEquals;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.smarthome.core.items.GenericItem;
import org.eclipse.smarthome.core.items.GroupFunction;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.library.items.DimmerItem;
import org.eclipse.smarthome.core.library.items.SwitchItem;
import org.eclipse.smarthome.core.types.Command;
import org.eclipse.smarthome.core.types.State;
import org.eclipse.smarthome.core.types.UnDefType;
import org.junit.Before;
import org.junit.Test;
/**
* @author Thomas.Eichstaedt-Engelen
*/
public class ArithmeticGroupFunctionTest {
private GroupFunction function;
private Set<Item> items;
@Before
public void init() {
items = new HashSet<Item>();
}
@Test
public void testOrFunction() {
items.add(new TestItem("TestItem1", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem2", UnDefType.UNDEF));
items.add(new TestItem("TestItem3", OpenClosedType.OPEN));
items.add(new TestItem("TestItem4", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem5", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.Or(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.OPEN, state);
}
@Test
public void testOrFunction_negative() {
items.add(new TestItem("TestItem1", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem2", UnDefType.UNDEF));
items.add(new TestItem("TestItem3", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem4", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem5", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.Or(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testOrFunction_justsOneItem() {
items.add(new TestItem("TestItem1", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.Or(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testOrFunction_differntTypes() {
DimmerItem dimmer1 = new DimmerItem("TestDimmer1");
dimmer1.setState(new PercentType("42"));
DimmerItem dimmer2 = new DimmerItem("TestDimmer2");
dimmer2.setState(new DecimalType("0"));
SwitchItem switch1 = new SwitchItem("TestSwitch1");
switch1.setState(OnOffType.ON);
SwitchItem switch2 = new SwitchItem("TestSwitch2");
switch2.setState(OnOffType.OFF);
items.add(dimmer1);
items.add(dimmer2);
items.add(switch1);
items.add(switch2);
function = new ArithmeticGroupFunction.Or(OnOffType.ON, OnOffType.OFF);
State state = function.calculate(items);
State decimalState = function.getStateAs(items, DecimalType.class);
assertEquals(OnOffType.ON, state);
assertEquals(new DecimalType("2"), decimalState);
}
@Test
public void testNOrFunction() {
items.add(new TestItem("TestItem1", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem2", UnDefType.UNDEF));
items.add(new TestItem("TestItem3", OpenClosedType.OPEN));
items.add(new TestItem("TestItem4", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem5", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.NOr(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testNOrFunction_negative() {
items.add(new TestItem("TestItem1", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem2", UnDefType.UNDEF));
items.add(new TestItem("TestItem3", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem4", OpenClosedType.CLOSED));
items.add(new TestItem("TestItem5", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.NOr(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.OPEN, state);
}
@Test
public void testAndFunction() {
items.add(new TestItem("TestItem1", OpenClosedType.OPEN));
items.add(new TestItem("TestItem2", OpenClosedType.OPEN));
items.add(new TestItem("TestItem3", OpenClosedType.OPEN));
function = new ArithmeticGroupFunction.And(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.OPEN, state);
}
@Test
public void testAndFunction_negative() {
items.add(new TestItem("TestItem1", OpenClosedType.OPEN));
items.add(new TestItem("TestItem2", UnDefType.UNDEF));
items.add(new TestItem("TestItem3", OpenClosedType.OPEN));
items.add(new TestItem("TestItem4", OpenClosedType.OPEN));
items.add(new TestItem("TestItem5", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.And(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testAndFunction_justsOneItem() {
items.add(new TestItem("TestItem1", UnDefType.UNDEF));
function = new ArithmeticGroupFunction.And(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testNAndFunction() {
items.add(new TestItem("TestItem1", OpenClosedType.OPEN));
items.add(new TestItem("TestItem2", OpenClosedType.OPEN));
items.add(new TestItem("TestItem3", OpenClosedType.OPEN));
function = new ArithmeticGroupFunction.NAnd(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.CLOSED, state);
}
@Test
public void testNAndFunction_negative() {
items.add(new TestItem("TestItem1", OpenClosedType.OPEN));
items.add(new TestItem("TestItem2", OpenClosedType.OPEN));
items.add(new TestItem("TestItem3", OpenClosedType.CLOSED));
function = new ArithmeticGroupFunction.NAnd(OpenClosedType.OPEN, OpenClosedType.CLOSED);
State state = function.calculate(items);
assertEquals(OpenClosedType.OPEN, state);
}
@Test
public void testSumFunction() {
items.add(new TestItem("TestItem1", new DecimalType("23.54")));
items.add(new TestItem("TestItem2", UnDefType.NULL));
items.add(new TestItem("TestItem3", new DecimalType("89")));
items.add(new TestItem("TestItem4", UnDefType.UNDEF));
items.add(new TestItem("TestItem5", new DecimalType("122.41")));
function = new ArithmeticGroupFunction.Sum();
State state = function.calculate(items);
assertEquals(new DecimalType("234.95"), state);
}
class TestItem extends GenericItem {
public TestItem(String name, State state) {
super("Test", name);
setState(state);
}
@Override
public List<Class<? extends State>> getAcceptedDataTypes() {
return null;
}
@Override
public List<Class<? extends Command>> getAcceptedCommandTypes() {
return null;
}
}
}