Skip to content

Commit 4eedc30

Browse files
committed
OAK-11607 validate laziness
1 parent 6c9d0d6 commit 4eedc30

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/tree/impl/OrderedChildnameIterableTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.apache.jackrabbit.oak.plugins.tree.impl;
22

33
import java.util.ArrayList;
4+
import java.util.Iterator;
45
import java.util.List;
56

67
import org.junit.Assert;
@@ -10,6 +11,45 @@ public class OrderedChildnameIterableTest {
1011

1112
static final List<String> ALL_CHILDREN = List.of("1","2","3","4","5");
1213

14+
// Track iterator access for testing lazy loading
15+
private static class TrackingIterable implements Iterable<String> {
16+
private final List<String> elements;
17+
private int accessCount = 0;
18+
private final List<String> accessedElements = new ArrayList<>();
19+
20+
TrackingIterable(List<String> elements) {
21+
this.elements = elements;
22+
}
23+
24+
@Override
25+
public Iterator<String> iterator() {
26+
return new Iterator<String>() {
27+
private int index = 0;
28+
29+
@Override
30+
public boolean hasNext() {
31+
return index < elements.size();
32+
}
33+
34+
@Override
35+
public String next() {
36+
String element = elements.get(index++);
37+
accessCount++;
38+
accessedElements.add(element);
39+
return element;
40+
}
41+
};
42+
}
43+
44+
public int getAccessCount() {
45+
return accessCount;
46+
}
47+
48+
public List<String> getAccessedElements() {
49+
return accessedElements;
50+
}
51+
}
52+
1353
List<String> iterableToList(Iterable<String> iter) {
1454
List<String> result = new ArrayList<>();
1555
iter.iterator().forEachRemaining(result::add);
@@ -44,4 +84,42 @@ public void onlyOrderedChildrenAvailable() {
4484
Assert.assertEquals(List.of(), iterableToList(iterable));
4585
}
4686

87+
@Test
88+
public void testLazyLoading() {
89+
// Create tracking iterable for allChildren
90+
TrackingIterable trackingAllChildren = new TrackingIterable(ALL_CHILDREN);
91+
92+
OrderedChildnameIterable iterable = new OrderedChildnameIterable(
93+
List.of("4", "1"),
94+
trackingAllChildren
95+
);
96+
97+
Iterator<String> iterator = iterable.iterator();
98+
99+
// Get first element ("4")
100+
Assert.assertTrue(iterator.hasNext());
101+
Assert.assertEquals("4", iterator.next());
102+
// iterated through 4 elements in allChildren
103+
Assert.assertEquals(4, trackingAllChildren.getAccessCount());
104+
Assert.assertEquals(List.of("1", "2", "3", "4"), trackingAllChildren.getAccessedElements());
105+
106+
// Get second element ("1")
107+
Assert.assertTrue(iterator.hasNext());
108+
Assert.assertEquals("1", iterator.next());
109+
// No additional access to allChildren
110+
Assert.assertEquals(4, trackingAllChildren.getAccessCount());
111+
Assert.assertEquals(List.of("1", "2", "3", "4"), trackingAllChildren.getAccessedElements());
112+
113+
// Get remaining elements
114+
Assert.assertTrue(iterator.hasNext());
115+
Assert.assertEquals("2", iterator.next());
116+
Assert.assertTrue(iterator.hasNext());
117+
Assert.assertEquals("3", iterator.next());
118+
Assert.assertTrue(iterator.hasNext());
119+
Assert.assertEquals("5", iterator.next());
120+
121+
// No more elements should be accessed since we already had them all
122+
Assert.assertEquals(5, trackingAllChildren.getAccessCount());
123+
Assert.assertFalse(iterator.hasNext());
124+
}
47125
}

0 commit comments

Comments
 (0)