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/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/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/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..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. *

@@ -97,11 +97,11 @@ public void setTestAppEnum(TestAppEnum testAppEnum) { } /** - * Hash code implementation consistent with equals() + * Standard implementation consistent with the {@link #equals(Object)} method */ @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/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/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/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 8a12bc9..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 @@ -82,16 +80,32 @@ public void setTestComplexInputObject(TestComplexInputObject testComplexInputObj } /** - * Hash code implementation consistent with equals(). + * @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/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/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java new file mode 100644 index 0000000..24f7e23 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/DynamicTestTranslationSpec.java @@ -0,0 +1,221 @@ +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; + +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), + 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 DynamicTestTranslationSpec(Class typeI, Class typeA) { + this.typeI = typeI; + this.typeA = typeA; + } + + public Class getTypeI() { + return typeI; + } + + public Class getTypeA() { + return typeA; + } + + public TestTranslationSpec getTranslationSpec() { + return new DynamicTranslationSpec<>(typeI, typeA); + } + + public static DynamicTestTranslationSpec getRandomTranslationSpec(final RandomGenerator randomGenerator) { + return DynamicTestTranslationSpec.values()[randomGenerator.nextInt(DynamicTestTranslationSpec.values().length)]; + } + + public static List getTranslationSpecs() { + return Arrays.asList(DynamicTestTranslationSpec.values()); + } + + 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 TestTranslationSpec { + private final Class typeI; + private final Class typeA; + + private DynamicTranslationSpec(Class typeI, Class typeA) { + 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/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..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,6 +2,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.TestEnumTranslationSpec; import gov.hhs.aspr.ms.taskit.core.testsupport.translation.object.specs.TestObjectTranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; @@ -17,9 +18,11 @@ private TestObjectTranslator() { */ public static Translator getTranslator() { return Translator.builder().setTranslatorId(TestObjectTranslatorId.TRANSLATOR_ID) - .addDependency(TestComplexObjectTranslatorId.TRANSLATOR_ID).setInitializer(translatorContext -> { + .addDependency(TestComplexObjectTranslatorId.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/object/specs/TestEnumTranslationSpec.java b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestEnumTranslationSpec.java new file mode 100644 index 0000000..1693f58 --- /dev/null +++ b/core/src/main/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/TestEnumTranslationSpec.java @@ -0,0 +1,31 @@ +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; +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/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/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/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/engine/AT_TaskitEngine.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/engine/AT_TaskitEngine.java index 7d62de6..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 @@ -2,15 +2,16 @@ 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.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; @@ -24,12 +25,15 @@ 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.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.translation.ITranslationSpec; 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; @@ -111,9 +115,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); @@ -165,9 +172,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(); @@ -231,9 +242,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(); @@ -300,9 +315,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); @@ -353,9 +371,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(); @@ -408,9 +429,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(); @@ -440,9 +464,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(); @@ -582,125 +609,102 @@ 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); + 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()); + } - // init vs not init - assertNotEquals(taskitEngine1, taskitEngine5); + private TaskitEngine getRandomTaskitEngine(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - taskitEngine1.init(); - taskitEngine2.init(); - taskitEngine3.init(); - taskitEngine4.init(); + TestTaskitEngine.Builder builder = TestTaskitEngine.builder(); - // init and same translation specs - assertEquals(taskitEngine1, taskitEngine4); + List shuffledTranslationSpecs = DynamicTestTranslationSpec.getShuffledTranslationSpecs(randomGenerator); - // init and different translation specs - assertNotEquals(taskitEngine1, taskitEngine2); - assertNotEquals(taskitEngine1, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine3); - assertNotEquals(taskitEngine2, taskitEngine4); - assertNotEquals(taskitEngine3, taskitEngine4); + int n = randomGenerator.nextInt(10) + 1; + for (int i = 0; i < n; i++) { + 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 dee7b30..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 @@ -1,12 +1,19 @@ 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.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.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; @@ -19,6 +26,7 @@ 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 +218,90 @@ 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(); + 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()); + } - TaskitEngineData taskitEngineData3 = TaskitEngineData.builder() - .addTranslationSpec(testComplexObjectTranslationSpec) - .build(); - // same - assertEquals(taskitEngineData1, taskitEngineData1); - // not null - assertNotEquals(taskitEngineData1, null); + private TaskitEngineData getRandomTaskitEngineData(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + + TaskitEngineData.Builder builder = TaskitEngineData.builder(); - // not instance of - assertNotEquals(taskitEngineData1, new Object()); + List shuffledTranslationSpecs = DynamicTestTranslationSpec.getShuffledTranslationSpecs(randomGenerator); - // same exact specs - assertEquals(taskitEngineData1, taskitEngineData2); - assertEquals(taskitEngineData2, taskitEngineData1); + int n = randomGenerator.nextInt(10) + 1; + for (int i = 0; i < n; i++) { + DynamicTestTranslationSpec translationSpec = shuffledTranslationSpecs.get(i); + builder.addTranslationSpec(translationSpec.getTranslationSpec()); + } - // different specs - assertNotEquals(taskitEngineData1, taskitEngineData3); - assertNotEquals(taskitEngineData2, taskitEngineData3); - assertNotEquals(taskitEngineData3, taskitEngineData1); - assertNotEquals(taskitEngineData3, taskitEngineData2); + return builder.build(); } } 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..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 @@ -261,7 +261,8 @@ public void testRead() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator()).build(); + .addTranslator(TestComplexObjectTranslator.getTranslator()) + .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() .addTaskitEngine(testTaskitEngine).build(); @@ -317,7 +318,8 @@ public void testReadAndTranslate() { TestTaskitEngine testTaskitEngine = TestTaskitEngine.builder() .addTranslator(TestObjectTranslator.getTranslator()) - .addTranslator(TestComplexObjectTranslator.getTranslator()).build(); + .addTranslator(TestComplexObjectTranslator.getTranslator()) + .build(); TaskitEngineManager taskitEngineManager = TaskitEngineManager.builder() .addTaskitEngine(testTaskitEngine).build(); 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/TestObjectUtil.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/TestObjectUtil.java index fb9ae42..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 @@ -3,36 +3,56 @@ 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; 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; 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 +68,38 @@ 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)); + TestInputEnum[] enumValues = TestInputEnum.values(); + TestInputEnum randomEnum = enumValues[localRG.nextInt(enumValues.length)]; - return inputObject; + 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; } 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; } @@ -87,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; } @@ -99,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; } @@ -110,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; } @@ -121,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; } @@ -144,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 1586c05..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 @@ -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; @@ -22,6 +20,7 @@ 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.translation.ITranslationSpec; import gov.hhs.aspr.ms.taskit.core.translation.Translator; @@ -162,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(); @@ -186,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(); @@ -266,111 +269,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); - } } 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..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 @@ -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,69 @@ 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 = TestObjectUtil.generateTestAppObject(seed); + TestAppObject testAppObject2 = TestObjectUtil.generateTestAppObject(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 = TestObjectUtil.generateTestAppObject(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 = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); + assertFalse(testAppObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestAppObject testAppObject = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); + assertFalse(testAppObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + 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 = TestObjectUtil.generateTestAppObject(seed); + TestAppObject testAppObject2 = TestObjectUtil.generateTestAppObject(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 = TestObjectUtil.generateTestAppObject(randomGenerator.nextLong()); + set.add(testAppObject); + } + assertEquals(100, set.size()); } - } 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..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 @@ -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_TestComplexAppObject { @@ -81,102 +87,74 @@ 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 = 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() { - 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); - - testComplexAppObject2.setStartTime(150.0156); - assertNotEquals(testComplexAppObject1, testComplexAppObject2); - testComplexAppObject2.setStartTime(startTime); - - testComplexAppObject2.setTestString("Test"); - assertNotEquals(testComplexAppObject1, testComplexAppObject2); - testComplexAppObject2.setTestString(testString); - - // exact same values of integer, bool, string and testComplexAppObject should - // be equal - assertEquals(testComplexAppObject1, testComplexAppObject2); + 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 d12bc04..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 @@ -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_TestComplexInputObject { @@ -81,101 +87,74 @@ 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 = 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() { - 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); - - testComplexInputObject2.setNumEntities(0); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setNumEntities(numEntities); - - testComplexInputObject2.setStartTime(150.0156); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setStartTime(startTime); - - testComplexInputObject2.setTestString("Test"); - assertNotEquals(testComplexInputObject1, testComplexInputObject2); - testComplexInputObject2.setTestString(testString); - - // exact same values of integer, bool, string and testComplexInputObject should - // be equal - assertEquals(testComplexInputObject1, testComplexInputObject2); + 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 a57141a..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 @@ -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 { @@ -101,117 +107,92 @@ 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() { - 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 = TestObjectUtil.generateTestInputObject(seed); + TestInputObject testInputObject2 = TestObjectUtil.generateTestInputObject(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 = TestObjectUtil.generateTestInputObject(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 = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); + assertFalse(testInputObject.equals(new Object())); + } + + // never equal to null + for (int i = 0; i < 30; i++) { + TestInputObject testInputObject = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); + assertFalse(testInputObject.equals(null)); + } + + // reflexive + for (int i = 0; i < 30; i++) { + 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 = TestObjectUtil.generateTestInputObject(seed); + TestInputObject testInputObject2 = TestObjectUtil.generateTestInputObject(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 = TestObjectUtil.generateTestInputObject(randomGenerator.nextLong()); + set.add(testInputObject); + } + assertEquals(100, set.size()); } - } 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; + } } 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..5fc2294 --- /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 testGetRandomTranslationSpec() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(242770195043563036L); + Map idCounter = new LinkedHashMap<>(); + Set setOfDynamicTestTranslationSpecs = 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); + setOfDynamicTestTranslationSpecs.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(setOfDynamicTestTranslationSpecs.size(), DynamicTestTranslationSpec.values().length); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpecs", args = {}) + public void testGetTranslationSpecs() { + assertEquals(Arrays.asList(DynamicTestTranslationSpec.values()), + DynamicTestTranslationSpec.getTranslationSpecs()); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getShuffledTranslationSpecs", args = { + RandomGenerator.class }) + public void testGetShuffledTranslationSpecs() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(503706833466130759L); + List dynamicTestTranslationSpecs = DynamicTestTranslationSpec.getTranslationSpecs(); + Collections.shuffle(dynamicTestTranslationSpecs, new Random(randomGenerator.nextLong())); + + assertEquals(dynamicTestTranslationSpecs, DynamicTestTranslationSpec + .getShuffledTranslationSpecs(RandomGeneratorProvider.getRandomGenerator(503706833466130759L))); + } + + @Test + @UnitTestMethod(target = DynamicTestTranslationSpec.class, name = "getTranslationSpec", args = {}) + public void testGetTranslationSpec() { + 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/object/specs/AT_TestEnumTranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestEnumTranslationSpec.java new file mode 100644 index 0000000..37ad25e --- /dev/null +++ b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/testsupport/translation/object/specs/AT_TestEnumTranslationSpec.java @@ -0,0 +1,72 @@ +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; + +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/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..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 @@ -30,8 +30,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 +50,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/translation/AT_TranslationSpec.java b/core/src/test/java/gov/hhs/aspr/ms/taskit/core/translation/AT_TranslationSpec.java index 1da9878..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 @@ -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,11 @@ import java.io.File; import java.io.IOException; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; 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; @@ -26,11 +28,14 @@ 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.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.util.annotations.UnitTestMethod; import gov.hhs.aspr.ms.util.errors.ContractException; +import gov.hhs.aspr.ms.util.random.RandomGeneratorProvider; public class AT_TranslationSpec { @@ -94,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 @@ -149,6 +155,7 @@ public Class getInputObjectClass() { TestTaskitEngine.builder() .addTranslationSpec(testObjectTranslationSpec) .addTranslationSpec(complexObjectTranslationSpec) + .addTranslationSpec(testEnumTranslationSpec) .addTranslationSpec(wrapperTranslationSpec) .addTranslationSpec(wrapperTranslationSpec2) .build(); @@ -238,329 +245,99 @@ 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) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2655488674438883354L); - @Override - protected TestAppObject translateInputObject(TestInputObject inputObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateInputObject'"); - } + // equal objects have equal hash codes + for (int i = 0; i < 30; i++) { + long seed = randomGenerator.nextLong(); - @Override - protected TestInputObject translateAppObject(TestAppObject appObject) { - throw new UnsupportedOperationException("Unimplemented method 'translateAppObject'"); - } + TranslationSpec translationSpec1 = getRandomTranslationSpec(seed); + TranslationSpec translationSpec2 = getRandomTranslationSpec(seed); - @Override - public Class getAppObjectClass() { - return TestAppObject.class; - } + assertEquals(translationSpec1, translationSpec2); + assertEquals(translationSpec1.hashCode(), translationSpec2.hashCode()); - @Override - public Class getInputObjectClass() { - return TestInputObject.class; - } + // 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()); + } - // same input class, different app class - TranslationSpec translationSpecB = new TranslationSpec<>( - TestTaskitEngine.class) { + // hash codes are reasonably distributed + Set hashCodes = new LinkedHashSet<>(); + for (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + TranslationSpec testTranslationSpec = translationSpec.getTranslationSpec(); + hashCodes.add(testTranslationSpec.hashCode()); + } - @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()); + 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 (DynamicTestTranslationSpec translationSpec : DynamicTestTranslationSpec.values()) { + TestTranslationSpec testTranslationSpec = translationSpec.getTranslationSpec(); + set.add(testTranslationSpec); + } + + assertEquals(100, set.size()); + } - // init base - translationSpecA.init(testTaskitEngine); + private TranslationSpec getRandomTranslationSpec(long seed) { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); - // if all above are equal, then the two specs are equal - assertEquals(translationSpecA, translationSpecE); + DynamicTestTranslationSpec translationSpec = DynamicTestTranslationSpec.getRandomTranslationSpec(randomGenerator); + return translationSpec.getTranslationSpec(); } } 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..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 @@ -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,113 @@ 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 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; - Translator translatorA = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdA).build(); + private static TestTranslatorId getRandomTranslatorId(RandomGenerator randomGenerator) { + int index = randomGenerator.nextInt(TestTranslatorId.values().length); + return TestTranslatorId.values()[index]; + } - Translator translatorB = Translator.builder().setInitializer(consumerA).setTranslatorId(translatorIdB).build(); + private static Set getRandomTranslatorIds(RandomGenerator randomGenerator) { + Set result = new LinkedHashSet<>(); + for (TestTranslatorId testTranslatorId : TestTranslatorId.values()) { + if (randomGenerator.nextBoolean()) { + result.add(testTranslatorId); + } + } + 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()); + TestTranslatorId translatorId = TestTranslatorId.getRandomTranslatorId(randomGenerator); + builder.setTranslatorId(translatorId); - // if different class, not equal - assertNotEquals(translatorA.hashCode(), new Object().hashCode()); + Set randomTestTranslatorIds = TestTranslatorId.getRandomTranslatorIds(randomGenerator); + for (TestTranslatorId testTranslatorId : randomTestTranslatorIds) { + if (testTranslatorId != translatorId) { + builder.addDependency(testTranslatorId); + } + } - // 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()); + } + + // 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)); + } + } + + // 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 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. + */ } 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..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; @@ -23,6 +22,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 +130,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 +156,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(); @@ -196,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); - } } 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();