From 635197662a22e9a3f812345e7dce7f053fc4d0b5 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Tue, 22 Apr 2025 15:29:41 -0400 Subject: [PATCH 01/18] Update equals and hashCode in Translator and corresponding tests --- .../taskit/core/translation/Translator.java | 17 +- .../core/translation/AT_Translator.java | 173 +++++++++++------- 2 files changed, 119 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/Translator.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/Translator.java index eef64b7..446183e 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/Translator.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/Translator.java @@ -31,27 +31,30 @@ final static class Data { Data() { } + /** + * Standard implementation consistent with the {@link #equals(Object)} method + */ @Override public int hashCode() { return Objects.hash(translatorId, dependencies); } + /** + * Two {@link Data} instances are equal if and only if + * they have the same translatorId and dependencies. + */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } - if (obj == null) { return false; } - if (getClass() != obj.getClass()) { return false; } - Data other = (Data) obj; - return Objects.equals(translatorId, other.translatorId) && Objects.equals(dependencies, other.dependencies); } @@ -210,7 +213,7 @@ public boolean isInitialized() { } /** - * Hash code implementation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { @@ -218,8 +221,8 @@ public int hashCode() { } /** - * Two {@link Translator}s are equal if and only if they have the same id and - * dependencies. + * Two {@link Translator} instances are equal if and only if + * they have the same translatorId and dependencies. */ @Override public boolean equals(Object obj) { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java index 868a979..a859823 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -11,6 +10,7 @@ import java.util.Set; import java.util.function.Consumer; +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.engine.TaskitError; @@ -20,6 +20,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; import gov.hhs.aspr.ms.util.wrappers.MutableBoolean; public class AT_Translator { @@ -96,83 +97,127 @@ public void testIsInitialized() { assertTrue(testTranslator.isInitialized()); } - @Test - @UnitTestMethod(target = Translator.class, name = "hashCode", args = {}) - public void testHashCode() { - TranslatorId translatorIdA = new TranslatorId() { - }; - TranslatorId translatorIdB = new TranslatorId() { - }; - Consumer consumerA = (translatorContext) -> { - }; + private static enum TranslatorIds implements TranslatorId { + TRANSLATOR_ID_1, TRANSLATOR_ID_2, TRANSLATOR_ID_3, TRANSLATOR_ID_4, TRANSLATOR_ID_5, TRANSLATOR_ID_6, + TRANSLATOR_ID_7, TRANSLATOR_ID_8, TRANSLATOR_ID_9, TRANSLATOR_ID_10, TRANSLATOR_ID_11, TRANSLATOR_ID_12; - Translator translatorA = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA).build(); + public static TranslatorIds getRandomTranslatorId(RandomGenerator randomGenerator) { + int index = randomGenerator.nextInt(TranslatorIds.values().length); + return TranslatorIds.values()[index]; + } - Translator translatorB = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdB).build(); + public static Set getRandomTranslatorIds(RandomGenerator randomGenerator) { + Set result = new LinkedHashSet<>(); + for (TranslatorIds translatorIds : TranslatorIds.values()) { + if (randomGenerator.nextBoolean()) { + result.add(translatorIds); + } + } + return result; + } + } - Translator translatorC = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA) - .addDependency(translatorIdB).build(); + private Translator getRandomTranslator(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - Translator translatorD = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA) - .addDependency(translatorIdB).build(); + Translator.Builder builder = Translator.builder(); - // if same instance, equal - assertEquals(translatorA.hashCode(), translatorA.hashCode()); + TranslatorIds translatorId = TranslatorIds.getRandomTranslatorId(randomGenerator); + builder.setTranslatorId(translatorId); - // if different class, not equal - assertNotEquals(translatorA.hashCode(), new Object().hashCode()); + Set randomTranslatorIds = TranslatorIds.getRandomTranslatorIds(randomGenerator); + for (TranslatorIds translatorIds : randomTranslatorIds) { + if (translatorIds != translatorId) { + builder.addDependency(translatorIds); + } + } - // if different translator id, not equal - assertNotEquals(translatorA.hashCode(), translatorB.hashCode()); + builder.setInitializer((c) -> {}); - // if same id, but different dependencies, not equal - assertNotEquals(translatorA.hashCode(), translatorC.hashCode()); + return builder.build(); + } - // if same id and dependencies, equal - assertEquals(translatorC.hashCode(), translatorD.hashCode()); + @Test + @UnitTestMethod(target = Translator.class, name = "hashCode", args = {}) + public void testHashCode() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(1717890677700007680L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + Translator translator1 = getRandomTranslator(seed); + Translator translator2 = getRandomTranslator(seed); + + assertEquals(translator1, translator2); + assertEquals(translator1.hashCode(), translator2.hashCode()); + + // initialize both translators and show they are still equal with equal hash codes + translator1.initialize(new TranslatorContext(TestTaskitEngine.builder())); + translator2.initialize(new TranslatorContext(TestTaskitEngine.builder())); + assertEquals(translator1, translator2); + assertEquals(translator1.hashCode(), translator2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + Translator translator = getRandomTranslator(randomGenerator.nextLong()); + hashCodes.add(translator.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = Translator.class, name = "equals", args = { Object.class }) public void testEquals() { - TranslatorId translatorIdA = new TranslatorId() { - }; - TranslatorId translatorIdB = new TranslatorId() { - }; - Consumer consumerA = (translatorContext) -> { - }; - Translator translatorA = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA).build(); - - Translator translatorB = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdB).build(); - - Translator translatorC = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA) - .addDependency(translatorIdB).build(); - - Translator translatorD = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA) - .addDependency(translatorIdB).build(); - - // if same instance, equal - assertEquals(translatorA, translatorA); - - // if null, not equal - assertNotEquals(translatorA, null); - - // if different class, not equal - assertNotEquals(translatorA, new Object()); - - // if different translator id, not equal - assertNotEquals(translatorA, translatorB); - - // if same id, but different dependencies, not equal - assertNotEquals(translatorA, translatorC); - - // if same id and dependencies, equal - assertEquals(translatorC, translatorD); - - Translator.Data data = new Translator.Data(); - assertEquals(data, data); - assertNotEquals(data, null); - assertNotEquals(data, new Object()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8964621488877306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + Translator translator = getRandomTranslator(randomGenerator.nextLong()); + assertFalse(translator.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + Translator translator = getRandomTranslator(randomGenerator.nextLong()); + assertFalse(translator.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + Translator translator = getRandomTranslator(randomGenerator.nextLong()); + assertTrue(translator.equals(translator)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + Translator translator1 = getRandomTranslator(seed); + Translator translator2 = getRandomTranslator(seed); + assertFalse(translator1 == translator2); + for (int j = 0; j < 10; j++) { + assertTrue(translator1.equals(translator2)); + assertTrue(translator2.equals(translator1)); + } + + // initialize both translators and show they are still equal + translator1.initialize(new TranslatorContext(TestTaskitEngine.builder())); + translator2.initialize(new TranslatorContext(TestTaskitEngine.builder())); + for (int j = 0; j < 10; j++) { + assertTrue(translator1.equals(translator2)); + assertTrue(translator2.equals(translator1)); + } + } + + // different inputs yield unequal translators + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + Translator translator = getRandomTranslator(randomGenerator.nextLong()); + set.add(translator); + } + assertEquals(100, set.size()); } @Test From 4d7af86212c2ab7ad09c85d310617a7e60bb4c3b Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Tue, 22 Apr 2025 16:24:01 -0400 Subject: [PATCH 02/18] Update equals and hashCode in TestComplexInputObject and corresponding tests --- .../objects/TestComplexInputObject.java | 2 +- .../objects/AT_TestComplexInputObject.java | 163 ++++++++---------- 2 files changed, 75 insertions(+), 90 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexInputObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexInputObject.java index 6d0c251..dc2d0f6 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexInputObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexInputObject.java @@ -62,7 +62,7 @@ public void setNumEntities(int numEntities) { } /** - * Hash code implementation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java index d12bc04..daf1a42 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java @@ -1,14 +1,19 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.objects; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; -import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TestComplexInputObject { @@ -81,101 +86,81 @@ public void testGetString() { @Test @UnitTestMethod(target = TestComplexInputObject.class, name = "hashCode", args = {}) public void testHashCode() { - TestComplexInputObject testComplexInputObject1 = new TestComplexInputObject(); - TestComplexInputObject testComplexInputObject2 = new TestComplexInputObject(); - TestComplexInputObject testComplexInputObject3 = TestObjectUtil.generateTestComplexInputObject(); - TestComplexInputObject testComplexInputObject4 = TestObjectUtil.generateTestComplexInputObject(); - - int numEntities = 1000; - String testString = "test"; - double startTime = 0.156789; - - testComplexInputObject1.setNumEntities(numEntities); - testComplexInputObject1.setStartTime(startTime); - testComplexInputObject1.setTestString(testString); - - testComplexInputObject2.setNumEntities(numEntities); - testComplexInputObject2.setStartTime(startTime); - testComplexInputObject2.setTestString(testString); - - // exact same instance should be equal - assertEquals(testComplexInputObject1.hashCode(), testComplexInputObject1.hashCode()); - - // different objects should not be equal - assertNotEquals(testComplexInputObject1.hashCode(), new Object().hashCode()); - - // different values of integer, bool, string and testComplexInputObject should - // not be equal - assertNotEquals(testComplexInputObject1.hashCode(), testComplexInputObject3.hashCode()); - assertNotEquals(testComplexInputObject1.hashCode(), testComplexInputObject4.hashCode()); - assertNotEquals(testComplexInputObject3.hashCode(), testComplexInputObject4.hashCode()); - - testComplexInputObject2.setNumEntities(0); - assertNotEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); - testComplexInputObject2.setNumEntities(numEntities); - - testComplexInputObject2.setStartTime(150.0156); - assertNotEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); - testComplexInputObject2.setStartTime(startTime); - - testComplexInputObject2.setTestString("Test"); - assertNotEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); - testComplexInputObject2.setTestString(testString); - - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491508433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexInputObject testComplexInputObject1 = getRandomTestComplexInputObject(seed); + TestComplexInputObject testComplexInputObject2 = getRandomTestComplexInputObject(seed); + + assertEquals(testComplexInputObject1, testComplexInputObject2); + assertEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); + hashCodes.add(testComplexInputObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestComplexInputObject.class, name = "equals", args = { Object.class }) public void testEquals() { - TestComplexInputObject testComplexInputObject1 = new TestComplexInputObject(); - TestComplexInputObject testComplexInputObject2 = new TestComplexInputObject(); - TestComplexInputObject testComplexInputObject3 = TestObjectUtil.generateTestComplexInputObject(); - TestComplexInputObject testComplexInputObject4 = TestObjectUtil.generateTestComplexInputObject(); - - int numEntities = 1000; - String testString = "test"; - double startTime = 0.156789; - - testComplexInputObject1.setNumEntities(numEntities); - testComplexInputObject1.setStartTime(startTime); - testComplexInputObject1.setTestString(testString); - - testComplexInputObject2.setNumEntities(numEntities); - testComplexInputObject2.setStartTime(startTime); - testComplexInputObject2.setTestString(testString); - - // exact same instance should be equal - assertEquals(testComplexInputObject1, testComplexInputObject1); - - // null should not be equal - assertNotEquals(testComplexInputObject1, null); - - // different objects should not be equal - assertNotEquals(testComplexInputObject1, new Object()); - - // different values of integer, bool, string and testComplexInputObject should - // not be equal - assertNotEquals(testComplexInputObject1, testComplexInputObject3); - assertNotEquals(testComplexInputObject1, testComplexInputObject4); - assertNotEquals(testComplexInputObject3, testComplexInputObject4); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980223418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); + assertFalse(testComplexInputObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); + assertFalse(testComplexInputObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); + assertTrue(testComplexInputObject.equals(testComplexInputObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexInputObject testComplexInputObject1 = getRandomTestComplexInputObject(seed); + TestComplexInputObject testComplexInputObject2 = getRandomTestComplexInputObject(seed); + assertFalse(testComplexInputObject1 == testComplexInputObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testComplexInputObject1.equals(testComplexInputObject2)); + assertTrue(testComplexInputObject2.equals(testComplexInputObject1)); + } + } + + // different inputs yield unequal testComplexInputObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); + set.add(testComplexInputObject); + } + assertEquals(100, set.size()); + } - testComplexInputObject2.setNumEntities(0); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setNumEntities(numEntities); + private TestComplexInputObject getRandomTestComplexInputObject(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - testComplexInputObject2.setStartTime(150.0156); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setStartTime(startTime); + TestComplexInputObject complexInputObject = new TestComplexInputObject(); - testComplexInputObject2.setTestString("Test"); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setTestString(testString); + complexInputObject.setNumEntities(randomGenerator.nextInt(100)); + complexInputObject.setStartTime(randomGenerator.nextDouble() * 15); + complexInputObject.setTestString("readInput" + randomGenerator.nextInt(15)); - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testComplexInputObject1, testComplexInputObject2); + return complexInputObject; } } From ad58f04c66f0ea0171dd83bb7278458a7bbb9e74 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Tue, 22 Apr 2025 16:32:23 -0400 Subject: [PATCH 03/18] Update equals and hashCode in TestComplexAppObject and corresponding tests --- .../objects/TestComplexAppObject.java | 2 +- .../objects/AT_TestComplexAppObject.java | 166 ++++++++---------- 2 files changed, 76 insertions(+), 92 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexAppObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexAppObject.java index 7603aa2..f0fe124 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexAppObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestComplexAppObject.java @@ -63,7 +63,7 @@ public void setNumEntities(int numEntities) { } /** - * Hash code implentation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java index 5052fee..ac249c7 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java @@ -1,14 +1,19 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.objects; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; -import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TestComplexAppObject { @@ -81,102 +86,81 @@ public void testGetTestString() { @Test @UnitTestMethod(target = TestComplexAppObject.class, name = "hashCode", args = {}) public void testHashCode() { - TestComplexAppObject testComplexAppObject1 = new TestComplexAppObject(); - TestComplexAppObject testComplexAppObject2 = new TestComplexAppObject(); - TestComplexAppObject testComplexAppObject3 = TestObjectUtil.generateTestComplexAppObject(); - TestComplexAppObject testComplexAppObject4 = TestObjectUtil.generateTestComplexAppObject(); - - int numEntities = 1000; - String testString = "test"; - double startTime = 0.156789; - - testComplexAppObject1.setNumEntities(numEntities); - testComplexAppObject1.setStartTime(startTime); - testComplexAppObject1.setTestString(testString); - - testComplexAppObject2.setNumEntities(numEntities); - testComplexAppObject2.setStartTime(startTime); - testComplexAppObject2.setTestString(testString); - - // exact same instance should be equal - assertEquals(testComplexAppObject1.hashCode(), testComplexAppObject1.hashCode()); - - // different objects should not be equal - assertNotEquals(testComplexAppObject1.hashCode(), new Object().hashCode()); - - // different values of integer, bool, string and testComplexInputObject should - // not be equal - assertNotEquals(testComplexAppObject1.hashCode(), testComplexAppObject3.hashCode()); - assertNotEquals(testComplexAppObject1.hashCode(), testComplexAppObject4.hashCode()); - assertNotEquals(testComplexAppObject3.hashCode(), testComplexAppObject4.hashCode()); - - testComplexAppObject2.setNumEntities(0); - assertNotEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); - testComplexAppObject2.setNumEntities(numEntities); - - testComplexAppObject2.setStartTime(150.0156); - assertNotEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); - testComplexAppObject2.setStartTime(startTime); - - testComplexAppObject2.setTestString("Test"); - assertNotEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); - testComplexAppObject2.setTestString(testString); - - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491444433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexAppObject testComplexAppObject1 = getRandomTestComplexAppObject(seed); + TestComplexAppObject testComplexAppObject2 = getRandomTestComplexAppObject(seed); + + assertEquals(testComplexAppObject1, testComplexAppObject2); + assertEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); + hashCodes.add(testComplexAppObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestComplexAppObject.class, name = "equals", args = { Object.class }) public void testEquals() { - TestComplexAppObject testComplexAppObject1 = new TestComplexAppObject(); - TestComplexAppObject testComplexAppObject2 = new TestComplexAppObject(); - TestComplexAppObject testComplexAppObject3 = TestObjectUtil.generateTestComplexAppObject(); - TestComplexAppObject testComplexAppObject4 = TestObjectUtil.generateTestComplexAppObject(); - - int numEntities = 1000; - String testString = "test"; - double startTime = 0.156789; - - testComplexAppObject1.setNumEntities(numEntities); - testComplexAppObject1.setStartTime(startTime); - testComplexAppObject1.setTestString(testString); - - testComplexAppObject2.setNumEntities(numEntities); - testComplexAppObject2.setStartTime(startTime); - testComplexAppObject2.setTestString(testString); - - // exact same instance should be equal - assertEquals(testComplexAppObject1, testComplexAppObject1); - - // null should not be equal - assertNotEquals(testComplexAppObject1, null); - - // different objects should not be equal - assertNotEquals(testComplexAppObject1, new Object()); - - // different values of integer, bool, string and testComplexAppObject should - // not be equal - assertNotEquals(testComplexAppObject1, testComplexAppObject3); - assertNotEquals(testComplexAppObject1, testComplexAppObject4); - assertNotEquals(testComplexAppObject3, testComplexAppObject4); - - testComplexAppObject2.setNumEntities(0); - assertNotEquals(testComplexAppObject1, testComplexAppObject2); - testComplexAppObject2.setNumEntities(numEntities); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980322418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); + assertFalse(testComplexAppObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); + assertFalse(testComplexAppObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); + assertTrue(testComplexAppObject.equals(testComplexAppObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexAppObject testComplexAppObject1 = getRandomTestComplexAppObject(seed); + TestComplexAppObject testComplexAppObject2 = getRandomTestComplexAppObject(seed); + assertFalse(testComplexAppObject1 == testComplexAppObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testComplexAppObject1.equals(testComplexAppObject2)); + assertTrue(testComplexAppObject2.equals(testComplexAppObject1)); + } + } + + // different inputs yield unequal testComplexAppObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); + set.add(testComplexAppObject); + } + assertEquals(100, set.size()); + } - testComplexAppObject2.setStartTime(150.0156); - assertNotEquals(testComplexAppObject1, testComplexAppObject2); - testComplexAppObject2.setStartTime(startTime); + private TestComplexAppObject getRandomTestComplexAppObject(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TestComplexAppObject complexAppObject = new TestComplexAppObject(); - testComplexAppObject2.setTestString("Test"); - assertNotEquals(testComplexAppObject1, testComplexAppObject2); - testComplexAppObject2.setTestString(testString); + complexAppObject.setNumEntities(randomGenerator.nextInt(100)); + complexAppObject.setStartTime(randomGenerator.nextDouble() * 15); + complexAppObject.setTestString("readInput" + randomGenerator.nextInt(15)); - // exact same values of integer, bool, string and testComplexAppObject should - // be equal - assertEquals(testComplexAppObject1, testComplexAppObject2); + return complexAppObject; } - } From e19d4a7ef548424169979ce8bc6cd6082e24e7d6 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 08:41:24 -0400 Subject: [PATCH 04/18] Update equals and hashcode in TestObjectWrapper and corresponding tests --- .../objects/TestObjectWrapper.java | 4 +- .../objects/AT_TestObjectWrapper.java | 122 +++++++++++------- 2 files changed, 74 insertions(+), 52 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestObjectWrapper.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestObjectWrapper.java index 88d5e33..fa663ac 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestObjectWrapper.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestObjectWrapper.java @@ -35,11 +35,11 @@ public void setWrappedObject(Object wrappedObject) { } /** - * Hash code implementation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { - return Objects.hashCode(wrappedObject); + return Objects.hash(wrappedObject); } /** diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestObjectWrapper.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestObjectWrapper.java index 458bdb5..c834e28 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestObjectWrapper.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestObjectWrapper.java @@ -1,15 +1,21 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.objects; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TestObjectWrapper { @@ -55,60 +61,76 @@ public void testGetWrappedObject() { @Test @UnitTestMethod(target = TestObjectWrapper.class, name = "hashCode", args = {}) public void testHashCode() { - TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(); - TestObjectWrapper testObjectWrapper = new TestObjectWrapper(); - testObjectWrapper.setWrappedObject(testAppObject); - - TestObjectWrapper testObjectWrapper2 = new TestObjectWrapper(); - testObjectWrapper2.setWrappedObject(testAppObject); - - TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(); - TestObjectWrapper testObjectWrapper3 = new TestObjectWrapper(); - - testObjectWrapper3.setWrappedObject(testInputObject); - - // exact same instance is equal - assertEquals(testObjectWrapper.hashCode(), testObjectWrapper.hashCode()); - - // different objects should not be equal - assertNotEquals(testObjectWrapper.hashCode(), new Object().hashCode()); - - // different wrapped objects should not be equal - assertNotEquals(testObjectWrapper.hashCode(), testObjectWrapper3.hashCode()); - - // same wrapped objects should be equal - assertEquals(testObjectWrapper.hashCode(), testObjectWrapper2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2743491444433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestObjectWrapper testObjectWrapper1 = getRandomTestObjectWrapper(seed); + TestObjectWrapper testObjectWrapper2 = getRandomTestObjectWrapper(seed); + + assertEquals(testObjectWrapper1, testObjectWrapper2); + assertEquals(testObjectWrapper1.hashCode(), testObjectWrapper2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestObjectWrapper testObjectWrapper = getRandomTestObjectWrapper(randomGenerator.nextLong()); + hashCodes.add(testObjectWrapper.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestObjectWrapper.class, name = "equals", args = { Object.class }) public void testEquals() { - TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(); - TestObjectWrapper testObjectWrapper = new TestObjectWrapper(); - testObjectWrapper.setWrappedObject(testAppObject); - - TestObjectWrapper testObjectWrapper2 = new TestObjectWrapper(); - testObjectWrapper2.setWrappedObject(testAppObject); - - TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(); - TestObjectWrapper testObjectWrapper3 = new TestObjectWrapper(); - - testObjectWrapper3.setWrappedObject(testInputObject); - - // exact same instance is equal - assertEquals(testObjectWrapper, testObjectWrapper); - - // null should not be equal - assertNotEquals(testObjectWrapper, null); - - // different objects should not be equal - assertNotEquals(testObjectWrapper, new Object()); - - // different wrapped objects should not be equal - assertNotEquals(testObjectWrapper, testObjectWrapper3); - - // same wrapped objects should be equal - assertEquals(testObjectWrapper, testObjectWrapper2); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980322778377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestObjectWrapper testObjectWrapper = getRandomTestObjectWrapper(randomGenerator.nextLong()); + assertFalse(testObjectWrapper.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestObjectWrapper testObjectWrapper = getRandomTestObjectWrapper(randomGenerator.nextLong()); + assertFalse(testObjectWrapper.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestObjectWrapper testObjectWrapper = getRandomTestObjectWrapper(randomGenerator.nextLong()); + assertTrue(testObjectWrapper.equals(testObjectWrapper)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestObjectWrapper testObjectWrapper1 = getRandomTestObjectWrapper(seed); + TestObjectWrapper testObjectWrapper2 = getRandomTestObjectWrapper(seed); + assertFalse(testObjectWrapper1 == testObjectWrapper2); + for (int j = 0; j < 10; j++) { + assertTrue(testObjectWrapper1.equals(testObjectWrapper2)); + assertTrue(testObjectWrapper2.equals(testObjectWrapper1)); + } + } + + // different inputs yield unequal testObjectWrappers + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestObjectWrapper testObjectWrapper = getRandomTestObjectWrapper(randomGenerator.nextLong()); + set.add(testObjectWrapper); + } + assertEquals(100, set.size()); } + private TestObjectWrapper getRandomTestObjectWrapper(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + TestObjectWrapper testObjectWrapper = new TestObjectWrapper(); + testObjectWrapper.setWrappedObject(randomGenerator.nextInt()); + return testObjectWrapper; + } } From c3721e854df7d14758d28ea8946cd626b4892264 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 09:15:36 -0400 Subject: [PATCH 05/18] Update equals and hashcode in TestAppObject and corresponding tests --- .../testsupport/objects/TestAppObject.java | 2 +- .../testsupport/objects/AT_TestAppObject.java | 190 ++++++++---------- 2 files changed, 87 insertions(+), 105 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java index 0368b10..6e4053d 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java @@ -97,7 +97,7 @@ public void setTestAppEnum(TestAppEnum testAppEnum) { } /** - * Hash code implementation consistent with equals() + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java index e821956..a43c8b5 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java @@ -1,14 +1,20 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.objects; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TestAppObject { @@ -124,114 +130,90 @@ public void testGetTestAppEnum() { @Test @UnitTestMethod(target = TestAppObject.class, name = "hashCode", args = {}) public void testHashCode() { - TestAppObject testAppObject1 = new TestAppObject(); - TestAppObject testAppObject2 = new TestAppObject(); - TestAppObject testAppObject3 = TestObjectUtil.generateTestAppObject(); - TestAppObject testAppObject4 = TestObjectUtil.generateTestAppObject(); - - int integer = 1000; - String string = "test"; - boolean bool = false; - TestComplexAppObject testComplexAppObject = TestObjectUtil.generateTestComplexAppObject(); - testAppObject1.setInteger(integer); - testAppObject1.setBool(bool); - testAppObject1.setString(string); - testAppObject1.setTestComplexAppObject(testComplexAppObject); - - testAppObject2.setInteger(integer); - testAppObject2.setBool(bool); - testAppObject2.setString(string); - testAppObject2.setTestComplexAppObject(testComplexAppObject); - - // exact same instance should be equal - assertEquals(testAppObject1.hashCode(), testAppObject1.hashCode()); - - // different objects should not be equal - assertNotEquals(testAppObject1.hashCode(), new Object().hashCode()); - - // different values of integer, bool, string and testComplexAppObject should - // not be equal - assertNotEquals(testAppObject1.hashCode(), testAppObject3.hashCode()); - assertNotEquals(testAppObject1.hashCode(), testAppObject4.hashCode()); - assertNotEquals(testAppObject3.hashCode(), testAppObject4.hashCode()); - - testAppObject2.setInteger(0); - assertNotEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); - testAppObject2.setInteger(integer); - - testAppObject2.setBool(!bool); - assertNotEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); - testAppObject2.setBool(bool); - - testAppObject2.setString("Test"); - assertNotEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); - testAppObject2.setString(string); - - testAppObject2.setTestComplexAppObject(TestObjectUtil.generateTestComplexAppObject()); - assertNotEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); - testAppObject2.setTestComplexAppObject(testComplexAppObject); - - // exact same values of integer, bool, string and testComplexAppObject should - // be equal - assertEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491444438883354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestAppObject testAppObject1 = getRandomTestAppObject(seed); + TestAppObject testAppObject2 = getRandomTestAppObject(seed); + + assertEquals(testAppObject1, testAppObject2); + assertEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + hashCodes.add(testAppObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestAppObject.class, name = "equals", args = { Object.class }) public void testEquals() { - TestAppObject testAppObject1 = new TestAppObject(); - TestAppObject testAppObject2 = new TestAppObject(); - TestAppObject testAppObject3 = TestObjectUtil.generateTestAppObject(); - TestAppObject testAppObject4 = TestObjectUtil.generateTestAppObject(); - - int integer = 1000; - String string = "test"; - boolean bool = false; - TestComplexAppObject testComplexAppObject = TestObjectUtil.generateTestComplexAppObject(); - testAppObject1.setInteger(integer); - testAppObject1.setBool(bool); - testAppObject1.setString(string); - testAppObject1.setTestComplexAppObject(testComplexAppObject); - - testAppObject2.setInteger(integer); - testAppObject2.setBool(bool); - testAppObject2.setString(string); - testAppObject2.setTestComplexAppObject(testComplexAppObject); - - // exact same instance should be equal - assertEquals(testAppObject1, testAppObject1); - - // null should not be equal - assertNotEquals(testAppObject1, null); - - // different objects should not be equal - assertNotEquals(testAppObject1, new Object()); - - // different values of integer, bool, string and testComplexAppObject should - // not be equal - assertNotEquals(testAppObject1, testAppObject3); - assertNotEquals(testAppObject1, testAppObject4); - assertNotEquals(testAppObject3, testAppObject4); - - testAppObject2.setInteger(0); - assertNotEquals(testAppObject1, testAppObject2); - testAppObject2.setInteger(integer); - - testAppObject2.setBool(!bool); - assertNotEquals(testAppObject1, testAppObject2); - testAppObject2.setBool(bool); - - testAppObject2.setString("Test"); - assertNotEquals(testAppObject1, testAppObject2); - testAppObject2.setString(string); - - testAppObject2.setTestComplexAppObject(TestObjectUtil.generateTestComplexAppObject()); - assertNotEquals(testAppObject1, testAppObject2); - testAppObject2.setTestComplexAppObject(testComplexAppObject); - - // exact same values of integer, bool, string and testComplexAppObject should - // be equal - assertEquals(testAppObject1, testAppObject2); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980322418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + assertFalse(testAppObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + assertFalse(testAppObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + assertTrue(testAppObject.equals(testAppObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestAppObject testAppObject1 = getRandomTestAppObject(seed); + TestAppObject testAppObject2 = getRandomTestAppObject(seed); + assertFalse(testAppObject1 == testAppObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testAppObject1.equals(testAppObject2)); + assertTrue(testAppObject2.equals(testAppObject1)); + } + } + + // different inputs yield unequal testAppObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + set.add(testAppObject); + } + assertEquals(100, set.size()); } + private TestAppObject getRandomTestAppObject(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TestComplexAppObject testComplexAppObject = new TestComplexAppObject(); + testComplexAppObject.setNumEntities(randomGenerator.nextInt(100)); + testComplexAppObject.setStartTime(randomGenerator.nextDouble() * 15); + testComplexAppObject.setTestString("readInput" + randomGenerator.nextInt(15)); + + TestAppEnum[] enumValues = TestAppEnum.values(); + TestAppEnum randomEnum = enumValues[randomGenerator.nextInt(enumValues.length)]; + + TestAppObject testAppObject = new TestAppObject(); + testAppObject.setBool(randomGenerator.nextBoolean()); + testAppObject.setInteger(randomGenerator.nextInt(1500)); + testAppObject.setString("readInput" + randomGenerator.nextInt(25)); + testAppObject.setTestComplexAppObject(testComplexAppObject); + testAppObject.setTestAppEnum(randomEnum); + + return testAppObject; + } } From a9cf750b68579503df47e56e6eff693189229a31 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 09:24:19 -0400 Subject: [PATCH 06/18] Update equals and hashcode in TestInputObject and corresponding tests --- .../testsupport/objects/TestInputObject.java | 2 +- .../objects/AT_TestInputObject.java | 186 ++++++++---------- 2 files changed, 83 insertions(+), 105 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java index 8a12bc9..142253d 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java @@ -82,7 +82,7 @@ public void setTestComplexInputObject(TestComplexInputObject testComplexInputObj } /** - * Hash code implementation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java index a57141a..209094e 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java @@ -1,14 +1,20 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.objects; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TestInputObject { @@ -104,114 +110,86 @@ public void testGetTestComplexInputObject() { @Test @UnitTestMethod(target = TestInputObject.class, name = "hashCode", args = {}) public void testHashCode() { - TestInputObject testInputObject1 = new TestInputObject(); - TestInputObject testInputObject2 = new TestInputObject(); - TestInputObject testInputObject3 = TestObjectUtil.generateTestInputObject(); - TestInputObject testInputObject4 = TestObjectUtil.generateTestInputObject(); - - int integer = 1000; - String string = "test"; - boolean bool = false; - TestComplexInputObject testComplexInputObject = TestObjectUtil.generateTestComplexInputObject(); - testInputObject1.setInteger(integer); - testInputObject1.setBool(bool); - testInputObject1.setString(string); - testInputObject1.setTestComplexInputObject(testComplexInputObject); - - testInputObject2.setInteger(integer); - testInputObject2.setBool(bool); - testInputObject2.setString(string); - testInputObject2.setTestComplexInputObject(testComplexInputObject); - - // exact same instance should be equal - assertEquals(testInputObject1.hashCode(), testInputObject1.hashCode()); - - // different objects should not be equal - assertNotEquals(testInputObject1.hashCode(), new Object().hashCode()); - - // different values of integer, bool, string and testComplexInputObject should - // not be equal - assertNotEquals(testInputObject1.hashCode(), testInputObject3.hashCode()); - assertNotEquals(testInputObject1.hashCode(), testInputObject4.hashCode()); - assertNotEquals(testInputObject3.hashCode(), testInputObject4.hashCode()); - - testInputObject2.setInteger(0); - assertNotEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); - testInputObject2.setInteger(integer); - - testInputObject2.setBool(!bool); - assertNotEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); - testInputObject2.setBool(bool); - - testInputObject2.setString("Test"); - assertNotEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); - testInputObject2.setString(string); - - testInputObject2.setTestComplexInputObject(TestObjectUtil.generateTestComplexInputObject()); - assertNotEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); - testInputObject2.setTestComplexInputObject(testComplexInputObject); - - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491890433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestInputObject testInputObject1 = getRandomTestInputObject(seed); + TestInputObject testInputObject2 = getRandomTestInputObject(seed); + + assertEquals(testInputObject1, testInputObject2); + assertEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + hashCodes.add(testInputObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestInputObject.class, name = "equals", args = { Object.class }) public void testEquals() { - TestInputObject testInputObject1 = new TestInputObject(); - TestInputObject testInputObject2 = new TestInputObject(); - TestInputObject testInputObject3 = TestObjectUtil.generateTestInputObject(); - TestInputObject testInputObject4 = TestObjectUtil.generateTestInputObject(); - - int integer = 1000; - String string = "test"; - boolean bool = false; - TestComplexInputObject testComplexInputObject = TestObjectUtil.generateTestComplexInputObject(); - testInputObject1.setInteger(integer); - testInputObject1.setBool(bool); - testInputObject1.setString(string); - testInputObject1.setTestComplexInputObject(testComplexInputObject); - - testInputObject2.setInteger(integer); - testInputObject2.setBool(bool); - testInputObject2.setString(string); - testInputObject2.setTestComplexInputObject(testComplexInputObject); - - // exact same instance should be equal - assertEquals(testInputObject1, testInputObject1); - - // null should not be equal - assertNotEquals(testInputObject1, null); - - // different objects should not be equal - assertNotEquals(testInputObject1, new Object()); - - // different values of integer, bool, string and testComplexInputObject should - // not be equal - assertNotEquals(testInputObject1, testInputObject3); - assertNotEquals(testInputObject1, testInputObject4); - assertNotEquals(testInputObject3, testInputObject4); - - testInputObject2.setInteger(0); - assertNotEquals(testInputObject1, testInputObject2); - testInputObject2.setInteger(integer); - - testInputObject2.setBool(!bool); - assertNotEquals(testInputObject1, testInputObject2); - testInputObject2.setBool(bool); - - testInputObject2.setString("Test"); - assertNotEquals(testInputObject1, testInputObject2); - testInputObject2.setString(string); - - testInputObject2.setTestComplexInputObject(TestObjectUtil.generateTestComplexInputObject()); - assertNotEquals(testInputObject1, testInputObject2); - testInputObject2.setTestComplexInputObject(testComplexInputObject); - - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testInputObject1, testInputObject2); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980234518377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + assertFalse(testInputObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + assertFalse(testInputObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + assertTrue(testInputObject.equals(testInputObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestInputObject testInputObject1 = getRandomTestInputObject(seed); + TestInputObject testInputObject2 = getRandomTestInputObject(seed); + assertFalse(testInputObject1 == testInputObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testInputObject1.equals(testInputObject2)); + assertTrue(testInputObject2.equals(testInputObject1)); + } + } + + // different inputs yield unequal testInputObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + set.add(testInputObject); + } + assertEquals(100, set.size()); } + private TestInputObject getRandomTestInputObject(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TestComplexInputObject testComplexInputObject = new TestComplexInputObject(); + testComplexInputObject.setNumEntities(randomGenerator.nextInt(100)); + testComplexInputObject.setStartTime(randomGenerator.nextDouble() * 15); + testComplexInputObject.setTestString("readInput" + randomGenerator.nextInt(15)); + + TestInputObject testInputObject = new TestInputObject(); + testInputObject.setBool(randomGenerator.nextBoolean()); + testInputObject.setInteger(randomGenerator.nextInt(1500)); + testInputObject.setString("readInput" + randomGenerator.nextInt(25)); + testInputObject.setTestComplexInputObject(testComplexInputObject); + + return testInputObject; + } } From 6f94b462cb205af48df6418a3d01d2933c2629e9 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 11:33:25 -0400 Subject: [PATCH 07/18] Update equals and hashcode in TranslationSpec and corresponding tests --- .../core/translation/TranslationSpec.java | 2 +- .../core/translation/AT_TranslationSpec.java | 500 +++++++----------- 2 files changed, 183 insertions(+), 319 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/TranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/TranslationSpec.java index f97f8ef..8d1df61 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/TranslationSpec.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/translation/TranslationSpec.java @@ -128,7 +128,7 @@ public T translate(Object object) { } /** - * Hash code implementation consistent with equals(); + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 1da9878..9f3ea92 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -10,8 +9,12 @@ import java.io.File; import java.io.IOException; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; +import java.util.Set; +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.engine.TaskitEngine; @@ -31,6 +34,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TranslationSpec { @@ -238,329 +242,189 @@ public void testGetTranslationSpecClassMapping() { @Test @UnitTestMethod(target = TranslationSpec.class, name = "hashCode", args = {}) public void testHashCode() { - TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() - .addTranslationSpec(new TestComplexObjectTranslationSpec()).build(); - // base - TranslationSpec translationSpecA = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // same input class, different app class - TranslationSpec translationSpecB = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppChildObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppChildObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppChildObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // same app class, different input class - TranslationSpec translationSpecC = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputChildObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputChildObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputChildObject.class; - } - - }; - - // different app and different input class - TranslationSpec translationSpecD = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppChildObject translateInputObject(TestInputChildObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputChildObject translateAppObject(TestAppChildObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppChildObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputChildObject.class; - } - - }; - - // duplicate of the base - TranslationSpec translationSpecE = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // init the duplicate base - translationSpecE.init(testTaskitEngine); - - // same exact object should be equal - assertEquals(translationSpecA.hashCode(), translationSpecA.hashCode()); - - // different types of objects should not be equal - assertNotEquals(translationSpecA.hashCode(), new Object().hashCode()); - - // different app class should not be equal - assertNotEquals(translationSpecA.hashCode(), translationSpecB.hashCode()); - - // different input class should not be equal - assertNotEquals(translationSpecA.hashCode(), translationSpecC.hashCode()); - - // different input and different app class should not be equal - assertNotEquals(translationSpecA.hashCode(), translationSpecD.hashCode()); - - // if one is initialized and the other is not, they should not be equal - assertNotEquals(translationSpecA.hashCode(), translationSpecE.hashCode()); - - // init base - translationSpecA.init(testTaskitEngine); - - // if all above are equal, then the two specs are equal - assertEquals(translationSpecA.hashCode(), translationSpecE.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2655488674438883354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); + + assertEquals(translationSpec1, translationSpec2); + assertEquals(translationSpec1.hashCode(), translationSpec2.hashCode()); + + // initialize both translationSpecs and show they are still equal with equal hash codes + TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() + .addTranslationSpec(new TestComplexObjectTranslationSpec()).build(); + + translationSpec1.init(testTaskitEngine); + translationSpec2.init(testTaskitEngine); + assertEquals(translationSpec1, translationSpec2); + assertEquals(translationSpec1.hashCode(), translationSpec2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + hashCodes.add(translationSpec.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TranslationSpec.class, name = "equals", args = { Object.class }) public void testEquals() { - TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() - .addTranslationSpec(new TestComplexObjectTranslationSpec()).build(); - // base - TranslationSpec translationSpecA = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // same input class, different app class - TranslationSpec translationSpecB = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppChildObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppChildObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppChildObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // same app class, different input class - TranslationSpec translationSpecC = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputChildObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputChildObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputChildObject.class; - } - - }; - - // different app and different input class - TranslationSpec translationSpecD = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppChildObject translateInputObject(TestInputChildObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputChildObject translateAppObject(TestAppChildObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppChildObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputChildObject.class; - } - - }; - - // duplicate of the base - TranslationSpec translationSpecE = new TranslationSpec<>( - TestTaskitEngine.class) { - - @Override - protected TestAppObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected TestInputObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } - - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } - - }; - - // init the duplicate base - translationSpecE.init(testTaskitEngine); - - // same exact object should be equal - assertEquals(translationSpecA, translationSpecA); - - // null object should not be equal - assertNotEquals(translationSpecA, null); - - // different types of objects should not be equal - assertNotEquals(translationSpecA, new Object()); - - // different app class should not be equal - assertNotEquals(translationSpecA, translationSpecB); - - // different input class should not be equal - assertNotEquals(translationSpecA, translationSpecC); - - // different input and different app class should not be equal - assertNotEquals(translationSpecA, translationSpecD); - - // if one is initialized and the other is not, they should not be equal - assertNotEquals(translationSpecA, translationSpecE); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8999922418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + assertFalse(translationSpec.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + assertFalse(translationSpec.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + assertTrue(translationSpec.equals(translationSpec)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); + assertFalse(translationSpec1 == translationSpec2); + for (int j = 0; j < 10; j++) { + assertTrue(translationSpec1.equals(translationSpec2)); + assertTrue(translationSpec2.equals(translationSpec1)); + } + + // initialize both translationSpecs and show they are still equal + TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() + .addTranslationSpec(new TestComplexObjectTranslationSpec()).build(); + + translationSpec1.init(testTaskitEngine); + translationSpec2.init(testTaskitEngine); + for (int j = 0; j < 10; j++) { + assertTrue(translationSpec1.equals(translationSpec2)); + assertTrue(translationSpec2.equals(translationSpec1)); + } + } + + // different inputs yield unequal translationSpecs + Set> set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + set.add(translationSpec); + } + assertEquals(100, set.size()); + } - // init base - translationSpecA.init(testTaskitEngine); + private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, + T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, + T11.class, T12.class, T13.class, T14.class, T15.class, T16.class, + T17.class, T18.class, T19.class, T20.class, T21.class, T22.class, + T23.class, T24.class, T25.class, T26.class, T27.class, T28.class, + T29.class, T30.class, T31.class, T32.class, T33.class, T34.class, + T35.class, T36.class, T37.class, T38.class, T39.class, T40.class, + T41.class, T42.class, T43.class, T44.class, T45.class, T46.class, + T47.class, T48.class, T49.class, T50.class, TestAppObject.class, + TestInputObject.class, TestAppChildObject.class, TestInputChildObject.class); + + private static final class DynamicTranslationSpec extends TranslationSpec { + private final Class typeI; + private final Class typeA; + + public DynamicTranslationSpec(Class typeI, Class typeA) { + super(TestTaskitEngine.class); + this.typeI = typeI; + this.typeA = typeA; + } + + @Override + protected A translateInputObject(I inputObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); + } + + @Override + protected I translateAppObject(A appObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); + } + + @Override + public Class getAppObjectClass() { + return typeA; + } + + @Override + public Class getInputObjectClass() { + return typeI; + } + } - // if all above are equal, then the two specs are equal - assertEquals(translationSpecA, translationSpecE); + private TranslationSpec getRandomTranslationSpec(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + return new DynamicTranslationSpec<>(t1, t2); } + + private static class T1 {} + private static class T2 {} + private static class T3 {} + private static class T4 {} + private static class T5 {} + private static class T6 {} + private static class T7 {} + private static class T8 {} + private static class T9 {} + private static class T10 {} + private static class T11 {} + private static class T12 {} + private static class T13 {} + private static class T14 {} + private static class T15 {} + private static class T16 {} + private static class T17 {} + private static class T18 {} + private static class T19 {} + private static class T20 {} + private static class T21 {} + private static class T22 {} + private static class T23 {} + private static class T24 {} + private static class T25 {} + private static class T26 {} + private static class T27 {} + private static class T28 {} + private static class T29 {} + private static class T30 {} + private static class T31 {} + private static class T32 {} + private static class T33 {} + private static class T34 {} + private static class T35 {} + private static class T36 {} + private static class T37 {} + private static class T38 {} + private static class T39 {} + private static class T40 {} + private static class T41 {} + private static class T42 {} + private static class T43 {} + private static class T44 {} + private static class T45 {} + private static class T46 {} + private static class T47 {} + private static class T48 {} + private static class T49 {} + private static class T50 {} } From a7fd1b7bb55a1d038f9f8d800f5367334d98b239 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 13:04:09 -0400 Subject: [PATCH 08/18] Remove initialized status from testEquals and testHashCode in AT_Translator --- .../core/translation/AT_Translator.java | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java index a859823..c3f0554 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_Translator.java @@ -97,20 +97,20 @@ public void testIsInitialized() { assertTrue(testTranslator.isInitialized()); } - private static enum TranslatorIds implements TranslatorId { + private static enum TestTranslatorId implements TranslatorId { TRANSLATOR_ID_1, TRANSLATOR_ID_2, TRANSLATOR_ID_3, TRANSLATOR_ID_4, TRANSLATOR_ID_5, TRANSLATOR_ID_6, TRANSLATOR_ID_7, TRANSLATOR_ID_8, TRANSLATOR_ID_9, TRANSLATOR_ID_10, TRANSLATOR_ID_11, TRANSLATOR_ID_12; - public static TranslatorIds getRandomTranslatorId(RandomGenerator randomGenerator) { - int index = randomGenerator.nextInt(TranslatorIds.values().length); - return TranslatorIds.values()[index]; + private static TestTranslatorId getRandomTranslatorId(RandomGenerator randomGenerator) { + int index = randomGenerator.nextInt(TestTranslatorId.values().length); + return TestTranslatorId.values()[index]; } - public static Set getRandomTranslatorIds(RandomGenerator randomGenerator) { - Set result = new LinkedHashSet<>(); - for (TranslatorIds translatorIds : TranslatorIds.values()) { + private static Set getRandomTranslatorIds(RandomGenerator randomGenerator) { + Set result = new LinkedHashSet<>(); + for (TestTranslatorId testTranslatorId : TestTranslatorId.values()) { if (randomGenerator.nextBoolean()) { - result.add(translatorIds); + result.add(testTranslatorId); } } return result; @@ -122,13 +122,13 @@ private Translator getRandomTranslator(long seed) { Translator.Builder builder = Translator.builder(); - TranslatorIds translatorId = TranslatorIds.getRandomTranslatorId(randomGenerator); + TestTranslatorId translatorId = TestTranslatorId.getRandomTranslatorId(randomGenerator); builder.setTranslatorId(translatorId); - Set randomTranslatorIds = TranslatorIds.getRandomTranslatorIds(randomGenerator); - for (TranslatorIds translatorIds : randomTranslatorIds) { - if (translatorIds != translatorId) { - builder.addDependency(translatorIds); + Set randomTestTranslatorIds = TestTranslatorId.getRandomTranslatorIds(randomGenerator); + for (TestTranslatorId testTranslatorId : randomTestTranslatorIds) { + if (testTranslatorId != translatorId) { + builder.addDependency(testTranslatorId); } } @@ -150,12 +150,6 @@ public void testHashCode() { assertEquals(translator1, translator2); assertEquals(translator1.hashCode(), translator2.hashCode()); - - // initialize both translators and show they are still equal with equal hash codes - translator1.initialize(new TranslatorContext(TestTaskitEngine.builder())); - translator2.initialize(new TranslatorContext(TestTaskitEngine.builder())); - assertEquals(translator1, translator2); - assertEquals(translator1.hashCode(), translator2.hashCode()); } // hash codes are reasonably distributed @@ -201,14 +195,6 @@ public void testEquals() { assertTrue(translator1.equals(translator2)); assertTrue(translator2.equals(translator1)); } - - // initialize both translators and show they are still equal - translator1.initialize(new TranslatorContext(TestTaskitEngine.builder())); - translator2.initialize(new TranslatorContext(TestTaskitEngine.builder())); - for (int j = 0; j < 10; j++) { - assertTrue(translator1.equals(translator2)); - assertTrue(translator2.equals(translator1)); - } } // different inputs yield unequal translators From 9254255510af086c1fc2ff55440345c1fb2a6559 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Wed, 23 Apr 2025 14:05:57 -0400 Subject: [PATCH 09/18] Update equals and hashCode in TaskitEngineData and corresponding tests --- .../taskit/core/engine/TaskitEngineData.java | 36 +-- .../core/engine/AT_TaskitEngineData.java | 210 ++++++++++++------ 2 files changed, 163 insertions(+), 83 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngineData.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngineData.java index 1f74d3a..ac1934e 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngineData.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngineData.java @@ -302,29 +302,31 @@ public static Builder builder() { return new Builder(); } + /** + * Standard implementation consistent with the {@link #equals(Object)} method. + * Note that we do not include the classToSpec map as part of the hash code + * contract, as there is never a case where it would differ from the + * translationSpec set, since both data structures get populated in the same + * addTranslationSpec() method. The data structure that matters is the list of + * translation specs, not the mapping, which only exists as a convenience map + * for translation purposes. + */ @Override public int hashCode() { - /* - * Note that we do not include the classToSpec map as part of the hash code - * contract, as there is never a case where it would differ from the - * translationSpec set, since both data structures get populated in the same - * addTranslationSpec() method. The data structure that matters is the list of - * translation specs, not the mapping, which only exists as a convenience map - * for translation purposes - */ return Objects.hash(translationSpecs); } + /** + * Two {@link TaskitEngineData} instances are equal if and only if + * their translationSpecs are equal. Note that we do not include the classToSpec + * map as part of the equals contract, as there is never a case where it would + * differ from the translationSpec set, since both data structures get populated + * in the same addTranslationSpec() method. The data structure that matters is + * the list of translation specs, not the mapping, which only exists as a + * convenience map for translation purposes. + */ @Override public boolean equals(Object obj) { - /* - * Note that we do not include the classToSpec map as part of the equals - * contract, as there is never a case where it would differ from the - * translationSpec set, since both data structures get populated in the same - * addTranslationSpec() method. The data structure that matters is the list of - * translation specs, not the mapping, which only exists as a convenience map - * for translation purposes - */ if (this == obj) { return true; } @@ -333,7 +335,7 @@ public boolean equals(Object obj) { return false; } - if (!(obj instanceof TaskitEngineData)) { + if (getClass() != obj.getClass()) { return false; } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java index dee7b30..cee1a07 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java @@ -1,12 +1,23 @@ package gov.hhs.aspr.ms.taskit.core.engine; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppChildObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecEmptyMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecNullMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; @@ -14,11 +25,13 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; +import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorContext; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TaskitEngineData { @Test @@ -210,79 +223,144 @@ public void testBuilder() { // nothing to test } - // TODO: update test @Test @UnitTestMethod(target = TaskitEngineData.class, name = "hashCode", args = {}) public void testHashCode() { - TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); - TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); - - TaskitEngineData taskitEngineData1 = TaskitEngineData.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - TaskitEngineData taskitEngineData2 = TaskitEngineData.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - TaskitEngineData taskitEngineData3 = TaskitEngineData.builder() - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - // same - assertEquals(taskitEngineData1.hashCode(), taskitEngineData1.hashCode()); - - // same exact specs - assertEquals(taskitEngineData1.hashCode(), taskitEngineData2.hashCode()); - assertEquals(taskitEngineData2.hashCode(), taskitEngineData1.hashCode()); - - // different specs - assertNotEquals(taskitEngineData1.hashCode(), taskitEngineData3.hashCode()); - assertNotEquals(taskitEngineData2.hashCode(), taskitEngineData3.hashCode()); - assertNotEquals(taskitEngineData3.hashCode(), taskitEngineData1.hashCode()); - assertNotEquals(taskitEngineData3.hashCode(), taskitEngineData2.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2658899674638883354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TaskitEngineData taskitEngineData1 = getRandomTaskitEngineData(seed); + TaskitEngineData taskitEngineData2 = getRandomTaskitEngineData(seed); + + assertEquals(taskitEngineData1, taskitEngineData2); + assertEquals(taskitEngineData1.hashCode(), taskitEngineData2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TaskitEngineData taskitEngineData = getRandomTaskitEngineData(randomGenerator.nextLong()); + hashCodes.add(taskitEngineData.hashCode()); + } + + assertEquals(100, hashCodes.size()); } - // TODO: update test @Test @UnitTestMethod(target = TaskitEngineData.class, name = "equals", args = { Object.class }) public void testEquals() { - TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); - TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); - - TaskitEngineData taskitEngineData1 = TaskitEngineData.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - TaskitEngineData taskitEngineData2 = TaskitEngineData.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - TaskitEngineData taskitEngineData3 = TaskitEngineData.builder() - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - // same - assertEquals(taskitEngineData1, taskitEngineData1); - - // not null - assertNotEquals(taskitEngineData1, null); - - // not instance of - assertNotEquals(taskitEngineData1, new Object()); - - // same exact specs - assertEquals(taskitEngineData1, taskitEngineData2); - assertEquals(taskitEngineData2, taskitEngineData1); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8999757418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TaskitEngineData taskitEngineData = getRandomTaskitEngineData(randomGenerator.nextLong()); + assertFalse(taskitEngineData.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TaskitEngineData taskitEngineData = getRandomTaskitEngineData(randomGenerator.nextLong()); + assertFalse(taskitEngineData.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TaskitEngineData taskitEngineData = getRandomTaskitEngineData(randomGenerator.nextLong()); + assertTrue(taskitEngineData.equals(taskitEngineData)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TaskitEngineData taskitEngineData1 = getRandomTaskitEngineData(seed); + TaskitEngineData taskitEngineData2 = getRandomTaskitEngineData(seed); + assertFalse(taskitEngineData1 == taskitEngineData2); + for (int j = 0; j < 10; j++) { + assertTrue(taskitEngineData1.equals(taskitEngineData2)); + assertTrue(taskitEngineData2.equals(taskitEngineData1)); + } + } + + // different inputs yield unequal taskitEngineDatas + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TaskitEngineData taskitEngineData = getRandomTaskitEngineData(randomGenerator.nextLong()); + set.add(taskitEngineData); + } + assertEquals(100, set.size()); + } - // different specs - assertNotEquals(taskitEngineData1, taskitEngineData3); - assertNotEquals(taskitEngineData2, taskitEngineData3); - assertNotEquals(taskitEngineData3, taskitEngineData1); - assertNotEquals(taskitEngineData3, taskitEngineData2); + private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, + T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, T11.class, T12.class, + T13.class, T14.class, T15.class, TestAppObject.class, TestInputObject.class, + TestAppChildObject.class, TestInputChildObject.class); + + private static final class DynamicTranslationSpec extends TranslationSpec { + private final Class typeI; + private final Class typeA; + + public DynamicTranslationSpec(Class typeI, Class typeA) { + super(TestTaskitEngine.class); + this.typeI = typeI; + this.typeA = typeA; + } + + @Override + protected A translateInputObject(I inputObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); + } + + @Override + protected I translateAppObject(A appObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); + } + + @Override + public Class getAppObjectClass() { + return typeA; + } + + @Override + public Class getInputObjectClass() { + return typeI; + } + } + + private TaskitEngineData getRandomTaskitEngineData(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TaskitEngineData.Builder builder = TaskitEngineData.builder(); + + Set> set = new HashSet<>(); + int n = randomGenerator.nextInt(7) + 1; + while (set.size() < n) { + Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + set.add(new DynamicTranslationSpec<>(t1, t2)); + } + + for (DynamicTranslationSpec spec : set) { + builder.addTranslationSpec(spec); + } + + return builder.build(); } + + private static class T1 {} + private static class T2 {} + private static class T3 {} + private static class T4 {} + private static class T5 {} + private static class T6 {} + private static class T7 {} + private static class T8 {} + private static class T9 {} + private static class T10 {} + private static class T11 {} + private static class T12 {} + private static class T13 {} + private static class T14 {} + private static class T15 {} } From 5bd7aabc241f4505cf4a8ef8d753245cd0444209 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Thu, 24 Apr 2025 07:47:40 -0400 Subject: [PATCH 10/18] Update equals and hashCode in TaskitEngine and corresponding tests --- .../ms/taskit/core/engine/TaskitEngine.java | 2 +- .../taskit/core/engine/AT_TaskitEngine.java | 263 ++++++++++-------- 2 files changed, 151 insertions(+), 114 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngine.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngine.java index 6a7bfcf..4948d9a 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngine.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/engine/TaskitEngine.java @@ -368,7 +368,7 @@ public final ITranslationSpec getTranslationSpecForClass(Class classRef) } /** - * A hash code implementation consistent with equals(). + * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index 7d62de6..b82c8a0 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java @@ -2,15 +2,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.io.File; import java.io.IOException; import java.nio.file.Path; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; +import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; @@ -28,8 +30,10 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; +import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; import gov.hhs.aspr.ms.util.resourcehelper.ResourceError; import gov.hhs.aspr.ms.util.resourcehelper.ResourceHelper; @@ -582,125 +586,158 @@ public void testGetTranslationSpecForClass() { assertEquals(TaskitError.UNKNOWN_TRANSLATION_SPEC, contractException.getErrorType()); } - // TODO: update test @Test @UnitTestMethod(target = TaskitEngine.class, name = "hashCode", args = {}) public void testHashCode() { - TaskitEngine taskitEngine1 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .build(); - - TaskitEngine taskitEngine2 = TestTaskitEngine.builder() - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .build(); - - TaskitEngine taskitEngine3 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .build(); - - TaskitEngine taskitEngine4 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .build(); - - // exact same, same hash code - assertEquals(taskitEngine1.hashCode(), taskitEngine1.hashCode()); - - // different translation specs - assertNotEquals(taskitEngine1.hashCode(), taskitEngine2.hashCode()); - assertNotEquals(taskitEngine1.hashCode(), taskitEngine3.hashCode()); - assertNotEquals(taskitEngine2.hashCode(), taskitEngine3.hashCode()); - assertNotEquals(taskitEngine2.hashCode(), taskitEngine4.hashCode()); - assertNotEquals(taskitEngine3.hashCode(), taskitEngine4.hashCode()); - - // same translation specs - assertEquals(taskitEngine1.hashCode(), taskitEngine4.hashCode()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2655488674438883354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TaskitEngine taskitEngine1 = getRandomTaskitEngine(seed); + TaskitEngine taskitEngine2 = getRandomTaskitEngine(seed); + + assertEquals(taskitEngine1, taskitEngine2); + assertEquals(taskitEngine1.hashCode(), taskitEngine2.hashCode()); + + //initialize both taskitEngines and show they are still equal with equal hash codes + taskitEngine1.init(); + taskitEngine2.init(); + assertEquals(taskitEngine1, taskitEngine2); + assertEquals(taskitEngine1.hashCode(), taskitEngine2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TaskitEngine taskitEngine = getRandomTaskitEngine(randomGenerator.nextLong()); + hashCodes.add(taskitEngine.hashCode()); + } + + assertEquals(100, hashCodes.size()); } - // TODO: update test @Test @UnitTestMethod(target = TaskitEngine.class, name = "equals", args = { Object.class }) public void testEquals() { - TaskitEngine taskitEngine1 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec())) - .buildWithoutInit(); - - TaskitEngine taskitEngine2 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() - .addTranslationSpec(new TestComplexObjectTranslationSpec())) - .buildWithoutInit(); - - TaskitEngine taskitEngine3 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec())) - .buildWithoutInit(); - - TaskitEngine taskitEngine4 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec())) - .buildWithoutInit(); - - TaskitEngine taskitEngine5 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .build(); - - TaskitEngine taskitEngine6 = new TaskitEngine( - TaskitEngineData.builder().addTranslationSpec(new TestObjectTranslationSpec()).build(), - new TaskitEngineId() { - - }) { - - @Override - protected void writeToFile(File file, O outputObject) throws IOException { - } - - @Override - protected I readFile(File file, Class inputClassRef) throws IOException { - return null; - } - - }; - - // exact same - assertEquals(taskitEngine1, taskitEngine1); - - // null test - assertNotEquals(taskitEngine1, null); - - // not an instance test - assertNotEquals(taskitEngine1, new Object()); - - // different id - assertNotEquals(taskitEngine1, taskitEngine6); - - // different translation specs - assertNotEquals(taskitEngine1, taskitEngine2); - assertNotEquals(taskitEngine1, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine4); - assertNotEquals(taskitEngine3, taskitEngine4); - - // same translation specs - assertEquals(taskitEngine1, taskitEngine4); - - // init vs not init - assertNotEquals(taskitEngine1, taskitEngine5); - - taskitEngine1.init(); - taskitEngine2.init(); - taskitEngine3.init(); - taskitEngine4.init(); - - // init and same translation specs - assertEquals(taskitEngine1, taskitEngine4); - - // init and different translation specs - assertNotEquals(taskitEngine1, taskitEngine2); - assertNotEquals(taskitEngine1, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine4); - assertNotEquals(taskitEngine3, taskitEngine4); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8999922418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TaskitEngine taskitEngine = getRandomTaskitEngine(randomGenerator.nextLong()); + assertFalse(taskitEngine.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TaskitEngine taskitEngine = getRandomTaskitEngine(randomGenerator.nextLong()); + assertFalse(taskitEngine.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TaskitEngine taskitEngine = getRandomTaskitEngine(randomGenerator.nextLong()); + assertTrue(taskitEngine.equals(taskitEngine)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TaskitEngine taskitEngine1 = getRandomTaskitEngine(seed); + TaskitEngine taskitEngine2 = getRandomTaskitEngine(seed); + assertFalse(taskitEngine1 == taskitEngine2); + for (int j = 0; j < 10; j++) { + assertTrue(taskitEngine1.equals(taskitEngine2)); + assertTrue(taskitEngine2.equals(taskitEngine1)); + } + + // initialize both taskitEngines and show they are still equal + taskitEngine1.init(); + taskitEngine2.init(); + for (int j = 0; j < 10; j++) { + assertTrue(taskitEngine1.equals(taskitEngine2)); + assertTrue(taskitEngine2.equals(taskitEngine1)); + } + } + + // different inputs yield unequal taskitEngines + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TaskitEngine taskitEngine = getRandomTaskitEngine(randomGenerator.nextLong()); + set.add(taskitEngine); + } + assertEquals(100, set.size()); + } + private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, + T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, T11.class, T12.class, + T13.class, T14.class, T15.class, TestAppObject.class, TestInputObject.class, + TestAppChildObject.class, TestInputChildObject.class); + + private static final class DynamicTranslationSpec extends TranslationSpec { + private final Class typeI; + private final Class typeA; + + public DynamicTranslationSpec(Class typeI, Class typeA) { + super(TestTaskitEngine.class); + this.typeI = typeI; + this.typeA = typeA; + } + + @Override + protected A translateInputObject(I inputObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); + } + + @Override + protected I translateAppObject(A appObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); + } + + @Override + public Class getAppObjectClass() { + return typeA; + } + + @Override + public Class getInputObjectClass() { + return typeI; + } + } + + private TaskitEngine getRandomTaskitEngine(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TestTaskitEngine.Builder builder = TestTaskitEngine.builder(); + + Set> set = new HashSet<>(); + int n = randomGenerator.nextInt(7) + 1; + while (set.size() < n) { + Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); + set.add(new DynamicTranslationSpec<>(t1, t2)); + } + + for (DynamicTranslationSpec spec : set) { + builder.addTranslationSpec(spec); + } + + return new TestTaskitEngineBuilderBridge(builder).buildWithoutInit(); } + + private static class T1 {} + private static class T2 {} + private static class T3 {} + private static class T4 {} + private static class T5 {} + private static class T6 {} + private static class T7 {} + private static class T8 {} + private static class T9 {} + private static class T10 {} + private static class T11 {} + private static class T12 {} + private static class T13 {} + private static class T14 {} + private static class T15 {} } From f1f490d11b9f2f48d9a513061daf3a462dd36e3e Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Thu, 24 Apr 2025 07:50:18 -0400 Subject: [PATCH 11/18] Removed unnecessary equals and hashCode and corresponding tests for TestTaskitEngine --- .../testsupport/engine/TestTaskitEngine.java | 10 -- .../engine/AT_TestTaskitEngine.java | 109 ------------------ 2 files changed, 119 deletions(-) diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/TestTaskitEngine.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/TestTaskitEngine.java index ffaf32a..7024665 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/TestTaskitEngine.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/TestTaskitEngine.java @@ -147,14 +147,4 @@ protected I readFile(File file, Class inputClassRef) throws IOException { return this.gson.fromJson(jsonObject.toString(), inputClassRef); } - - @Override - public int hashCode() { - return super.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return super.equals(obj); - } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java index 1586c05..022ed0a 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java @@ -1,14 +1,12 @@ package gov.hhs.aspr.ms.taskit.core.testsupport.engine; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import java.nio.file.Path; import org.junit.jupiter.api.Test; -import gov.hhs.aspr.ms.taskit.core.engine.TaskitEngine; import gov.hhs.aspr.ms.taskit.core.engine.TaskitEngineData; import gov.hhs.aspr.ms.taskit.core.engine.TaskitError; import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; @@ -266,111 +264,4 @@ public Class getInputObjectClass() { assertEquals(expectedAppObject, actualAppObject); } - - // TODO: update test - @Test - @UnitTestMethod(target = TestTaskitEngine.class, name = "hashCode", args = {}) - public void testHashCode() { - // see AT_TaskitEngine.testHashCode() - // code here is strictly for coverage, and coverage alone - TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); - TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); - TestTaskitEngine taskitEngine1 = TestTaskitEngine.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .buildWithoutInit(); - - TestTaskitEngine taskitEngine2 = TestTaskitEngine.builder() - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - - TestTaskitEngine taskitEngine3 = TestTaskitEngine.builder() - .addTranslationSpec(testObjectTranslationSpec) - .build(); - - TestTaskitEngine taskitEngine4 = TestTaskitEngine.builder() - .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(testComplexObjectTranslationSpec) - .buildWithoutInit(); - - // exact same, same hash code - assertEquals(taskitEngine1.hashCode(), taskitEngine1.hashCode()); - - // different translation specs - assertNotEquals(taskitEngine1.hashCode(), taskitEngine2.hashCode()); - assertNotEquals(taskitEngine1.hashCode(), taskitEngine3.hashCode()); - assertNotEquals(taskitEngine2.hashCode(), taskitEngine3.hashCode()); - assertNotEquals(taskitEngine2.hashCode(), taskitEngine4.hashCode()); - assertNotEquals(taskitEngine3.hashCode(), taskitEngine4.hashCode()); - - // same translation specs - assertEquals(taskitEngine1.hashCode(), taskitEngine4.hashCode()); - } - - // TODO: update test - @Test - @UnitTestMethod(target = TestTaskitEngine.class, name = "equals", args = { Object.class }) - public void testEquals() { - // see AT_TaskitEngine.testEquals() - // code here is strictly for coverage, and coverage alone - TaskitEngine taskitEngine1 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .buildWithoutInit(); - - TaskitEngine taskitEngine2 = TestTaskitEngine.builder() - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .buildWithoutInit(); - - TaskitEngine taskitEngine3 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .buildWithoutInit(); - - TaskitEngine taskitEngine4 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .buildWithoutInit(); - - TaskitEngine taskitEngine5 = TestTaskitEngine.builder() - .addTranslationSpec(new TestObjectTranslationSpec()) - .addTranslationSpec(new TestComplexObjectTranslationSpec()) - .build(); - - // exact same - assertEquals(taskitEngine1, taskitEngine1); - - // null test - assertNotEquals(taskitEngine1, null); - - // not an instance test - assertNotEquals(taskitEngine1, new Object()); - - // different translation specs - assertNotEquals(taskitEngine1, taskitEngine2); - assertNotEquals(taskitEngine1, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine4); - assertNotEquals(taskitEngine3, taskitEngine4); - - // same translation specs - assertEquals(taskitEngine1, taskitEngine4); - - // init vs not init - assertNotEquals(taskitEngine1, taskitEngine5); - - taskitEngine1.init(); - taskitEngine2.init(); - taskitEngine3.init(); - taskitEngine4.init(); - - // init and same translation specs - assertEquals(taskitEngine1, taskitEngine4); - - // init and different translation specs - assertNotEquals(taskitEngine1, taskitEngine2); - assertNotEquals(taskitEngine1, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine4); - assertNotEquals(taskitEngine3, taskitEngine4); - } } From aaaee5d2a2181be35d89b359954dbc7b13fb9294 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Thu, 24 Apr 2025 09:18:16 -0400 Subject: [PATCH 12/18] Move seeded random object generation from individual test classes to TestObjectUtil --- .../core/testsupport/TestObjectUtil.java | 68 ++++++--- .../testsupport/objects/AT_TestAppObject.java | 39 ++--- .../objects/AT_TestComplexAppObject.java | 136 +++++++++--------- .../objects/AT_TestComplexInputObject.java | 136 +++++++++--------- .../objects/AT_TestInputObject.java | 35 ++--- 5 files changed, 197 insertions(+), 217 deletions(-) diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java index fb9ae42..f1085e7 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java @@ -3,7 +3,10 @@ import java.util.ArrayList; import java.util.List; +import org.apache.commons.math3.random.RandomGenerator; + import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppChildObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppEnum; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestComplexAppObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestComplexInputObject; @@ -12,27 +15,43 @@ import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class TestObjectUtil { - static org.apache.commons.math3.random.RandomGenerator randomGenerator = RandomGeneratorProvider + static RandomGenerator randomGenerator = RandomGeneratorProvider .getRandomGenerator(4444833210967964206L); public static TestAppObject generateTestAppObject() { + return generateTestAppObject(randomGenerator.nextLong()); + } - TestAppObject appObject = new TestAppObject(); + public static TestAppObject generateTestAppObject(long seed) { + RandomGenerator localRG = RandomGeneratorProvider.getRandomGenerator(seed); - appObject.setTestComplexAppObject(generateTestComplexAppObject()); - appObject.setBool(randomGenerator.nextBoolean()); - appObject.setInteger(randomGenerator.nextInt(1500)); - appObject.setString("readInput" + randomGenerator.nextInt(25)); + TestComplexAppObject testComplexAppObject = generateTestComplexAppObject(localRG.nextLong()); - return appObject; + TestAppEnum[] enumValues = TestAppEnum.values(); + TestAppEnum randomEnum = enumValues[localRG.nextInt(enumValues.length)]; + + TestAppObject testAppObject = new TestAppObject(); + testAppObject.setBool(localRG.nextBoolean()); + testAppObject.setInteger(localRG.nextInt(1500)); + testAppObject.setString("readInput" + localRG.nextInt(25)); + testAppObject.setTestComplexAppObject(testComplexAppObject); + testAppObject.setTestAppEnum(randomEnum); + + return testAppObject; } public static TestComplexAppObject generateTestComplexAppObject() { + return generateTestComplexAppObject(randomGenerator.nextLong()); + } + + public static TestComplexAppObject generateTestComplexAppObject(long seed) { + RandomGenerator localRG = RandomGeneratorProvider.getRandomGenerator(seed); + TestComplexAppObject complexAppObject = new TestComplexAppObject(); - complexAppObject.setNumEntities(randomGenerator.nextInt(100)); - complexAppObject.setStartTime(randomGenerator.nextDouble() * 15); - complexAppObject.setTestString("readInput" + randomGenerator.nextInt(15)); + complexAppObject.setNumEntities(localRG.nextInt(100)); + complexAppObject.setStartTime(localRG.nextDouble() * 15); + complexAppObject.setTestString("readInput" + localRG.nextInt(15)); return complexAppObject; } @@ -48,23 +67,34 @@ public static List getListOfAppObjects(int num) { } public static TestInputObject generateTestInputObject() { + return generateTestInputObject(randomGenerator.nextLong()); + } + public static TestInputObject generateTestInputObject(long seed) { + RandomGenerator localRG = RandomGeneratorProvider.getRandomGenerator(seed); - TestInputObject inputObject = new TestInputObject(); + TestComplexInputObject testComplexInputObject = generateTestComplexInputObject(localRG.nextLong()); - inputObject.setTestComplexInputObject(generateTestComplexInputObject()); - inputObject.setBool(randomGenerator.nextBoolean()); - inputObject.setInteger(randomGenerator.nextInt(1500)); - inputObject.setString("readInput" + randomGenerator.nextInt(25)); + TestInputObject testInputObject = new TestInputObject(); + testInputObject.setBool(localRG.nextBoolean()); + testInputObject.setInteger(localRG.nextInt(1500)); + testInputObject.setString("readInput" + localRG.nextInt(25)); + testInputObject.setTestComplexInputObject(testComplexInputObject); - return inputObject; + return testInputObject; } public static TestComplexInputObject generateTestComplexInputObject() { + return generateTestComplexInputObject(randomGenerator.nextLong()); + } + + public static TestComplexInputObject generateTestComplexInputObject(long seed) { + RandomGenerator localRG = RandomGeneratorProvider.getRandomGenerator(seed); + TestComplexInputObject complexInputObject = new TestComplexInputObject(); - complexInputObject.setNumEntities(randomGenerator.nextInt(100)); - complexInputObject.setStartTime(randomGenerator.nextDouble() * 15); - complexInputObject.setTestString("readInput" + randomGenerator.nextInt(15)); + complexInputObject.setNumEntities(localRG.nextInt(100)); + complexInputObject.setStartTime(localRG.nextDouble() * 15); + complexInputObject.setTestString("readInput" + localRG.nextInt(15)); return complexInputObject; } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java index a43c8b5..887abff 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestAppObject.java @@ -135,8 +135,8 @@ public void testHashCode() { // equal objects have equal hash codes for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TestAppObject testAppObject1 = getRandomTestAppObject(seed); - TestAppObject testAppObject2 = getRandomTestAppObject(seed); + TestAppObject testAppObject1 = TestObjectUtil.generateTestAppObject(seed); + TestAppObject testAppObject2 = TestObjectUtil.generateTestAppObject(seed); assertEquals(testAppObject1, testAppObject2); assertEquals(testAppObject1.hashCode(), testAppObject2.hashCode()); @@ -145,7 +145,7 @@ public void testHashCode() { // hash codes are reasonably distributed Set hashCodes = new LinkedHashSet<>(); for (int i = 0; i < 100; i++) { - TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); hashCodes.add(testAppObject.hashCode()); } @@ -159,27 +159,27 @@ public void testEquals() { // never equal to another type for (int i = 0; i < 30; i++) { - TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); assertFalse(testAppObject.equals(new Object())); } // never equal to null for (int i = 0; i < 30; i++) { - TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); assertFalse(testAppObject.equals(null)); } // reflexive for (int i = 0; i < 30; i++) { - TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); assertTrue(testAppObject.equals(testAppObject)); } // symmetric, transitive, consistent for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TestAppObject testAppObject1 = getRandomTestAppObject(seed); - TestAppObject testAppObject2 = getRandomTestAppObject(seed); + TestAppObject testAppObject1 = TestObjectUtil.generateTestAppObject(seed); + TestAppObject testAppObject2 = TestObjectUtil.generateTestAppObject(seed); assertFalse(testAppObject1 == testAppObject2); for (int j = 0; j < 10; j++) { assertTrue(testAppObject1.equals(testAppObject2)); @@ -190,30 +190,9 @@ public void testEquals() { // different inputs yield unequal testAppObjects Set set = new LinkedHashSet<>(); for (int i = 0; i < 100; i++) { - TestAppObject testAppObject = getRandomTestAppObject(randomGenerator.nextLong()); + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); set.add(testAppObject); } assertEquals(100, set.size()); } - - private TestAppObject getRandomTestAppObject(long seed) { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - - TestComplexAppObject testComplexAppObject = new TestComplexAppObject(); - testComplexAppObject.setNumEntities(randomGenerator.nextInt(100)); - testComplexAppObject.setStartTime(randomGenerator.nextDouble() * 15); - testComplexAppObject.setTestString("readInput" + randomGenerator.nextInt(15)); - - TestAppEnum[] enumValues = TestAppEnum.values(); - TestAppEnum randomEnum = enumValues[randomGenerator.nextInt(enumValues.length)]; - - TestAppObject testAppObject = new TestAppObject(); - testAppObject.setBool(randomGenerator.nextBoolean()); - testAppObject.setInteger(randomGenerator.nextInt(1500)); - testAppObject.setString("readInput" + randomGenerator.nextInt(25)); - testAppObject.setTestComplexAppObject(testComplexAppObject); - testAppObject.setTestAppEnum(randomEnum); - - return testAppObject; - } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java index ac249c7..99f8e46 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexAppObject.java @@ -11,6 +11,7 @@ import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; +import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; @@ -86,81 +87,74 @@ public void testGetTestString() { @Test @UnitTestMethod(target = TestComplexAppObject.class, name = "hashCode", args = {}) public void testHashCode() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491444433183354L); - - // equal objects have equal hash codes - for (int i = 0; i < 30; i++) { - long seed = randomGenerator.nextLong(); - TestComplexAppObject testComplexAppObject1 = getRandomTestComplexAppObject(seed); - TestComplexAppObject testComplexAppObject2 = getRandomTestComplexAppObject(seed); - - assertEquals(testComplexAppObject1, testComplexAppObject2); - assertEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); - } - - // hash codes are reasonably distributed - Set hashCodes = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); - hashCodes.add(testComplexAppObject.hashCode()); - } - - assertEquals(100, hashCodes.size()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491444433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexAppObject testComplexAppObject1 = TestObjectUtil.generateTestComplexAppObject(seed); + TestComplexAppObject testComplexAppObject2 = TestObjectUtil.generateTestComplexAppObject(seed); + + assertEquals(testComplexAppObject1, testComplexAppObject2); + assertEquals(testComplexAppObject1.hashCode(), testComplexAppObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexAppObject testComplexAppObject = TestObjectUtil + .generateTestComplexAppObject(randomGenerator.nextLong()); + hashCodes.add(testComplexAppObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestComplexAppObject.class, name = "equals", args = { Object.class }) public void testEquals() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980322418377306870L); - - // never equal to another type - for (int i = 0; i < 30; i++) { - TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); - assertFalse(testComplexAppObject.equals(new Object())); - } - - // never equal to null - for (int i = 0; i < 30; i++) { - TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); - assertFalse(testComplexAppObject.equals(null)); - } - - // reflexive - for (int i = 0; i < 30; i++) { - TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); - assertTrue(testComplexAppObject.equals(testComplexAppObject)); - } - - // symmetric, transitive, consistent - for (int i = 0; i < 30; i++) { - long seed = randomGenerator.nextLong(); - TestComplexAppObject testComplexAppObject1 = getRandomTestComplexAppObject(seed); - TestComplexAppObject testComplexAppObject2 = getRandomTestComplexAppObject(seed); - assertFalse(testComplexAppObject1 == testComplexAppObject2); - for (int j = 0; j < 10; j++) { - assertTrue(testComplexAppObject1.equals(testComplexAppObject2)); - assertTrue(testComplexAppObject2.equals(testComplexAppObject1)); - } - } - - // different inputs yield unequal testComplexAppObjects - Set set = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TestComplexAppObject testComplexAppObject = getRandomTestComplexAppObject(randomGenerator.nextLong()); - set.add(testComplexAppObject); - } - assertEquals(100, set.size()); - } - - private TestComplexAppObject getRandomTestComplexAppObject(long seed) { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - - TestComplexAppObject complexAppObject = new TestComplexAppObject(); - - complexAppObject.setNumEntities(randomGenerator.nextInt(100)); - complexAppObject.setStartTime(randomGenerator.nextDouble() * 15); - complexAppObject.setTestString("readInput" + randomGenerator.nextInt(15)); - - return complexAppObject; + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980322418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = TestObjectUtil + .generateTestComplexAppObject(randomGenerator.nextLong()); + assertFalse(testComplexAppObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = TestObjectUtil + .generateTestComplexAppObject(randomGenerator.nextLong()); + assertFalse(testComplexAppObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestComplexAppObject testComplexAppObject = TestObjectUtil + .generateTestComplexAppObject(randomGenerator.nextLong()); + assertTrue(testComplexAppObject.equals(testComplexAppObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexAppObject testComplexAppObject1 = TestObjectUtil.generateTestComplexAppObject(seed); + TestComplexAppObject testComplexAppObject2 = TestObjectUtil.generateTestComplexAppObject(seed); + assertFalse(testComplexAppObject1 == testComplexAppObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testComplexAppObject1.equals(testComplexAppObject2)); + assertTrue(testComplexAppObject2.equals(testComplexAppObject1)); + } + } + + // different inputs yield unequal testComplexAppObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexAppObject testComplexAppObject = TestObjectUtil + .generateTestComplexAppObject(randomGenerator.nextLong()); + set.add(testComplexAppObject); + } + assertEquals(100, set.size()); } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java index daf1a42..23b9bb1 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestComplexInputObject.java @@ -11,6 +11,7 @@ import org.apache.commons.math3.random.RandomGenerator; import org.junit.jupiter.api.Test; +import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; @@ -86,81 +87,74 @@ public void testGetString() { @Test @UnitTestMethod(target = TestComplexInputObject.class, name = "hashCode", args = {}) public void testHashCode() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491508433183354L); - - // equal objects have equal hash codes - for (int i = 0; i < 30; i++) { - long seed = randomGenerator.nextLong(); - TestComplexInputObject testComplexInputObject1 = getRandomTestComplexInputObject(seed); - TestComplexInputObject testComplexInputObject2 = getRandomTestComplexInputObject(seed); - - assertEquals(testComplexInputObject1, testComplexInputObject2); - assertEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); - } - - // hash codes are reasonably distributed - Set hashCodes = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); - hashCodes.add(testComplexInputObject.hashCode()); - } - - assertEquals(100, hashCodes.size()); + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2653491508433183354L); + + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexInputObject testComplexInputObject1 = TestObjectUtil.generateTestComplexInputObject(seed); + TestComplexInputObject testComplexInputObject2 = TestObjectUtil.generateTestComplexInputObject(seed); + + assertEquals(testComplexInputObject1, testComplexInputObject2); + assertEquals(testComplexInputObject1.hashCode(), testComplexInputObject2.hashCode()); + } + + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexInputObject testComplexInputObject = TestObjectUtil + .generateTestComplexInputObject(randomGenerator.nextLong()); + hashCodes.add(testComplexInputObject.hashCode()); + } + + assertEquals(100, hashCodes.size()); } @Test @UnitTestMethod(target = TestComplexInputObject.class, name = "equals", args = { Object.class }) public void testEquals() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980223418377306870L); - - // never equal to another type - for (int i = 0; i < 30; i++) { - TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); - assertFalse(testComplexInputObject.equals(new Object())); - } - - // never equal to null - for (int i = 0; i < 30; i++) { - TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); - assertFalse(testComplexInputObject.equals(null)); - } - - // reflexive - for (int i = 0; i < 30; i++) { - TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); - assertTrue(testComplexInputObject.equals(testComplexInputObject)); - } - - // symmetric, transitive, consistent - for (int i = 0; i < 30; i++) { - long seed = randomGenerator.nextLong(); - TestComplexInputObject testComplexInputObject1 = getRandomTestComplexInputObject(seed); - TestComplexInputObject testComplexInputObject2 = getRandomTestComplexInputObject(seed); - assertFalse(testComplexInputObject1 == testComplexInputObject2); - for (int j = 0; j < 10; j++) { - assertTrue(testComplexInputObject1.equals(testComplexInputObject2)); - assertTrue(testComplexInputObject2.equals(testComplexInputObject1)); - } - } - - // different inputs yield unequal testComplexInputObjects - Set set = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TestComplexInputObject testComplexInputObject = getRandomTestComplexInputObject(randomGenerator.nextLong()); - set.add(testComplexInputObject); - } - assertEquals(100, set.size()); - } - - private TestComplexInputObject getRandomTestComplexInputObject(long seed) { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - - TestComplexInputObject complexInputObject = new TestComplexInputObject(); - - complexInputObject.setNumEntities(randomGenerator.nextInt(100)); - complexInputObject.setStartTime(randomGenerator.nextDouble() * 15); - complexInputObject.setTestString("readInput" + randomGenerator.nextInt(15)); - - return complexInputObject; + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(8980223418377306870L); + + // never equal to another type + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = TestObjectUtil + .generateTestComplexInputObject(randomGenerator.nextLong()); + assertFalse(testComplexInputObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = TestObjectUtil + .generateTestComplexInputObject(randomGenerator.nextLong()); + assertFalse(testComplexInputObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + TestComplexInputObject testComplexInputObject = TestObjectUtil + .generateTestComplexInputObject(randomGenerator.nextLong()); + assertTrue(testComplexInputObject.equals(testComplexInputObject)); + } + + // symmetric, transitive, consistent + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); + TestComplexInputObject testComplexInputObject1 = TestObjectUtil.generateTestComplexInputObject(seed); + TestComplexInputObject testComplexInputObject2 = TestObjectUtil.generateTestComplexInputObject(seed); + assertFalse(testComplexInputObject1 == testComplexInputObject2); + for (int j = 0; j < 10; j++) { + assertTrue(testComplexInputObject1.equals(testComplexInputObject2)); + assertTrue(testComplexInputObject2.equals(testComplexInputObject1)); + } + } + + // different inputs yield unequal testComplexInputObjects + Set set = new LinkedHashSet<>(); + for (int i = 0; i < 100; i++) { + TestComplexInputObject testComplexInputObject = TestObjectUtil + .generateTestComplexInputObject(randomGenerator.nextLong()); + set.add(testComplexInputObject); + } + assertEquals(100, set.size()); } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java index 209094e..8b0f2b0 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java @@ -115,8 +115,8 @@ public void testHashCode() { // equal objects have equal hash codes for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TestInputObject testInputObject1 = getRandomTestInputObject(seed); - TestInputObject testInputObject2 = getRandomTestInputObject(seed); + TestInputObject testInputObject1 = TestObjectUtil.generateTestInputObject(seed); + TestInputObject testInputObject2 = TestObjectUtil.generateTestInputObject(seed); assertEquals(testInputObject1, testInputObject2); assertEquals(testInputObject1.hashCode(), testInputObject2.hashCode()); @@ -125,7 +125,7 @@ public void testHashCode() { // hash codes are reasonably distributed Set hashCodes = new LinkedHashSet<>(); for (int i = 0; i < 100; i++) { - TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); hashCodes.add(testInputObject.hashCode()); } @@ -139,27 +139,27 @@ public void testEquals() { // never equal to another type for (int i = 0; i < 30; i++) { - TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); assertFalse(testInputObject.equals(new Object())); } // never equal to null for (int i = 0; i < 30; i++) { - TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); assertFalse(testInputObject.equals(null)); } // reflexive for (int i = 0; i < 30; i++) { - TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); assertTrue(testInputObject.equals(testInputObject)); } // symmetric, transitive, consistent for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TestInputObject testInputObject1 = getRandomTestInputObject(seed); - TestInputObject testInputObject2 = getRandomTestInputObject(seed); + TestInputObject testInputObject1 = TestObjectUtil.generateTestInputObject(seed); + TestInputObject testInputObject2 = TestObjectUtil.generateTestInputObject(seed); assertFalse(testInputObject1 == testInputObject2); for (int j = 0; j < 10; j++) { assertTrue(testInputObject1.equals(testInputObject2)); @@ -170,26 +170,9 @@ public void testEquals() { // different inputs yield unequal testInputObjects Set set = new LinkedHashSet<>(); for (int i = 0; i < 100; i++) { - TestInputObject testInputObject = getRandomTestInputObject(randomGenerator.nextLong()); + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); set.add(testInputObject); } assertEquals(100, set.size()); } - - private TestInputObject getRandomTestInputObject(long seed) { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - - TestComplexInputObject testComplexInputObject = new TestComplexInputObject(); - testComplexInputObject.setNumEntities(randomGenerator.nextInt(100)); - testComplexInputObject.setStartTime(randomGenerator.nextDouble() * 15); - testComplexInputObject.setTestString("readInput" + randomGenerator.nextInt(15)); - - TestInputObject testInputObject = new TestInputObject(); - testInputObject.setBool(randomGenerator.nextBoolean()); - testInputObject.setInteger(randomGenerator.nextInt(1500)); - testInputObject.setString("readInput" + randomGenerator.nextInt(25)); - testInputObject.setTestComplexInputObject(testComplexInputObject); - - return testInputObject; - } } From e0a6460ee09233e95a1e5aef78844510ac95c3c4 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Thu, 24 Apr 2025 14:52:46 -0400 Subject: [PATCH 13/18] Update TestInputObject and TestAppObject to fully use enums and update all downstream related classes and tests --- .../testsupport/objects/TestAppObject.java | 6 +- .../testsupport/objects/TestInputEnum.java | 12 ++++ .../testsupport/objects/TestInputObject.java | 27 +++++-- .../object/TestObjectTranslator.java | 5 +- .../specs/TestObjectTranslationSpec.java | 2 + .../testenum/TestEnumTranslator.java | 24 +++++++ .../testenum/TestEnumTranslatorId.java | 13 ++++ .../specs/TestEnumTranslationSpec.java | 31 ++++++++ .../taskit/core/engine/AT_TaskitEngine.java | 34 +++++++-- .../core/engine/AT_TaskitEngineManager.java | 19 ++++- .../core/testsupport/TestObjectUtil.java | 17 +++++ .../engine/AT_TestTaskitEngine.java | 5 ++ .../objects/AT_TestInputObject.java | 20 ++++++ .../object/AT_TestObjectTranslator.java | 2 + .../specs/AT_TestObjectTranslationSpec.java | 13 +++- .../testenum/AT_TestEnumTranslator.java | 25 +++++++ .../testenum/AT_TestEnumTranslatorId.java | 15 ++++ .../specs/AT_TestEnumTranslationSpec.java | 72 +++++++++++++++++++ .../core/translation/AT_TranslationSpec.java | 3 + .../TestProtobufObjectTranslationSpec.java | 5 ++ .../engine/AT_ProtobufBinaryTaskitEngine.java | 4 +- .../engine/AT_ProtobufJsonTaskitEngine.java | 4 +- .../engine/AT_ProtobufTaskitEngine.java | 7 +- .../AT_TestProtobufObjectTranslationSpec.java | 2 + 24 files changed, 342 insertions(+), 25 deletions(-) create mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputEnum.java create mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java create mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java create mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java create mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java create mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java create mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java index 6e4053d..8fc1426 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestAppObject.java @@ -4,7 +4,7 @@ /** * Test class representing a class with various variables, including a Complex - * class. + * class, and an enum. *

* Should NOT be used outside of testing. *

@@ -101,7 +101,7 @@ public void setTestAppEnum(TestAppEnum testAppEnum) { */ @Override public int hashCode() { - return Objects.hash(integer, bool, string, testComplexAppObject); + return Objects.hash(integer, bool, string, testComplexAppObject, testAppEnum); } /** @@ -121,6 +121,6 @@ public boolean equals(Object obj) { } TestAppObject other = (TestAppObject) obj; return integer == other.integer && bool == other.bool && Objects.equals(string, other.string) - && Objects.equals(testComplexAppObject, other.testComplexAppObject); + && Objects.equals(testComplexAppObject, other.testComplexAppObject) && testAppEnum == other.testAppEnum; } } diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputEnum.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputEnum.java new file mode 100644 index 0000000..b279da4 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputEnum.java @@ -0,0 +1,12 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.objects; + +/** + * Complement enum to {@link TestAppEnum}. + *

+ * Should NOT be used outside of testing. + *

+ */ +public enum TestInputEnum { + TEST1, + TEST2 +} diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java index 142253d..b8f086d 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/TestInputObject.java @@ -5,9 +5,6 @@ /** * Complement class to {@link TestAppObject} *

- * Note this class does not have an enum variable. - *

- *

* Should NOT be used outside of testing. *

*/ @@ -16,6 +13,7 @@ public class TestInputObject { private boolean bool; private String string; private TestComplexInputObject testComplexInputObject; + private TestInputEnum testInputEnum; /** * @return value of the integer variable @@ -81,17 +79,33 @@ public void setTestComplexInputObject(TestComplexInputObject testComplexInputObj this.testComplexInputObject = testComplexInputObject; } + /** + * @return the value of the enum variable + */ + public TestInputEnum getTestInputEnum() { + return this.testInputEnum; + } + + /** + * Sets the value of the enum variable. + * + * @param testInputEnum the value to set + */ + public void setTestInputEnum(TestInputEnum testInputEnum) { + this.testInputEnum = testInputEnum; + } + /** * Standard implementation consistent with the {@link #equals(Object)} method */ @Override public int hashCode() { - return Objects.hash(integer, bool, string, testComplexInputObject); + return Objects.hash(integer, bool, string, testComplexInputObject, testInputEnum); } /** * Two {@link TestInputObject}s are equal if and only if their integers, bools, - * strings, and testComplexInputObjects are equal. + * strings, testComplexInputObjects, and testInputEnums are equal. */ @Override public boolean equals(Object obj) { @@ -106,7 +120,6 @@ public boolean equals(Object obj) { } TestInputObject other = (TestInputObject) obj; return integer == other.integer && bool == other.bool && Objects.equals(string, other.string) - && Objects.equals(testComplexInputObject, other.testComplexInputObject); + && Objects.equals(testComplexInputObject, other.testComplexInputObject) && testInputEnum == other.testInputEnum; } - } diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java index 6eeadb7..bbcfc6d 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java @@ -3,6 +3,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslatorId; import gov.hhs.aspr.ms.taskit.core.translation.Translator; /** @@ -17,7 +18,9 @@ private TestObjectTranslator() { */ public static Translator getTranslator() { return Translator.builder().setTranslatorId(TestObjectTranslatorId.TRANSLATOR_ID) - .addDependency(TestComplexObjectTranslatorId.TRANSLATOR_ID).setInitializer(translatorContext -> { + .addDependency(TestComplexObjectTranslatorId.TRANSLATOR_ID) + .addDependency(TestEnumTranslatorId.TRANSLATOR_ID) + .setInitializer(translatorContext -> { translatorContext.getTaskitEngineBuilder(TestTaskitEngine.Builder.class) .addTranslationSpec(new TestObjectTranslationSpec()); }).build(); diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestObjectTranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestObjectTranslationSpec.java index 472f8f8..900c673 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestObjectTranslationSpec.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestObjectTranslationSpec.java @@ -18,6 +18,7 @@ protected TestAppObject translateInputObject(TestInputObject inputObject) { testAppObject.setString(inputObject.getString()); testAppObject .setTestComplexAppObject(this.taskitEngine.translateObject(inputObject.getTestComplexInputObject())); + testAppObject.setTestAppEnum(this.taskitEngine.translateObject(inputObject.getTestInputEnum())); return testAppObject; } @@ -31,6 +32,7 @@ protected TestInputObject translateAppObject(TestAppObject appObject) { testInputObject.setString(appObject.getString()); testInputObject .setTestComplexInputObject(this.taskitEngine.translateObject(appObject.getTestComplexAppObject())); + testInputObject.setTestInputEnum(this.taskitEngine.translateObject(appObject.getTestAppEnum())); return testInputObject; } diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java new file mode 100644 index 0000000..91bd542 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java @@ -0,0 +1,24 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; + +import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.translation.Translator; + +/** + * Translator for the TestEnum + */ +public class TestEnumTranslator { + private TestEnumTranslator() { + } + + /** + * @return the Translator for the TestEnum + */ + public static Translator getTranslator() { + return Translator.builder().setTranslatorId(TestEnumTranslatorId.TRANSLATOR_ID) + .setInitializer(translatorContext -> { + translatorContext.getTaskitEngineBuilder(TestTaskitEngine.Builder.class) + .addTranslationSpec(new TestEnumTranslationSpec()); + }).build(); + } +} diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java new file mode 100644 index 0000000..cde0845 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java @@ -0,0 +1,13 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; + +import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; + +/** + * TranslatorId for the TestEnumTranslator + */ +public class TestEnumTranslatorId implements TranslatorId { + public final static TranslatorId TRANSLATOR_ID = new TestEnumTranslatorId(); + + private TestEnumTranslatorId() { + } +} diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java new file mode 100644 index 0000000..9874c36 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java @@ -0,0 +1,31 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs; + +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppEnum; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputEnum; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; + +/** + * Translation Specification for the TestEnum + */ +public class TestEnumTranslationSpec extends TestTranslationSpec { + + @Override + protected TestAppEnum translateInputObject(TestInputEnum inputObject) { + return TestAppEnum.valueOf(inputObject.name()); + } + + @Override + protected TestInputEnum translateAppObject(TestAppEnum appObject) { + return TestInputEnum.valueOf(appObject.name()); + } + + @Override + public Class getAppObjectClass() { + return TestAppEnum.class; + } + + @Override + public Class getInputObjectClass() { + return TestInputEnum.class; + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index b82c8a0..e19f2d1 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java @@ -29,6 +29,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -115,9 +116,12 @@ public void testWrite() throws IOException { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec).build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); TestInputObject inputObject = TestObjectUtil.getInputFromApp(expectedAppObject); @@ -169,9 +173,13 @@ public void testTranslateAndWrite() throws IOException { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); @@ -235,9 +243,13 @@ public void testTranslateAndWrite_Class() throws IOException { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); @@ -304,9 +316,12 @@ public void testRead() throws IOException { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); TestInputObject expectedInputObject = TestObjectUtil.getInputFromApp(expectedAppObject); @@ -357,9 +372,12 @@ public void testReadAndTranslate() throws IOException { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) - .addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); @@ -412,9 +430,12 @@ public void testReadAndTranslate() throws IOException { public void testTranslateObject() { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + TaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(testComplexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); @@ -444,9 +465,12 @@ public void testTranslateObject() { public void testTranslateObjectAsSafeClass() { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + TaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(testComplexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java index 2d93637..bee84b3 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java @@ -20,6 +20,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslator; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslator; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; import gov.hhs.aspr.ms.util.resourcehelper.ResourceHelper; @@ -36,6 +37,7 @@ public void testTranslateObject() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -92,6 +94,7 @@ public void testTranslateObjectAsClassSafe() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -192,6 +195,7 @@ public Class getInputObjectClass() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .addTranslationSpec(wrapperTranslationSpec) .build(); @@ -261,7 +265,9 @@ public void testRead() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator()).build(); + .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) + .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() .addTaskitEngine(testTaskitEngine).build(); @@ -317,7 +323,9 @@ public void testReadAndTranslate() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator()).build(); + .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) + .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() .addTaskitEngine(testTaskitEngine).build(); @@ -370,6 +378,7 @@ public void testWrite() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -420,6 +429,7 @@ public void testTranslateAndWrite() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -471,6 +481,7 @@ public void testTranslateAndWrite_Parent() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -539,6 +550,7 @@ public void testAddTaskitEngine() { TestTaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager.builder().addTaskitEngine(taskitEngine).build(); @@ -555,7 +567,8 @@ public void testAddTaskitEngine() { contractException = assertThrows(ContractException.class, () -> { TestTaskitEngine taskitEngine2 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator())) + .addTranslator(TestComplexObjectTranslator.getTranslator()) + .addTranslator(TestEnumTranslator.getTranslator())) .buildWithoutInit(); TaskitEngineManager.builder() diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java index f1085e7..a0af713 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java @@ -11,6 +11,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestComplexAppObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestComplexInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputEnum; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; @@ -74,11 +75,15 @@ public static TestInputObject generateTestInputObject(long seed) { TestComplexInputObject testComplexInputObject = generateTestComplexInputObject(localRG.nextLong()); + TestInputEnum[] enumValues = TestInputEnum.values(); + TestInputEnum randomEnum = enumValues[localRG.nextInt(enumValues.length)]; + TestInputObject testInputObject = new TestInputObject(); testInputObject.setBool(localRG.nextBoolean()); testInputObject.setInteger(localRG.nextInt(1500)); testInputObject.setString("readInput" + localRG.nextInt(25)); testInputObject.setTestComplexInputObject(testComplexInputObject); + testInputObject.setTestInputEnum(randomEnum); return testInputObject; } @@ -117,6 +122,7 @@ public static TestAppObject getAppFromInput(TestInputObject inputObject) { appObject.setBool(inputObject.isBool()); appObject.setInteger(inputObject.getInteger()); appObject.setString(inputObject.getString()); + appObject.setTestAppEnum(getAppEnumFromInputEnum(inputObject.getTestInputEnum())); return appObject; } @@ -129,6 +135,7 @@ public static TestInputObject getInputFromApp(TestAppObject appObject) { inputObject.setBool(appObject.isBool()); inputObject.setInteger(appObject.getInteger()); inputObject.setString(appObject.getString()); + inputObject.setTestInputEnum(getInputEnumFromAppEnum(appObject.getTestAppEnum())); return inputObject; } @@ -140,6 +147,7 @@ public static TestAppChildObject getChildAppFromApp(TestAppObject appObject) { childAppObject.setBool(appObject.isBool()); childAppObject.setInteger(appObject.getInteger()); childAppObject.setString(appObject.getString()); + childAppObject.setTestAppEnum(appObject.getTestAppEnum()); return childAppObject; } @@ -151,6 +159,7 @@ public static TestInputChildObject getChildInputFromInput(TestInputObject inputO childInputObject.setBool(inputObject.isBool()); childInputObject.setInteger(inputObject.getInteger()); childInputObject.setString(inputObject.getString()); + childInputObject.setTestInputEnum(inputObject.getTestInputEnum()); return childInputObject; } @@ -174,4 +183,12 @@ public static TestComplexInputObject getComplexInputFromComplexApp(TestComplexAp return complexInputObject; } + + public static TestAppEnum getAppEnumFromInputEnum(TestInputEnum testInputEnum) { + return TestAppEnum.valueOf(testInputEnum.name()); + } + + public static TestInputEnum getInputEnumFromAppEnum(TestAppEnum testAppEnum) { + return TestInputEnum.valueOf(testAppEnum.name()); + } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java index 022ed0a..617143d 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java @@ -21,6 +21,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorContext; @@ -160,9 +161,11 @@ public void testTranslateObject() { // code here is strictly for coverage, and coverage alone TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(testComplexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); @@ -184,9 +187,11 @@ public void testTranslateObjectAsClassSafe() { // code here is strictly for coverage, and coverage alone TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec testComplexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(testComplexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java index 8b0f2b0..5b725f8 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/objects/AT_TestInputObject.java @@ -107,6 +107,26 @@ public void testGetTestComplexInputObject() { assertEquals(testComplexInputObject, testInputObject.getTestComplexInputObject()); } + @Test + @UnitTestMethod(target = TestInputObject.class, name = "setTestInputEnum", args = { TestInputEnum.class }) + public void testSetTestInputEnum() { + TestInputObject testInputObject = new TestInputObject(); + + testInputObject.setTestInputEnum(TestInputEnum.TEST1); + + assertEquals(TestInputEnum.TEST1, testInputObject.getTestInputEnum()); + } + + @Test + @UnitTestMethod(target = TestInputObject.class, name = "getTestInputEnum", args = {}) + public void testGetTestInputEnum() { + TestInputObject testInputObject = new TestInputObject(); + + testInputObject.setTestInputEnum(TestInputEnum.TEST2); + + assertEquals(TestInputEnum.TEST2, testInputObject.getTestInputEnum()); + } + @Test @UnitTestMethod(target = TestInputObject.class, name = "hashCode", args = {}) public void testHashCode() { diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java index 7fa9a57..a2c7a81 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslatorId; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -23,6 +24,7 @@ public void testGetTranslator() { Set expectedDependencies = new LinkedHashSet<>(); expectedDependencies.add(TestComplexObjectTranslatorId.TRANSLATOR_ID); + expectedDependencies.add(TestEnumTranslatorId.TRANSLATOR_ID); assertEquals(expectedDependencies, testObjectTranslator.getTranslatorDependencies()); } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java index 60b3a51..db21ddf 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java @@ -10,6 +10,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestForCoverage; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -30,8 +31,12 @@ public void testConvertInputObject() { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine.builder() - .addTranslationSpec(testObjectTranslationSpec).addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(testObjectTranslationSpec) + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestAppObject actualAppObject = testObjectTranslationSpec.translateInputObject(testInputObject); @@ -46,8 +51,12 @@ public void testConvertAppObject() { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTaskitEngine.builder() - .addTranslationSpec(testObjectTranslationSpec).addTranslationSpec(complexObjectTranslationSpec).build(); + .addTranslationSpec(testObjectTranslationSpec) + .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) + .build(); TestInputObject actualInputObject = testObjectTranslationSpec.translateAppObject(testAppObject); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java new file mode 100644 index 0000000..9bb85c8 --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java @@ -0,0 +1,25 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.LinkedHashSet; +import java.util.Set; + +import org.junit.jupiter.api.Test; + +import gov.hhs.aspr.ms.taskit.core.translation.Translator; +import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; +import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; + +public class AT_TestEnumTranslator { + @Test + @UnitTestMethod(target = TestEnumTranslator.class, name = "getTranslator", args = {}) + public void testGetTranslator() { + Translator testEnumTranslator = TestEnumTranslator.getTranslator(); + + assertEquals(TestEnumTranslatorId.TRANSLATOR_ID, testEnumTranslator.getTranslatorId()); + + Set expectedDependencies = new LinkedHashSet<>(); + assertEquals(expectedDependencies, testEnumTranslator.getTranslatorDependencies()); + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java new file mode 100644 index 0000000..43df4a0 --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java @@ -0,0 +1,15 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; + +import gov.hhs.aspr.ms.util.annotations.UnitTestField; + +public class AT_TestEnumTranslatorId { + @Test + @UnitTestField(target = TestEnumTranslatorId.class, name = "TRANSLATOR_ID") + public void testTranslatorId() { + assertNotNull(TestEnumTranslatorId.TRANSLATOR_ID); + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java new file mode 100644 index 0000000..4435a5d --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java @@ -0,0 +1,72 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; + +import gov.hhs.aspr.ms.taskit.core.testsupport.TestObjectUtil; +import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppEnum; +import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputEnum; +import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; +import gov.hhs.aspr.ms.util.annotations.UnitTestForCoverage; +import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; + +public class AT_TestEnumTranslationSpec { + @Test + @UnitTestConstructor(target = TestEnumTranslationSpec.class, args = {}) + public void testConstructor() { + assertNotNull(new TestEnumTranslationSpec()); + } + + @Test + @UnitTestForCoverage + public void testConvertInputObject() { + TestInputEnum testInputEnum = TestInputEnum.TEST1; + TestAppEnum expectedAppEnum = TestObjectUtil.getAppEnumFromInputEnum(testInputEnum); + + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + + TestTaskitEngine.builder()// + .addTranslationSpec(testEnumTranslationSpec)// + .build(); + + TestAppEnum actualAppEnum = testEnumTranslationSpec.translateInputObject(testInputEnum); + + assertEquals(expectedAppEnum, actualAppEnum); + } + + @Test + @UnitTestForCoverage + public void testConvertAppObject() { + TestAppEnum testAppEnum = TestAppEnum.TEST2; + TestInputEnum expectedInputEnum = TestObjectUtil.getInputEnumFromAppEnum(testAppEnum); + + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + + TestTaskitEngine.builder()// + .addTranslationSpec(testEnumTranslationSpec)// + .build(); + + TestInputEnum actualInputEnum = testEnumTranslationSpec.translateAppObject(testAppEnum); + + assertEquals(expectedInputEnum, actualInputEnum); + } + + @Test + @UnitTestMethod(target = TestEnumTranslationSpec.class, name = "getAppObjectClass", args = {}) + public void testGetAppObjectClass() { + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + + assertEquals(TestAppEnum.class, testEnumTranslationSpec.getAppObjectClass()); + } + + @Test + @UnitTestMethod(target = TestEnumTranslationSpec.class, name = "getInputObjectClass", args = {}) + public void testGetInputObjectClass() { + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); + + assertEquals(TestInputEnum.class, testEnumTranslationSpec.getInputObjectClass()); + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 9f3ea92..54f1361 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java @@ -32,6 +32,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; @@ -98,6 +99,7 @@ public void testIsInitialized() { public void testTranslate() { TestObjectTranslationSpec testObjectTranslationSpec = new TestObjectTranslationSpec(); TestComplexObjectTranslationSpec complexObjectTranslationSpec = new TestComplexObjectTranslationSpec(); + TestEnumTranslationSpec testEnumTranslationSpec = new TestEnumTranslationSpec(); TestTranslationSpec wrapperTranslationSpec = new TestTranslationSpec() { @Override @@ -153,6 +155,7 @@ public Class getInputObjectClass() { TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .addTranslationSpec(wrapperTranslationSpec) .addTranslationSpec(wrapperTranslationSpec2) .build(); diff --git a/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/TestProtobufObjectTranslationSpec.java b/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/TestProtobufObjectTranslationSpec.java index 07a8a26..9a04a8e 100644 --- a/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/TestProtobufObjectTranslationSpec.java +++ b/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/TestProtobufObjectTranslationSpec.java @@ -2,6 +2,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestComplexInputObject; +import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputEnum; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.protobuf.translation.ProtobufTranslationSpec; @@ -19,6 +20,8 @@ protected TestAppObject translateInputObject(TestInputObject inputObject) { testAppObject.setString(inputObject.getString()); testAppObject .setTestComplexAppObject(this.taskitEngine.translateObject(inputObject.getTestComplexInputObject())); + testAppObject + .setTestAppEnum(this.taskitEngine.translateObject(inputObject.getEnum())); return testAppObject; } @@ -29,6 +32,8 @@ protected TestInputObject translateAppObject(TestAppObject appObject) { .setInteger(appObject.getInteger()).setString(appObject.getString()) .setTestComplexInputObject((TestComplexInputObject) this.taskitEngine .translateObject(appObject.getTestComplexAppObject())) + .setEnum((TestInputEnum) this.taskitEngine + .translateObject(appObject.getTestAppEnum())) .build(); return testInputObject; diff --git a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufBinaryTaskitEngine.java b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufBinaryTaskitEngine.java index 6247249..d35d58c 100644 --- a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufBinaryTaskitEngine.java +++ b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufBinaryTaskitEngine.java @@ -25,6 +25,7 @@ import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputEnum; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.translation.ProtobufTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.translation.specs.AnyTranslationSpec; @@ -54,7 +55,8 @@ public void testReadFile() throws IOException { ProtobufBinaryTaskitEngine protobufTaskitEngine = ProtobufBinaryTaskitEngine.builder() .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()).build(); + .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()).build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); TestInputObject expectedObject = TestObjectUtil.getInputFromApp(expectedAppObject); diff --git a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufJsonTaskitEngine.java b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufJsonTaskitEngine.java index 65168e0..09883f4 100644 --- a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufJsonTaskitEngine.java +++ b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufJsonTaskitEngine.java @@ -31,6 +31,7 @@ import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputEnum; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.translation.ProtobufTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.translation.specs.AnyTranslationSpec; @@ -60,7 +61,8 @@ public void testReadFile() throws IOException { ProtobufJsonTaskitEngine protobufTaskitEngine = ProtobufJsonTaskitEngine.builder() .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()).build(); + .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()).build(); TestAppObject expectedAppObject = TestObjectUtil.generateTestAppObject(); TestInputObject expectedObject = TestObjectUtil.getInputFromApp(expectedAppObject); diff --git a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java index 7ce1dbe..6f064eb 100644 --- a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java +++ b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java @@ -23,6 +23,7 @@ import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestComplexInputObject; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.protobuf.testsupport.translation.specs.TestProtobufObjectTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestForCoverage; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -130,7 +131,8 @@ public void testGetAnyFromObjectAsClassSafe() { */ ProtobufJsonTaskitEngine protobufTaskitEngine = ProtobufJsonTaskitEngine.builder() .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()).build(); + .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()).build(); TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(); TestAppChildObject testAppChildObject = TestObjectUtil.getChildAppFromApp(testAppObject); @@ -155,7 +157,8 @@ public void testGetObjectFromAny() { */ ProtobufJsonTaskitEngine protobufTaskitEngine = ProtobufJsonTaskitEngine.builder() .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()).build(); + .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()).build(); TestAppObject expectedObject = TestObjectUtil.generateTestAppObject(); diff --git a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/AT_TestProtobufObjectTranslationSpec.java b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/AT_TestProtobufObjectTranslationSpec.java index d9d1033..54d142e 100644 --- a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/AT_TestProtobufObjectTranslationSpec.java +++ b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/testsupport/translation/specs/AT_TestProtobufObjectTranslationSpec.java @@ -29,6 +29,7 @@ public void testConvertInputObject() { ProtobufJsonTaskitEngine.builder() .addTranslationSpec(objectTranslationSpec) .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()) .build(); TestAppObject expectedValue = TestObjectUtil.generateTestAppObject(); @@ -47,6 +48,7 @@ public void testConvertAppObject() { ProtobufJsonTaskitEngine.builder() .addTranslationSpec(objectTranslationSpec) .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) + .addTranslationSpec(new TestProtobufEnumTranslationSpec()) .build(); TestAppObject appValue = TestObjectUtil.generateTestAppObject(); From decfbdf2f2062cc9ace26988cc8519f7e9655ba4 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Mon, 28 Apr 2025 11:13:12 -0400 Subject: [PATCH 14/18] Refactor DynamicTranslationSpec into a separate enum and update corresponding tests --- .../translation/TestClassPair.java | 196 ++++++++++++++++++ .../taskit/core/engine/AT_TaskitEngine.java | 71 +------ .../core/engine/AT_TaskitEngineData.java | 73 +------ .../translation/AT_TestClassPair.java | 101 +++++++++ .../core/translation/AT_TranslationSpec.java | 126 ++--------- 5 files changed, 329 insertions(+), 238 deletions(-) create mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java create mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java new file mode 100644 index 0000000..766515a --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java @@ -0,0 +1,196 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import org.apache.commons.math3.random.RandomGenerator; + +import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; +import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; + +public enum TestClassPair { + T1_T2(T1.class, T2.class), + T1_T3(T1.class, T3.class), + T1_T4(T1.class, T4.class), + T1_T5(T1.class, T5.class), + T1_T6(T1.class, T6.class), + T1_T7(T1.class, T7.class), + T1_T8(T1.class, T8.class), + T1_T9(T1.class, T9.class), + T1_T10(T1.class, T10.class), + T1_T11(T1.class, T11.class), + T1_T12(T1.class, T12.class), + T1_T13(T1.class, T13.class), + T1_T14(T1.class, T14.class), + T1_T15(T1.class, T15.class), + T2_T3(T2.class, T3.class), + T2_T4(T2.class, T4.class), + T2_T5(T2.class, T5.class), + T2_T6(T2.class, T6.class), + T2_T7(T2.class, T7.class), + T2_T8(T2.class, T8.class), + T2_T9(T2.class, T9.class), + T2_T10(T2.class, T10.class), + T2_T11(T2.class, T11.class), + T2_T12(T2.class, T12.class), + T2_T13(T2.class, T13.class), + T2_T14(T2.class, T14.class), + T2_T15(T2.class, T15.class), + T3_T4(T3.class, T4.class), + T3_T5(T3.class, T5.class), + T3_T6(T3.class, T6.class), + T3_T7(T3.class, T7.class), + T3_T8(T3.class, T8.class), + T3_T9(T3.class, T9.class), + T3_T10(T3.class, T10.class), + T3_T11(T3.class, T11.class), + T3_T12(T3.class, T12.class), + T3_T13(T3.class, T13.class), + T3_T14(T3.class, T14.class), + T3_T15(T3.class, T15.class), + T4_T5(T4.class, T5.class), + T4_T6(T4.class, T6.class), + T4_T7(T4.class, T7.class), + T4_T8(T4.class, T8.class), + T4_T9(T4.class, T9.class), + T4_T10(T4.class, T10.class), + T4_T11(T4.class, T11.class), + T4_T12(T4.class, T12.class), + T4_T13(T4.class, T13.class), + T4_T14(T4.class, T14.class), + T4_T15(T4.class, T15.class), + T5_T6(T5.class, T6.class), + T5_T7(T5.class, T7.class), + T5_T8(T5.class, T8.class), + T5_T9(T5.class, T9.class), + T5_T10(T5.class, T10.class), + T5_T11(T5.class, T11.class), + T5_T12(T5.class, T12.class), + T5_T13(T5.class, T13.class), + T5_T14(T5.class, T14.class), + T5_T15(T5.class, T15.class), + T6_T7(T6.class, T7.class), + T6_T8(T6.class, T8.class), + T6_T9(T6.class, T9.class), + T6_T10(T6.class, T10.class), + T6_T11(T6.class, T11.class), + T6_T12(T6.class, T12.class), + T6_T13(T6.class, T13.class), + T6_T14(T6.class, T14.class), + T6_T15(T6.class, T15.class), + T7_T8(T7.class, T8.class), + T7_T9(T7.class, T9.class), + T7_T10(T7.class, T10.class), + T7_T11(T7.class, T11.class), + T7_T12(T7.class, T12.class), + T7_T13(T7.class, T13.class), + T7_T14(T7.class, T14.class), + T7_T15(T7.class, T15.class), + T8_T9(T8.class, T9.class), + T8_T10(T8.class, T10.class), + T8_T11(T8.class, T11.class), + T8_T12(T8.class, T12.class), + T8_T13(T8.class, T13.class), + T8_T14(T8.class, T14.class), + T8_T15(T8.class, T15.class), + T9_T10(T9.class, T10.class), + T9_T11(T9.class, T11.class), + T9_T12(T9.class, T12.class), + T9_T13(T9.class, T13.class), + T9_T14(T9.class, T14.class), + T9_T15(T9.class, T15.class), + T10_T11(T10.class, T11.class), + T10_T12(T10.class, T12.class), + T10_T13(T10.class, T13.class), + T10_T14(T10.class, T14.class), + T10_T15(T10.class, T15.class), + T11_T12(T11.class, T12.class), + T11_T13(T11.class, T13.class), + T11_T14(T11.class, T14.class), + T11_T15(T11.class, T15.class), + T12_T13(T12.class, T13.class); + + private final Class typeI; + private final Class typeA; + + private TestClassPair(Class typeI, Class typeA) { + this.typeI = typeI; + this.typeA = typeA; + } + + public Class getTypeI() { + return typeI; + } + + public Class getTypeA() { + return typeA; + } + + public static TestClassPair getRandomTestClassPair(final RandomGenerator randomGenerator) { + return TestClassPair.values()[randomGenerator.nextInt(TestClassPair.values().length)]; + } + + public static List getTestClassPairs() { + return Arrays.asList(TestClassPair.values()); + } + + public static List getShuffledTestClassPairs(final RandomGenerator randomGenerator) { + List result = getTestClassPairs(); + Random random = new Random(randomGenerator.nextLong()); + Collections.shuffle(result, random); + return result; + } + + public TranslationSpec createTranslationSpec() { + return new DynamicTranslationSpec<>(typeI, typeA); + } + + private static final class DynamicTranslationSpec extends TranslationSpec { + private final Class typeI; + private final Class typeA; + + private DynamicTranslationSpec(Class typeI, Class typeA) { + super(TestTaskitEngine.class); + this.typeI = typeI; + this.typeA = typeA; + } + + @Override + protected A translateInputObject(I inputObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); + } + + @Override + protected I translateAppObject(A appObject) { + throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); + } + + @Override + public Class getAppObjectClass() { + return typeA; + } + + @Override + public Class getInputObjectClass() { + return typeI; + } + } + + private static class T1 {} + private static class T2 {} + private static class T3 {} + private static class T4 {} + private static class T5 {} + private static class T6 {} + private static class T7 {} + private static class T8 {} + private static class T9 {} + private static class T10 {} + private static class T11 {} + private static class T12 {} + private static class T13 {} + private static class T14 {} + private static class T15 {} +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index e19f2d1..98a3439 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -26,12 +25,12 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestObjectWrapper; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; -import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; @@ -693,75 +692,19 @@ public void testEquals() { assertEquals(100, set.size()); } - private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, - T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, T11.class, T12.class, - T13.class, T14.class, T15.class, TestAppObject.class, TestInputObject.class, - TestAppChildObject.class, TestInputChildObject.class); - - private static final class DynamicTranslationSpec extends TranslationSpec { - private final Class typeI; - private final Class typeA; - - public DynamicTranslationSpec(Class typeI, Class typeA) { - super(TestTaskitEngine.class); - this.typeI = typeI; - this.typeA = typeA; - } - - @Override - protected A translateInputObject(I inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected I translateAppObject(A appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return typeA; - } - - @Override - public Class getInputObjectClass() { - return typeI; - } - } - private TaskitEngine getRandomTaskitEngine(long seed) { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); TestTaskitEngine.Builder builder = TestTaskitEngine.builder(); - Set> set = new HashSet<>(); - int n = randomGenerator.nextInt(7) + 1; - while (set.size() < n) { - Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - set.add(new DynamicTranslationSpec<>(t1, t2)); - } + List shuffledTestClassPairs = TestClassPair.getShuffledTestClassPairs(randomGenerator); - for (DynamicTranslationSpec spec : set) { - builder.addTranslationSpec(spec); - } + int n = randomGenerator.nextInt(10) + 1; + for (int i = 0; i < n; i++) { + TestClassPair testClassPair = shuffledTestClassPairs.get(i); + builder.addTranslationSpec(testClassPair.createTranslationSpec()); + } return new TestTaskitEngineBuilderBridge(builder).buildWithoutInit(); } - - private static class T1 {} - private static class T2 {} - private static class T3 {} - private static class T4 {} - private static class T5 {} - private static class T6 {} - private static class T7 {} - private static class T8 {} - private static class T9 {} - private static class T10 {} - private static class T11 {} - private static class T12 {} - private static class T13 {} - private static class T14 {} - private static class T15 {} } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java index cee1a07..96f6042 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java @@ -5,7 +5,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -14,10 +13,7 @@ import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; -import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppChildObject; -import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; -import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; -import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecEmptyMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecNullMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; @@ -25,7 +21,6 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; -import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorContext; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; @@ -292,75 +287,21 @@ public void testEquals() { assertEquals(100, set.size()); } - private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, - T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, T11.class, T12.class, - T13.class, T14.class, T15.class, TestAppObject.class, TestInputObject.class, - TestAppChildObject.class, TestInputChildObject.class); - private static final class DynamicTranslationSpec extends TranslationSpec { - private final Class typeI; - private final Class typeA; - - public DynamicTranslationSpec(Class typeI, Class typeA) { - super(TestTaskitEngine.class); - this.typeI = typeI; - this.typeA = typeA; - } - - @Override - protected A translateInputObject(I inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected I translateAppObject(A appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return typeA; - } - - @Override - public Class getInputObjectClass() { - return typeI; - } - } private TaskitEngineData getRandomTaskitEngineData(long seed) { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); TaskitEngineData.Builder builder = TaskitEngineData.builder(); - Set> set = new HashSet<>(); - int n = randomGenerator.nextInt(7) + 1; - while (set.size() < n) { - Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - set.add(new DynamicTranslationSpec<>(t1, t2)); - } + List shuffledTestClassPairs = TestClassPair.getShuffledTestClassPairs(randomGenerator); - for (DynamicTranslationSpec spec : set) { - builder.addTranslationSpec(spec); - } + int n = randomGenerator.nextInt(10) + 1; + for (int i = 0; i < n; i++) { + TestClassPair testClassPair = shuffledTestClassPairs.get(i); + builder.addTranslationSpec(testClassPair.createTranslationSpec()); + } return builder.build(); } - - private static class T1 {} - private static class T2 {} - private static class T3 {} - private static class T4 {} - private static class T5 {} - private static class T6 {} - private static class T7 {} - private static class T8 {} - private static class T9 {} - private static class T10 {} - private static class T11 {} - private static class T12 {} - private static class T13 {} - private static class T14 {} - private static class T15 {} } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java new file mode 100644 index 0000000..1af33f5 --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java @@ -0,0 +1,101 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; +import org.junit.jupiter.api.Test; + +import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; +import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; +import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; +import gov.hhs.aspr.ms.util.wrappers.MutableInteger; + +public class AT_TestClassPair { + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "getTypeI", args = {}) + public void testGetTypeI() { + for (TestClassPair testClassPair : TestClassPair.values()) { + assertNotNull(testClassPair.getTypeI()); + } + } + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "getTypeA", args = {}) + public void testGetTypeA() { + for (TestClassPair testClassPair : TestClassPair.values()) { + assertNotNull(testClassPair.getTypeA()); + } + } + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "getRandomTestClassPair", args = { RandomGenerator.class }) + public void testGetRandomTestClassPair() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(242770195043563036L); + Map idCounter = new LinkedHashMap<>(); + Set setOfRandomTestClassPairs = new LinkedHashSet<>(); + + for (TestClassPair testClassPair : TestClassPair.values()) { + idCounter.put(testClassPair, new MutableInteger()); + } + + // show that generated values are reasonably unique + int numIterations = 10000; + for (int i = 0; i < numIterations; i++) { + TestClassPair testClassPair = TestClassPair.getRandomTestClassPair(randomGenerator); + setOfRandomTestClassPairs.add(testClassPair); + idCounter.get(testClassPair).increment(); + } + + int acceptableLowerLimit = 75; + int acceptableUpperLimit = 125; + for (TestClassPair testClassPair : idCounter.keySet()) { + assertTrue(idCounter.get(testClassPair).getValue() >= acceptableLowerLimit + && idCounter.get(testClassPair).getValue() <= acceptableUpperLimit); + } + + assertEquals(idCounter.values().stream().mapToInt(a -> a.getValue()).sum(), numIterations); + assertEquals(setOfRandomTestClassPairs.size(), TestClassPair.values().length); + } + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "getTestClassPairs", args = {}) + public void testGetTestClassPairs() { + assertEquals(Arrays.asList(TestClassPair.values()), TestClassPair.getTestClassPairs()); + } + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "getShuffledTestClassPairs", args = { RandomGenerator.class }) + public void testGetShuffledTestClassPairs() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(503706833466130759L); + List testClassPairs = TestClassPair.getTestClassPairs(); + Collections.shuffle(testClassPairs, new Random(randomGenerator.nextLong())); + + assertEquals(testClassPairs, TestClassPair.getShuffledTestClassPairs(RandomGeneratorProvider.getRandomGenerator(503706833466130759L))); + } + + @Test + @UnitTestMethod(target = TestClassPair.class, name = "createTranslationSpec", args = {}) + public void testCreateTranslationSpec() { + for (TestClassPair testClassPair : TestClassPair.values()) { + + TranslationSpec spec = testClassPair.createTranslationSpec(); + + assertNotNull(spec); + assertEquals(testClassPair.getTypeI(), spec.getInputObjectClass()); + assertEquals(testClassPair.getTypeA(), spec.getAppObjectClass()); + } + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 54f1361..58542da 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.util.LinkedHashMap; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -29,6 +28,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestObjectWrapper; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; @@ -250,8 +250,9 @@ public void testHashCode() { // equal objects have equal hash codes for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); - TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); + + TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); assertEquals(translationSpec1, translationSpec2); assertEquals(translationSpec1.hashCode(), translationSpec2.hashCode()); @@ -268,8 +269,8 @@ public void testHashCode() { // hash codes are reasonably distributed Set hashCodes = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + for (TestClassPair testClassPair : TestClassPair.values()) { + TranslationSpec translationSpec = testClassPair.createTranslationSpec(); hashCodes.add(translationSpec.hashCode()); } @@ -283,27 +284,28 @@ public void testEquals() { // never equal to another type for (int i = 0; i < 30; i++) { - TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); assertFalse(translationSpec.equals(new Object())); } // never equal to null for (int i = 0; i < 30; i++) { - TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); assertFalse(translationSpec.equals(null)); } // reflexive for (int i = 0; i < 30; i++) { - TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); assertTrue(translationSpec.equals(translationSpec)); } // symmetric, transitive, consistent for (int i = 0; i < 30; i++) { long seed = randomGenerator.nextLong(); - TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); - TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); + assertFalse(translationSpec1 == translationSpec2); for (int j = 0; j < 10; j++) { assertTrue(translationSpec1.equals(translationSpec2)); @@ -324,110 +326,18 @@ public void testEquals() { // different inputs yield unequal translationSpecs Set> set = new LinkedHashSet<>(); - for (int i = 0; i < 100; i++) { - TranslationSpec translationSpec = getRandomTranslationSpec(randomGenerator.nextLong()); + for (TestClassPair testClassPair : TestClassPair.values()) { + TranslationSpec translationSpec = testClassPair.createTranslationSpec(); set.add(translationSpec); } - assertEquals(100, set.size()); - } - private static final List> TYPES = List.of(T1.class, T2.class, T3.class, T4.class, - T5.class, T6.class, T7.class, T8.class, T9.class, T10.class, - T11.class, T12.class, T13.class, T14.class, T15.class, T16.class, - T17.class, T18.class, T19.class, T20.class, T21.class, T22.class, - T23.class, T24.class, T25.class, T26.class, T27.class, T28.class, - T29.class, T30.class, T31.class, T32.class, T33.class, T34.class, - T35.class, T36.class, T37.class, T38.class, T39.class, T40.class, - T41.class, T42.class, T43.class, T44.class, T45.class, T46.class, - T47.class, T48.class, T49.class, T50.class, TestAppObject.class, - TestInputObject.class, TestAppChildObject.class, TestInputChildObject.class); - - private static final class DynamicTranslationSpec extends TranslationSpec { - private final Class typeI; - private final Class typeA; - - public DynamicTranslationSpec(Class typeI, Class typeA) { - super(TestTaskitEngine.class); - this.typeI = typeI; - this.typeA = typeA; - } - - @Override - protected A translateInputObject(I inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } - - @Override - protected I translateAppObject(A appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } - - @Override - public Class getAppObjectClass() { - return typeA; - } - - @Override - public Class getInputObjectClass() { - return typeI; - } + assertEquals(100, set.size()); } private TranslationSpec getRandomTranslationSpec(long seed) { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - Class t1 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - Class t2 = TYPES.get(randomGenerator.nextInt(TYPES.size())); - return new DynamicTranslationSpec<>(t1, t2); - } - private static class T1 {} - private static class T2 {} - private static class T3 {} - private static class T4 {} - private static class T5 {} - private static class T6 {} - private static class T7 {} - private static class T8 {} - private static class T9 {} - private static class T10 {} - private static class T11 {} - private static class T12 {} - private static class T13 {} - private static class T14 {} - private static class T15 {} - private static class T16 {} - private static class T17 {} - private static class T18 {} - private static class T19 {} - private static class T20 {} - private static class T21 {} - private static class T22 {} - private static class T23 {} - private static class T24 {} - private static class T25 {} - private static class T26 {} - private static class T27 {} - private static class T28 {} - private static class T29 {} - private static class T30 {} - private static class T31 {} - private static class T32 {} - private static class T33 {} - private static class T34 {} - private static class T35 {} - private static class T36 {} - private static class T37 {} - private static class T38 {} - private static class T39 {} - private static class T40 {} - private static class T41 {} - private static class T42 {} - private static class T43 {} - private static class T44 {} - private static class T45 {} - private static class T46 {} - private static class T47 {} - private static class T48 {} - private static class T49 {} - private static class T50 {} + TestClassPair testClassPair = TestClassPair.getRandomTestClassPair(randomGenerator); + return testClassPair.createTranslationSpec(); + } } From 0489b876e8cd24acb8866502b03019b99d26c35b Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Mon, 28 Apr 2025 12:10:25 -0400 Subject: [PATCH 15/18] Remove hashCode and equals from ProtobufTaskitEngine and update related comments --- .../protobuf/engine/ProtobufTaskitEngine.java | 55 ++++--------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/engine/ProtobufTaskitEngine.java b/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/engine/ProtobufTaskitEngine.java index d41f689..c578dde 100644 --- a/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/engine/ProtobufTaskitEngine.java +++ b/protobuf/src/main/java/gov/hhs/aspr/ms/taskit/protobuf/engine/ProtobufTaskitEngine.java @@ -153,49 +153,14 @@ public final Class getClassFromTypeUrl(String typeUrl) { "Unable to find corresponding class for: " + typeUrl); } - @Override - public int hashCode() { - /* - * Note that we don't include the type url map as part of the hash code contract - * because it is - * directly linked to the added translationSpecs, which are already part of the - * hash code contract. - * Meaning that if the specs are the same, so is the map. There is never a case - * where the map would be different outside of the specs being different. - * However, child classes of this class are free to use the type url map as part - * of their hash code contract if they so wish. - */ - return super.hashCode(); - } - - @Override - public boolean equals(Object obj) { - /* - * Note that we don't include the type url map as part of the equals contract - * because it is - * directly linked to the added translationSpecs, which are already part of the - * equals contract. - * Meaning that if the specs are the same, so is the map. There is never a case - * where the map would be different outside of the specs being different. - * However, child classes of this class are free to use the type url map as part - * of their equals contract if they so wish. - */ - if (this == obj) { - return true; - } - - if (obj == null) { - return false; - } - - if (!(obj instanceof ProtobufTaskitEngine)) { - return false; - } - - if (!super.equals(obj)) { - return false; - } - return true; - } - + /* + * Note that we don't include the type url map as part of the hash code contract + * or the equals contract because it is + * directly linked to the added translationSpecs, which are already part of the + * hash code contract and equals contract. + * Meaning that if the specs are the same, so is the map. There is never a case + * where the map would be different outside of the specs being different. + * However, child classes of this class are free to use the type url map as part + * of their hash code contract and equals contract if they so wish. + */ } From 0a1ccac184a0e48d45924ff16e0afa3458653abc Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Mon, 28 Apr 2025 13:10:29 -0400 Subject: [PATCH 16/18] Remove testEquals and testHashCode from AT_ProtobufTaskitEngine --- .../engine/AT_ProtobufTaskitEngine.java | 83 ------------------- 1 file changed, 83 deletions(-) diff --git a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java index 6f064eb..11bacdc 100644 --- a/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java +++ b/protobuf/src/test/java/gov/hhs/aspr/ms/taskit/protobuf/engine/AT_ProtobufTaskitEngine.java @@ -1,7 +1,6 @@ package gov.hhs.aspr.ms.taskit.protobuf.engine; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -199,86 +198,4 @@ public void testGetClassFromTypeUrl() { assertEquals(ProtobufTaskitError.UNKNOWN_TYPE_URL, contractException.getErrorType()); } - - @Test - @UnitTestMethod(target = ProtobufTaskitEngine.class, name = "hashCode", args = {}) - public void testHashCode() { - // TODO: update test - ProtobufTaskitEngine protobufTaskitEngine1 = ProtobufJsonTaskitEngine.builder() - .build(); - ProtobufTaskitEngine protobufTaskitEngine2 = ProtobufJsonTaskitEngine.builder() - .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .build(); - ProtobufTaskitEngine protobufTaskitEngine3 = ProtobufJsonTaskitEngine.builder() - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) - .build(); - ProtobufTaskitEngine protobufTaskitEngine4 = ProtobufJsonTaskitEngine.builder() - .build(); - - // exact same - assertEquals(protobufTaskitEngine1.hashCode(), protobufTaskitEngine1.hashCode()); - assertEquals(protobufTaskitEngine2.hashCode(), protobufTaskitEngine2.hashCode()); - assertEquals(protobufTaskitEngine3.hashCode(), protobufTaskitEngine3.hashCode()); - assertEquals(protobufTaskitEngine4.hashCode(), protobufTaskitEngine4.hashCode()); - - // super not equals - assertNotEquals(protobufTaskitEngine1.hashCode(), protobufTaskitEngine2.hashCode()); - assertNotEquals(protobufTaskitEngine1.hashCode(), protobufTaskitEngine3.hashCode()); - assertNotEquals(protobufTaskitEngine2.hashCode(), protobufTaskitEngine1.hashCode()); - assertNotEquals(protobufTaskitEngine2.hashCode(), protobufTaskitEngine3.hashCode()); - assertNotEquals(protobufTaskitEngine2.hashCode(), protobufTaskitEngine4.hashCode()); - assertNotEquals(protobufTaskitEngine3.hashCode(), protobufTaskitEngine1.hashCode()); - assertNotEquals(protobufTaskitEngine3.hashCode(), protobufTaskitEngine2.hashCode()); - assertNotEquals(protobufTaskitEngine3.hashCode(), protobufTaskitEngine4.hashCode()); - assertNotEquals(protobufTaskitEngine4.hashCode(), protobufTaskitEngine2.hashCode()); - assertNotEquals(protobufTaskitEngine4.hashCode(), protobufTaskitEngine3.hashCode()); - - // same specs - assertEquals(protobufTaskitEngine1.hashCode(), protobufTaskitEngine4.hashCode()); - assertEquals(protobufTaskitEngine4.hashCode(), protobufTaskitEngine1.hashCode()); - } - - @Test - @UnitTestMethod(target = ProtobufTaskitEngine.class, name = "equals", args = { Object.class }) - public void testEquals() { - // TODO: update test - ProtobufTaskitEngine protobufTaskitEngine1 = ProtobufJsonTaskitEngine.builder() - .build(); - ProtobufTaskitEngine protobufTaskitEngine2 = ProtobufJsonTaskitEngine.builder() - .addTranslationSpec(new TestProtobufObjectTranslationSpec()) - .build(); - ProtobufTaskitEngine protobufTaskitEngine3 = ProtobufJsonTaskitEngine.builder() - .addTranslationSpec(new TestProtobufComplexObjectTranslationSpec()) - .build(); - ProtobufTaskitEngine protobufTaskitEngine4 = ProtobufJsonTaskitEngine.builder() - .build(); - - // exact same - assertEquals(protobufTaskitEngine1, protobufTaskitEngine1); - assertEquals(protobufTaskitEngine2, protobufTaskitEngine2); - assertEquals(protobufTaskitEngine3, protobufTaskitEngine3); - assertEquals(protobufTaskitEngine4, protobufTaskitEngine4); - - // null - assertNotEquals(protobufTaskitEngine1, null); - - // not instance - assertNotEquals(protobufTaskitEngine1, new Object()); - - // super not equals - assertNotEquals(protobufTaskitEngine1, protobufTaskitEngine2); - assertNotEquals(protobufTaskitEngine1, protobufTaskitEngine3); - assertNotEquals(protobufTaskitEngine2, protobufTaskitEngine1); - assertNotEquals(protobufTaskitEngine2, protobufTaskitEngine3); - assertNotEquals(protobufTaskitEngine2, protobufTaskitEngine4); - assertNotEquals(protobufTaskitEngine3, protobufTaskitEngine1); - assertNotEquals(protobufTaskitEngine3, protobufTaskitEngine2); - assertNotEquals(protobufTaskitEngine3, protobufTaskitEngine4); - assertNotEquals(protobufTaskitEngine4, protobufTaskitEngine2); - assertNotEquals(protobufTaskitEngine4, protobufTaskitEngine3); - - // same specs - assertEquals(protobufTaskitEngine1, protobufTaskitEngine4); - assertEquals(protobufTaskitEngine4, protobufTaskitEngine1); - } } From c1c3a22a5909a64d9b325e7e794e50644e043150 Mon Sep 17 00:00:00 2001 From: bischoffz Date: Mon, 28 Apr 2025 19:42:28 -0400 Subject: [PATCH 17/18] enum rename/slight refactor --- ...r.java => DynamicTestTranslationSpec.java} | 95 ++++++++++------ .../taskit/core/engine/AT_TaskitEngine.java | 8 +- .../core/engine/AT_TaskitEngineData.java | 8 +- .../AT_DynamicTestTranslationSpec.java | 104 ++++++++++++++++++ .../translation/AT_TestClassPair.java | 101 ----------------- .../core/translation/AT_TranslationSpec.java | 18 +-- 6 files changed, 181 insertions(+), 153 deletions(-) rename core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/{TestClassPair.java => DynamicTestTranslationSpec.java} (76%) create mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java delete mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java similarity index 76% rename from core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java rename to core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java index 766515a..24f7e23 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/TestClassPair.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java @@ -7,11 +7,8 @@ import org.apache.commons.math3.random.RandomGenerator; -import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; -import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; - -public enum TestClassPair { - T1_T2(T1.class, T2.class), +public enum DynamicTestTranslationSpec { + T1_T2(T1.class, T2.class), T1_T3(T1.class, T3.class), T1_T4(T1.class, T4.class), T1_T5(T1.class, T5.class), @@ -114,8 +111,8 @@ public enum TestClassPair { private final Class typeI; private final Class typeA; - - private TestClassPair(Class typeI, Class typeA) { + + private DynamicTestTranslationSpec(Class typeI, Class typeA) { this.typeI = typeI; this.typeA = typeA; } @@ -128,31 +125,30 @@ public Class getTypeA() { return typeA; } - public static TestClassPair getRandomTestClassPair(final RandomGenerator randomGenerator) { - return TestClassPair.values()[randomGenerator.nextInt(TestClassPair.values().length)]; + public TestTranslationSpec getTranslationSpec() { + return new DynamicTranslationSpec<>(typeI, typeA); } - public static List getTestClassPairs() { - return Arrays.asList(TestClassPair.values()); + public static DynamicTestTranslationSpec getRandomTranslationSpec(final RandomGenerator randomGenerator) { + return DynamicTestTranslationSpec.values()[randomGenerator.nextInt(DynamicTestTranslationSpec.values().length)]; } - public static List getShuffledTestClassPairs(final RandomGenerator randomGenerator) { - List result = getTestClassPairs(); - Random random = new Random(randomGenerator.nextLong()); - Collections.shuffle(result, random); - return result; + public static List getTranslationSpecs() { + return Arrays.asList(DynamicTestTranslationSpec.values()); } - public TranslationSpec createTranslationSpec() { - return new DynamicTranslationSpec<>(typeI, typeA); + public static List getShuffledTranslationSpecs(final RandomGenerator randomGenerator) { + List result = getTranslationSpecs(); + Random random = new Random(randomGenerator.nextLong()); + Collections.shuffle(result, random); + return result; } - private static final class DynamicTranslationSpec extends TranslationSpec { + private static final class DynamicTranslationSpec extends TestTranslationSpec { private final Class typeI; private final Class typeA; private DynamicTranslationSpec(Class typeI, Class typeA) { - super(TestTaskitEngine.class); this.typeI = typeI; this.typeA = typeA; } @@ -178,19 +174,48 @@ public Class getInputObjectClass() { } } - private static class T1 {} - private static class T2 {} - private static class T3 {} - private static class T4 {} - private static class T5 {} - private static class T6 {} - private static class T7 {} - private static class T8 {} - private static class T9 {} - private static class T10 {} - private static class T11 {} - private static class T12 {} - private static class T13 {} - private static class T14 {} - private static class T15 {} + private static class T1 { + } + + private static class T2 { + } + + private static class T3 { + } + + private static class T4 { + } + + private static class T5 { + } + + private static class T6 { + } + + private static class T7 { + } + + private static class T8 { + } + + private static class T9 { + } + + private static class T10 { + } + + private static class T11 { + } + + private static class T12 { + } + + private static class T13 { + } + + private static class T14 { + } + + private static class T15 { + } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index 98a3439..94aa598 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java @@ -25,7 +25,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestObjectWrapper; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.DynamicTestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; @@ -697,12 +697,12 @@ private TaskitEngine getRandomTaskitEngine(long seed) { TestTaskitEngine.Builder builder = TestTaskitEngine.builder(); - List shuffledTestClassPairs = TestClassPair.getShuffledTestClassPairs(randomGenerator); + List shuffledTranslationSpecs = DynamicTestTranslationSpec.getShuffledTranslationSpecs(randomGenerator); int n = randomGenerator.nextInt(10) + 1; for (int i = 0; i < n; i++) { - TestClassPair testClassPair = shuffledTestClassPairs.get(i); - builder.addTranslationSpec(testClassPair.createTranslationSpec()); + DynamicTestTranslationSpec translationSpec = shuffledTranslationSpecs.get(i); + builder.addTranslationSpec(translationSpec.getTranslationSpec()); } return new TestTaskitEngineBuilderBridge(builder).buildWithoutInit(); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java index 96f6042..29cedfb 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineData.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.DynamicTestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecEmptyMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecNullMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; @@ -294,12 +294,12 @@ private TaskitEngineData getRandomTaskitEngineData(long seed) { TaskitEngineData.Builder builder = TaskitEngineData.builder(); - List shuffledTestClassPairs = TestClassPair.getShuffledTestClassPairs(randomGenerator); + List shuffledTranslationSpecs = DynamicTestTranslationSpec.getShuffledTranslationSpecs(randomGenerator); int n = randomGenerator.nextInt(10) + 1; for (int i = 0; i < n; i++) { - TestClassPair testClassPair = shuffledTestClassPairs.get(i); - builder.addTranslationSpec(testClassPair.createTranslationSpec()); + DynamicTestTranslationSpec translationSpec = shuffledTranslationSpecs.get(i); + builder.addTranslationSpec(translationSpec.getTranslationSpec()); } return builder.build(); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java new file mode 100644 index 0000000..57ec9d3 --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java @@ -0,0 +1,104 @@ +package gov.hhs.aspr.ms.taskit.core.testsupport.translation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; + +import org.apache.commons.math3.random.RandomGenerator; +import org.junit.jupiter.api.Test; + +import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; +import gov.hhs.aspr.ms.util.wrappers.MutableInteger; + +public class AT_DynamicTestTranslationSpec { + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTypeI", args = {}) + public void testGetTypeI() { + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + assertNotNull(translationSpec.getTypeI()); + } + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTypeA", args = {}) + public void testGetTypeA() { + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + assertNotNull(translationSpec.getTypeA()); + } + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getRandomTranslationSpec", args = { + RandomGenerator.class }) + public void testGetRandomTestClassPair() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(242770195043563036L); + Map idCounter = new LinkedHashMap<>(); + Set setOfRandomTestClassPairs = new LinkedHashSet<>(); + + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + idCounter.put(translationSpec, new MutableInteger()); + } + + // show that generated values are reasonably unique + int numIterations = 10000; + for (int i = 0; i < numIterations; i++) { + DynamicTestTranslationSpec translationSpec = DynamicTestTranslationSpec + .getRandomTranslationSpec(randomGenerator); + setOfRandomTestClassPairs.add(translationSpec); + idCounter.get(translationSpec).increment(); + } + + int acceptableLowerLimit = 75; + int acceptableUpperLimit = 125; + for (DynamicTestTranslationSpec translationSpec : idCounter.keySet()) { + assertTrue(idCounter.get(translationSpec).getValue() >= acceptableLowerLimit + && idCounter.get(translationSpec).getValue() <= acceptableUpperLimit); + } + + assertEquals(idCounter.values().stream().mapToInt(a -> a.getValue()).sum(), numIterations); + assertEquals(setOfRandomTestClassPairs.size(), DynamicTestTranslationSpec.values().length); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpecs", args = {}) + public void testGetTestClassPairs() { + assertEquals(Arrays.asList(DynamicTestTranslationSpec.values()), + DynamicTestTranslationSpec.getTranslationSpecs()); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getShuffledTranslationSpecs", args = { + RandomGenerator.class }) + public void testGetShuffledTestClassPairs() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(503706833466130759L); + List testClassPairs = DynamicTestTranslationSpec.getTranslationSpecs(); + Collections.shuffle(testClassPairs, new Random(randomGenerator.nextLong())); + + assertEquals(testClassPairs, DynamicTestTranslationSpec + .getShuffledTranslationSpecs(RandomGeneratorProvider.getRandomGenerator(503706833466130759L))); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpec", args = {}) + public void testCreateTranslationSpec() { + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + + TestTranslationSpec spec = translationSpec.getTranslationSpec(); + + assertNotNull(spec); + assertEquals(translationSpec.getTypeI(), spec.getInputObjectClass()); + assertEquals(translationSpec.getTypeA(), spec.getAppObjectClass()); + } + } +} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java deleted file mode 100644 index 1af33f5..0000000 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_TestClassPair.java +++ /dev/null @@ -1,101 +0,0 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; - -import org.apache.commons.math3.random.RandomGenerator; -import org.junit.jupiter.api.Test; - -import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; -import gov.hhs.aspr.ms.taskit.core.translation.TranslationSpec; -import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; -import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; -import gov.hhs.aspr.ms.util.wrappers.MutableInteger; - -public class AT_TestClassPair { - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "getTypeI", args = {}) - public void testGetTypeI() { - for (TestClassPair testClassPair : TestClassPair.values()) { - assertNotNull(testClassPair.getTypeI()); - } - } - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "getTypeA", args = {}) - public void testGetTypeA() { - for (TestClassPair testClassPair : TestClassPair.values()) { - assertNotNull(testClassPair.getTypeA()); - } - } - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "getRandomTestClassPair", args = { RandomGenerator.class }) - public void testGetRandomTestClassPair() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(242770195043563036L); - Map idCounter = new LinkedHashMap<>(); - Set setOfRandomTestClassPairs = new LinkedHashSet<>(); - - for (TestClassPair testClassPair : TestClassPair.values()) { - idCounter.put(testClassPair, new MutableInteger()); - } - - // show that generated values are reasonably unique - int numIterations = 10000; - for (int i = 0; i < numIterations; i++) { - TestClassPair testClassPair = TestClassPair.getRandomTestClassPair(randomGenerator); - setOfRandomTestClassPairs.add(testClassPair); - idCounter.get(testClassPair).increment(); - } - - int acceptableLowerLimit = 75; - int acceptableUpperLimit = 125; - for (TestClassPair testClassPair : idCounter.keySet()) { - assertTrue(idCounter.get(testClassPair).getValue() >= acceptableLowerLimit - && idCounter.get(testClassPair).getValue() <= acceptableUpperLimit); - } - - assertEquals(idCounter.values().stream().mapToInt(a -> a.getValue()).sum(), numIterations); - assertEquals(setOfRandomTestClassPairs.size(), TestClassPair.values().length); - } - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "getTestClassPairs", args = {}) - public void testGetTestClassPairs() { - assertEquals(Arrays.asList(TestClassPair.values()), TestClassPair.getTestClassPairs()); - } - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "getShuffledTestClassPairs", args = { RandomGenerator.class }) - public void testGetShuffledTestClassPairs() { - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(503706833466130759L); - List testClassPairs = TestClassPair.getTestClassPairs(); - Collections.shuffle(testClassPairs, new Random(randomGenerator.nextLong())); - - assertEquals(testClassPairs, TestClassPair.getShuffledTestClassPairs(RandomGeneratorProvider.getRandomGenerator(503706833466130759L))); - } - - @Test - @UnitTestMethod(target = TestClassPair.class, name = "createTranslationSpec", args = {}) - public void testCreateTranslationSpec() { - for (TestClassPair testClassPair : TestClassPair.values()) { - - TranslationSpec spec = testClassPair.createTranslationSpec(); - - assertNotNull(spec); - assertEquals(testClassPair.getTypeI(), spec.getInputObjectClass()); - assertEquals(testClassPair.getTypeA(), spec.getAppObjectClass()); - } - } -} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 58542da..0e1137e 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java @@ -28,7 +28,7 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputChildObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestObjectWrapper; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestClassPair; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.DynamicTestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; @@ -269,9 +269,9 @@ public void testHashCode() { // hash codes are reasonably distributed Set hashCodes = new LinkedHashSet<>(); - for (TestClassPair testClassPair : TestClassPair.values()) { - TranslationSpec translationSpec = testClassPair.createTranslationSpec(); - hashCodes.add(translationSpec.hashCode()); + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + TranslationSpec testTranslationSpec = translationSpec.getTranslationSpec(); + hashCodes.add(testTranslationSpec.hashCode()); } assertEquals(100, hashCodes.size()); @@ -326,9 +326,9 @@ public void testEquals() { // different inputs yield unequal translationSpecs Set> set = new LinkedHashSet<>(); - for (TestClassPair testClassPair : TestClassPair.values()) { - TranslationSpec translationSpec = testClassPair.createTranslationSpec(); - set.add(translationSpec); + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + TestTranslationSpec testTranslationSpec = translationSpec.getTranslationSpec(); + set.add(testTranslationSpec); } assertEquals(100, set.size()); @@ -337,7 +337,7 @@ public void testEquals() { private TranslationSpec getRandomTranslationSpec(long seed) { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - TestClassPair testClassPair = TestClassPair.getRandomTestClassPair(randomGenerator); - return testClassPair.createTranslationSpec(); + DynamicTestTranslationSpec translationSpec = DynamicTestTranslationSpec.getRandomTranslationSpec(randomGenerator); + return translationSpec.getTranslationSpec(); } } From 7f26b8a43f2cfd7ca6e08de4372786e232ff67c7 Mon Sep 17 00:00:00 2001 From: travisrieglerleidos Date: Tue, 29 Apr 2025 09:32:41 -0400 Subject: [PATCH 18/18] Remove TestEnumTranslator/Id and move TestEnumTranslationSpec to be in the object/specs package --- .../object/TestObjectTranslator.java | 6 ++--- .../specs/TestEnumTranslationSpec.java | 2 +- .../testenum/TestEnumTranslator.java | 24 ------------------ .../testenum/TestEnumTranslatorId.java | 13 ---------- .../taskit/core/engine/AT_TaskitEngine.java | 2 +- .../core/engine/AT_TaskitEngineManager.java | 13 +--------- .../testsupport/AT_TranslatorTestSupport.java | 5 +++- .../engine/AT_TestTaskitEngine.java | 2 +- .../AT_DynamicTestTranslationSpec.java | 20 +++++++-------- .../object/AT_TestObjectTranslator.java | 2 -- .../specs/AT_TestEnumTranslationSpec.java | 2 +- .../specs/AT_TestObjectTranslationSpec.java | 1 - .../testenum/AT_TestEnumTranslator.java | 25 ------------------- .../testenum/AT_TestEnumTranslatorId.java | 15 ----------- .../core/translation/AT_TranslationSpec.java | 2 +- 15 files changed, 23 insertions(+), 111 deletions(-) rename core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/{testenum => object}/specs/TestEnumTranslationSpec.java (92%) delete mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java delete mode 100644 core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java rename core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/{testenum => object}/specs/AT_TestEnumTranslationSpec.java (97%) delete mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java delete mode 100644 core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java index bbcfc6d..8b41108 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/TestObjectTranslator.java @@ -2,8 +2,8 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslatorId; import gov.hhs.aspr.ms.taskit.core.translation.Translator; /** @@ -19,10 +19,10 @@ private TestObjectTranslator() { public static Translator getTranslator() { return Translator.builder().setTranslatorId(TestObjectTranslatorId.TRANSLATOR_ID) .addDependency(TestComplexObjectTranslatorId.TRANSLATOR_ID) - .addDependency(TestEnumTranslatorId.TRANSLATOR_ID) .setInitializer(translatorContext -> { translatorContext.getTaskitEngineBuilder(TestTaskitEngine.Builder.class) - .addTranslationSpec(new TestObjectTranslationSpec()); + .addTranslationSpec(new TestObjectTranslationSpec()) + .addTranslationSpec(new TestEnumTranslationSpec()); }).build(); } } diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestEnumTranslationSpec.java similarity index 92% rename from core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java rename to core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestEnumTranslationSpec.java index 9874c36..1693f58 100644 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/TestEnumTranslationSpec.java +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestEnumTranslationSpec.java @@ -1,4 +1,4 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs; +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppEnum; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputEnum; diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java deleted file mode 100644 index 91bd542..0000000 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslator.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; - -import gov.hhs.aspr.ms.taskit.core.testsupport.engine.TestTaskitEngine; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.translation.Translator; - -/** - * Translator for the TestEnum - */ -public class TestEnumTranslator { - private TestEnumTranslator() { - } - - /** - * @return the Translator for the TestEnum - */ - public static Translator getTranslator() { - return Translator.builder().setTranslatorId(TestEnumTranslatorId.TRANSLATOR_ID) - .setInitializer(translatorContext -> { - translatorContext.getTaskitEngineBuilder(TestTaskitEngine.Builder.class) - .addTranslationSpec(new TestEnumTranslationSpec()); - }).build(); - } -} diff --git a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java deleted file mode 100644 index cde0845..0000000 --- a/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/TestEnumTranslatorId.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; - -import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; - -/** - * TranslatorId for the TestEnumTranslator - */ -public class TestEnumTranslatorId implements TranslatorId { - public final static TranslatorId TRANSLATOR_ID = new TestEnumTranslatorId(); - - private TestEnumTranslatorId() { - } -} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index 94aa598..868b7f9 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java @@ -28,8 +28,8 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.DynamicTestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java index bee84b3..6906ffc 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngineManager.java @@ -20,7 +20,6 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslator; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslator; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; import gov.hhs.aspr.ms.util.resourcehelper.ResourceHelper; @@ -37,7 +36,6 @@ public void testTranslateObject() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -94,7 +92,6 @@ public void testTranslateObjectAsClassSafe() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -195,7 +192,6 @@ public Class getInputObjectClass() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .addTranslationSpec(wrapperTranslationSpec) .build(); @@ -266,7 +262,6 @@ public void testRead() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -324,7 +319,6 @@ public void testReadAndTranslate() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -378,7 +372,6 @@ public void testWrite() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -429,7 +422,6 @@ public void testTranslateAndWrite() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -481,7 +473,6 @@ public void testTranslateAndWrite_Parent() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() @@ -550,7 +541,6 @@ public void testAddTaskitEngine() { TestTaskitEngine taskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator()) .build(); TaskitEngineManager.builder().addTaskitEngine(taskitEngine).build(); @@ -567,8 +557,7 @@ public void testAddTaskitEngine() { contractException = assertThrows(ContractException.class, () -> { TestTaskitEngine taskitEngine2 = new TestTaskitEngineBuilderBridge(TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator()) - .addTranslator(TestEnumTranslator.getTranslator())) + .addTranslator(TestComplexObjectTranslator.getTranslator())) .buildWithoutInit(); TaskitEngineManager.builder() diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/AT_TranslatorTestSupport.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/AT_TranslatorTestSupport.java index b3ecc10..4fb4353 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/AT_TranslatorTestSupport.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/AT_TranslatorTestSupport.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -21,6 +22,7 @@ public void testTestGetTranslationSpecs() throws ClassNotFoundException { List translationSpecs = new ArrayList<>(); translationSpecs.add(new TestObjectTranslationSpec()); + translationSpecs.add(new TestEnumTranslationSpec()); Set missingSpecs = TranslatorTestSupport.testGetTranslationSpecs(TestObjectTranslator.class, translationSpecs); @@ -28,7 +30,8 @@ public void testTestGetTranslationSpecs() throws ClassNotFoundException { missingSpecs = TranslatorTestSupport.testGetTranslationSpecs(TestObjectTranslator.class, new ArrayList<>()); - assertTrue(missingSpecs.size() == 1); + assertTrue(missingSpecs.size() == 2); assertTrue(missingSpecs.contains(TestObjectTranslationSpec.class.getSimpleName())); + assertTrue(missingSpecs.contains(TestEnumTranslationSpec.class.getSimpleName())); } } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java index 617143d..7ba74e9 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/engine/AT_TestTaskitEngine.java @@ -20,8 +20,8 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.bad.BadTranslationSpecNullMap; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.TestObjectTranslator; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.ITranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorContext; diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java index 57ec9d3..5fc2294 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/AT_DynamicTestTranslationSpec.java @@ -41,10 +41,10 @@ public void testGetTypeA() { @Test @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getRandomTranslationSpec", args = { RandomGenerator.class }) - public void testGetRandomTestClassPair() { + public void testGetRandomTranslationSpec() { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(242770195043563036L); Map idCounter = new LinkedHashMap<>(); - Set setOfRandomTestClassPairs = new LinkedHashSet<>(); + Set setOfDynamicTestTranslationSpecs = new LinkedHashSet<>(); for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { idCounter.put(translationSpec, new MutableInteger()); @@ -55,7 +55,7 @@ public void testGetRandomTestClassPair() { for (int i = 0; i < numIterations; i++) { DynamicTestTranslationSpec translationSpec = DynamicTestTranslationSpec .getRandomTranslationSpec(randomGenerator); - setOfRandomTestClassPairs.add(translationSpec); + setOfDynamicTestTranslationSpecs.add(translationSpec); idCounter.get(translationSpec).increment(); } @@ -67,12 +67,12 @@ public void testGetRandomTestClassPair() { } assertEquals(idCounter.values().stream().mapToInt(a -> a.getValue()).sum(), numIterations); - assertEquals(setOfRandomTestClassPairs.size(), DynamicTestTranslationSpec.values().length); + assertEquals(setOfDynamicTestTranslationSpecs.size(), DynamicTestTranslationSpec.values().length); } @Test @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpecs", args = {}) - public void testGetTestClassPairs() { + public void testGetTranslationSpecs() { assertEquals(Arrays.asList(DynamicTestTranslationSpec.values()), DynamicTestTranslationSpec.getTranslationSpecs()); } @@ -80,18 +80,18 @@ public void testGetTestClassPairs() { @Test @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getShuffledTranslationSpecs", args = { RandomGenerator.class }) - public void testGetShuffledTestClassPairs() { + public void testGetShuffledTranslationSpecs() { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(503706833466130759L); - List testClassPairs = DynamicTestTranslationSpec.getTranslationSpecs(); - Collections.shuffle(testClassPairs, new Random(randomGenerator.nextLong())); + List dynamicTestTranslationSpecs = DynamicTestTranslationSpec.getTranslationSpecs(); + Collections.shuffle(dynamicTestTranslationSpecs, new Random(randomGenerator.nextLong())); - assertEquals(testClassPairs, DynamicTestTranslationSpec + assertEquals(dynamicTestTranslationSpecs, DynamicTestTranslationSpec .getShuffledTranslationSpecs(RandomGeneratorProvider.getRandomGenerator(503706833466130759L))); } @Test @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpec", args = {}) - public void testCreateTranslationSpec() { + public void testGetTranslationSpec() { for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { TestTranslationSpec spec = translationSpec.getTranslationSpec(); diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java index a2c7a81..7fa9a57 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/AT_TestObjectTranslator.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.TestComplexObjectTranslatorId; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.TestEnumTranslatorId; import gov.hhs.aspr.ms.taskit.core.translation.Translator; import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; @@ -24,7 +23,6 @@ public void testGetTranslator() { Set expectedDependencies = new LinkedHashSet<>(); expectedDependencies.add(TestComplexObjectTranslatorId.TRANSLATOR_ID); - expectedDependencies.add(TestEnumTranslatorId.TRANSLATOR_ID); assertEquals(expectedDependencies, testObjectTranslator.getTranslatorDependencies()); } diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestEnumTranslationSpec.java similarity index 97% rename from core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java rename to core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestEnumTranslationSpec.java index 4435a5d..37ad25e 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/specs/AT_TestEnumTranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestEnumTranslationSpec.java @@ -1,4 +1,4 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs; +package gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java index db21ddf..f126813 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestObjectTranslationSpec.java @@ -10,7 +10,6 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestAppObject; import gov.hhs.aspr.ms.taskit.core.testsupport.objects.TestInputObject; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestConstructor; import gov.hhs.aspr.ms.util.annotations.UnitTestForCoverage; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java deleted file mode 100644 index 9bb85c8..0000000 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslator.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.LinkedHashSet; -import java.util.Set; - -import org.junit.jupiter.api.Test; - -import gov.hhs.aspr.ms.taskit.core.translation.Translator; -import gov.hhs.aspr.ms.taskit.core.translation.TranslatorId; -import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; - -public class AT_TestEnumTranslator { - @Test - @UnitTestMethod(target = TestEnumTranslator.class, name = "getTranslator", args = {}) - public void testGetTranslator() { - Translator testEnumTranslator = TestEnumTranslator.getTranslator(); - - assertEquals(TestEnumTranslatorId.TRANSLATOR_ID, testEnumTranslator.getTranslatorId()); - - Set expectedDependencies = new LinkedHashSet<>(); - assertEquals(expectedDependencies, testEnumTranslator.getTranslatorDependencies()); - } -} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java deleted file mode 100644 index 43df4a0..0000000 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/testenum/AT_TestEnumTranslatorId.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import org.junit.jupiter.api.Test; - -import gov.hhs.aspr.ms.util.annotations.UnitTestField; - -public class AT_TestEnumTranslatorId { - @Test - @UnitTestField(target = TestEnumTranslatorId.class, name = "TRANSLATOR_ID") - public void testTranslatorId() { - assertNotNull(TestEnumTranslatorId.TRANSLATOR_ID); - } -} diff --git a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 0e1137e..16c5ca2 100644 --- a/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java @@ -31,8 +31,8 @@ import gov.hhs.aspr.ms.taskit.core.testsupport.translation.DynamicTestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.TestTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.complexobject.specs.TestComplexObjectTranslationSpec; +import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; -import gov.hhs.aspr.ms.taskit.core.testsupport.translation.testenum.specs.TestEnumTranslationSpec; import gov.hhs.aspr.ms.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider;