package org.openhab.domain.rule; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openhab.domain.DocumentFactory; import org.openhab.domain.IDocumentFactory; import org.openhab.domain.IEventBus; import org.openhab.domain.IOpenHABWidgetProvider; import org.openhab.domain.IPopularNameProvider; import org.openhab.domain.IUnitEntityDataTypeProvider; import org.openhab.domain.OpenHABWidgetProvider; import org.openhab.domain.PopularNameProvider; import org.openhab.domain.UnitEntityDataTypeProvider; import org.openhab.domain.model.OpenHABWidget; import org.openhab.domain.rule.operators.RuleOperator; import org.openhab.domain.util.IColorParser; import org.openhab.domain.util.ILogger; import org.openhab.domain.util.RegularExpression; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.mock; /** * Created by Tony Alpskog in 2014. */ public class RuleTreeTest { private IRuleOperatorProvider mRop; private IOpenHABWidgetProvider mWidgetProvider; private IUnitEntityDataTypeProvider mUnitEntityDataTypeProvider; private IEventBus mEventBus; @Before public void setUp() throws Exception { final ILogger logger = mock(ILogger.class); final IColorParser colorParser = mock(IColorParser.class); final RegularExpression regularExpression = new RegularExpression(); final IPopularNameProvider popularNameProvider = new PopularNameProvider(); mEventBus = mock(IEventBus.class); mWidgetProvider = new OpenHABWidgetProvider(regularExpression, logger, popularNameProvider, mEventBus); mUnitEntityDataTypeProvider = new UnitEntityDataTypeProvider(); final IDocumentFactory documentFactory = new DocumentFactory(); final HttpDataSetup httpDataSetup = new HttpDataSetup(logger, colorParser, documentFactory); mWidgetProvider.setOpenHABWidgets(httpDataSetup.loadTestData()); mRop = new RuleOperatorProvider(); } @Test public void testSimple2() { Assert.assertTrue(true); } @Test public void testGetWidgetById() { OpenHABWidget unit = mWidgetProvider.getWidgetByID("GF_Kitchen_0"); Assert.assertEquals("Ceiling", unit.getLabel()); Assert.assertEquals("Light_GF_Kitchen_Ceiling", unit.getItem().getName()); } @Test public void testMathEpsilonDiff() { Float f = Float.valueOf(34.7f); Double d = Double.valueOf(34.7); Assert.assertEquals(true, Math.abs(f.doubleValue() - d.doubleValue()) < 8E-7f); Assert.assertEquals(true, Math.abs(d.doubleValue() - f.doubleValue()) < 8E-7f); } private List<IEntityDataType> mock_getOperandsAsList(int operandPairNumber) { List<IEntityDataType> operands = new ArrayList<IEntityDataType>(); switch (operandPairNumber) { case 1: //Switch operands.add(mUnitEntityDataTypeProvider.getUnitEntityDataType(mWidgetProvider.getWidgetByID("GF_Kitchen_0"))); operands.add(mUnitEntityDataTypeProvider.getUnitEntityDataType(mWidgetProvider.getWidgetByID("FF_Bath_1"))); break; case 2: //Number operands.add(mUnitEntityDataTypeProvider.getUnitEntityDataType(mWidgetProvider.getWidgetByID("FF_Bed_3"))); operands.add(mUnitEntityDataTypeProvider.getUnitEntityDataType(mWidgetProvider.getWidgetByID("GF_Toilet_4"))); break; } return operands; } public RuleOperation mock_getRuleOperation(int operationNumber) { RuleOperation result = null; OpenHABWidget widget; switch (operationNumber) { case 1: widget = mWidgetProvider.getWidgetByID("GF_Kitchen_0"); result = new RuleOperation(mRop.getRuleOperator(widget, RuleOperatorType.Equal), mock_getOperandsAsList(1)); // Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF] break; case 2: widget = mWidgetProvider.getWidgetByID("FF_Bath_1"); result = new RuleOperation(mRop.getRuleOperator(widget, RuleOperatorType.NotEqual), mock_getOperandsAsList(1)); // Light_GF_Kitchen_Ceiling [OFF] != Light_FF_Bath_Mirror [OFF] break; case 3: widget = mWidgetProvider.getWidgetByID("FF_Bed_3"); result = new RuleOperation(mRop.getRuleOperator(widget, RuleOperatorType.LessThan), mock_getOperandsAsList(2)); // Temperature_FF_Bed [19.20] < Temperature_GF_Toilet [21.50] break; case 4: widget = mWidgetProvider.getWidgetByID("GF_Toilet_4"); result = new RuleOperation(mRop.getRuleOperator(widget, RuleOperatorType.MoreThan), mock_getOperandsAsList(2)); // Temperature_FF_Bed [19.20] > Temperature_GF_Toilet [21.50] break; } return result; } @Test public void test_toString() { RuleTreeItem rt = mock_getRuleOperation(1).getRuleTreeItem(0); Assert.assertEquals("[Sant] Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]", rt.toString()); } @Test public void test_toString_from_a_two_operation_operands_operation() { RuleOperation ron1 = mock_getRuleOperation(1); RuleTreeItem rti1 = new RuleTreeItem(0, ron1.getRuleTreeItem(0).toString(), RuleTreeItem.ItemType.OPERAND); Assert.assertEquals("[Sant] Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]", rti1.toString()); Assert.assertEquals(0, rti1.getPosition()); Assert.assertEquals(0, rti1.getChildren().size()); Assert.assertEquals(true, ron1.getValue().getValue()); RuleOperation ron2 = mock_getRuleOperation(4); RuleTreeItem rti2 = new RuleTreeItem(1, ron2.getRuleTreeItem(1).toString(), RuleTreeItem.ItemType.OPERAND); Assert.assertEquals("[Falskt] Temperature_FF_Bed [19.2] > Temperature_GF_Toilet [21.5]", rti2.toString()); Assert.assertEquals(1, rti2.getPosition()); Assert.assertEquals(0, rti2.getChildren().size()); Assert.assertEquals(false, ron2.getValue().getValue()); RuleOperator ror = mRop.getRuleOperator(LogicBoolean.class, RuleOperatorType.And); List<IEntityDataType> operandList = new ArrayList<IEntityDataType>(); operandList.add(ron1); operandList.add(ron2); RuleOperation mainOperation = new RuleOperation(ror, operandList); RuleTreeItem mainRuleTreeItem = mainOperation.getRuleTreeItem(3); Assert.assertEquals(3, mainRuleTreeItem.getPosition()); Assert.assertEquals(false, mainOperation.getValue().getValue()); Assert.assertEquals("(Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]) AND (Temperature_FF_Bed [19.2] > Temperature_GF_Toilet [21.5])", mainOperation.toString()); Assert.assertEquals("[Falskt] (Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]) AND (Temperature_FF_Bed [19.2] > Temperature_GF_Toilet [21.5])", mainRuleTreeItem.toString()); Assert.assertEquals(3, mainRuleTreeItem.getChildren().size()); Assert.assertEquals("[Sant] Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]", mainRuleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("AND", mainRuleTreeItem.getChildren().get(1).toString()); Assert.assertEquals(1, mainRuleTreeItem.getChildren().get(1).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(1).getChildren().size()); Assert.assertEquals("[Falskt] Temperature_FF_Bed [19.2] > Temperature_GF_Toilet [21.5]", mainRuleTreeItem.getChildren().get(2).toString()); Assert.assertEquals(2, mainRuleTreeItem.getChildren().get(2).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(2).getChildren().size()); operandList.clear(); ron1.setName("First_Operation"); ron2.setName("Second_Operation"); operandList.add(ron1); operandList.add(ron2); mainOperation = new RuleOperation(ror, operandList); mainRuleTreeItem = mainOperation.getRuleTreeItem(3); Assert.assertEquals(3, mainRuleTreeItem.getPosition()); Assert.assertEquals(false, mainOperation.getValue().getValue()); Assert.assertEquals("First_Operation [Sant] AND Second_Operation [Falskt]", mainOperation.toString()); Assert.assertEquals("[Falskt] First_Operation [Sant] AND Second_Operation [Falskt]", mainRuleTreeItem.toString()); Assert.assertEquals(3, mainRuleTreeItem.getChildren().size()); Assert.assertEquals("[Sant] First_Operation", mainRuleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("AND", mainRuleTreeItem.getChildren().get(1).toString()); Assert.assertEquals(1, mainRuleTreeItem.getChildren().get(1).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(1).getChildren().size()); Assert.assertEquals("[Falskt] Second_Operation", mainRuleTreeItem.getChildren().get(2).toString()); Assert.assertEquals(2, mainRuleTreeItem.getChildren().get(2).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(2).getChildren().size()); } @Test public void test_toString_with_nested_incomplete_operations() { RuleOperation ron1 = mock_getRuleOperation(1); ron1.setOperand(0, null); RuleTreeItem rti1 = new RuleTreeItem(0, ron1.getRuleTreeItem(0).toString(), RuleTreeItem.ItemType.OPERAND); String rti1String = RuleOperatorType.MISSING_OPERAND + " = Light_FF_Bath_Mirror [OFF]"; Assert.assertEquals("[Falskt] " + rti1String, rti1.toString()); Assert.assertEquals(false, ron1.getValue().getValue()); RuleOperation ron2 = mock_getRuleOperation(4); ron2.setRuleOperator(null); RuleTreeItem rti2 = new RuleTreeItem(1, ron2.getRuleTreeItem(1).toString(), RuleTreeItem.ItemType.OPERAND); String rti2String = "Temperature_FF_Bed [19.2] " + RuleOperator.MISSING_OPERATOR; Assert.assertEquals("[Falskt] " + rti2String, rti2.toString()); Assert.assertEquals(false, ron2.getValue().getValue()); RuleOperation ron3 = new RuleOperation("Empty operation"); RuleTreeItem rti3 = new RuleTreeItem(1, ron3.getRuleTreeItem(1).toString(), RuleTreeItem.ItemType.OPERAND); String rti3String = "Empty operation"; Assert.assertEquals("[Falskt] " + rti3String + " <Incomplete>", rti3.toString()); Assert.assertEquals(false, ron3.getValue().getValue()); RuleOperator ror = mRop.getRuleOperator(LogicBoolean.class, RuleOperatorType.And); List<IEntityDataType> operandList = new ArrayList<IEntityDataType>(); operandList.add(ron1); operandList.add(ron2); operandList.add(ron3); RuleOperation mainOperation = new RuleOperation(ror, operandList); RuleTreeItem mainRuleTreeItem = mainOperation.getRuleTreeItem(3); Assert.assertEquals(3, mainRuleTreeItem.getPosition()); Assert.assertEquals(false, mainOperation.getValue().getValue()); Assert.assertEquals("(" + rti1String + ") AND (" + rti2String + ") AND " + rti3String + " <Incomplete> [Falskt]", mainOperation.toString()); Assert.assertEquals("[Falskt] (" + rti1String + ") AND (" + rti2String + ") AND " + rti3String + " <Incomplete> [Falskt]", mainRuleTreeItem.toString()); Assert.assertEquals(5, mainRuleTreeItem.getChildren().size()); Assert.assertEquals("[Falskt] " + rti1String, mainRuleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("AND", mainRuleTreeItem.getChildren().get(1).toString()); Assert.assertEquals(1, mainRuleTreeItem.getChildren().get(1).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(1).getChildren().size()); Assert.assertEquals("[Falskt] " + rti2String, mainRuleTreeItem.getChildren().get(2).toString()); Assert.assertEquals(2, mainRuleTreeItem.getChildren().get(2).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(2).getChildren().size()); Assert.assertEquals("AND", mainRuleTreeItem.getChildren().get(3).toString()); Assert.assertEquals(3, mainRuleTreeItem.getChildren().get(3).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(3).getChildren().size()); Assert.assertEquals("[Falskt] " + rti3String + " <Incomplete>", mainRuleTreeItem.getChildren().get(4).toString()); Assert.assertEquals(4, mainRuleTreeItem.getChildren().get(4).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(4).getChildren().size()); mainOperation.setRuleOperator(mRop.getRuleOperator(LogicBoolean.class, RuleOperatorType.Or)); mainRuleTreeItem = mainOperation.getRuleTreeItem(3); Assert.assertEquals(false, mainOperation.getValue().getValue()); Assert.assertEquals("(" + rti1String + ") OR (" + rti2String + ") OR " + rti3String + " <Incomplete> [Falskt]", mainOperation.toString()); Assert.assertEquals("[Falskt] (" + rti1String + ") OR (" + rti2String + ") OR " + rti3String + " <Incomplete> [Falskt]", mainRuleTreeItem.toString()); Assert.assertEquals(5, mainRuleTreeItem.getChildren().size()); Assert.assertEquals("[Falskt] " + rti1String, mainRuleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("OR", mainRuleTreeItem.getChildren().get(1).toString()); Assert.assertEquals(1, mainRuleTreeItem.getChildren().get(1).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(1).getChildren().size()); Assert.assertEquals("[Falskt] " + rti2String, mainRuleTreeItem.getChildren().get(2).toString()); Assert.assertEquals(2, mainRuleTreeItem.getChildren().get(2).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(2).getChildren().size()); Assert.assertEquals("OR", mainRuleTreeItem.getChildren().get(3).toString()); Assert.assertEquals(3, mainRuleTreeItem.getChildren().get(3).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(3).getChildren().size()); Assert.assertEquals("[Falskt] " + rti3String + " <Incomplete>", mainRuleTreeItem.getChildren().get(4).toString()); Assert.assertEquals(4, mainRuleTreeItem.getChildren().get(4).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(4).getChildren().size()); ror = mainOperation.getRuleOperator(); operandList.add(mock_getRuleOperation(1)); mainOperation = new RuleOperation(ror, operandList); mainRuleTreeItem = mainOperation.getRuleTreeItem(3); Assert.assertEquals(true, mainOperation.getValue().getValue()); Assert.assertEquals("(" + rti1String + ") OR (" + rti2String + ") OR " + rti3String + " <Incomplete> [Falskt] OR (Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF])", mainOperation.toString()); Assert.assertEquals("[Sant] (" + rti1String + ") OR (" + rti2String + ") OR " + rti3String + " <Incomplete> [Falskt] OR (Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF])", mainRuleTreeItem.toString()); Assert.assertEquals(7, mainRuleTreeItem.getChildren().size()); Assert.assertEquals("[Falskt] " + rti1String, mainRuleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("OR", mainRuleTreeItem.getChildren().get(1).toString()); Assert.assertEquals(1, mainRuleTreeItem.getChildren().get(1).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(1).getChildren().size()); Assert.assertEquals("[Falskt] " + rti2String, mainRuleTreeItem.getChildren().get(2).toString()); Assert.assertEquals(2, mainRuleTreeItem.getChildren().get(2).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(2).getChildren().size()); Assert.assertEquals("OR", mainRuleTreeItem.getChildren().get(3).toString()); Assert.assertEquals(3, mainRuleTreeItem.getChildren().get(3).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(3).getChildren().size()); Assert.assertEquals("[Falskt] " + rti3String + " <Incomplete>", mainRuleTreeItem.getChildren().get(4).toString()); Assert.assertEquals(4, mainRuleTreeItem.getChildren().get(4).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(4).getChildren().size()); Assert.assertEquals("OR", mainRuleTreeItem.getChildren().get(5).toString()); Assert.assertEquals(5, mainRuleTreeItem.getChildren().get(5).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(5).getChildren().size()); Assert.assertEquals("[Sant] Light_GF_Kitchen_Ceiling [OFF] = Light_FF_Bath_Mirror [OFF]", mainRuleTreeItem.getChildren().get(6).toString()); Assert.assertEquals(6, mainRuleTreeItem.getChildren().get(6).getPosition()); Assert.assertEquals(0, mainRuleTreeItem.getChildren().get(6).getChildren().size()); } @Test public void test_toString_with_nested_empty_operations() { RuleOperation ro1 = new RuleOperation("Hello"); RuleOperation ro2 = new RuleOperation("There"); ro1.setOperand(0, ro2); RuleTreeItem ruleTreeItem = ro1.getRuleTreeItem(0); Assert.assertEquals(1, ruleTreeItem.getChildren().size()); Assert.assertEquals("Hello <Incomplete> [Falskt]", ro1.toString()); Assert.assertEquals("There <Incomplete> [Falskt]", ro2.toString()); Assert.assertEquals("[Falskt] Hello <Incomplete>", ruleTreeItem.toString()); Assert.assertEquals(0, ruleTreeItem.getChildren().get(0).getChildren().size()); Assert.assertEquals("[Falskt] There <Incomplete>", ruleTreeItem.getChildren().get(0).toString()); Assert.assertEquals(0, ruleTreeItem.getChildren().get(0).getPosition()); Assert.assertEquals(0, ruleTreeItem.getChildren().get(0).getChildren().size()); } }