Skip to content

Commit e7e2d74

Browse files
authored
Dimension context (#326)
* Add a SimulationState instance to the DimensionContext * Added unit tests
1 parent df53e79 commit e7e2d74

7 files changed

Lines changed: 92 additions & 18 deletions

File tree

simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DimensionContext.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
public final class DimensionContext implements PluginDataBuilderContainer {
1515

16+
private SimulationState simulationState;
1617
private Map<Class<?>, List<PluginDataBuilder>> pluginDataBuilderBaseMap = new LinkedHashMap<>();
1718
private Map<Class<?>, List<PluginDataBuilder>> pluginDataBuilderWorkingMap = new LinkedHashMap<>();
1819
private Map<Class<?>, List<PluginData>> pluginDataBaseMap = new LinkedHashMap<>();
@@ -28,17 +29,32 @@ public static class Builder {
2829
private Builder() {
2930
}
3031

32+
private SimulationState simulationState;
3133
private Map<Class<?>, List<PluginDataBuilder>> pluginDataBuilderMap = new LinkedHashMap<>();
3234
private Map<Class<?>, List<PluginData>> pluginDataMap = new LinkedHashMap<>();
3335

36+
private void validate() {
37+
if(simulationState == null) {
38+
throw new ContractException(NucleusError.NULL_SIMULATION_STATE);
39+
}
40+
}
41+
3442
/**
3543
* Returns the DimensionContext instance composed from the inputs to this
3644
* builder.
45+
*
46+
* @throws ContractException
47+
* <ul>
48+
* <li>{@linkplain NucleusError#NULL_SIMULATION_STATE}
49+
* if the simulation state is not set</li>
50+
* </ul>
3751
*/
3852
public DimensionContext build() {
53+
validate();
3954
DimensionContext result = new DimensionContext();
4055
result.pluginDataBuilderBaseMap.putAll(pluginDataBuilderMap);
4156
result.pluginDataBaseMap.putAll(pluginDataMap);
57+
result.simulationState = simulationState;
4258
return result;
4359
}
4460

@@ -69,6 +85,10 @@ public <T extends PluginData> PluginDataBuilder add(T t) {
6985
pluginDataBuilders.add(builder);
7086
return builder;
7187
}
88+
89+
public void setSimulationState(SimulationState simulationState) {
90+
this.simulationState = simulationState;
91+
}
7292
}
7393

7494
/**
@@ -120,24 +140,24 @@ public <T extends PluginDataBuilder> T getPluginDataBuilder(Class<T> classRef) {
120140

121141
return classRef.cast(pluginDataBuilder);
122142
}
123-
143+
124144
/**
125145
* Returns the stored plugin data builders matching the given class reference.
126146
*
127147
* @throws ContractException
128148
* <ul>
129149
* <li>{@linkplain NucleusError#NULL_PLUGIN_DATA_BUILDER_CLASS}
130-
* if the class reference is null</li> *
150+
* if the class reference is null</li> *
131151
* </ul>
132152
*/
133-
@SuppressWarnings("unchecked")
153+
@SuppressWarnings("unchecked")
134154
public <T extends PluginDataBuilder> List<T> getPluginDataBuilders(Class<T> classRef) {
135155
if (classRef == null) {
136156
throw new ContractException(NucleusError.NULL_PLUGIN_DATA_BUILDER_CLASS);
137157
}
138-
158+
139159
List<T> result = new ArrayList<>();
140-
160+
141161
List<PluginDataBuilder> pluginDataBuilders = pluginDataBuilderWorkingMap.get(classRef);
142162

143163
if (pluginDataBuilders == null) {
@@ -150,11 +170,11 @@ public <T extends PluginDataBuilder> List<T> getPluginDataBuilders(Class<T> clas
150170
}
151171
pluginDataBuilderWorkingMap.put(classRef, pluginDataBuilders);
152172
}
153-
154-
for(PluginDataBuilder pluginDataBuilder : pluginDataBuilders) {
155-
result.add((T)pluginDataBuilder);
173+
174+
for (PluginDataBuilder pluginDataBuilder : pluginDataBuilders) {
175+
result.add((T) pluginDataBuilder);
156176
}
157-
177+
158178
return result;
159179
}
160180

@@ -212,14 +232,13 @@ public <T extends PluginData> T getPluginData(Class<T> classRef) {
212232
* if the class reference is null</li>
213233
* </ul>
214234
*/
215-
@SuppressWarnings("unchecked")
235+
@SuppressWarnings("unchecked")
216236
public <T extends PluginData> List<T> getPluginDatas(Class<T> classRef) {
217237

218-
219238
if (classRef == null) {
220239
throw new ContractException(NucleusError.NULL_PLUGIN_DATA_CLASS);
221240
}
222-
241+
223242
List<T> result = new ArrayList<>();
224243

225244
List<PluginData> pluginDatas = pluginDataWorkingMap.get(classRef);
@@ -233,11 +252,18 @@ public <T extends PluginData> List<T> getPluginDatas(Class<T> classRef) {
233252
}
234253
pluginDataWorkingMap.put(classRef, pluginDatas);
235254
}
236-
237-
for(PluginData pluginData : pluginDatas) {
238-
result.add((T)pluginData);
255+
256+
for (PluginData pluginData : pluginDatas) {
257+
result.add((T) pluginData);
239258
}
240259

241260
return result;
242261
}
262+
263+
/**
264+
* Returns the simulation state.
265+
*/
266+
public SimulationState getSimulationState() {
267+
return simulationState;
268+
}
243269
}

simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/Experiment.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,9 @@ private List<Plugin> getNewPluginInstancesFromScenarioId(final int scenarioId) {
534534
list.add(contextBuilder.add(pluginData));
535535
}
536536
}
537+
538+
contextBuilder.setSimulationState(data.simulationState);
539+
537540
final DimensionContext dimensionContext = contextBuilder.build();
538541

539542
// initialize the scenario meta data

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ public void testGetPluginDataBuilder() {
160160
PluginData p4 = new PluginData2();
161161

162162
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
163+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
163164

164165
dimensionContextBuilder.add(p1);
165166
dimensionContextBuilder.add(p2);
@@ -223,6 +224,7 @@ public void testGetPluginDataBuilders() {
223224
PluginData p4 = new PluginData2();
224225

225226
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
227+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
226228

227229
dimensionContextBuilder.add(p1);
228230
dimensionContextBuilder.add(p2);
@@ -245,13 +247,15 @@ public void testGetPluginDataBuilders() {
245247
assertEquals(p1.toBuilder(), pluginData1Builders.get(0));
246248

247249
// There should be exactly one type3 builder
248-
List<PluginData3.Builder> pluginData3Builders = dimensionContext.getPluginDataBuilders(PluginData3.Builder.class);
250+
List<PluginData3.Builder> pluginData3Builders = dimensionContext
251+
.getPluginDataBuilders(PluginData3.Builder.class);
249252
assertNotNull(pluginData3Builders);
250253
assertEquals(1, pluginData3Builders.size());
251254
assertEquals(p3.toBuilder(), pluginData3Builders.get(0));
252255

253256
// There should be exactly two type2 builders
254-
List<PluginData2.Builder> pluginData2Builders = dimensionContext.getPluginDataBuilders(PluginData2.Builder.class);
257+
List<PluginData2.Builder> pluginData2Builders = dimensionContext
258+
.getPluginDataBuilders(PluginData2.Builder.class);
255259
assertNotNull(pluginData2Builders);
256260
assertEquals(2, pluginData2Builders.size());
257261
assertTrue(pluginData2Builders.contains(p2.toBuilder()));
@@ -267,7 +271,8 @@ public void testGetPluginDataBuilders() {
267271
assertTrue(pluginDataBuilders.contains(p4.toBuilder()));
268272

269273
// There should be exactly zero type4s
270-
List<PluginData4.Builder> pluginData4Builders = dimensionContext.getPluginDataBuilders(PluginData4.Builder.class);
274+
List<PluginData4.Builder> pluginData4Builders = dimensionContext
275+
.getPluginDataBuilders(PluginData4.Builder.class);
271276
assertNotNull(pluginData4Builders);
272277
assertEquals(0, pluginData4Builders.size());
273278

@@ -293,6 +298,8 @@ public void testGetPluginData() {
293298
PluginData p4 = new PluginData2();
294299

295300
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
301+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
302+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
296303

297304
dimensionContextBuilder.add(p1);
298305
dimensionContextBuilder.add(p2);
@@ -356,6 +363,7 @@ public void testGetPluginDatas() {
356363
PluginData p4 = new PluginData2();
357364

358365
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
366+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
359367

360368
dimensionContextBuilder.add(p1);
361369
dimensionContextBuilder.add(p2);
@@ -406,6 +414,27 @@ public void testGetPluginDatas() {
406414
}
407415

408416
@Test
417+
@UnitTestMethod(target = DimensionContext.class, name = "getSimulationState", args = {})
418+
public void testGetSimulationState() {
419+
SimulationState simulationState = SimulationState.builder().build();
420+
DimensionContext.Builder builder = DimensionContext.builder();
421+
builder.setSimulationState(simulationState);
422+
DimensionContext dimensionContext = builder.build();
423+
assertTrue(simulationState == dimensionContext.getSimulationState());
424+
}
425+
426+
@Test
427+
@UnitTestMethod(target = DimensionContext.Builder.class, name = "setSimulationState", args = {SimulationState.class})
428+
public void testSetSimulationState() {
429+
SimulationState simulationState = SimulationState.builder().build();
430+
DimensionContext.Builder builder = DimensionContext.builder();
431+
builder.setSimulationState(simulationState);
432+
DimensionContext dimensionContext = builder.build();
433+
assertTrue(simulationState == dimensionContext.getSimulationState());
434+
}
435+
436+
437+
@Test
409438
@UnitTestMethod(target = DimensionContext.Builder.class, name = "add", args = { PluginData.class })
410439
public void testAdd() {
411440
PluginData p1 = new PluginData1();
@@ -417,6 +446,7 @@ public void testAdd() {
417446
expectedContents.add(p2);
418447

419448
DimensionContext.Builder builder = DimensionContext.builder();
449+
builder.setSimulationState(SimulationState.builder().build());
420450

421451
PluginDataBuilder p1b = builder.add(p1);
422452
PluginDataBuilder p2b = builder.add(p2);
@@ -449,6 +479,7 @@ public void testBuild() {
449479
expectedContents.add(p2);
450480

451481
DimensionContext.Builder builder = DimensionContext.builder();
482+
builder.setSimulationState(SimulationState.builder().build());
452483

453484
PluginDataBuilder p1b = builder.add(p1);
454485
PluginDataBuilder p2b = builder.add(p2);
@@ -464,5 +495,11 @@ public void testBuild() {
464495

465496
assertEquals(expectedContents, actualContents);
466497

498+
// precondition test: if the simulation state is null
499+
ContractException contractException = assertThrows(ContractException.class, () -> {
500+
DimensionContext.builder().build();
501+
});
502+
assertEquals(NucleusError.NULL_SIMULATION_STATE, contractException.getErrorType());
503+
467504
}
468505
}

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/plugins/globalproperties/support/AT_GlobalPropertyDimension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.junit.jupiter.api.Test;
1313

1414
import gov.hhs.aspr.ms.gcm.simulation.nucleus.DimensionContext;
15+
import gov.hhs.aspr.ms.gcm.simulation.nucleus.SimulationState;
1516
import gov.hhs.aspr.ms.gcm.simulation.plugins.globalproperties.datamanagers.GlobalPropertiesPluginData;
1617
import gov.hhs.aspr.ms.gcm.simulation.plugins.globalproperties.testsupport.TestGlobalPropertyId;
1718
import gov.hhs.aspr.ms.gcm.simulation.plugins.properties.support.PropertyDefinition;
@@ -94,6 +95,7 @@ public void testExecuteLevel() {
9495

9596
pluginDataBuilder = (GlobalPropertiesPluginData.Builder) dimensionContextBuilder
9697
.add(pluginDataBuilder.build());
98+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
9799
DimensionContext dimensionContext = dimensionContextBuilder.build();
98100

99101
// execute the dimension with the level

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/plugins/groups/support/AT_GroupPropertyDimension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.junit.jupiter.api.Test;
1212

1313
import gov.hhs.aspr.ms.gcm.simulation.nucleus.DimensionContext;
14+
import gov.hhs.aspr.ms.gcm.simulation.nucleus.SimulationState;
1415
import gov.hhs.aspr.ms.gcm.simulation.plugins.groups.datamanagers.GroupsPluginData;
1516
import gov.hhs.aspr.ms.gcm.simulation.plugins.groups.testsupport.TestGroupPropertyId;
1617
import gov.hhs.aspr.ms.gcm.simulation.plugins.groups.testsupport.TestGroupTypeId;
@@ -98,6 +99,7 @@ public void testExecuteLevel() {
9899
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
99100

100101
pluginDataBuilder = (GroupsPluginData.Builder) dimensionContextBuilder.add(pluginDataBuilder.build());
102+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
101103
DimensionContext dimensionContext = dimensionContextBuilder.build();
102104

103105
// execute the dimension with the level

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/plugins/personproperties/support/AT_PersonPropertyDimension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.junit.jupiter.api.Test;
1212

1313
import gov.hhs.aspr.ms.gcm.simulation.nucleus.DimensionContext;
14+
import gov.hhs.aspr.ms.gcm.simulation.nucleus.SimulationState;
1415
import gov.hhs.aspr.ms.gcm.simulation.plugins.personproperties.datamanagers.PersonPropertiesPluginData;
1516
import gov.hhs.aspr.ms.gcm.simulation.plugins.personproperties.testsupport.TestPersonPropertyId;
1617
import gov.hhs.aspr.ms.gcm.simulation.plugins.properties.support.PropertyDefinition;
@@ -90,6 +91,7 @@ public void testExecuteLevel() {
9091

9192
pluginDataBuilder = (PersonPropertiesPluginData.Builder) dimensionContextBuilder
9293
.add(pluginDataBuilder.build());
94+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
9395
DimensionContext dimensionContext = dimensionContextBuilder.build();
9496

9597
// execute the dimension with the level

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/plugins/regions/support/AT_RegionPropertyDimension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.junit.jupiter.api.Test;
1313

1414
import gov.hhs.aspr.ms.gcm.simulation.nucleus.DimensionContext;
15+
import gov.hhs.aspr.ms.gcm.simulation.nucleus.SimulationState;
1516
import gov.hhs.aspr.ms.gcm.simulation.plugins.properties.support.PropertyDefinition;
1617
import gov.hhs.aspr.ms.gcm.simulation.plugins.regions.datamanagers.RegionsPluginData;
1718
import gov.hhs.aspr.ms.gcm.simulation.plugins.regions.testsupport.TestRegionPropertyId;
@@ -97,6 +98,7 @@ public void testExecuteLevel() {
9798
DimensionContext.Builder dimensionContextBuilder = DimensionContext.builder();
9899

99100
pluginDataBuilder = (RegionsPluginData.Builder) dimensionContextBuilder.add(pluginDataBuilder.build());
101+
dimensionContextBuilder.setSimulationState(SimulationState.builder().build());
100102
DimensionContext dimensionContext = dimensionContextBuilder.build();
101103

102104
// execute the dimension with the level

0 commit comments

Comments
 (0)