Skip to content
Snippets Groups Projects
Commit ce873fa8 authored by René Schöne's avatar René Schöne
Browse files

working on multiple scenes

- workaround as ragconnect can not handle receiving lists yet
- added merging algorithm
- added tests for merging algorithm
- added some doc-strings in aspects
- test only against name of logical objects (as they might be copies now)
parent 064078d4
Branches
Tags
1 merge request!1Multiple scenes, multiple robots and more
Pipeline #10017 passed
Showing
with 274 additions and 49 deletions
import java.util.*;
aspect BFS {
//--- BFS ---
syn List<Edge> Vertex.BFS(Vertex goal) {
Map<Vertex, Edge> pred = new HashMap<>();
Queue<Vertex> Q = new LinkedList<>();
......@@ -36,7 +37,9 @@ aspect BFS {
return null;
}
//--- reconstructFrom ---
private List<Edge> Vertex.reconstructFrom(Vertex goal, Map<Vertex, Edge> pred) {
// used at the end of BFS to back-track path from goal to start
List<Edge> result = new ArrayList<>();
Vertex current = goal;
while (!current.equals(this)) {
......@@ -49,6 +52,7 @@ aspect BFS {
return result;
}
//--- prettyPrint ---
public String Graph.prettyPrint() {
StringJoiner sj = new StringJoiner("\n", "Graph {\n", "\n}");
if (!hasVertex()) { sj.add("<no vertices>"); }
......
aspect RobotReachabilityToBFS {
//--- toReachabilityGraph ---
syn nta Graph WorldModelB.toReachabilityGraph() {
Graph result = new Graph();
if (!hasMyScene()) {
......@@ -37,6 +38,7 @@ aspect RobotReachabilityToBFS {
return result;
}
//--- correspondingVertex ---
syn Optional<Vertex> LogicalObjectOfInterest.correspondingVertex() {
if (!worldModelB().hasMyScene()) {
return Optional.empty();
......
// --- receiving ---
receive tree WorldModelB.MyScene using ParseScene, ConvertScene ;
receive tree WorldModelB.OtherScene ;
receive tree WorldModelB.OtherScene1 ;
receive tree WorldModelB.OtherScene2 ;
receive tree Robot.CanReachObjectOfInterestWrapper using ParseReachability, ConvertReachability ;
// --- sending ---
......
aspect Computation {
//--- unspecifiedLocation ---
syn nta LogicalDropOffLocation WorldModelB.unspecifiedLocation() = new LogicalDropOffLocation().setName("<unspecified>");
//--- getOtherSceneList ---
syn JastAddList<LogicalScene> WorldModelB.getOtherSceneList() {
JastAddList<LogicalScene> result = new JastAddList<>();
if (hasOtherScene1()) {
result.add(getOtherScene1());
}
if (hasOtherScene2()) {
result.add(getOtherScene2());
}
return result;
}
//--- mergedOtherScene ---
syn nta LogicalScene WorldModelB.mergedOtherScene() {
// return empty scene, if there are no other scenes (yet)
if (!hasOtherScene()) {
return new LogicalScene();
}
// return scene, if there is exactly one. (TODO: check if copy is needed here)
if (getNumOtherScene() == 1) {
return getOtherScene(0);
}
var result = new LogicalScene();
// use getOtherSceneList() and merge by name all locations, objects and relations into one new, unified scene
Map<String, LogicalDropOffLocation> mergedLocations = new HashMap<>();
Map<String, LogicalMovableObject> mergedObjects = new HashMap<>();
// first create all locations
for (LogicalScene scene : getOtherSceneList()) {
for (LogicalDropOffLocation loc : scene.getLogicalDropOffLocationList()) {
if (!mergedLocations.containsKey(loc.getName())) {
LogicalDropOffLocation copyOfLoc = new LogicalDropOffLocation();
copyOfLoc.setName(loc.getName());
mergedLocations.put(loc.getName(), copyOfLoc);
result.addLogicalDropOffLocation(copyOfLoc);
}
}
}
// then create all objects, and set LocatedAt relation (checking for possible conflicts)
for (LogicalScene scene : getOtherSceneList()) {
for (LogicalMovableObject obj : scene.getLogicalMovableObjectList()) {
if (mergedObjects.containsKey(obj.getName())) {
// object already known
LogicalMovableObject copyOfObj = mergedObjects.get(obj.getName());
if (obj.hasLocatedAt()) {
String locationName = obj.getLocatedAt().getName();
LogicalDropOffLocation copyOfLoc = mergedLocations.get(locationName);
if (copyOfObj.hasLocatedAt() && !obj.getLocatedAt().getName().equals(copyOfObj.getLocatedAt().getName())) {
System.err.println("Overriding located-at of " + obj.getName() + " while merging (" + locationName + "," + copyOfObj.getLocatedAt().getName() + ")");
}
copyOfObj.setLocatedAt(copyOfLoc);
}
} else {
LogicalMovableObject copyOfObj = new LogicalMovableObject();
copyOfObj.setName(obj.getName());
if (obj.hasLocatedAt()) {
copyOfObj.setLocatedAt(mergedLocations.get(obj.getLocatedAt().getName()));
}
mergedObjects.put(obj.getName(), copyOfObj);
result.addLogicalMovableObject(copyOfObj);
}
}
}
return result;
}
//--- diffScenes ---
syn nta JastAddList<Difference> WorldModelB.diffScenes() {
var result = new JastAddList<Difference>();
if (!hasMyScene() || !hasOtherScene()) {
// without both scenes, there are no differences
// without my and at least one other scene, there are no differences
return result;
}
var myLogicalScene = getMyScene().getLogicalScene();
for (LogicalMovableObject otherObject : getOtherScene().getLogicalMovableObjectList()) {
for (LogicalMovableObject otherObject : mergedOtherScene().getLogicalMovableObjectList()) {
LogicalObjectOfInterest myGenericObject = myLogicalScene.resolveLogicalObjectOfInterest(otherObject.getName());
if (myGenericObject == null) {
// new object, currently not handled
......@@ -125,6 +191,7 @@ aspect Computation {
return false;
}
//--- reachableObjects ---
syn List<LogicalObjectOfInterest> Robot.reachableObjects() {
if (!worldModelB().hasMyScene()) {
return Collections.emptyList();
......
WorldModelB ::= Robot* [MyScene:Scene] [OtherScene:LogicalScene] /NextOperation:Operation/ ;
WorldModelB ::= Robot* [MyScene:Scene] [OtherScene1:LogicalScene] [OtherScene2:LogicalScene] /OtherScene:LogicalScene*/ /NextOperation:Operation/ ;
// workaround with NTA OtherSceneList as receiving lists is not possible yet
Robot ::= <Name:String> CanReachObjectOfInterestWrapper ;
......
......@@ -82,7 +82,7 @@ public class MainB extends SharedMainParts<MqttHandler, WorldModelB> {
@Override
protected void connectEndpoints() throws IOException {
model.connectMyScene(mqttUri(TOPIC_MY_SCENE_UPDATE_FROM_ROS, config));
model.connectOtherScene(mqttUri(TOPIC_OTHER_SCENE_UPDATE_FROM_PLACE_A, config));
model.connectOtherScene1(mqttUri(TOPIC_OTHER_SCENE_UPDATE_FROM_PLACE_A, config));
model.connectNextOperation(mqttUri(TOPIC_COMMAND, config), false);
}
......
......@@ -188,7 +188,7 @@ public class SimpleMainB {
/// Connect endpoints
model.connectMyScene(mqttUri("TOPIC_MY_SCENE_UPDATE_FROM_ROS", config));
model.connectOtherScene(mqttUri("TOPIC_OTHER_SCENE_UPDATE_FROM_PLACE_A", config));
model.connectOtherScene1(mqttUri("TOPIC_OTHER_SCENE_UPDATE_FROM_PLACE_A", config));
model.connectNextOperation(mqttUri("TOPIC_COMMANDS", config), false);
System.out.println("before");
......@@ -264,7 +264,7 @@ public class SimpleMainB {
LogicalDropOffLocation otherGamma = new LogicalDropOffLocation().setName("placeGamma");
otherGamma.addContainedObject(otherObj1);
otherScene.addLogicalDropOffLocation(otherGamma);
model.setOtherScene(otherScene);
model.setOtherScene1(otherScene);
// printing and testing
printModelInfos(model);
......
......@@ -117,7 +117,7 @@ public class UtilB {
}
sb.append("otherScene:");
if (model.hasOtherScene()) {
sb.append("\n").append(model.getOtherScene().prettyPrint());
sb.append("\n").append(model.mergedOtherScene().prettyPrint());
} else {
sb.append(" (unset)\n");
}
......
......@@ -33,7 +33,7 @@ public class TestComputeOperations {
LogicalMovableObject x = logicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
LogicalDropOffLocation red = logicalScene.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
LogicalDropOffLocation green = logicalScene.resolveLogicalObjectOfInterest("green").asLogicalDropOffLocation();
DifferenceObjectAtWrongPlace diff = new DifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, green);
DifferenceObjectAtWrongPlace diff = createDifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, green);
List<Operation> operations = diff.computeOperations();
assertThat(operations).isNotEmpty();
......@@ -60,7 +60,7 @@ public class TestComputeOperations {
LogicalDropOffLocation red = logicalScene.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
LogicalDropOffLocation blue = logicalScene.resolveLogicalObjectOfInterest("blue").asLogicalDropOffLocation();
Robot arm1 = model.findRobot("arm1").orElseThrow();
DifferenceObjectAtWrongPlace diff = new DifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, blue);
DifferenceObjectAtWrongPlace diff = createDifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, blue);
List<Operation> operations = diff.computeOperations();
assertThat(operations).isNotEmpty();
......@@ -90,7 +90,7 @@ public class TestComputeOperations {
LogicalDropOffLocation green = logicalScene.resolveLogicalObjectOfInterest("green").asLogicalDropOffLocation();
Robot arm1 = model.findRobot("arm1").orElseThrow();
Robot arm2 = model.findRobot("arm2").orElseThrow();
DifferenceObjectAtWrongPlace diff = new DifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, green);
DifferenceObjectAtWrongPlace diff = createDifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, green);
List<Operation> operations = diff.computeOperations();
assertThat(operations).isNotEmpty();
......@@ -137,7 +137,7 @@ public class TestComputeOperations {
Robot arm2 = model.findRobot("arm2").orElseThrow();
Robot arm4 = model.findRobot("arm4").orElseThrow();
Robot arm5 = model.findRobot("arm5").orElseThrow();
DifferenceObjectAtWrongPlace diff = new DifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, purple);
DifferenceObjectAtWrongPlace diff = createDifferenceObjectAtWrongPlace(x, emptyPreviousLocation ? null : red, purple);
List<Operation> operations = diff.computeOperations();
assertThat(operations).isNotEmpty();
......@@ -164,4 +164,12 @@ public class TestComputeOperations {
assertEquals(x, pickAndPlace3.getObjectToPick());
assertEquals(purple, pickAndPlace3.getTargetLocation());
}
private DifferenceObjectAtWrongPlace createDifferenceObjectAtWrongPlace(LogicalMovableObject x, LogicalDropOffLocation previousLocation, LogicalDropOffLocation newLocation) {
DifferenceObjectAtWrongPlace result = new DifferenceObjectAtWrongPlace();
result.setObject(x);
result.setPreviousLocation(previousLocation);
result.setNewLocation(newLocation);
return result;
}
}
......@@ -31,17 +31,15 @@ public class TestDifference {
LogicalMovableObject x = myLogicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
assertFalse(x.hasLocatedAt());
LogicalDropOffLocation otherRed = model.getOtherScene().resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
assertEquals(1, diffs.getNumChild());
Difference diff = diffs.getChild(0);
assertThat(diff).isInstanceOf(DifferenceObjectAtWrongPlace.class);
DifferenceObjectAtWrongPlace wrongPlace = (DifferenceObjectAtWrongPlace) diff;
assertEquals(x, wrongPlace.getObject());
assertEquals("x", wrongPlace.getObject().getName());
assertNull(wrongPlace.getPreviousLocation());
assertEquals(otherRed, wrongPlace.getNewLocation());
assertEquals("red", wrongPlace.getNewLocation().getName());
}
@Test
......@@ -58,9 +56,7 @@ public class TestDifference {
LogicalScene myLogicalScene = model.getMyScene().getLogicalScene();
LogicalMovableObject x = myLogicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
LogicalDropOffLocation blue = myLogicalScene.resolveLogicalObjectOfInterest("blue").asLogicalDropOffLocation();
assertEquals(blue, x.getLocatedAt());
LogicalDropOffLocation otherRed = model.getOtherScene().resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertEquals("blue", x.getLocatedAt().getName());
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
......@@ -68,9 +64,9 @@ public class TestDifference {
Difference diff = diffs.getChild(0);
assertThat(diff).isInstanceOf(DifferenceObjectAtWrongPlace.class);
DifferenceObjectAtWrongPlace wrongPlace = (DifferenceObjectAtWrongPlace) diff;
assertEquals(x, wrongPlace.getObject());
assertEquals(blue, wrongPlace.getPreviousLocation());
assertEquals(otherRed, wrongPlace.getNewLocation());
assertEquals("x", wrongPlace.getObject().getName());
assertEquals("blue", wrongPlace.getPreviousLocation().getName());
assertEquals("red", wrongPlace.getNewLocation().getName());
}
@Test
......@@ -86,8 +82,7 @@ public class TestDifference {
LogicalScene myLogicalScene = model.getMyScene().getLogicalScene();
LogicalMovableObject x = myLogicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
LogicalDropOffLocation red = myLogicalScene.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertEquals(red, x.getLocatedAt());
assertEquals("red", x.getLocatedAt().getName());
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
......@@ -95,8 +90,8 @@ public class TestDifference {
Difference diff = diffs.getChild(0);
assertThat(diff).isInstanceOf(DifferenceObjectMisplaced.class);
DifferenceObjectMisplaced misplaced = (DifferenceObjectMisplaced) diff;
assertEquals(x, misplaced.getObject());
assertEquals(red, misplaced.getPreviousLocation());
assertEquals("x", misplaced.getObject().getName());
assertEquals("red", misplaced.getPreviousLocation().getName());
}
@Test
......@@ -116,7 +111,7 @@ public class TestDifference {
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
assertEquals(0, diffs.getNumChild());
assertThat(diffs).isEmpty();
}
@Test
......@@ -133,12 +128,11 @@ public class TestDifference {
LogicalScene myLogicalScene = model.getMyScene().getLogicalScene();
LogicalMovableObject x = myLogicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
LogicalDropOffLocation red = myLogicalScene.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertEquals(red, x.getLocatedAt());
assertEquals("red", x.getLocatedAt().getName());
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
assertEquals(0, diffs.getNumChild());
assertThat(diffs).isEmpty();
}
@Test
......@@ -154,15 +148,13 @@ public class TestDifference {
LogicalScene myLogicalScene = model.getMyScene().getLogicalScene();
assertNull(myLogicalScene.resolveLogicalObjectOfInterest("x"));
LogicalMovableObject otherX = model.getOtherScene().resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
assertEquals(1, diffs.getNumChild());
Difference diff = diffs.getChild(0);
assertThat(diff).isInstanceOf(DifferenceNewObject.class);
DifferenceNewObject diffNewObject = (DifferenceNewObject) diff;
assertEquals(otherX, diffNewObject.getObject());
assertEquals("x", diffNewObject.getObject().getName());
}
@Test
......@@ -182,21 +174,17 @@ public class TestDifference {
LogicalScene myLogicalScene = model.getMyScene().getLogicalScene();
LogicalMovableObject x = myLogicalScene.resolveLogicalObjectOfInterest("x").asLogicalMovableObject();
LogicalMovableObject y = myLogicalScene.resolveLogicalObjectOfInterest("y").asLogicalMovableObject();
LogicalDropOffLocation blue = myLogicalScene.resolveLogicalObjectOfInterest("blue").asLogicalDropOffLocation();
LogicalDropOffLocation green = myLogicalScene.resolveLogicalObjectOfInterest("green").asLogicalDropOffLocation();
assertEquals(blue, x.getLocatedAt());
assertEquals(green, y.getLocatedAt());
LogicalDropOffLocation otherRed = model.getOtherScene().resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertEquals("blue", x.getLocatedAt().getName());
assertEquals("green", y.getLocatedAt().getName());
JastAddList<Difference> diffs = model.diffScenes();
assertNotNull(diffs);
assertEquals(2, diffs.getNumChild());
assertThat(diffs).allMatch(d -> d instanceof DifferenceObjectAtWrongPlace);
//noinspection unchecked
assertThat(diffs).map(diff -> (DifferenceObjectAtWrongPlace) diff)
.extracting("Object", "PreviousLocation", "NewLocation")
.containsOnly(tuple(x, blue, otherRed),
tuple(y, green, otherRed));
.extracting(d -> d.getObject().getName(), d -> d.getPreviousLocation().getName(), d -> d.getNewLocation().getName())
.containsOnly(tuple("x", "blue", "red"),
tuple("y", "green", "red"));
}
}
package de.tudresden.inf.st.placeB;
import de.tudresden.inf.st.placeB.ast.LogicalDropOffLocation;
import de.tudresden.inf.st.placeB.ast.LogicalMovableObject;
import de.tudresden.inf.st.placeB.ast.LogicalScene;
import de.tudresden.inf.st.placeB.ast.WorldModelB;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import java.util.Collections;
import static de.tudresden.inf.st.placeB.TestUtils.newModel;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Testing merging of multiple (other) scenes.
*
* @author rschoene - Initial contribution
*/
public class TestMultiScenes {
@Test
public void noOtherScenes() {
WorldModelB model = newModel();
LogicalScene actual = model.mergedOtherScene();
assertThat(actual.getLogicalDropOffLocationList()).isEmpty();
assertThat(actual.getLogicalMovableObjectList()).isEmpty();
}
@ParameterizedTest(name = "twoScenesContains [scene1 = {argumentsWithNames}]")
@ValueSource(booleans = {true, false})
public void oneSceneNoContains(boolean scene1) {
WorldModelB model = newModel();
TestUtils.addOtherLocations(scene1 ? model.getOtherScene1() : model.getOtherScene2(), "red");
TestUtils.addOtherObjects(scene1 ? model.getOtherScene1() : model.getOtherScene2(), "a");
LogicalScene actual = model.mergedOtherScene();
assertThat(actual.getLogicalDropOffLocationList())
.extracting("Name").containsOnly("red");
assertThat(actual.getLogicalMovableObjectList())
.extracting("Name").containsOnly("a");
}
@Test
public void twoScenesNoContains() {
WorldModelB model = newModel();
TestUtils.addOtherLocations(model, "red");
TestUtils.addOtherObjects(model, "a");
TestUtils.addOtherLocations(model.getOtherScene2(), "blue");
TestUtils.addOtherObjects(model.getOtherScene2(), "b");
LogicalScene actual = model.mergedOtherScene();
assertThat(actual.getLogicalDropOffLocationList())
.size().isEqualTo(2);
assertThat(actual.getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene2().getLogicalDropOffLocationList())
.extracting("Name").containsOnly("red", "blue");
assertThat(actual.getLogicalDropOffLocationList())
.extracting("ContainedObjects").containsOnly(Collections.emptyList());
assertThat(actual.getLogicalMovableObjectList())
.size().isEqualTo(2);
assertThat(actual.getLogicalMovableObjectList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalMovableObjectList())
.doesNotContainAnyElementsOf(model.getOtherScene2().getLogicalMovableObjectList())
.extracting("Name").containsOnly("a", "b");
assertThat(actual.getLogicalMovableObjectList())
.extracting("LocatedAt").containsOnly((LogicalDropOffLocation) null);
}
@ParameterizedTest(name = "twoScenesContains [scene1 = {argumentsWithNames}]")
@ValueSource(booleans = {true, false})
public void twoScenesContains1(boolean scene1) {
WorldModelB model = newModel();
TestUtils.addOtherLocations(model, "red", "blue");
TestUtils.addOtherObjects(model, "a", "b");
model.getOtherScene2().addLogicalDropOffLocation(new LogicalDropOffLocation().setName("red"));
model.getOtherScene2().addLogicalMovableObject(new LogicalMovableObject().setName("a"));
TestUtils.addContainedObjects(scene1 ? model.getOtherScene1() : model.getOtherScene2(),
"red", "a");
LogicalScene actual = model.mergedOtherScene();
assertThat(actual.getLogicalDropOffLocationList())
.size().isEqualTo(2);
assertThat(actual.getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene2().getLogicalDropOffLocationList())
.extracting("Name").containsExactly("red", "blue");
LogicalDropOffLocation red = actual.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertThat(red.getContainedObjectList())
.extracting("Name").containsOnly("a");
assertThat(actual.getLogicalMovableObjectList())
.size().isEqualTo(2);
assertThat(actual.getLogicalMovableObjectList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalMovableObjectList())
.extracting("Name").containsOnly("a", "b");
LogicalMovableObject a = actual.resolveLogicalObjectOfInterest("a").asLogicalMovableObject();
assertThat(a.getLocatedAt())
.extracting("Name").isEqualTo("red");
}
@Test
public void twoScenesRedContainsATwice() {
WorldModelB model = newModel();
TestUtils.addOtherLocations(model, "red", "blue");
TestUtils.addOtherObjects(model, "a", "b");
TestUtils.addContainedObjects(model, "red", "a");
TestUtils.addOtherLocations(model.getOtherScene2(), "red");
TestUtils.addOtherObjects(model.getOtherScene2(), "a", "b");
TestUtils.addContainedObjects(model.getOtherScene2(), "red", "a");
LogicalScene actual = model.mergedOtherScene();
assertThat(actual.getLogicalDropOffLocationList())
.size().isEqualTo(2);
assertThat(actual.getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalDropOffLocationList())
.doesNotContainAnyElementsOf(model.getOtherScene2().getLogicalDropOffLocationList())
.extracting("Name").containsExactly("red", "blue");
LogicalDropOffLocation red = actual.resolveLogicalObjectOfInterest("red").asLogicalDropOffLocation();
assertThat(red.getContainedObjectList())
.extracting("Name").containsOnly("a");
assertThat(actual.getLogicalMovableObjectList())
.size().isEqualTo(2);
assertThat(actual.getLogicalMovableObjectList())
.doesNotContainAnyElementsOf(model.getOtherScene1().getLogicalMovableObjectList())
.extracting("Name").containsOnly("a", "b");
LogicalMovableObject a = actual.resolveLogicalObjectOfInterest("a").asLogicalMovableObject();
assertThat(a.getLocatedAt())
.extracting("Name").isEqualTo("red");
}
}
......@@ -12,8 +12,8 @@ public class TestUtils {
WorldModelB model = new WorldModelB();
Scene scene = new Scene();
model.setMyScene(scene);
LogicalScene otherScene = new LogicalScene();
model.setOtherScene(otherScene);
model.setOtherScene1(new LogicalScene());
model.setOtherScene2(new LogicalScene());
return model;
}
......@@ -70,21 +70,33 @@ public class TestUtils {
}
public static void addOtherObjects(WorldModelB model, String... names) {
addOtherObjects(model.getOtherScene1(), names);
}
public static void addOtherObjects(LogicalScene scene, String... names) {
for (String name : names) {
model.getOtherScene().addLogicalMovableObject(new LogicalMovableObject().setName(name));
scene.addLogicalMovableObject(new LogicalMovableObject().setName(name));
}
}
public static void addOtherLocations(WorldModelB model, String... names) {
addOtherLocations(model.getOtherScene1(), names);
}
public static void addOtherLocations(LogicalScene scene, String... names) {
for (String name : names) {
model.getOtherScene().addLogicalDropOffLocation(new LogicalDropOffLocation().setName(name));
scene.addLogicalDropOffLocation(new LogicalDropOffLocation().setName(name));
}
}
public static void addContainedObjects(WorldModelB model, String locationName, String... objectNames) {
LogicalDropOffLocation location = model.getOtherScene().resolveLogicalObjectOfInterest(locationName).asLogicalDropOffLocation();
addContainedObjects(model.getOtherScene1(), locationName, objectNames);
}
public static void addContainedObjects(LogicalScene scene, String locationName, String... objectNames) {
LogicalDropOffLocation location = scene.resolveLogicalObjectOfInterest(locationName).asLogicalDropOffLocation();
for (String objectName : objectNames) {
location.addContainedObject(model.getOtherScene().resolveLogicalObjectOfInterest(objectName).asLogicalMovableObject());
location.addContainedObject(scene.resolveLogicalObjectOfInterest(objectName).asLogicalMovableObject());
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment