From 2e50840d4489dee2852f15f17d1444b369d9dd74 Mon Sep 17 00:00:00 2001 From: Karl Schrab Date: Fri, 24 Jan 2025 10:58:17 +0100 Subject: [PATCH] test(agents): unit test for mapping and launching agents --- .../ambassador/ApplicationAmbassadorTest.java | 34 +++++++++- .../ambassador/InteractionTestHelper.java | 29 ++++++++ .../application/app/TestAgentApplication.java | 53 +++++++++++++++ .../mapping/ambassador/SpawningFramework.java | 57 +++++++++------- .../ambassador/spawning/AgentSpawner.java | 7 +- .../ambassador/MappingAmbassadorTest.java | 68 +++++++++++++++---- .../test/resources/mapping_config_agent.json | 45 ++++++++++++ 7 files changed, 252 insertions(+), 41 deletions(-) create mode 100644 fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/app/TestAgentApplication.java create mode 100644 fed/mosaic-mapping/src/test/resources/mapping_config_agent.json diff --git a/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/ApplicationAmbassadorTest.java b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/ApplicationAmbassadorTest.java index e58ad6110..7bef0f93a 100644 --- a/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/ApplicationAmbassadorTest.java +++ b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/ApplicationAmbassadorTest.java @@ -30,6 +30,7 @@ import org.eclipse.mosaic.fed.application.ambassador.simulation.communication.ReceivedAcknowledgement; import org.eclipse.mosaic.fed.application.ambassador.simulation.navigation.CentralNavigationComponent; import org.eclipse.mosaic.fed.application.ambassador.simulation.perception.CentralPerceptionComponent; +import org.eclipse.mosaic.fed.application.app.TestAgentApplication; import org.eclipse.mosaic.fed.application.app.TestApplicationWithSpy; import org.eclipse.mosaic.fed.application.app.TestChargingStationApplication; import org.eclipse.mosaic.fed.application.app.TestElectricVehicleApplication; @@ -72,6 +73,7 @@ import org.eclipse.mosaic.rti.api.RtiAmbassador; import org.eclipse.mosaic.rti.api.parameters.AmbassadorParameter; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.junit.After; import org.junit.Assert; @@ -311,6 +313,35 @@ public void processInteraction_VehicleRegistration_VehicleWithElectricVehicleApp ); } + /** + * The ApplicationAmbassador receives an AgentRegistration interaction with a AgentApplication. + * The application of the agent will be added to the simulator and initialized. + * After the simulation has been finished, the application will tear down. + */ + @Test + public void processInteraction_AgentRegistration() throws InternalFederateException, IOException { + final ApplicationAmbassador ambassador = createAmbassador(); + + // init ambassador + ambassador.initialize(0L, END_TIME); + assertEquals("Time advance should be requested for the end of the simulation", END_TIME, recentAdvanceTime); + + TestAgentApplication app = testAddUnit( + ambassador, + "agent_0", + InteractionTestHelper.createAgentRegistrationInteraction("agent_0", 5, TestAgentApplication.class) + ); + + // verify that setUp has been called on the application of the unit + Mockito.verify(app.getApplicationSpy()).onStartup(); + + // tears down all applications + ambassador.processTimeAdvanceGrant(recentAdvanceTime); + ambassador.processTimeAdvanceGrant(END_TIME); + ambassador.finishSimulation(); + Mockito.verify(app.getApplicationSpy()).onShutdown(); + } + /** * After a vehicle has been added to the ApplicationAmbassador, it receives an V2xMessageReception Interaction. @@ -953,12 +984,13 @@ private > TEST_AP Assert.assertEquals(interaction.getTime(), recentAdvanceTime); Assert.assertTrue(interactionTimeEquals(interaction.getTime())); Assert.assertTrue(countStartApplicationEvents() > 0); + Assert.assertNotNull(UnitSimulator.UnitSimulator.getAllUnits().get(unitId)); // should initialize the application ambassador.processTimeAdvanceGrant(recentAdvanceTime); @SuppressWarnings("unchecked") - TEST_APP app = (TEST_APP) UnitSimulator.UnitSimulator.getAllUnits().get(unitId).getApplications().get(0); + TEST_APP app = (TEST_APP) Iterables.getFirst(UnitSimulator.UnitSimulator.getAllUnits().get(unitId).getApplications(), null); // assert that the requested advance time of the ambassador did not change Assert.assertEquals(interaction.getTime(), recentAdvanceTime); diff --git a/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/InteractionTestHelper.java b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/InteractionTestHelper.java index 43fb40b30..7b72f574a 100644 --- a/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/InteractionTestHelper.java +++ b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/ambassador/InteractionTestHelper.java @@ -21,6 +21,7 @@ import org.eclipse.mosaic.fed.application.app.TestServerApplication; import org.eclipse.mosaic.fed.application.app.TestTrafficLightApplication; import org.eclipse.mosaic.fed.application.app.TestTrafficManagementCenterApplication; +import org.eclipse.mosaic.interactions.mapping.AgentRegistration; import org.eclipse.mosaic.interactions.mapping.ChargingStationRegistration; import org.eclipse.mosaic.interactions.mapping.RsuRegistration; import org.eclipse.mosaic.interactions.mapping.ServerRegistration; @@ -29,6 +30,7 @@ import org.eclipse.mosaic.interactions.mapping.VehicleRegistration; import org.eclipse.mosaic.lib.enums.VehicleClass; import org.eclipse.mosaic.lib.geo.GeoPoint; +import org.eclipse.mosaic.lib.math.SpeedUtils; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLight; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLightGroup; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLightProgram; @@ -150,6 +152,31 @@ public static VehicleRegistration createVehicleRegistrationInteraction( ); } + /** + * Creates a {@link AgentRegistration}-interaction with the given parameters + * for an agent. + * + * @param id identifier of the agent + * @param startTimeInSeconds time of the interaction + * @param testClass application class + * @return the {@link VehicleRegistration}-interaction + */ + public static AgentRegistration createAgentRegistrationInteraction( + String id, + long startTimeInSeconds, + Class> testClass + ) { + return new AgentRegistration( + startTimeInSeconds * TIME.SECOND, + id, + "group_0", + GeoPoint.ORIGO, + GeoPoint.ORIGO, + getApplications(testClass != null, testClass), + SpeedUtils.kmh2ms(3) + ); + } + /** * Creates a {@link VehicleRegistration}-interaction with the given parameters * for an electric car. @@ -246,4 +273,6 @@ private static List getApplications(boolean withApp, Class appClass) return Collections.emptyList(); } } + + } diff --git a/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/app/TestAgentApplication.java b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/app/TestAgentApplication.java new file mode 100644 index 000000000..d70162bb1 --- /dev/null +++ b/fed/mosaic-application/src/test/java/org/eclipse/mosaic/fed/application/app/TestAgentApplication.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025 Fraunhofer FOKUS and others. All rights reserved. + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contact: mosaic@fokus.fraunhofer.de + */ + +package org.eclipse.mosaic.fed.application.app; + +import org.eclipse.mosaic.fed.application.app.api.Application; +import org.eclipse.mosaic.fed.application.app.api.OperatingSystemAccess; +import org.eclipse.mosaic.fed.application.app.api.os.AgentOperatingSystem; +import org.eclipse.mosaic.lib.util.scheduling.Event; + +import org.mockito.Mockito; + +public class TestAgentApplication extends AbstractApplication + implements TestApplicationWithSpy>, Application { + + private final OperatingSystemAccess thisApplicationSpy; + + public TestAgentApplication() { + thisApplicationSpy = Mockito.mock(OperatingSystemAccess.class); + } + + @Override + public OperatingSystemAccess getApplicationSpy() { + return thisApplicationSpy; + } + + @Override + public void onStartup() { + thisApplicationSpy.onStartup(); + } + + @Override + public void onShutdown() { + thisApplicationSpy.onShutdown(); + } + + @Override + public void processEvent(Event event) throws Exception { + thisApplicationSpy.processEvent(event); + } +} diff --git a/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/SpawningFramework.java b/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/SpawningFramework.java index 1b62a5c4d..e86caf655 100644 --- a/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/SpawningFramework.java +++ b/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/SpawningFramework.java @@ -70,12 +70,12 @@ public class SpawningFramework { private final Map> typeDistributions = new HashMap<>(); private final Map tls = new HashMap<>(); private final List vehicleFlowGenerators = new ArrayList<>(); - private final List agents = new ArrayList<>(); + private final List agentSpawners = new ArrayList<>(); private final List rsus = new ArrayList<>(); private final List tmcs = new ArrayList<>(); private final List servers = new ArrayList<>(); private final List chargingStations = new ArrayList<>(); - private final List spawners = new ArrayList<>(); + private final List staticSpawners = new ArrayList<>(); private final CMappingConfiguration config; private ScenarioTrafficLightRegistration scenarioTrafficLightRegistration; @@ -135,23 +135,13 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, } } - if (mappingConfiguration.agents != null) { - for (CAgent agentConfiguration : mappingConfiguration.agents) { - if (agentConfiguration != null) { - AgentSpawner agentSpawner = new AgentSpawner(agentConfiguration); - agents.add(agentSpawner); - spawners.add(agentSpawner); - } - } - } - // RSUs if (mappingConfiguration.rsus != null) { for (CRoadSideUnit roadSideUnitConfiguration : mappingConfiguration.rsus) { if (roadSideUnitConfiguration != null) { RoadSideUnitSpawner roadSideUnitSpawner = new RoadSideUnitSpawner(roadSideUnitConfiguration); rsus.add(roadSideUnitSpawner); - spawners.add(roadSideUnitSpawner); + staticSpawners.add(roadSideUnitSpawner); } } } @@ -162,7 +152,7 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, TrafficManagementCenterSpawner trafficManagementCenterSpawner = new TrafficManagementCenterSpawner(trafficManagementCenterConfiguration); tmcs.add(trafficManagementCenterSpawner); - spawners.add(trafficManagementCenterSpawner); + staticSpawners.add(trafficManagementCenterSpawner); } } } @@ -172,7 +162,7 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, if (serverConfiguration != null) { ServerSpawner serverSpawner = new ServerSpawner(serverConfiguration); servers.add(serverSpawner); - spawners.add(serverSpawner); + staticSpawners.add(serverSpawner); } } } @@ -183,7 +173,7 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, ChargingStationSpawner chargingStationSpawner = new ChargingStationSpawner(chargingStationConfiguration); chargingStations.add(chargingStationSpawner); - spawners.add(chargingStationSpawner); + staticSpawners.add(chargingStationSpawner); } } } @@ -206,8 +196,14 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, spawnersExist = generateVehicleFlows(mappingConfiguration.vehicles, mappingConfiguration.config, rng); } - if (mappingConfiguration.vehicles == null || !spawnersExist) { - LOG.info("No vehicle spawners defined in mapping config. Only external vehicles will be simulated."); + // Agent spawners + if (mappingConfiguration.agents != null) { + for (CAgent agentConfiguration : mappingConfiguration.agents) { + if (agentConfiguration != null) { + agentSpawners.add(new AgentSpawner(agentConfiguration)); + spawnersExist = true; + } + } } // OD-Matrices @@ -224,6 +220,11 @@ public SpawningFramework(CMappingAmbassador mappingConfiguration, boolean fixedOrder = mappingConfiguration.config != null && mappingConfiguration.config.fixedOrder; for (OriginDestinationVehicleFlowGenerator mapper : matrices) { mapper.generateVehicleStreams(this, rng, flowNoise, fixedOrder); + spawnersExist = true; + } + + if (!spawnersExist) { + LOG.info("No vehicle spawners defined in mapping config. Only external vehicles will be simulated."); } // Use the prototype configurations to complete the spawner-definitions: @@ -415,7 +416,7 @@ private void completeSpawnerDefinitions() { } } - for (AgentSpawner spawner : agents) { + for (AgentSpawner spawner : agentSpawners) { spawner.fillInPrototype(getPrototypeByName(spawner.getPrototypeName())); if (config != null) { @@ -494,11 +495,19 @@ void timeAdvance(long time, RtiAmbassador rti, RandomNumberGenerator rng) throws immobileUnitsInitialized = true; } - Iterator iterator = vehicleFlowGenerators.iterator(); - while (iterator.hasNext()) { - VehicleFlowGenerator vehicleFlowGenerator = iterator.next(); + Iterator vehicleFlowIt = vehicleFlowGenerators.iterator(); + while (vehicleFlowIt.hasNext()) { + VehicleFlowGenerator vehicleFlowGenerator = vehicleFlowIt.next(); if (vehicleFlowGenerator.timeAdvance(this)) { - iterator.remove(); + vehicleFlowIt.remove(); + } + } + + Iterator agentSpawnerIt = agentSpawners.iterator(); + while (agentSpawnerIt.hasNext()) { + AgentSpawner agentSpawner = agentSpawnerIt.next(); + if (agentSpawner.timeAdvance(this)) { + agentSpawnerIt.remove(); } } } @@ -553,7 +562,7 @@ private void initTrafficLights(long time, RtiAmbassador rti, RandomNumberGenerat private void initImmobileUnits() throws InternalFederateException { // First time-advance. We need to process RSUs, ChargingStations, TMCs and Servers: - for (Spawner spawner : spawners) { + for (Spawner spawner : staticSpawners) { spawner.init(this); } } diff --git a/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/spawning/AgentSpawner.java b/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/spawning/AgentSpawner.java index 1527612e8..a7f486b9c 100644 --- a/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/spawning/AgentSpawner.java +++ b/fed/mosaic-mapping/src/main/java/org/eclipse/mosaic/fed/mapping/ambassador/spawning/AgentSpawner.java @@ -63,7 +63,11 @@ public void configure(CMappingConfiguration mappingParameterizationConfiguration } } - public void init(SpawningFramework spawningFramework) throws InternalFederateException { + public boolean timeAdvance(SpawningFramework spawningFramework) throws InternalFederateException { + if (spawningFramework.getTime() < startingTime) { + return false; + } + final String name = UnitNameGenerator.nextAgentName(); final AgentRegistration interaction = new AgentRegistration( startingTime, name, group, origin, destination, getApplications(), defaultIfNull(walkingSpeed, DEFAULT_WALKING_SPEED) @@ -75,6 +79,7 @@ startingTime, name, group, origin, destination, getApplications(), defaultIfNull LOG.error("Exception while sending Interaction in AgentSpawner.init()"); throw new InternalFederateException("Exception while sending Interaction in AgentSpawner.init()", e); } + return true; } @Override diff --git a/fed/mosaic-mapping/src/test/java/org/eclipse/mosaic/fed/mapping/ambassador/MappingAmbassadorTest.java b/fed/mosaic-mapping/src/test/java/org/eclipse/mosaic/fed/mapping/ambassador/MappingAmbassadorTest.java index 30fdef596..d3a48f4bd 100644 --- a/fed/mosaic-mapping/src/test/java/org/eclipse/mosaic/fed/mapping/ambassador/MappingAmbassadorTest.java +++ b/fed/mosaic-mapping/src/test/java/org/eclipse/mosaic/fed/mapping/ambassador/MappingAmbassadorTest.java @@ -16,10 +16,13 @@ package org.eclipse.mosaic.fed.mapping.ambassador; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; +import org.eclipse.mosaic.interactions.mapping.AgentRegistration; import org.eclipse.mosaic.interactions.mapping.TrafficLightRegistration; import org.eclipse.mosaic.interactions.mapping.VehicleRegistration; import org.eclipse.mosaic.interactions.mapping.advanced.ScenarioTrafficLightRegistration; @@ -27,6 +30,8 @@ import org.eclipse.mosaic.interactions.traffic.VehicleTypesInitialization; import org.eclipse.mosaic.lib.geo.GeoPoint; import org.eclipse.mosaic.lib.math.DefaultRandomNumberGenerator; +import org.eclipse.mosaic.lib.math.SpeedUtils; +import org.eclipse.mosaic.lib.objects.mapping.AgentMapping; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLight; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLightGroup; import org.eclipse.mosaic.lib.objects.trafficlight.TrafficLightProgram; @@ -42,7 +47,6 @@ import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -71,8 +75,8 @@ public void initializeWithMappingFile_assertSpawningInteractions() throws Except final MappingAmbassador ambassador = createMappingAmbassadorWithMappingFile("mapping_config.json"); ambassador.initialize(0, 100 * TIME.SECOND); - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); lastReceivedInteraction = null; ambassador.advanceTime(0); @@ -97,8 +101,8 @@ public void initializeWithMappingFile_assertSpawningInteractions_scaleTraffic() final MappingAmbassador ambassador = createMappingAmbassadorWithMappingFile("mapping_config_scale.json"); ambassador.initialize(0, 100 * TIME.SECOND); - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); lastReceivedInteraction = null; ambassador.advanceTime(0); @@ -212,8 +216,8 @@ public void initializeWithMappingFile_timeSpanConfigured() throws Exception { private Pair countVehicleSpawners(final MappingAmbassador ambassador) throws InternalFederateException { ambassador.initialize(0, 100 * TIME.SECOND); - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); lastReceivedInteraction = null; ambassador.advanceTime(0); @@ -227,7 +231,7 @@ private Pair countVehicleSpawners(final MappingAmbassador amba if (lastReceivedInteraction == null) { continue; } - Assert.assertTrue(lastReceivedInteraction instanceof VehicleRegistration); + assertTrue(lastReceivedInteraction instanceof VehicleRegistration); if (((VehicleRegistration) lastReceivedInteraction).getMapping().getApplications().get(0).equals("Car1App")) { countCar1App++; @@ -250,13 +254,13 @@ public void initializeWithMappingFile_ScenarioTrafficLightRegistrations() throws final ScenarioTrafficLightRegistration scenarioTrafficLightRegistrationMsg = createScenarioTrafficLightRegistration(); ambassador.processInteraction(scenarioTrafficLightRegistrationMsg); - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); lastReceivedInteraction = null; ambassador.advanceTime(0); - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof TrafficLightRegistration); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof TrafficLightRegistration); lastReceivedInteraction = null; } @@ -273,8 +277,8 @@ public static ScenarioTrafficLightRegistration createScenarioTrafficLightRegistr private void assertVehicleRegistration(String... applications) { - Assert.assertNotNull(lastReceivedInteraction); - Assert.assertTrue(lastReceivedInteraction instanceof VehicleRegistration); + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleRegistration); assertEquals( StringUtils.join(Lists.newArrayList(applications)), StringUtils.join(((VehicleRegistration) lastReceivedInteraction).getMapping().getApplications()) @@ -297,7 +301,7 @@ public void initializeWithMappingFile_scenarioVehicleRegistration() throws Excep ); ambassador.processInteraction(new ScenarioVehicleRegistration(0, "veh_0", new VehicleType("UNKNOWN"))); - Assert.assertNull(lastReceivedInteraction); + assertNull(lastReceivedInteraction); } @Test @@ -321,6 +325,40 @@ public void initializeWithMappingFile_scenarioVehicleRegistrationWithTypeDistrib ); } + @Test + public void initializeWithMappingFile_agentRegistration() throws Exception { + final MappingAmbassador ambassador = createMappingAmbassadorWithMappingFile("mapping_config_agent.json"); + ambassador.initialize(0, 100 * TIME.SECOND); + + assertNotNull(lastReceivedInteraction); + assertTrue(lastReceivedInteraction instanceof VehicleTypesInitialization); + lastReceivedInteraction = null; + + ambassador.advanceTime(0); + assertNull(lastReceivedInteraction); + + ambassador.advanceTime(5 * TIME.SECOND); + assertAgentRegistration("agent_0", SpeedUtils.kmh2ms(4), "org.eclipse.mosaic.fed.application.app.TestAgentApplication"); + + ambassador.advanceTime(7 * TIME.SECOND); + assertNull(lastReceivedInteraction); + + ambassador.advanceTime(10 * TIME.SECOND); + assertAgentRegistration("agent_1", SpeedUtils.kmh2ms(2), "org.eclipse.mosaic.fed.application.app.SlowAgentApp"); + + ambassador.advanceTime(11 * TIME.SECOND); + assertNull(lastReceivedInteraction); + } + + private void assertAgentRegistration(String name, double walkingSpeed, String application) { + assertTrue(lastReceivedInteraction instanceof AgentRegistration); + AgentMapping agentMapping = ((AgentRegistration) lastReceivedInteraction).getMapping(); + assertEquals(name, agentMapping.getName()); + assertTrue(agentMapping.getApplications().contains(application)); + assertEquals(walkingSpeed, agentMapping.getWalkingSpeed(), 0.001); + lastReceivedInteraction = null; + } + @Before public void setup() throws Throwable { when(rtiMock.createRandomNumberGenerator()).thenReturn(new DefaultRandomNumberGenerator(989123)); diff --git a/fed/mosaic-mapping/src/test/resources/mapping_config_agent.json b/fed/mosaic-mapping/src/test/resources/mapping_config_agent.json new file mode 100644 index 000000000..2d1e93eb4 --- /dev/null +++ b/fed/mosaic-mapping/src/test/resources/mapping_config_agent.json @@ -0,0 +1,45 @@ +{ + "prototypes": [ + { + "name": "SlowAgent", + "maxSpeed": "2 km/h" + }, + { + "name": "AgentWithApp", + "applications": [ + "org.eclipse.mosaic.fed.application.app.TestAgentApplication" + ], + "maxSpeed": "5 km/h" + } + ], + "agents": [ + { + "startingTime": 5.0, + "name": "AgentWithApp", + "origin": { + "latitude": 0, + "longitude": 0 + }, + "destination": { + "latitude": 0, + "longitude": 0 + }, + "walkingSpeed": "4 km/h" + }, + { + "startingTime": 10.0, + "name": "SlowAgent", + "origin": { + "latitude": 0, + "longitude": 0 + }, + "destination": { + "latitude": 0, + "longitude": 0 + }, + "applications": [ + "org.eclipse.mosaic.fed.application.app.SlowAgentApp" + ] + } + ] +}