From af4229510acdb48dd38fe3dc29ebf08dd0f3a10c Mon Sep 17 00:00:00 2001 From: William Thistlethwaite Date: Tue, 25 Mar 2025 17:57:23 -0400 Subject: [PATCH 1/7] Update README.md (#295) WT: Minor fixes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c866493af..4822695ab 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ To use this project in your project, simply add the following dependency to your gov.hhs.aspr.ms.gcm simulation - 4.2.0 + 4.4.0 ``` @@ -53,7 +53,7 @@ Data managers and actors are organized into plugins. A GCM model is thus compose ### Requirements - Maven 3.8.x - Java 17 -- Your favroite IDE for developing Java projects +- Your favorite IDE for developing Java projects - Modeling Utilities located [here](https://github.com/HHS/ASPR-ms-util) *Note that Modeling Utilities is in Maven Central, so there is no need to clone and build it. @@ -69,7 +69,7 @@ To build this project: The documentation can be found at [https://hhs.github.io/ASPR-8/](https://hhs.github.io/ASPR-8/) ## Lessons -The documentation contains lessons which the code can be found in [lessons](lessons). +Code for all lessons in the documentation above can be found in [lessons](lessons). [contributors-shield]: https://img.shields.io/github/contributors/HHS/ASPR-8 From 21f9dca53e468c6e06b99891f181e5969271977e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 17:57:08 +0000 Subject: [PATCH 2/7] Update taskit to 5.1.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8e5769f5a..adbbf9029 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 4.4.0 + 4.4.1 UTF-8 @@ -70,7 +70,7 @@ 0.7.0 - 5.1.0 + 5.1.1 0.8.12 5.11.4 From 8f7cafcbf987ebeacf94e4adf3925fdcd0b088e7 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 May 2025 08:32:29 +0000 Subject: [PATCH 3/7] Update taskit to 5.1.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index adbbf9029..d1c83deba 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 4.4.1 + 4.4.2 UTF-8 @@ -70,7 +70,7 @@ 0.7.0 - 5.1.1 + 5.1.2 0.8.12 5.11.4 From c72d150f33ceced7577f06366ee2c3ae0a12e2c9 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 28 May 2025 18:08:37 +0000 Subject: [PATCH 4/7] Update taskit to 5.1.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d1c83deba..4856bbe4b 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 4.4.2 + 4.4.3 UTF-8 @@ -70,7 +70,7 @@ 0.7.0 - 5.1.2 + 5.1.3 0.8.12 5.11.4 From 515532a9040dfd4d0c18e295e0bd7b9cfc35b22c Mon Sep 17 00:00:00 2001 From: shawnhatch Date: Fri, 13 Jun 2025 17:34:29 -0400 Subject: [PATCH 5/7] Added access to plugin datas from the DataManager, Actor and Report contexts. --- .gitignore | 3 +- pom.xml | 2 +- .../gcm/simulation/nucleus/ActorContext.java | 26 +++ .../nucleus/DataManagerContext.java | 26 +++ .../gcm/simulation/nucleus/ReportContext.java | 26 +++ .../simulation/nucleus/AT_ActorContext.java | 183 ++++++++++++++++-- .../nucleus/AT_DataManagerContext.java | 160 +++++++++++++++ .../nucleus/AT_DimesionContext.java | 2 + .../simulation/nucleus/AT_ReportContext.java | 161 +++++++++++++++ 9 files changed, 570 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 8524ee842..4a40bd1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -326,4 +326,5 @@ Temporary Items ################################### # VSCode -.vscode \ No newline at end of file +.vscode +docgen/renv \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4856bbe4b..d28eecec9 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 4.4.3 + 4.4.4 UTF-8 diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java index 6e8da6ffb..568da008f 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java @@ -243,5 +243,31 @@ public List retrievePlans() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java index dfbbaa6b8..0345e0cb9 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java @@ -315,5 +315,31 @@ public DataManagerId getDataManagerId() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java index 938a57fe3..94fe84987 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java @@ -202,5 +202,31 @@ public List retrievePlans() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java index 0eda0d89f..98ad336c6 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -392,12 +393,9 @@ public void testGetActorId() { // show that the number of actor ids matches the number of actor aliases assertEquals(3, observedActorIds.size()); } - - - - + private void executeGetDataManagerTest(Consumer consumer) { - + // create the test plugin data builder TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); @@ -408,7 +406,7 @@ private void executeGetDataManagerTest(Consumer consumer) { pluginDataBuilder.addTestDataManager("dm3B", () -> new TestDataManager3B()); pluginDataBuilder.addTestDataManager("dm4A", () -> new TestDataManager4A()); - pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer)); + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer)); // build the action plugin TestPluginData testPluginData = pluginDataBuilder.build(); @@ -421,9 +419,9 @@ private void executeGetDataManagerTest(Consumer consumer) { @UnitTestMethod(target = ActorContext.class, name = "getDataManager", args = { Class.class }) public void testGetDataManager() { - //postcondition test: - executeGetDataManagerTest((c)->{ - assertNotNull(c.getDataManager(TestDataManager1.class)); + // postcondition test: + executeGetDataManagerTest((c) -> { + assertNotNull(c.getDataManager(TestDataManager1.class)); assertNotNull(c.getDataManager(TestDataManager3A.class)); assertNotNull(c.getDataManager(TestDataManager3B.class)); assertNotNull(c.getDataManager(TestDataManager4A.class)); @@ -431,24 +429,24 @@ public void testGetDataManager() { }); // precondition test: if the class reference is null - ContractException contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + ContractException contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(null); }); }); assertEquals(NucleusError.NULL_DATA_MANAGER_CLASS, contractException.getErrorType()); - + // precondition test: if the class reference is null - contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(TestDataManager3.class); }); }); assertEquals(NucleusError.AMBIGUOUS_DATA_MANAGER_CLASS, contractException.getErrorType()); - + // precondition test: if the class reference is unknown - contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(TestDataManager4B.class); }); }); @@ -1070,4 +1068,155 @@ private void planRetrievalSimCloseSubscribe(ActorContext context, List { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = ActorContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } } \ No newline at end of file diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java index de788dfb7..3ce1cd0ba 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -1333,4 +1334,163 @@ public void testGetDataManagerId() { .execute();// } + + private static class LocalPluginData implements PluginData { + + public static class Builder implements PluginDataBuilder { + @Override + public LocalPluginData build() { + return new LocalPluginData(); + } + } + + @Override + public PluginDataBuilder toBuilder() { + return new Builder(); + } + } + + private static class LocalPluginData2 implements PluginData { + + public static class Builder implements PluginDataBuilder { + @Override + public LocalPluginData2 build() { + return new LocalPluginData2(); + } + } + + @Override + public PluginDataBuilder toBuilder() { + return new Builder(); + } + } + + @Test + @UnitTestMethod(target = DimensionContext.class, name = "getPluginData", args = { Class.class }) + public void testGetPluginData() { + + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestDataManager("dm", ()->new TestDataManager()); + + pluginDataBuilder.addTestDataManagerPlan("dm", new TestDataManagerPlan(0, (c) -> { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager())// + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager()) + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = DimensionContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestDataManager("dm",()->new TestDataManager()); + pluginDataBuilder.addTestDataManagerPlan("dm", new TestDataManagerPlan(0, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager())// + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java index acf302803..050b28186 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java @@ -262,4 +262,6 @@ public void testBuild() { assertEquals(expectedContents, actualContents); } + + } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java index ff511fd34..4bc174c53 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java @@ -13,6 +13,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -820,4 +821,164 @@ private void planRetrievalSimCloseSubscribe(ReportContext context, List {})); + + pluginDataBuilder.addTestReportPlan("report", new TestReportPlan(0, (c) -> { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("report", new TestReportPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("dm", new TestReportPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = ReportContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(10, (c) -> {})); + pluginDataBuilder.addTestReportPlan("report", new TestReportPlan(4, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("report", new TestReportPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + } From 8ee25b136d969dd9940c1bcce9da8a1ce6506aae Mon Sep 17 00:00:00 2001 From: shawnhatch Date: Mon, 16 Jun 2025 10:45:36 -0400 Subject: [PATCH 6/7] Typographic change --- .../gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java index 5397c77ce..e3def9516 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java @@ -13,6 +13,7 @@ * managers to actors. It is supplied by the engine each time it interacts with * an actor. Actors are defined by this context. If this context is passed to a * method invocation, then that method is an actor method. + * */ public final class ActorContext { From afd039153ab2af4492c5d124f987855a9dfc7c61 Mon Sep 17 00:00:00 2001 From: shawnhatch Date: Mon, 16 Jun 2025 10:52:18 -0400 Subject: [PATCH 7/7] Fixed unit scope issue --- .../gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_Experiment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_Experiment.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_Experiment.java index 023d270c0..cd44c9ca5 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_Experiment.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_Experiment.java @@ -398,7 +398,7 @@ private void testSetHaltOnException() { testSetHaltOnException_Implicit(); } - @Test + private void testSetHaltOnException_Explicit_True() { // This test will run the experiment two times in single thread mode