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.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
36
37 @SuppressWarnings("boxing")
38 public class CollatingIteratorTest extends AbstractIteratorTest<Integer> {
39
40
41
42 private Comparator<Integer> comparator;
43
44
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
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
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());
151 assertEquals(1, iter.getIteratorIndex());
152 assertEquals(Integer.valueOf(1), iter.next());
153 assertEquals(0, iter.getIteratorIndex());
154 assertEquals(Integer.valueOf(1), iter.next());
155 assertEquals(0, iter.getIteratorIndex());
156 assertEquals(Integer.valueOf(1), iter.next());
157 assertEquals(2, iter.getIteratorIndex());
158 assertEquals(Integer.valueOf(2), iter.next());
159 assertEquals(0, iter.getIteratorIndex());
160 assertEquals(Integer.valueOf(2), iter.next());
161 assertEquals(1, iter.getIteratorIndex());
162 assertEquals(Integer.valueOf(3), iter.next());
163 assertEquals(0, iter.getIteratorIndex());
164 assertEquals(Integer.valueOf(3), iter.next());
165 assertEquals(2, iter.getIteratorIndex());
166 assertEquals(Integer.valueOf(4), iter.next());
167 assertEquals(1, iter.getIteratorIndex());
168 assertEquals(Integer.valueOf(5), iter.next());
169 assertEquals(0, iter.getIteratorIndex());
170 assertEquals(Integer.valueOf(5), iter.next());
171 assertEquals(2, iter.getIteratorIndex());
172 assertEquals(Integer.valueOf(6), iter.next());
173 assertEquals(1, iter.getIteratorIndex());
174 assertEquals(Integer.valueOf(7), iter.next());
175 assertEquals(2, iter.getIteratorIndex());
176 assertEquals(Integer.valueOf(8), iter.next());
177 assertEquals(0, iter.getIteratorIndex());
178 assertEquals(Integer.valueOf(8), iter.next());
179 assertEquals(1, iter.getIteratorIndex());
180 assertEquals(Integer.valueOf(9), iter.next());
181 assertEquals(2, iter.getIteratorIndex());
182 assertEquals(Integer.valueOf(10), iter.next());
183 assertEquals(1, iter.getIteratorIndex());
184 assertEquals(Integer.valueOf(11), iter.next());
185 assertEquals(2, iter.getIteratorIndex());
186 assertEquals(Integer.valueOf(12), iter.next());
187 assertEquals(1, iter.getIteratorIndex());
188 assertEquals(Integer.valueOf(13), iter.next());
189 assertEquals(0, iter.getIteratorIndex());
190 assertEquals(Integer.valueOf(13), iter.next());
191 assertEquals(2, iter.getIteratorIndex());
192 assertEquals(Integer.valueOf(14), iter.next());
193 assertEquals(1, iter.getIteratorIndex());
194 assertEquals(Integer.valueOf(15), iter.next());
195 assertEquals(2, iter.getIteratorIndex());
196 assertEquals(Integer.valueOf(16), iter.next());
197 assertEquals(1, iter.getIteratorIndex());
198 assertEquals(Integer.valueOf(17), iter.next());
199 assertEquals(2, iter.getIteratorIndex());
200 assertEquals(Integer.valueOf(18), iter.next());
201 assertEquals(1, iter.getIteratorIndex());
202 assertEquals(Integer.valueOf(19), iter.next());
203 assertEquals(2, iter.getIteratorIndex());
204 assertEquals(Integer.valueOf(21), iter.next());
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