Skip to content
Snippets Groups Projects
Commit 1863ba06 authored by Manuel Krombholz's avatar Manuel Krombholz
Browse files

StateSyncGroup Tests for different Item Types

parent 3656a189
Branches
Tags
1 merge request!10Resolve "Check if item-controlling can be modeled using ECA rules"
Pipeline #9471 failed
......@@ -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);
}
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment