1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.iterators;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertThrows;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.List;
27 import java.util.NoSuchElementException;
28
29 import org.junit.jupiter.api.Test;
30
31
32
33
34 public class LoopingListIteratorTest {
35
36
37
38
39 @Test
40 public void testAdd() {
41 List<String> list = new ArrayList<>(Arrays.asList("b", "e", "f"));
42 LoopingListIterator<String> loop = new LoopingListIterator<>(list);
43
44 loop.add("a");
45 assertEquals("b", loop.next());
46 loop.reset();
47 assertEquals("a", loop.next());
48 assertEquals("b", loop.next());
49
50 loop.add("c");
51 assertEquals("e", loop.next());
52 assertEquals("e", loop.previous());
53 assertEquals("c", loop.previous());
54 assertEquals("c", loop.next());
55
56 loop.add("d");
57 loop.reset();
58 assertEquals("a", loop.next());
59 assertEquals("b", loop.next());
60 assertEquals("c", loop.next());
61 assertEquals("d", loop.next());
62 assertEquals("e", loop.next());
63 assertEquals("f", loop.next());
64 assertEquals("a", loop.next());
65
66 list = new ArrayList<>(Arrays.asList("b", "e", "f"));
67 loop = new LoopingListIterator<>(list);
68
69 loop.add("a");
70 assertEquals("a", loop.previous());
71 loop.reset();
72 assertEquals("f", loop.previous());
73 assertEquals("e", loop.previous());
74
75 loop.add("d");
76 assertEquals("d", loop.previous());
77
78 loop.add("c");
79 assertEquals("c", loop.previous());
80
81 loop.reset();
82 assertEquals("a", loop.next());
83 assertEquals("b", loop.next());
84 assertEquals("c", loop.next());
85 assertEquals("d", loop.next());
86 assertEquals("e", loop.next());
87 assertEquals("f", loop.next());
88 assertEquals("a", loop.next());
89 }
90
91
92
93
94 @Test
95 public void testConstructorEx() {
96 assertThrows(NullPointerException.class, () -> new LoopingListIterator<>(null));
97 }
98
99
100
101
102
103 @Test
104 public void testJoggingNotOverBoundary() {
105 final List<String> list = Arrays.asList("a", "b");
106 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
107
108
109
110 loop.reset();
111 assertEquals("a", loop.next());
112 assertEquals("a", loop.previous());
113 assertEquals("a", loop.next());
114
115 assertEquals("b", loop.next());
116 assertEquals("b", loop.previous());
117 assertEquals("b", loop.next());
118 }
119
120
121
122
123
124 @Test
125 public void testJoggingOverBoundary() {
126 final List<String> list = Arrays.asList("a", "b");
127 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
128
129
130
131 assertEquals("b", loop.previous());
132 assertEquals("b", loop.next());
133 assertEquals("b", loop.previous());
134
135 assertEquals("a", loop.previous());
136 assertEquals("a", loop.next());
137 assertEquals("a", loop.previous());
138 }
139
140
141
142
143 @Test
144 public void testLooping0() {
145 final List<Object> list = new ArrayList<>();
146 final LoopingListIterator<Object> loop = new LoopingListIterator<>(list);
147 assertFalse(loop.hasNext());
148 assertFalse(loop.hasPrevious());
149 assertThrows(NoSuchElementException.class, () -> loop.next());
150 assertThrows(NoSuchElementException.class, () -> loop.previous());
151 }
152
153
154
155
156
157 @Test
158 public void testLooping1() {
159 final List<String> list = Arrays.asList("a");
160 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
161
162 assertTrue(loop.hasNext());
163 assertEquals("a", loop.next());
164
165 assertTrue(loop.hasNext());
166 assertEquals("a", loop.next());
167
168 assertTrue(loop.hasNext());
169 assertEquals("a", loop.next());
170
171 assertTrue(loop.hasPrevious());
172 assertEquals("a", loop.previous());
173
174 assertTrue(loop.hasPrevious());
175 assertEquals("a", loop.previous());
176
177 assertTrue(loop.hasPrevious());
178 assertEquals("a", loop.previous());
179 }
180
181
182
183
184
185 @Test
186 public void testLooping2() {
187 final List<String> list = Arrays.asList("a", "b");
188 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
189
190 assertTrue(loop.hasNext());
191 assertEquals("a", loop.next());
192
193 assertTrue(loop.hasNext());
194 assertEquals("b", loop.next());
195
196 assertTrue(loop.hasNext());
197 assertEquals("a", loop.next());
198
199
200 loop.reset();
201
202 assertTrue(loop.hasPrevious());
203 assertEquals("b", loop.previous());
204
205 assertTrue(loop.hasPrevious());
206 assertEquals("a", loop.previous());
207
208 assertTrue(loop.hasPrevious());
209 assertEquals("b", loop.previous());
210 }
211
212
213
214
215 @Test
216 public void testNextAndPreviousIndex() {
217 final List<String> list = Arrays.asList("a", "b", "c");
218 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
219
220 assertEquals(0, loop.nextIndex());
221 assertEquals(2, loop.previousIndex());
222
223 assertEquals("a", loop.next());
224 assertEquals(1, loop.nextIndex());
225 assertEquals(0, loop.previousIndex());
226
227 assertEquals("a", loop.previous());
228 assertEquals(0, loop.nextIndex());
229 assertEquals(2, loop.previousIndex());
230
231 assertEquals("c", loop.previous());
232 assertEquals(2, loop.nextIndex());
233 assertEquals(1, loop.previousIndex());
234
235 assertEquals("b", loop.previous());
236 assertEquals(1, loop.nextIndex());
237 assertEquals(0, loop.previousIndex());
238
239 assertEquals("a", loop.previous());
240 assertEquals(0, loop.nextIndex());
241 assertEquals(2, loop.previousIndex());
242 }
243
244
245
246
247 @Test
248 public void testRemovingElementsAndIteratingBackwards() {
249 final List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
250 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
251
252 assertTrue(loop.hasPrevious());
253 assertEquals("c", loop.previous());
254 loop.remove();
255 assertEquals(2, list.size());
256
257 assertTrue(loop.hasPrevious());
258 assertEquals("b", loop.previous());
259 loop.remove();
260 assertEquals(1, list.size());
261
262 assertTrue(loop.hasPrevious());
263 assertEquals("a", loop.previous());
264 loop.remove();
265 assertEquals(0, list.size());
266
267 assertFalse(loop.hasPrevious());
268
269 assertThrows(NoSuchElementException.class, () -> loop.previous());
270 }
271
272
273
274
275 @Test
276 public void testRemovingElementsAndIteratingForward() {
277 final List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
278 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
279
280 assertTrue(loop.hasNext());
281 assertEquals("a", loop.next());
282 loop.remove();
283 assertEquals(2, list.size());
284
285 assertTrue(loop.hasNext());
286 assertEquals("b", loop.next());
287 loop.remove();
288 assertEquals(1, list.size());
289
290 assertTrue(loop.hasNext());
291 assertEquals("c", loop.next());
292 loop.remove();
293 assertEquals(0, list.size());
294
295 assertFalse(loop.hasNext());
296
297 assertThrows(NoSuchElementException.class, () -> loop.next());
298 }
299
300
301
302
303 @Test
304 public void testReset() {
305 final List<String> list = Arrays.asList("a", "b", "c");
306 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
307
308 assertEquals("a", loop.next());
309 assertEquals("b", loop.next());
310 loop.reset();
311 assertEquals("a", loop.next());
312 loop.reset();
313 assertEquals("a", loop.next());
314 assertEquals("b", loop.next());
315 assertEquals("c", loop.next());
316 loop.reset();
317
318 assertEquals("c", loop.previous());
319 assertEquals("b", loop.previous());
320 loop.reset();
321 assertEquals("c", loop.previous());
322 loop.reset();
323 assertEquals("c", loop.previous());
324 assertEquals("b", loop.previous());
325 assertEquals("a", loop.previous());
326 }
327
328
329
330
331 @Test
332 public void testSet() {
333 final List<String> list = Arrays.asList("q", "r", "z");
334 final LoopingListIterator<String> loop = new LoopingListIterator<>(list);
335
336 assertEquals("z", loop.previous());
337 loop.set("c");
338
339 loop.reset();
340 assertEquals("q", loop.next());
341 loop.set("a");
342
343 assertEquals("r", loop.next());
344 loop.set("b");
345
346 loop.reset();
347 assertEquals("a", loop.next());
348 assertEquals("b", loop.next());
349 assertEquals("c", loop.next());
350 }
351
352 }