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.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
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());
141 assertEquals(1, iter.getIteratorIndex());
142 assertEquals(Integer.valueOf(1), iter.next());
143 assertEquals(0, iter.getIteratorIndex());
144 assertEquals(Integer.valueOf(1), iter.next());
145 assertEquals(0, iter.getIteratorIndex());
146 assertEquals(Integer.valueOf(1), iter.next());
147 assertEquals(2, iter.getIteratorIndex());
148 assertEquals(Integer.valueOf(2), iter.next());
149 assertEquals(0, iter.getIteratorIndex());
150 assertEquals(Integer.valueOf(2), iter.next());
151 assertEquals(1, iter.getIteratorIndex());
152 assertEquals(Integer.valueOf(3), iter.next());
153 assertEquals(0, iter.getIteratorIndex());
154 assertEquals(Integer.valueOf(3), iter.next());
155 assertEquals(2, iter.getIteratorIndex());
156 assertEquals(Integer.valueOf(4), iter.next());
157 assertEquals(1, iter.getIteratorIndex());
158 assertEquals(Integer.valueOf(5), iter.next());
159 assertEquals(0, iter.getIteratorIndex());
160 assertEquals(Integer.valueOf(5), iter.next());
161 assertEquals(2, iter.getIteratorIndex());
162 assertEquals(Integer.valueOf(6), iter.next());
163 assertEquals(1, iter.getIteratorIndex());
164 assertEquals(Integer.valueOf(7), iter.next());
165 assertEquals(2, iter.getIteratorIndex());
166 assertEquals(Integer.valueOf(8), iter.next());
167 assertEquals(0, iter.getIteratorIndex());
168 assertEquals(Integer.valueOf(8), iter.next());
169 assertEquals(1, iter.getIteratorIndex());
170 assertEquals(Integer.valueOf(9), iter.next());
171 assertEquals(2, iter.getIteratorIndex());
172 assertEquals(Integer.valueOf(10), iter.next());
173 assertEquals(1, iter.getIteratorIndex());
174 assertEquals(Integer.valueOf(11), iter.next());
175 assertEquals(2, iter.getIteratorIndex());
176 assertEquals(Integer.valueOf(12), iter.next());
177 assertEquals(1, iter.getIteratorIndex());
178 assertEquals(Integer.valueOf(13), iter.next());
179 assertEquals(0, iter.getIteratorIndex());
180 assertEquals(Integer.valueOf(13), iter.next());
181 assertEquals(2, iter.getIteratorIndex());
182 assertEquals(Integer.valueOf(14), iter.next());
183 assertEquals(1, iter.getIteratorIndex());
184 assertEquals(Integer.valueOf(15), iter.next());
185 assertEquals(2, iter.getIteratorIndex());
186 assertEquals(Integer.valueOf(16), iter.next());
187 assertEquals(1, iter.getIteratorIndex());
188 assertEquals(Integer.valueOf(17), iter.next());
189 assertEquals(2, iter.getIteratorIndex());
190 assertEquals(Integer.valueOf(18), iter.next());
191 assertEquals(1, iter.getIteratorIndex());
192 assertEquals(Integer.valueOf(19), iter.next());
193 assertEquals(2, iter.getIteratorIndex());
194 assertEquals(Integer.valueOf(21), iter.next());
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