11package org .apache .jackrabbit .oak .plugins .tree .impl ;
22
33import java .util .ArrayList ;
4+ import java .util .Iterator ;
45import java .util .List ;
56
67import 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