diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java index fd6024bdfd45e2652eb4eaa118eada3dbfc75f23..5836641cd5b068302f1b258c08c5a4021400b228 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java @@ -35,6 +35,15 @@ public class TestUtils { return ModelAndItem.of(root.getSmartHomeEntityModel(), item); } + public static SmartHomeEntityModel createModelWithGroup() { + Root root = Root.createEmptyRoot(); + Group g = new Group(); + root.getSmartHomeEntityModel().addGroup(g); + g.setID("DEFAULT_GROUP"); + + return root.getSmartHomeEntityModel(); + } + public static NumberItem addItemTo(SmartHomeEntityModel model, double initialValue) { return addItemTo(model, initialValue, false); } diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java index c566bf861833c4cd12fecee142d285d1228269a2..633627c6bf85e4ddd363865b01bb62155919ae1e 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java @@ -2,12 +2,17 @@ package de.tudresden.inf.st.eraser; import beaver.Parser; import de.tudresden.inf.st.eraser.jastadd.model.*; +import de.tudresden.inf.st.eraser.jastadd.model.Action; import de.tudresden.inf.st.eraser.util.ParserUtils; import de.tudresden.inf.st.eraser.util.TestUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Disabled; +import org.testcontainers.shaded.com.google.common.collect.ImmutableList; import java.io.IOException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledFuture; @@ -15,9 +20,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.StreamSupport; +import static de.tudresden.inf.st.eraser.util.TestUtils.getDefaultGroup; import static org.assertj.core.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; /** * Testing the simple rule engine. @@ -245,6 +250,254 @@ public class RulesTest { assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated"); } + @Test + public void testStateSyncGroupRewriteStructure() { + // init StateSyncGroup + StateSyncGroup group = new StateSyncGroup(); + + ArrayList<Item> items = new ArrayList<>(); + + // create model and an item + TestUtils.ModelAndItem mai = TestUtils.createModelAndItem(0, true); + NumberItem item0 = mai.item; + group.addTargetItem(item0); + items.add(item0); + + // init more items + for (int i=1;i<=4;i++) { + NumberItem item = TestUtils.addItemTo(mai.model, i, true); + item.setID("item"+i); + group.addTargetItem(item); + items.add(item); + } + + // add StateSyncGroup as rule to root + mai.model.getRoot().addRule(group); + + + + // trace rewritten rule and its actions + Rule rewrittenRule = mai.model.getRoot().getRules().getChild(0); + + + ImmutableList<Action> actions = ImmutableList.copyOf(rewrittenRule.getActionList().iterator()); + ImmutableList<ItemObserver> observers = ImmutableList.copyOf(rewrittenRule.getObservers().iterator()); + + // check general structure + assertEquals(ImmutableList.copyOf(rewrittenRule.getConditionList().iterator()).size(), 0); + assertEquals(actions.size(), 5); + + // check actions and observers + for (int i=0;i<items.size();i++) { + assertTrue(actions.get(i) instanceof SetStateFromTriggeringItemAction); + assertTrue(observers.contains(items.get(i).getItemObserver())); + } + + + + } + + private static void addItemToModel(SmartHomeEntityModel model, Item item) { + getDefaultGroup(model).addItem(item); + } + + @Test + public void testColorItemStateSyncGroup() { + StateSyncGroup group = new StateSyncGroup(); + + //init model and 3 items + SmartHomeEntityModel model = TestUtils.createModelWithGroup(); + + ColorItem colorItem1 = new ColorItem(); + addItemToModel(model,colorItem1); + group.addTargetItem(colorItem1); + + ColorItem colorItem2 = new ColorItem(); + addItemToModel(model,colorItem2); + group.addTargetItem(colorItem2); + + ColorItem colorItem3 = new ColorItem(); + addItemToModel(model,colorItem3); + group.addTargetItem(colorItem3); + + + // add StateSyncGroup as rule to root and trigger rewrite + model.getRoot().addRule(group); + model.getRoot().doFullTraversal(); + + + colorItem1.setState(TupleHSB.parse("0,0,100")); + assertEquals(colorItem1.getState(),TupleHSB.parse("0,0,100")); + assertEquals(colorItem2.getState(),TupleHSB.parse("0,0,100")); + assertEquals(colorItem3.getState(),TupleHSB.parse("0,0,100")); + + colorItem3.setState(TupleHSB.parse("0,0,7")); + assertEquals(colorItem1.getState(),TupleHSB.parse("0,0,7")); + assertEquals(colorItem2.getState(),TupleHSB.parse("0,0,7")); + assertEquals(colorItem3.getState(),TupleHSB.parse("0,0,7")); + + + } + + @Test + public void testDateTimeItemStateSyncGroup() { + StateSyncGroup group = new StateSyncGroup(); + + //init model and 3 items + SmartHomeEntityModel model = TestUtils.createModelWithGroup(); + + DateTimeItem dateTimeItem1 = new DateTimeItem(); + addItemToModel(model,dateTimeItem1); + group.addTargetItem(dateTimeItem1); + + DateTimeItem dateTimeItem2 = new DateTimeItem(); + addItemToModel(model,dateTimeItem2); + group.addTargetItem(dateTimeItem2); + + DateTimeItem dateTimeItem3 = new DateTimeItem(); + addItemToModel(model,dateTimeItem3); + group.addTargetItem(dateTimeItem3); + + + // add StateSyncGroup as rule to root and trigger rewrite + model.getRoot().addRule(group); + model.getRoot().doFullTraversal(); + + Instant i1 = Instant.now(); + dateTimeItem1.setState(i1); + assertEquals(dateTimeItem1.getState(),i1); + assertEquals(dateTimeItem2.getState(),i1); + assertEquals(dateTimeItem3.getState(),i1); + + Instant i2 = Instant.now(); + dateTimeItem3.setState(i2); + assertEquals(dateTimeItem1.getState(),i2); + assertEquals(dateTimeItem2.getState(),i2); + assertEquals(dateTimeItem3.getState(),i2); + } + + /** + * Also for DimmerItem, RollerShutterItem, ActivityItem + */ + @Test + public void testDoubleStateItemStateSyncGroup() { + StateSyncGroup group = new StateSyncGroup(); + + //init model and 3 items + SmartHomeEntityModel model = TestUtils.createModelWithGroup(); + + NumberItem numberItem1 = new NumberItem(); + addItemToModel(model,numberItem1); + group.addTargetItem(numberItem1); + + NumberItem numberItem2 = new NumberItem(); + addItemToModel(model,numberItem2); + group.addTargetItem(numberItem2); + + NumberItem numberItem3 = new NumberItem(); + addItemToModel(model,numberItem3); + group.addTargetItem(numberItem3); + + + // add StateSyncGroup as rule to root and trigger rewrite + model.getRoot().addRule(group); + model.getRoot().doFullTraversal(); + + + numberItem1.setState(123); + assertEquals(numberItem1.getState(),123); + assertEquals(numberItem2.getState(),123); + assertEquals(numberItem3.getState(),123); + + numberItem2.setState(42); + assertEquals(numberItem1.getState(),42); + assertEquals(numberItem2.getState(),42); + assertEquals(numberItem3.getState(),42); + } + + /** + * Also for ImageItem, LocationItem, PlayerItem, DefaultItem + */ + @Test + public void testStringStateItemStateSyncGroup() { + StateSyncGroup group = new StateSyncGroup(); + + //init model and 3 items + SmartHomeEntityModel model = TestUtils.createModelWithGroup(); + + StringItem stringItem1 = new StringItem(); + addItemToModel(model,stringItem1); + group.addTargetItem(stringItem1); + + StringItem stringItem2 = new StringItem(); + addItemToModel(model,stringItem2); + group.addTargetItem(stringItem2); + + StringItem stringItem3 = new StringItem(); + addItemToModel(model,stringItem3); + group.addTargetItem(stringItem3); + + + // add StateSyncGroup as rule to root and trigger rewrite + model.getRoot().addRule(group); + model.getRoot().doFullTraversal(); + + + stringItem1.setState("123"); + assertEquals(stringItem1.getState(),"123"); + assertEquals(stringItem2.getState(),"123"); + assertEquals(stringItem3.getState(),"123"); + + stringItem2.setState("Hermes"); + assertEquals(stringItem1.getState(),"Hermes"); + assertEquals(stringItem2.getState(),"Hermes"); + assertEquals(stringItem3.getState(),"Hermes"); + + + } + + + /** + * Also for ContactItem + */ + @Test + public void testBooleanStateItemStateSyncGroup() { + StateSyncGroup group = new StateSyncGroup(); + + //init model and 3 items + SmartHomeEntityModel model = TestUtils.createModelWithGroup(); + + SwitchItem switchItem1 = new SwitchItem(); + addItemToModel(model,switchItem1); + group.addTargetItem(switchItem1); + + SwitchItem switchItem2 = new SwitchItem(); + addItemToModel(model,switchItem2); + group.addTargetItem(switchItem2); + + SwitchItem switchItem3 = new SwitchItem(); + addItemToModel(model,switchItem3); + group.addTargetItem(switchItem3); + + + // add StateSyncGroup as rule to root and trigger rewrite + model.getRoot().addRule(group); + model.getRoot().doFullTraversal(); + + + switchItem3.setState(false); + assertFalse(switchItem1.getState()); + assertFalse(switchItem2.getState()); + assertFalse(switchItem3.getState()); + + switchItem1.setState(true); + assertTrue(switchItem1.getState()); + assertTrue(switchItem2.getState()); + assertTrue(switchItem3.getState()); + + } + + @Test public void testTwoActions() { TestUtils.ModelAndItem modelAndItem = createModelAndItem(2); @@ -673,7 +926,7 @@ public class RulesTest { private StringItem addStringItem(SmartHomeEntityModel model, String initialValue) { StringItem item = new StringItem(); - Group group = TestUtils.getDefaultGroup(model); + Group group = getDefaultGroup(model); item.setID("item" + group.getNumItem()); item.setState(initialValue, false); group.addItem(item);