From 5e240d114a4208d2af4497bda3bc996c190e1e26 Mon Sep 17 00:00:00 2001 From: "ah.jo" Date: Sat, 10 Dec 2022 17:14:40 +0900 Subject: [PATCH] Add generating a circular-reference object (#519) --- .../resolver/ArbitraryTraverser.java | 5 +++ .../resolver/TraverseContext.java | 16 +++++++- .../test/FixtureMonkeyV04Test.java | 41 +++++++++++++++++++ .../test/FixtureMonkeyV04TestSpecs.java | 28 +++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/ArbitraryTraverser.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/ArbitraryTraverser.java index ce7b9004d..98d908d3b 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/ArbitraryTraverser.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/ArbitraryTraverser.java @@ -95,6 +95,7 @@ public ArbitraryNode traverse( return this.traverse( arbitraryProperty, new TraverseContext( + arbitraryProperty, new ArrayList<>(), containerInfoManipulators ) @@ -135,6 +136,10 @@ private List generateChildrenNodes( for (int sequence = 0; sequence < properties.size(); sequence++) { Property childProperty = properties.get(sequence); + if (context.isTraversed(childProperty)) { + continue; + } + ContainerPropertyGenerator containerPropertyGenerator = this.generateOptions.getContainerPropertyGenerator(childProperty); boolean childContainer = containerPropertyGenerator != null; diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/TraverseContext.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/TraverseContext.java index 61a265aa3..b1d51380c 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/TraverseContext.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/TraverseContext.java @@ -25,20 +25,28 @@ import org.apiguardian.api.API.Status; import com.navercorp.fixturemonkey.api.generator.ArbitraryProperty; +import com.navercorp.fixturemonkey.api.property.Property; @API(since = "0.4.0", status = Status.EXPERIMENTAL) final class TraverseContext { + private final ArbitraryProperty rootArbitraryProperty; private final List arbitraryProperties; private final List containerInfoManipulators; public TraverseContext( + ArbitraryProperty rootArbitraryProperty, List arbitraryProperties, List containerInfoManipulators ) { + this.rootArbitraryProperty = rootArbitraryProperty; this.arbitraryProperties = arbitraryProperties; this.containerInfoManipulators = containerInfoManipulators; } + public ArbitraryProperty getRootArbitraryProperty() { + return rootArbitraryProperty; + } + public List getArbitraryProperties() { return arbitraryProperties; } @@ -52,6 +60,12 @@ public TraverseContext appendArbitraryProperty( ) { List arbitraryProperties = new ArrayList<>(this.arbitraryProperties); arbitraryProperties.add(arbitraryProperty); - return new TraverseContext(arbitraryProperties, containerInfoManipulators); + return new TraverseContext(rootArbitraryProperty, arbitraryProperties, containerInfoManipulators); + } + + public boolean isTraversed(Property property) { + return property.equals(rootArbitraryProperty.getObjectProperty().getProperty()) + || arbitraryProperties.stream() + .anyMatch(it -> property.equals(it.getObjectProperty().getProperty())); } } 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 8fa28ba5d..c087fb226 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 @@ -68,6 +68,9 @@ import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.InterfaceImplementation; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.ListStringObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.NullableObject; +import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.RecursiveLeftObject; +import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SelfRecursiveListObject; +import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SelfRecursiveObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SimpleObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.StaticFieldObject; import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.StringPair; @@ -1551,4 +1554,42 @@ void setSpec() { then(actual).isEqualTo(expected); } + + @Property + void sampleSelfRecursiveObject() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultNotNull(true) + .build(); + + SelfRecursiveObject actual = sut.giveMeOne(SelfRecursiveObject.class); + + then(actual.getValue()).isNotNull(); + then(actual.getRecursive()).isNotNull(); + then(actual.getRecursive().getValue()).isNotNull(); + } + + @Property + void sampleSelfRecursiveList() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultNotNull(true) + .build(); + + SelfRecursiveListObject actual = sut.giveMeOne(SelfRecursiveListObject.class); + + then(actual.getValue()).isNotNull(); + then(actual.getRecursives()).isNotNull(); + } + + @Property + void sampleRecursiveObject() { + LabMonkey sut = LabMonkey.labMonkeyBuilder() + .defaultNotNull(true) + .build(); + + RecursiveLeftObject actual = sut.giveMeOne(RecursiveLeftObject.class); + + then(actual.getValue()).isNotNull(); + then(actual.getRecursive()).isNotNull(); + then(actual.getRecursive().getValue()).isNotNull(); + } } diff --git a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04TestSpecs.java b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04TestSpecs.java index ca45da00b..703c235f5 100644 --- a/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04TestSpecs.java +++ b/fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04TestSpecs.java @@ -174,4 +174,32 @@ public static class CustomContainer extends ArrayList { public static class CustomContainerFieldObject { CustomContainer value; } + + @Data + public static class SelfRecursiveObject { + String value; + + SelfRecursiveObject recursive; + } + + @Data + public static class SelfRecursiveListObject { + String value; + + List recursives; + } + + @Data + public static class RecursiveLeftObject { + String value; + + RecursiveRightObject recursive; + } + + @Data + public static class RecursiveRightObject { + int value; + + RecursiveLeftObject recursive; + } }