Skip to content

Commit

Permalink
Fix generating enum set or map (#488)
Browse files Browse the repository at this point in the history
  • Loading branch information
seongahjo authored Nov 12, 2022
1 parent 51b7fc7 commit 7cbf051
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand All @@ -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<? extends Enum>)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<Property> childProperties = new ArrayList<>();
for (int sequence = 0; sequence < size; sequence++) {
childProperties.add(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public ContainerProperty generate(ContainerPropertyGeneratorContext context) {
if (actualElementType.isEnum()) {
int enumSize = EnumSet.allOf((Class<? extends Enum>)actualElementType).size();
containerInfo = new ArbitraryContainerInfo(
containerInfo.getElementMinSize(),
Math.min(containerInfo.getElementMinSize(), enumSize),
Math.min(containerInfo.getElementMaxSize(), enumSize),
false
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1162,4 +1164,40 @@ void sizeWhenRegisterApply() {

then(actual).hasSize(2);
}

@Property
void sampleEnumMapWithEnumSizeIsLessThanContainerInfoMaxSize() {
LabMonkey sut = LabMonkey.labMonkeyBuilder()
.defaultArbitraryContainerMaxSize(5)
.build();

Map<TwoEnum, String> values = sut.giveMeOne(new TypeReference<Map<TwoEnum, String>>() {
});

then(values).hasSizeLessThanOrEqualTo(2);
}

@Property
void sampleEnumMapWithEnumSizeIsLessThanContainerInfoMinSize() {
LabMonkey sut = LabMonkey.labMonkeyBuilder()
.defaultArbitraryContainerInfo(new ArbitraryContainerInfo(3, 5, false))
.build();

Map<TwoEnum, String> values = sut.giveMeOne(new TypeReference<Map<TwoEnum, String>>() {
});

then(values).hasSizeLessThanOrEqualTo(2);
}

@Property
void sampleEnumSetWithEnumSizeIsLessThanContainerInfoMinSize() {
LabMonkey sut = LabMonkey.labMonkeyBuilder()
.defaultArbitraryContainerInfo(new ArbitraryContainerInfo(3, 5, false))
.build();

Set<TwoEnum> values = sut.giveMeOne(new TypeReference<Set<TwoEnum>>() {
});

then(values).hasSizeLessThanOrEqualTo(2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1474,4 +1475,32 @@ void sampleUniqueMap() {

then(actual).hasSize(200);
}

@Property
void sampleEnumMap() {
Map<TwoEnum, String> values = SUT.giveMeOne(new TypeReference<Map<TwoEnum, String>>() {
});

then(values).hasSizeLessThanOrEqualTo(2);
}

@Property
void sizeEnumSetGreaterThanEnumSizeThrows() {
thenThrownBy(
() -> SUT.giveMeBuilder(new TypeReference<Set<TwoEnum>>() {
})
.size("$", 3)
.sample()
).isExactlyInstanceOf(TooManyFilterMissesException.class);
}

@Property
void sizeEnumMapGreaterThanEnumSizeThrows() {
thenThrownBy(
() -> SUT.giveMeBuilder(new TypeReference<Map<TwoEnum, String>>() {
})
.size("$", 3)
.sample()
).isExactlyInstanceOf(TooManyFilterMissesException.class);
}
}

0 comments on commit 7cbf051

Please sign in to comment.