1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.multiset;
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.Set;
25
26 import org.apache.commons.collections4.MultiSet;
27 import org.apache.commons.collections4.Predicate;
28 import org.apache.commons.collections4.functors.TruePredicate;
29 import org.junit.jupiter.api.Test;
30
31
32
33
34
35 public class PredicatedMultiSetTest<T> extends AbstractMultiSetTest<T> {
36
37 protected Predicate<T> truePredicate = TruePredicate.<T>truePredicate();
38
39 protected MultiSet<T> decorateMultiSet(final HashMultiSet<T> multiset, final Predicate<T> predicate) {
40 return PredicatedMultiSet.predicatedMultiSet(multiset, predicate);
41 }
42
43 @Override
44 public String getCompatibilityVersion() {
45 return "4.1";
46 }
47
48 @Override
49 protected int getIterationBehaviour() {
50 return UNORDERED;
51 }
52
53 @Override
54 public MultiSet<T> makeObject() {
55 return decorateMultiSet(new HashMultiSet<>(), truePredicate);
56 }
57
58 protected MultiSet<T> makeTestMultiSet() {
59 return decorateMultiSet(new HashMultiSet<>(), stringPredicate());
60 }
61
62 protected Predicate<T> stringPredicate() {
63 return String.class::isInstance;
64 }
65
66 @Test
67 @SuppressWarnings("unchecked")
68 public void testIllegalAdd() {
69 final MultiSet<T> multiset = makeTestMultiSet();
70 final Integer i = Integer.valueOf(3);
71 assertThrows(IllegalArgumentException.class, () -> multiset.add((T) i),
72 "Integer should fail string predicate.");
73 assertFalse(multiset.contains(i), "Collection shouldn't contain illegal element");
74 }
75
76 @Test
77 @SuppressWarnings("unchecked")
78 public void testIllegalDecorate() {
79 final HashMultiSet<Object> elements = new HashMultiSet<>();
80 elements.add("one");
81 elements.add("two");
82 elements.add(Integer.valueOf(3));
83 elements.add("four");
84 assertThrows(IllegalArgumentException.class, () -> decorateMultiSet((HashMultiSet<T>) elements, stringPredicate()),
85 "MultiSet contains an element that should fail the predicate.");
86 assertThrows(NullPointerException.class, () -> decorateMultiSet(new HashMultiSet<>(), null),
87 "Expecting NullPointerException for null predicate.");
88 }
89
90 @Test
91 @SuppressWarnings("unchecked")
92 public void testLegalAddRemove() {
93 final MultiSet<T> multiset = makeTestMultiSet();
94 assertEquals(0, multiset.size());
95 final T[] els = (T[]) new Object[] { "1", "3", "5", "7", "2", "4", "1" };
96 for (int i = 0; i < els.length; i++) {
97 multiset.add(els[i]);
98 assertEquals(i + 1, multiset.size());
99 assertTrue(multiset.contains(els[i]));
100 }
101 Set<T> set = ((PredicatedMultiSet<T>) multiset).uniqueSet();
102 assertTrue(set.contains(els[0]), "Unique set contains the first element");
103 assertTrue(multiset.remove(els[0]));
104 set = ((PredicatedMultiSet<T>) multiset).uniqueSet();
105 assertTrue(set.contains(els[0]),
106 "Unique set does not contain anymore the first element");
107 }
108
109
110
111
112
113
114
115
116 }