Skip to content

Commit 5e240d1

Browse files
authored
Add generating a circular-reference object (#519)
1 parent 22dcf35 commit 5e240d1

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/ArbitraryTraverser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public ArbitraryNode traverse(
9595
return this.traverse(
9696
arbitraryProperty,
9797
new TraverseContext(
98+
arbitraryProperty,
9899
new ArrayList<>(),
99100
containerInfoManipulators
100101
)
@@ -135,6 +136,10 @@ private List<ArbitraryNode> generateChildrenNodes(
135136
for (int sequence = 0; sequence < properties.size(); sequence++) {
136137
Property childProperty = properties.get(sequence);
137138

139+
if (context.isTraversed(childProperty)) {
140+
continue;
141+
}
142+
138143
ContainerPropertyGenerator containerPropertyGenerator =
139144
this.generateOptions.getContainerPropertyGenerator(childProperty);
140145
boolean childContainer = containerPropertyGenerator != null;

fixture-monkey/src/main/java/com/navercorp/fixturemonkey/resolver/TraverseContext.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,28 @@
2525
import org.apiguardian.api.API.Status;
2626

2727
import com.navercorp.fixturemonkey.api.generator.ArbitraryProperty;
28+
import com.navercorp.fixturemonkey.api.property.Property;
2829

2930
@API(since = "0.4.0", status = Status.EXPERIMENTAL)
3031
final class TraverseContext {
32+
private final ArbitraryProperty rootArbitraryProperty;
3133
private final List<ArbitraryProperty> arbitraryProperties;
3234
private final List<ContainerInfoManipulator> containerInfoManipulators;
3335

3436
public TraverseContext(
37+
ArbitraryProperty rootArbitraryProperty,
3538
List<ArbitraryProperty> arbitraryProperties,
3639
List<ContainerInfoManipulator> containerInfoManipulators
3740
) {
41+
this.rootArbitraryProperty = rootArbitraryProperty;
3842
this.arbitraryProperties = arbitraryProperties;
3943
this.containerInfoManipulators = containerInfoManipulators;
4044
}
4145

46+
public ArbitraryProperty getRootArbitraryProperty() {
47+
return rootArbitraryProperty;
48+
}
49+
4250
public List<ArbitraryProperty> getArbitraryProperties() {
4351
return arbitraryProperties;
4452
}
@@ -52,6 +60,12 @@ public TraverseContext appendArbitraryProperty(
5260
) {
5361
List<ArbitraryProperty> arbitraryProperties = new ArrayList<>(this.arbitraryProperties);
5462
arbitraryProperties.add(arbitraryProperty);
55-
return new TraverseContext(arbitraryProperties, containerInfoManipulators);
63+
return new TraverseContext(rootArbitraryProperty, arbitraryProperties, containerInfoManipulators);
64+
}
65+
66+
public boolean isTraversed(Property property) {
67+
return property.equals(rootArbitraryProperty.getObjectProperty().getProperty())
68+
|| arbitraryProperties.stream()
69+
.anyMatch(it -> property.equals(it.getObjectProperty().getProperty()));
5670
}
5771
}

fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04Test.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@
6868
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.InterfaceImplementation;
6969
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.ListStringObject;
7070
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.NullableObject;
71+
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.RecursiveLeftObject;
72+
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SelfRecursiveListObject;
73+
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SelfRecursiveObject;
7174
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.SimpleObject;
7275
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.StaticFieldObject;
7376
import com.navercorp.fixturemonkey.test.FixtureMonkeyV04TestSpecs.StringPair;
@@ -1551,4 +1554,42 @@ void setSpec() {
15511554

15521555
then(actual).isEqualTo(expected);
15531556
}
1557+
1558+
@Property
1559+
void sampleSelfRecursiveObject() {
1560+
LabMonkey sut = LabMonkey.labMonkeyBuilder()
1561+
.defaultNotNull(true)
1562+
.build();
1563+
1564+
SelfRecursiveObject actual = sut.giveMeOne(SelfRecursiveObject.class);
1565+
1566+
then(actual.getValue()).isNotNull();
1567+
then(actual.getRecursive()).isNotNull();
1568+
then(actual.getRecursive().getValue()).isNotNull();
1569+
}
1570+
1571+
@Property
1572+
void sampleSelfRecursiveList() {
1573+
LabMonkey sut = LabMonkey.labMonkeyBuilder()
1574+
.defaultNotNull(true)
1575+
.build();
1576+
1577+
SelfRecursiveListObject actual = sut.giveMeOne(SelfRecursiveListObject.class);
1578+
1579+
then(actual.getValue()).isNotNull();
1580+
then(actual.getRecursives()).isNotNull();
1581+
}
1582+
1583+
@Property
1584+
void sampleRecursiveObject() {
1585+
LabMonkey sut = LabMonkey.labMonkeyBuilder()
1586+
.defaultNotNull(true)
1587+
.build();
1588+
1589+
RecursiveLeftObject actual = sut.giveMeOne(RecursiveLeftObject.class);
1590+
1591+
then(actual.getValue()).isNotNull();
1592+
then(actual.getRecursive()).isNotNull();
1593+
then(actual.getRecursive().getValue()).isNotNull();
1594+
}
15541595
}

fixture-monkey/src/test/java/com/navercorp/fixturemonkey/test/FixtureMonkeyV04TestSpecs.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,32 @@ public static class CustomContainer extends ArrayList<String> {
174174
public static class CustomContainerFieldObject {
175175
CustomContainer value;
176176
}
177+
178+
@Data
179+
public static class SelfRecursiveObject {
180+
String value;
181+
182+
SelfRecursiveObject recursive;
183+
}
184+
185+
@Data
186+
public static class SelfRecursiveListObject {
187+
String value;
188+
189+
List<SelfRecursiveObject> recursives;
190+
}
191+
192+
@Data
193+
public static class RecursiveLeftObject {
194+
String value;
195+
196+
RecursiveRightObject recursive;
197+
}
198+
199+
@Data
200+
public static class RecursiveRightObject {
201+
int value;
202+
203+
RecursiveLeftObject recursive;
204+
}
177205
}

0 commit comments

Comments
 (0)