diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryGeneratorContext.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryGeneratorContext.java index 16253793f..b89d45fb3 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryGeneratorContext.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryGeneratorContext.java @@ -38,7 +38,9 @@ import com.navercorp.fixturemonkey.api.context.MonkeyGeneratorContext; import com.navercorp.fixturemonkey.api.customizer.FixtureCustomizer; +import com.navercorp.fixturemonkey.api.lazy.LazyArbitrary; import com.navercorp.fixturemonkey.api.matcher.MatcherOperator; +import com.navercorp.fixturemonkey.api.property.CompositeProperty; import com.navercorp.fixturemonkey.api.property.Property; @API(since = "0.4.0", status = Status.EXPERIMENTAL) @@ -57,6 +59,8 @@ public final class ArbitraryGeneratorContext { private final MonkeyGeneratorContext monkeyGeneratorContext; + private final LazyArbitrary pathProperty = LazyArbitrary.lazy(this::initPathProperty); + @SuppressWarnings("rawtypes") public ArbitraryGeneratorContext( ArbitraryProperty property, @@ -140,4 +144,16 @@ public synchronized boolean isUniqueAndCheck(Property property, Object value) { public void evictUnique(Property property) { monkeyGeneratorContext.evictUnique(property); } + + public Property getPathProperty() { + return pathProperty.getValue(); + } + + private Property initPathProperty() { + if (ownerContext == null) { + return property.getObjectProperty().getProperty(); + } + + return new CompositeProperty(property.getObjectProperty().getProperty(), ownerContext.getPathProperty()); + } } diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapEntryElementIntrospector.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapEntryElementIntrospector.java index e3f233f81..6aa3a90a7 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapEntryElementIntrospector.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapEntryElementIntrospector.java @@ -76,7 +76,7 @@ public ArbitraryIntrospectorResult introspect(ArbitraryGeneratorContext context) new FilteredMonkeyArbitrary<>( arbitraries.get(0), it -> context.isUniqueAndCheck( - mapEntryProperty, + context.getOwnerContext().getPathProperty(), it ), MAX_TRIES diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapIntrospector.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapIntrospector.java index b86507f78..ddc89f8af 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapIntrospector.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/MapIntrospector.java @@ -78,7 +78,7 @@ public ArbitraryIntrospectorResult introspect(ArbitraryGeneratorContext context) } return new ArbitraryIntrospectorResult(builderCombinator.build(map -> { - context.evictUnique(property); + context.evictUnique(context.getPathProperty()); return map; })); } diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/SetIntrospector.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/SetIntrospector.java index ca356d42f..f61d31809 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/SetIntrospector.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/SetIntrospector.java @@ -69,7 +69,7 @@ public ArbitraryIntrospectorResult introspect(ArbitraryGeneratorContext context) new FilteredMonkeyArbitrary<>( arbitrary, it -> context.isUniqueAndCheck( - property, + context.getPathProperty(), it ), MAX_TRIES @@ -87,7 +87,7 @@ public ArbitraryIntrospectorResult introspect(ArbitraryGeneratorContext context) return new ArbitraryIntrospectorResult( builderCombinator.build(set -> { - context.evictUnique(property); + context.evictUnique(context.getPathProperty()); return set; }) ); diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/LabMonkey.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/LabMonkey.java index 83a21b688..118c73c63 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/LabMonkey.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/LabMonkey.java @@ -94,7 +94,6 @@ public DefaultArbitraryBuilder giveMeBuilder(Class type) { return giveMeBuilder(typeReference); } - @SuppressWarnings("unchecked") @Override public DefaultArbitraryBuilder giveMeBuilder(TypeReference type) { ManipulateOptions manipulateOptions = manipulateOptionsBuilder.build(); @@ -106,11 +105,7 @@ public DefaultArbitraryBuilder giveMeBuilder(TypeReference type) { .findAny() .orElse(null); - if (registered != null) { - return (DefaultArbitraryBuilder)registered.copy(); - } - - return new DefaultArbitraryBuilder<>( + DefaultArbitraryBuilder arbitraryBuilder = new DefaultArbitraryBuilder<>( manipulateOptions, rootProperty, new ArbitraryResolver( @@ -124,6 +119,12 @@ public DefaultArbitraryBuilder giveMeBuilder(TypeReference type) { this.validator, new ArbitraryBuilderContext() ); + + if (registered != null) { + arbitraryBuilder.setLazy("$", registered::sample); + } + + return arbitraryBuilder; } @Override 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 a067bc3dd..9f594c048 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 @@ -1030,7 +1030,7 @@ void sizeBiggerThanRegisterSized() { @Property void registerObjectNotFixed() { LabMonkey sut = LabMonkey.labMonkeyBuilder() - .register(String.class, it -> it.giveMeBuilder(String.class).set("$", Arbitraries.strings().alpha())) + .register(String.class, it -> it.giveMeBuilder(String.class).set("$", Arbitraries.strings().ofLength(10))) .build(); List sampled = sut.giveMeBuilder(new TypeReference>() { @@ -1120,4 +1120,46 @@ void applySizeWhenRegisteredWithSize() { then(actual).hasSize(10); } + + @Property + void sizeWhenRegisterSizeInApply() { + // given + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .register( + ListStringObject.class, + fixture -> fixture.giveMeBuilder(ListStringObject.class) + .apply((it, builder) -> builder.size("values", 1)) + ) + .build(); + + // when + List actual = sut.giveMeBuilder(ListStringObject.class) + .size("values", 2) + .sample() + .getValues(); + + then(actual).hasSize(2); + } + + @Property + void sizeWhenRegisterApply() { + // given + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .register( + ListStringObject.class, + fixture -> fixture.giveMeBuilder(ListStringObject.class) + .size("values", 1) + .apply((it, builder) -> { + }) + ) + .build(); + + // when + List actual = sut.giveMeBuilder(ListStringObject.class) + .size("values", 2) + .sample() + .getValues(); + + then(actual).hasSize(2); + } }