From 7cbf05147417575c31620f80a640249cab34cf51 Mon Sep 17 00:00:00 2001 From: "ah.jo" Date: Sun, 13 Nov 2022 00:38:52 +0900 Subject: [PATCH] Fix generating enum set or map (#488) --- .../MapContainerPropertyGenerator.java | 18 +++++++-- .../SetContainerPropertyGenerator.java | 2 +- .../test/FixtureMonkeyV04OptionsTest.java | 38 +++++++++++++++++++ .../test/FixtureMonkeyV04Test.java | 29 ++++++++++++++ 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/MapContainerPropertyGenerator.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/MapContainerPropertyGenerator.java index 96fbfb4a1..a261d42cf 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/MapContainerPropertyGenerator.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/MapContainerPropertyGenerator.java @@ -20,6 +20,7 @@ import java.lang.reflect.AnnotatedType; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import org.apiguardian.api.API; @@ -35,6 +36,7 @@ public final class MapContainerPropertyGenerator implements ContainerPropertyGenerator { public static final MapContainerPropertyGenerator INSTANCE = new MapContainerPropertyGenerator(); + @SuppressWarnings({"unchecked", "rawtypes"}) @Override public ContainerProperty generate(ContainerPropertyGeneratorContext context) { Property property = context.getProperty(); @@ -48,18 +50,28 @@ public ContainerProperty generate(ContainerPropertyGeneratorContext context) { ); } + AnnotatedType keyType = genericsTypes.get(0); + AnnotatedType valueType = genericsTypes.get(1); + ArbitraryContainerInfo containerInfo = context.getContainerInfo(); if (containerInfo == null) { containerInfo = context.getGenerateOptions() .getArbitraryContainerInfoGenerator(property) .generate(context); + + Class actualKeyType = Types.getActualType(keyType); + if (actualKeyType.isEnum()) { + int enumSize = EnumSet.allOf((Class)actualKeyType).size(); + containerInfo = new ArbitraryContainerInfo( + Math.min(containerInfo.getElementMinSize(), enumSize), + Math.min(containerInfo.getElementMaxSize(), enumSize), + false + ); + } } int size = containerInfo.getRandomSize(); - AnnotatedType keyType = genericsTypes.get(0); - AnnotatedType valueType = genericsTypes.get(1); - List childProperties = new ArrayList<>(); for (int sequence = 0; sequence < size; sequence++) { childProperties.add( diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/SetContainerPropertyGenerator.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/SetContainerPropertyGenerator.java index 826b3e4b2..ba6e38675 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/SetContainerPropertyGenerator.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/SetContainerPropertyGenerator.java @@ -60,7 +60,7 @@ public ContainerProperty generate(ContainerPropertyGeneratorContext context) { if (actualElementType.isEnum()) { int enumSize = EnumSet.allOf((Class)actualElementType).size(); containerInfo = new ArbitraryContainerInfo( - containerInfo.getElementMinSize(), + Math.min(containerInfo.getElementMinSize(), enumSize), Math.min(containerInfo.getElementMaxSize(), enumSize), false ); diff --git a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04OptionsTest.java b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04OptionsTest.java index 9f594c048..d1d15b0bb 100644 --- a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04OptionsTest.java +++ b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04OptionsTest.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; @@ -83,6 +84,7 @@ import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.ListStringObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.NullableObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SimpleObject; +import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.TwoEnum; class FixtureMonkeyV04OptionsTest { @Property @@ -1162,4 +1164,40 @@ void sizeWhenRegisterApply() { then(actual).hasSize(2); } + + @Property + void sampleEnumMapWithEnumSizeIsLessThanContainerInfoMaxSize() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultArbitraryContainerMaxSize(5) + .build(); + + Map values = sut.giveMeOne(new TypeReference>() { + }); + + then(values).hasSizeLessThanOrEqualTo(2); + } + + @Property + void sampleEnumMapWithEnumSizeIsLessThanContainerInfoMinSize() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultArbitraryContainerInfo(new ArbitraryContainerInfo(3, 5, false)) + .build(); + + Map values = sut.giveMeOne(new TypeReference>() { + }); + + then(values).hasSizeLessThanOrEqualTo(2); + } + + @Property + void sampleEnumSetWithEnumSizeIsLessThanContainerInfoMinSize() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultArbitraryContainerInfo(new ArbitraryContainerInfo(3, 5, false)) + .build(); + + Set values = sut.giveMeOne(new TypeReference>() { + }); + + then(values).hasSizeLessThanOrEqualTo(2); + } } diff --git a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04Test.java b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04Test.java index 9ecfda4bf..d53dedce9 100644 --- a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04Test.java +++ b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04Test.java @@ -46,6 +46,7 @@ import net.jqwik.api.Arbitraries; import net.jqwik.api.Arbitrary; import net.jqwik.api.Property; +import net.jqwik.api.TooManyFilterMissesException; import com.navercorp.fixturemonkey.ArbitraryBuilder; import com.navercorp.fixturemonkey.ArbitraryBuilders; @@ -1474,4 +1475,32 @@ void sampleUniqueMap() { then(actual).hasSize(200); } + + @Property + void sampleEnumMap() { + Map values = SUT.giveMeOne(new TypeReference>() { + }); + + then(values).hasSizeLessThanOrEqualTo(2); + } + + @Property + void sizeEnumSetGreaterThanEnumSizeThrows() { + thenThrownBy( + () -> SUT.giveMeBuilder(new TypeReference>() { + }) + .size("$", 3) + .sample() + ).isExactlyInstanceOf(TooManyFilterMissesException.class); + } + + @Property + void sizeEnumMapGreaterThanEnumSizeThrows() { + thenThrownBy( + () -> SUT.giveMeBuilder(new TypeReference>() { + }) + .size("$", 3) + .sample() + ).isExactlyInstanceOf(TooManyFilterMissesException.class); + } }