View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Tests the LoopingIterator class.
33   */
34  public class LoopingIteratorTest {
35  
36      /**
37       * Tests constructor exception.
38       */
39      @Test
40      public void testConstructorEx() {
41          assertThrows(NullPointerException.class, () -> new LoopingIterator<>(null));
42      }
43  
44      /**
45       * Tests whether an empty looping iterator works as designed.
46       */
47      @Test
48      public void testLooping0() {
49          final List<Object> list = new ArrayList<>();
50          final LoopingIterator<Object> loop = new LoopingIterator<>(list);
51          assertFalse(loop.hasNext(), "hasNext should return false");
52  
53          assertThrows(NoSuchElementException.class, () -> loop.next(),
54                  "NoSuchElementException was not thrown during next() call.");
55      }
56  
57      /**
58       * Tests whether a populated looping iterator works as designed.
59       */
60      @Test
61      public void testLooping1() {
62          final List<String> list = Arrays.asList("a");
63          final LoopingIterator<String> loop = new LoopingIterator<>(list);
64  
65          assertTrue(loop.hasNext(), "1st hasNext should return true");
66          assertEquals("a", loop.next());
67  
68          assertTrue(loop.hasNext(), "2nd hasNext should return true");
69          assertEquals("a", loop.next());
70  
71          assertTrue(loop.hasNext(), "3rd hasNext should return true");
72          assertEquals("a", loop.next());
73      }
74  
75      /**
76       * Tests whether a populated looping iterator works as designed.
77       */
78      @Test
79      public void testLooping2() {
80          final List<String> list = Arrays.asList("a", "b");
81          final LoopingIterator<String> loop = new LoopingIterator<>(list);
82  
83          assertTrue(loop.hasNext(), "1st hasNext should return true");
84          assertEquals("a", loop.next());
85  
86          assertTrue(loop.hasNext(), "2nd hasNext should return true");
87          assertEquals("b", loop.next());
88  
89          assertTrue(loop.hasNext(), "3rd hasNext should return true");
90          assertEquals("a", loop.next());
91      }
92  
93      /**
94       * Tests whether a populated looping iterator works as designed.
95       */
96      @Test
97      public void testLooping3() {
98          final List<String> list = Arrays.asList("a", "b", "c");
99          final LoopingIterator<String> loop = new LoopingIterator<>(list);
100 
101         assertTrue(loop.hasNext(), "1st hasNext should return true");
102         assertEquals("a", loop.next());
103 
104         assertTrue(loop.hasNext(), "2nd hasNext should return true");
105         assertEquals("b", loop.next());
106 
107         assertTrue(loop.hasNext(), "3rd hasNext should return true");
108         assertEquals("c", loop.next());
109 
110         assertTrue(loop.hasNext(), "4th hasNext should return true");
111         assertEquals("a", loop.next());
112     }
113 
114     /**
115      * Tests the remove() method on a LoopingIterator wrapped ArrayList.
116      */
117     @Test
118     public void testRemoving1() {
119         final List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
120         final LoopingIterator<String> loop = new LoopingIterator<>(list);
121         assertEquals(3, list.size(), "list should have 3 elements.");
122 
123         assertTrue(loop.hasNext(), "1st hasNext should return true");
124         assertEquals("a", loop.next());
125         loop.remove();  // removes a
126         assertEquals(2, list.size(), "list should have 2 elements.");
127 
128         assertTrue(loop.hasNext(), "2nd hasNext should return true");
129         assertEquals("b", loop.next());
130         loop.remove();  // removes b
131         assertEquals(1, list.size(), "list should have 1 elements.");
132 
133         assertTrue(loop.hasNext(), "3rd hasNext should return true");
134         assertEquals("c", loop.next());
135         loop.remove();  // removes c
136         assertEquals(0, list.size(), "list should have 0 elements.");
137 
138         assertFalse(loop.hasNext(), "4th hasNext should return false");
139 
140         assertThrows(NoSuchElementException.class, () -> loop.next(),
141                 "Expected NoSuchElementException to be thrown.");
142     }
143 
144     /**
145      * Tests the reset() method on a LoopingIterator wrapped ArrayList.
146      */
147     @Test
148     public void testReset() {
149         final List<String> list = Arrays.asList("a", "b", "c");
150         final LoopingIterator<String> loop = new LoopingIterator<>(list);
151 
152         assertEquals("a", loop.next());
153         assertEquals("b", loop.next());
154         loop.reset();
155         assertEquals("a", loop.next());
156         loop.reset();
157         assertEquals("a", loop.next());
158         assertEquals("b", loop.next());
159         assertEquals("c", loop.next());
160         loop.reset();
161         assertEquals("a", loop.next());
162         assertEquals("b", loop.next());
163         assertEquals("c", loop.next());
164     }
165 
166     /**
167      * Tests the size() method on a LoopingIterator wrapped ArrayList.
168      */
169     @Test
170     public void testSize() {
171         final List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
172         final LoopingIterator<String> loop = new LoopingIterator<>(list);
173 
174         assertEquals(3, loop.size());
175         loop.next();
176         loop.next();
177         assertEquals(3, loop.size());
178         loop.reset();
179         assertEquals(3, loop.size());
180         loop.next();
181         loop.remove();
182         assertEquals(2, loop.size());
183     }
184 
185 }