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.assertNull;
22  import static org.junit.jupiter.api.Assertions.assertSame;
23  import static org.junit.jupiter.api.Assertions.assertThrows;
24  import static org.junit.jupiter.api.Assertions.assertTrue;
25  
26  import java.util.ArrayList;
27  import java.util.Arrays;
28  import java.util.Comparator;
29  import java.util.List;
30  
31  import org.apache.commons.collections4.comparators.ComparableComparator;
32  import org.junit.jupiter.api.BeforeEach;
33  import org.junit.jupiter.api.Test;
34  
35  /**
36   * Unit test suite for {@link CollatingIterator}.
37   */
38  @SuppressWarnings("boxing")
39  public class CollatingIteratorTest extends AbstractIteratorTest<Integer> {
40  
41      private Comparator<Integer> comparator;
42  
43      private ArrayList<Integer> evens;
44      private ArrayList<Integer> odds;
45      private ArrayList<Integer> fib;
46  
47      @Override
48      public CollatingIterator<Integer> makeEmptyIterator() {
49          return new CollatingIterator<>(comparator);
50      }
51  
52      @Override
53      public CollatingIterator<Integer> makeObject() {
54          final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
55          iter.addIterator(evens.iterator());
56          iter.addIterator(odds.iterator());
57          iter.addIterator(fib.iterator());
58          return iter;
59      }
60  
61      @BeforeEach
62      public void setUp() throws Exception {
63          comparator = new ComparableComparator<>();
64          evens = new ArrayList<>();
65          odds = new ArrayList<>();
66          for (int i = 0; i < 20; i++) {
67              if (0 == i % 2) {
68                  evens.add(i);
69              } else {
70                  odds.add(i);
71              }
72          }
73          fib = new ArrayList<>();
74          fib.add(1);
75          fib.add(1);
76          fib.add(2);
77          fib.add(3);
78          fib.add(5);
79          fib.add(8);
80          fib.add(13);
81          fib.add(21);
82      }
83  
84      @Test
85      public void testGetSetComparator() {
86          final CollatingIterator<Integer> iter = new CollatingIterator<>();
87          assertNull(iter.getComparator());
88          iter.setComparator(comparator);
89          assertSame(comparator, iter.getComparator());
90          iter.setComparator(null);
91          assertNull(iter.getComparator());
92      }
93  
94      @Test
95      public void testIterateEven() {
96          final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
97          iter.addIterator(evens.iterator());
98          for (final Integer even : evens) {
99              assertTrue(iter.hasNext());
100             assertEquals(even, iter.next());
101             assertEquals(0, iter.getIteratorIndex());
102         }
103         assertFalse(iter.hasNext());
104     }
105 
106     @Test
107     public void testIterateEvenEven() {
108         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
109         iter.addIterator(evens.iterator());
110         iter.addIterator(evens.iterator());
111         for (final Integer even : evens) {
112             assertTrue(iter.hasNext());
113             assertEquals(even, iter.next());
114             assertEquals(0, iter.getIteratorIndex());
115             assertTrue(iter.hasNext());
116             assertEquals(even, iter.next());
117             assertEquals(1, iter.getIteratorIndex());
118         }
119         assertFalse(iter.hasNext());
120     }
121 
122     @Test
123     public void testIterateEvenOdd() {
124         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator, evens.iterator(), odds.iterator());
125         for (int i = 0; i < 20; i++) {
126             assertTrue(iter.hasNext());
127             assertEquals(Integer.valueOf(i), iter.next());
128             assertEquals(i % 2, iter.getIteratorIndex());
129         }
130         assertFalse(iter.hasNext());
131     }
132 
133     @Test
134     public void testIterateFibEvenOdd() {
135         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
136         iter.addIterator(fib.iterator());
137         iter.addIterator(evens.iterator());
138         iter.addIterator(odds.iterator());
139 
140         assertEquals(Integer.valueOf(0), iter.next());  // even   0
141         assertEquals(1, iter.getIteratorIndex());
142         assertEquals(Integer.valueOf(1), iter.next());  // fib    1
143         assertEquals(0, iter.getIteratorIndex());
144         assertEquals(Integer.valueOf(1), iter.next());  // fib    1
145         assertEquals(0, iter.getIteratorIndex());
146         assertEquals(Integer.valueOf(1), iter.next());  // odd    1
147         assertEquals(2, iter.getIteratorIndex());
148         assertEquals(Integer.valueOf(2), iter.next());  // fib    2
149         assertEquals(0, iter.getIteratorIndex());
150         assertEquals(Integer.valueOf(2), iter.next());  // even   2
151         assertEquals(1, iter.getIteratorIndex());
152         assertEquals(Integer.valueOf(3), iter.next());  // fib    3
153         assertEquals(0, iter.getIteratorIndex());
154         assertEquals(Integer.valueOf(3), iter.next());  // odd    3
155         assertEquals(2, iter.getIteratorIndex());
156         assertEquals(Integer.valueOf(4), iter.next());  // even   4
157         assertEquals(1, iter.getIteratorIndex());
158         assertEquals(Integer.valueOf(5), iter.next());  // fib    5
159         assertEquals(0, iter.getIteratorIndex());
160         assertEquals(Integer.valueOf(5), iter.next());  // odd    5
161         assertEquals(2, iter.getIteratorIndex());
162         assertEquals(Integer.valueOf(6), iter.next());  // even   6
163         assertEquals(1, iter.getIteratorIndex());
164         assertEquals(Integer.valueOf(7), iter.next());  // odd    7
165         assertEquals(2, iter.getIteratorIndex());
166         assertEquals(Integer.valueOf(8), iter.next());  // fib    8
167         assertEquals(0, iter.getIteratorIndex());
168         assertEquals(Integer.valueOf(8), iter.next());  // even   8
169         assertEquals(1, iter.getIteratorIndex());
170         assertEquals(Integer.valueOf(9), iter.next());  // odd    9
171         assertEquals(2, iter.getIteratorIndex());
172         assertEquals(Integer.valueOf(10), iter.next()); // even  10
173         assertEquals(1, iter.getIteratorIndex());
174         assertEquals(Integer.valueOf(11), iter.next()); // odd   11
175         assertEquals(2, iter.getIteratorIndex());
176         assertEquals(Integer.valueOf(12), iter.next()); // even  12
177         assertEquals(1, iter.getIteratorIndex());
178         assertEquals(Integer.valueOf(13), iter.next()); // fib   13
179         assertEquals(0, iter.getIteratorIndex());
180         assertEquals(Integer.valueOf(13), iter.next()); // odd   13
181         assertEquals(2, iter.getIteratorIndex());
182         assertEquals(Integer.valueOf(14), iter.next()); // even  14
183         assertEquals(1, iter.getIteratorIndex());
184         assertEquals(Integer.valueOf(15), iter.next()); // odd   15
185         assertEquals(2, iter.getIteratorIndex());
186         assertEquals(Integer.valueOf(16), iter.next()); // even  16
187         assertEquals(1, iter.getIteratorIndex());
188         assertEquals(Integer.valueOf(17), iter.next()); // odd   17
189         assertEquals(2, iter.getIteratorIndex());
190         assertEquals(Integer.valueOf(18), iter.next()); // even  18
191         assertEquals(1, iter.getIteratorIndex());
192         assertEquals(Integer.valueOf(19), iter.next()); // odd   19
193         assertEquals(2, iter.getIteratorIndex());
194         assertEquals(Integer.valueOf(21), iter.next()); // fib   21
195         assertEquals(0, iter.getIteratorIndex());
196 
197         assertFalse(iter.hasNext());
198     }
199 
200     @Test
201     public void testIterateOddEven() {
202         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator, odds.iterator(), evens.iterator());
203         for (int i = 0; i < 20; i++) {
204             assertTrue(iter.hasNext());
205             assertEquals(Integer.valueOf(i), iter.next());
206             assertEquals(i % 2 == 0 ? 1 : 0, iter.getIteratorIndex());
207         }
208         assertFalse(iter.hasNext());
209     }
210 
211     @Test
212     public void testNullComparator() {
213         final List<Integer> l1 = Arrays.asList(1, 3, 5);
214         final List<Integer> l2 = Arrays.asList(2, 4, 6);
215 
216         final CollatingIterator<Integer> collatingIterator1 = new CollatingIterator<>(null, l1.iterator(), l2.iterator());
217         assertThrows(NullPointerException.class, collatingIterator1::next, "You must invoke setComparator");
218 
219         int i = 0;
220         final CollatingIterator<Integer> collatingIterator2 = new CollatingIterator<>(null, l1.iterator(), l2.iterator());
221         collatingIterator2.setComparator(new ComparableComparator<>());
222         for (; collatingIterator2.hasNext(); i++) {
223             final Integer n = collatingIterator2.next();
224             assertEquals((int) n, i + 1, "wrong order");
225         }
226         assertEquals(i, l1.size() + l2.size(), "wrong size");
227     }
228 
229     @Test
230     public void testRemoveFromDouble() {
231         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
232         iter.addIterator(evens.iterator());
233         iter.addIterator(odds.iterator());
234         int expectedSize = evens.size() + odds.size();
235         while (iter.hasNext()) {
236             final Object o = iter.next();
237             final Integer val = (Integer) o;
238             if (val.intValue() % 4 == 0 || val.intValue() % 3 == 0) {
239                 expectedSize--;
240                 iter.remove();
241             }
242         }
243         assertEquals(expectedSize, evens.size() + odds.size());
244     }
245 
246     @Test
247     public void testRemoveFromSingle() {
248         final CollatingIterator<Integer> iter = new CollatingIterator<>(comparator);
249         iter.addIterator(evens.iterator());
250         int expectedSize = evens.size();
251         while (iter.hasNext()) {
252             final Object o = iter.next();
253             final Integer val = (Integer) o;
254             if (val.intValue() % 4 == 0) {
255                 expectedSize--;
256                 iter.remove();
257             }
258         }
259         assertEquals(expectedSize, evens.size());
260     }
261 }
262