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