1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.collection;
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.Collection;
27 import java.util.HashSet;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.function.Predicate;
31
32 import org.junit.jupiter.api.Test;
33
34
35
36
37
38 public class CompositeCollectionTest<E> extends AbstractCollectionTest<E> {
39
40 protected CompositeCollection<E> c;
41
42 protected Collection<E> one;
43
44 protected Collection<E> two;
45
46 @Override
47 public String getCompatibilityVersion() {
48 return "4";
49 }
50
51 @Override
52 @SuppressWarnings("unchecked")
53 public E[] getFullElements() {
54 return (E[]) new Object[] { "1", "2", "3", "4" };
55 }
56
57
58
59
60 @Override
61 public boolean isAddSupported() {
62 return false;
63 }
64
65 @Override
66 public boolean isRemoveSupported() {
67 return false;
68 }
69
70 @Override
71 public Collection<E> makeConfirmedCollection() {
72 return new HashSet<>();
73 }
74
75
76
77
78 @Override
79 public Collection<E> makeConfirmedFullCollection() {
80 return new HashSet<>(Arrays.asList(getFullElements()));
81 }
82
83
84
85 @Override
86 public Collection<E> makeFullCollection() {
87 final CompositeCollection<E> compositeCollection = new CompositeCollection<>();
88 final E[] elements = getFullElements();
89 for (final E element : elements) {
90 final Collection<E> summand = new HashSet<>();
91 summand.add(element);
92 compositeCollection.addComposited(summand);
93 }
94 return compositeCollection;
95 }
96
97
98
99 @Override
100 public Collection<E> makeObject() {
101 return new CompositeCollection<>();
102 }
103
104 @SuppressWarnings("serial")
105 protected void setUpMutatorTest() {
106 setUpTest();
107 c.setMutator(new CompositeCollection.CollectionMutator<E>() {
108
109 private static final long serialVersionUID = 1L;
110
111 @Override
112 public boolean add(final CompositeCollection<E> composite, final List<Collection<E>> collections, final E obj) {
113 for (final Collection<E> coll : collections) {
114 coll.add(obj);
115 }
116 return true;
117 }
118
119 @Override
120 public boolean addAll(final CompositeCollection<E> composite,
121 final List<Collection<E>> collections, final Collection<? extends E> coll) {
122 for (final Collection<E> collection : collections) {
123 collection.addAll(coll);
124 }
125 return true;
126 }
127
128 @Override
129 public boolean remove(final CompositeCollection<E> composite,
130 final List<Collection<E>> collections, final Object obj) {
131 for (final Collection<E> collection : collections) {
132 collection.remove(obj);
133 }
134 return true;
135 }
136 });
137 }
138
139 protected void setUpTest() {
140 c = new CompositeCollection<>();
141 one = new HashSet<>();
142 two = new HashSet<>();
143 }
144
145 @Test
146 @SuppressWarnings({ "unchecked", "serial" })
147 public void testAddAllMutator() {
148 setUpTest();
149 c.setMutator(new CompositeCollection.CollectionMutator<E>() {
150 private static final long serialVersionUID = 1L;
151
152 @Override
153 public boolean add(final CompositeCollection<E> composite,
154 final List<Collection<E>> collections, final E obj) {
155 for (final Collection<E> collection : collections) {
156 collection.add(obj);
157 }
158 return true;
159 }
160
161 @Override
162 public boolean addAll(final CompositeCollection<E> composite,
163 final List<Collection<E>> collections, final Collection<? extends E> coll) {
164 for (final Collection<E> collection : collections) {
165 collection.addAll(coll);
166 }
167 return true;
168 }
169
170 @Override
171 public boolean remove(final CompositeCollection<E> composite,
172 final List<Collection<E>> collections, final Object obj) {
173 return false;
174 }
175 });
176
177 c.addComposited(one);
178 two.add((E) "foo");
179 c.addAll(two);
180 assertTrue(c.contains("foo"));
181 assertTrue(one.contains("foo"));
182 }
183
184 @Test
185 @SuppressWarnings("unchecked")
186 public void testAddAllToCollection() {
187 setUpTest();
188 one.add((E) "1");
189 two.add((E) "2");
190 c.addComposited(one, two);
191 final Collection<E> toCollection = new HashSet<>(c);
192 assertTrue(toCollection.containsAll(c));
193 assertEquals(c.size(), toCollection.size());
194 }
195
196 @Test
197 @SuppressWarnings({ "unchecked", "serial" })
198 public void testAddMutator() {
199 setUpTest();
200 c.setMutator(new CompositeCollection.CollectionMutator<E>() {
201 private static final long serialVersionUID = 1L;
202
203 @Override
204 public boolean add(final CompositeCollection<E> composite,
205 final List<Collection<E>> collections, final E obj) {
206 for (final Collection<E> collection : collections) {
207 collection.add(obj);
208 }
209 return true;
210 }
211
212 @Override
213 public boolean addAll(final CompositeCollection<E> composite,
214 final List<Collection<E>> collections, final Collection<? extends E> coll) {
215 for (final Collection<E> collection : collections) {
216 collection.addAll(coll);
217 }
218 return true;
219 }
220
221 @Override
222 public boolean remove(final CompositeCollection<E> composite,
223 final List<Collection<E>> collections, final Object obj) {
224 return false;
225 }
226 });
227
228 c.addComposited(one);
229 c.add((E) "foo");
230 assertTrue(c.contains("foo"));
231 assertTrue(one.contains("foo"));
232 }
233
234 @Test
235 public void testAddNullList() {
236 final ArrayList<String> nullList = null;
237 final CompositeCollection<String> cc = new CompositeCollection<>();
238 cc.addComposited(nullList);
239 assertEquals(0, cc.size());
240 }
241
242 @Test
243 public void testAddNullLists2Args() {
244 final ArrayList<String> nullList = null;
245 final CompositeCollection<String> cc = new CompositeCollection<>();
246 cc.addComposited(nullList, nullList);
247 assertEquals(0, cc.size());
248 }
249
250 @Test
251 public void testAddNullListsVarArgs() {
252 final ArrayList<String> nullList = null;
253 final CompositeCollection<String> cc = new CompositeCollection<>();
254 cc.addComposited(nullList, nullList, nullList);
255 assertEquals(0, cc.size());
256 }
257
258 @Test
259 @SuppressWarnings("unchecked")
260 public void testClear() {
261 setUpTest();
262 one.add((E) "1");
263 two.add((E) "2");
264 c.addComposited(one, two);
265 c.clear();
266 assertTrue(one.isEmpty());
267 assertTrue(two.isEmpty());
268 assertTrue(c.isEmpty());
269 }
270
271 @Test
272 @SuppressWarnings("unchecked")
273 public void testContainsAll() {
274 setUpTest();
275 one.add((E) "1");
276 two.add((E) "1");
277 c.addComposited(one);
278 assertTrue(c.containsAll(two));
279 assertFalse(c.containsAll(null));
280 }
281
282 @Test
283 @SuppressWarnings("unchecked")
284 public void testIsEmpty() {
285 setUpTest();
286 assertTrue(c.isEmpty());
287 final HashSet<E> empty = new HashSet<>();
288 c.addComposited(empty);
289 assertTrue(c.isEmpty());
290 empty.add((E) "a");
291 assertFalse(c.isEmpty());
292 }
293
294 @Test
295 @SuppressWarnings("unchecked")
296 public void testIterator() {
297 setUpTest();
298 one.add((E) "1");
299 two.add((E) "2");
300 c.addComposited(one);
301 c.addComposited(two);
302 final Iterator<E> i = c.iterator();
303 E next = i.next();
304 assertTrue(c.contains(next));
305 assertTrue(one.contains(next));
306 next = i.next();
307 i.remove();
308 assertFalse(c.contains(next));
309 assertFalse(two.contains(next));
310 }
311
312 @Test
313 @SuppressWarnings("unchecked")
314 public void testMultipleCollectionsSize() {
315 setUpTest();
316 final HashSet<E> set = new HashSet<>();
317 set.add((E) "a");
318 set.add((E) "b");
319 c.addComposited(set);
320 final HashSet<E> other = new HashSet<>();
321 other.add((E) "c");
322 c.addComposited(other);
323 assertEquals(set.size() + other.size(), c.size());
324 }
325
326 @Test
327 @SuppressWarnings("unchecked")
328 public void testRemove() {
329 setUpMutatorTest();
330 one.add((E) "1");
331 two.add((E) "2");
332 two.add((E) "1");
333 c.addComposited(one, two);
334 c.remove("1");
335 assertFalse(c.contains("1"));
336 assertFalse(one.contains("1"));
337 assertFalse(two.contains("1"));
338 }
339
340 @Test
341 @SuppressWarnings("unchecked")
342 public void testRemoveAll() {
343 setUpMutatorTest();
344 one.add((E) "1");
345 two.add((E) "2");
346 two.add((E) "1");
347
348 final Collection<E> removing = new ArrayList<>(one);
349 c.addComposited(one, two);
350 c.removeAll(removing);
351 assertFalse(c.contains("1"));
352 assertFalse(one.contains("1"));
353 assertFalse(two.contains("1"));
354 c.removeAll(null);
355 assertFalse(c.contains("1"));
356 assertFalse(one.contains("1"));
357 assertFalse(two.contains("1"));
358 }
359
360 @Test
361 @SuppressWarnings("unchecked")
362 public void testRemoveComposited() {
363 setUpMutatorTest();
364 one.add((E) "1");
365 two.add((E) "2");
366 two.add((E) "1");
367 c.addComposited(one, two);
368 c.removeComposited(one);
369 assertTrue(c.contains("1"));
370 assertEquals(2, c.size());
371 }
372
373
374
375 @Test
376 @SuppressWarnings("unchecked")
377 public void testRemoveIf() {
378 setUpMutatorTest();
379 one.add((E) "1");
380 two.add((E) "2");
381 two.add((E) "1");
382
383 final Predicate<E> predicate = "1"::equals;
384 c.addComposited(one, two);
385 c.removeIf(predicate);
386 assertFalse(c.contains("1"));
387 assertFalse(one.contains("1"));
388 assertFalse(two.contains("1"));
389 c.removeIf(null);
390 assertFalse(c.contains("1"));
391 assertFalse(one.contains("1"));
392 assertFalse(two.contains("1"));
393 }
394
395 @Test
396 @SuppressWarnings("unchecked")
397 public void testRetainAll() {
398 setUpTest();
399 one.add((E) "1");
400 one.add((E) "2");
401 two.add((E) "1");
402 c.addComposited(one);
403 c.retainAll(two);
404 assertFalse(c.contains("2"));
405 assertFalse(one.contains("2"));
406 assertTrue(c.contains("1"));
407 assertTrue(one.contains("1"));
408 c.retainAll(null);
409 assertFalse(c.contains("2"));
410 assertFalse(one.contains("2"));
411 assertTrue(c.contains("1"));
412 assertTrue(one.contains("1"));
413 }
414
415 @Test
416 @SuppressWarnings("unchecked")
417 public void testSize() {
418 setUpTest();
419 final HashSet<E> set = new HashSet<>();
420 set.add((E) "a");
421 set.add((E) "b");
422 c.addComposited(set);
423 assertEquals(set.size(), c.size());
424 }
425
426 @Test
427 @SuppressWarnings("unchecked")
428 public void testToCollection() {
429 setUpTest();
430 one.add((E) "1");
431 two.add((E) "2");
432 c.addComposited(one, two);
433 final Collection<E> foo = c.toCollection();
434 assertTrue(foo.containsAll(c));
435 assertEquals(c.size(), foo.size());
436 one.add((E) "3");
437 assertFalse(foo.containsAll(c));
438 }
439
440
441
442
443
444 @Test
445 @Override
446 public void testUnsupportedRemove() {
447 resetFull();
448
449 assertThrows(UnsupportedOperationException.class, () -> getCollection().remove(null));
450
451 verify();
452 }
453
454
455
456
457
458
459
460
461 }