1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.set;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertSame;
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.Collection;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Set;
30
31 import org.apache.commons.collections4.IteratorUtils;
32 import org.junit.jupiter.api.Test;
33
34
35
36
37
38 public class ListOrderedSetTest<E>
39 extends AbstractSetTest<E> {
40
41 static class A {
42
43 @Override
44 public boolean equals(final Object obj) {
45 return obj instanceof A || obj instanceof B;
46 }
47
48 @Override
49 public int hashCode() {
50 return 1;
51 }
52 }
53
54 static class B {
55
56 @Override
57 public boolean equals(final Object obj) {
58 return obj instanceof A || obj instanceof B;
59 }
60
61 @Override
62 public int hashCode() {
63 return 1;
64 }
65 }
66
67 private static final Integer ZERO = Integer.valueOf(0);
68
69 private static final Integer ONE = Integer.valueOf(1);
70
71 private static final Integer TWO = Integer.valueOf(2);
72
73 private static final Integer THREE = Integer.valueOf(3);
74
75 @Override
76 public String getCompatibilityVersion() {
77 return "4";
78 }
79
80 @Override
81 public ListOrderedSet<E> makeObject() {
82 return ListOrderedSet.listOrderedSet(new HashSet<>());
83 }
84
85 @SuppressWarnings("unchecked")
86 protected ListOrderedSet<E> setupSet() {
87 final ListOrderedSet<E> set = makeObject();
88
89 for (int i = 0; i < 10; i++) {
90 set.add((E) Integer.toString(i));
91 }
92 return set;
93 }
94
95 @Test
96 public void testDecorator() {
97 assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet((List<E>) null));
98 assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet((Set<E>) null));
99 assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(null, null));
100 assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(new HashSet<>(), null));
101 assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(null, new ArrayList<>()));
102 }
103
104 @Test
105 @SuppressWarnings("unchecked")
106 public void testDuplicates() {
107 final List<E> list = new ArrayList<>(10);
108 list.add((E) Integer.valueOf(1));
109 list.add((E) Integer.valueOf(2));
110 list.add((E) Integer.valueOf(3));
111 list.add((E) Integer.valueOf(1));
112
113 final ListOrderedSet<E> orderedSet = ListOrderedSet.listOrderedSet(list);
114
115 assertEquals(3, orderedSet.size());
116 assertEquals(3, IteratorUtils.toArray(orderedSet.iterator()).length);
117
118
119 assertEquals(Integer.valueOf(1), orderedSet.get(0));
120 assertEquals(Integer.valueOf(2), orderedSet.get(1));
121 assertEquals(Integer.valueOf(3), orderedSet.get(2));
122 }
123
124 @Test
125 @SuppressWarnings("unchecked")
126 public void testListAddIndexed() {
127 final ListOrderedSet<E> set = makeObject();
128 set.add((E) ZERO);
129 set.add((E) TWO);
130
131 set.add(1, (E) ONE);
132 assertEquals(3, set.size());
133 assertSame(ZERO, set.get(0));
134 assertSame(ONE, set.get(1));
135 assertSame(TWO, set.get(2));
136
137 set.add(0, (E) ONE);
138 assertEquals(3, set.size());
139 assertSame(ZERO, set.get(0));
140 assertSame(ONE, set.get(1));
141 assertSame(TWO, set.get(2));
142
143 final List<E> list = new ArrayList<>();
144 list.add((E) ZERO);
145 list.add((E) TWO);
146
147 set.addAll(0, list);
148 assertEquals(3, set.size());
149 assertSame(ZERO, set.get(0));
150 assertSame(ONE, set.get(1));
151 assertSame(TWO, set.get(2));
152
153 list.add(0, (E) THREE);
154 set.remove(TWO);
155 set.addAll(1, list);
156 assertEquals(4, set.size());
157 assertSame(ZERO, set.get(0));
158 assertSame(THREE, set.get(1));
159 assertSame(TWO, set.get(2));
160 assertSame(ONE, set.get(3));
161 }
162
163 @Test
164 @SuppressWarnings("unchecked")
165 public void testListAddRemove() {
166 final ListOrderedSet<E> set = makeObject();
167 final List<E> view = set.asList();
168 set.add((E) ZERO);
169 set.add((E) ONE);
170 set.add((E) TWO);
171
172 assertEquals(3, set.size());
173 assertSame(ZERO, set.get(0));
174 assertSame(ONE, set.get(1));
175 assertSame(TWO, set.get(2));
176 assertEquals(3, view.size());
177 assertSame(ZERO, view.get(0));
178 assertSame(ONE, view.get(1));
179 assertSame(TWO, view.get(2));
180
181 assertEquals(0, set.indexOf(ZERO));
182 assertEquals(1, set.indexOf(ONE));
183 assertEquals(2, set.indexOf(TWO));
184
185 set.remove(1);
186 assertEquals(2, set.size());
187 assertSame(ZERO, set.get(0));
188 assertSame(TWO, set.get(1));
189 assertEquals(2, view.size());
190 assertSame(ZERO, view.get(0));
191 assertSame(TWO, view.get(1));
192 }
193
194 @Test
195 @SuppressWarnings("unchecked")
196 public void testListAddReplacing() {
197 final ListOrderedSet<E> set = makeObject();
198 final A a = new A();
199 final B b = new B();
200 set.add((E) a);
201 assertEquals(1, set.size());
202 set.add((E) b);
203 assertEquals(1, set.size());
204 assertSame(a, set.decorated().iterator().next());
205 assertSame(a, set.iterator().next());
206 assertSame(a, set.get(0));
207 assertSame(a, set.asList().get(0));
208 }
209
210 @Test
211 @SuppressWarnings("unchecked")
212 public void testOrdering() {
213 final ListOrderedSet<E> set = setupSet();
214 Iterator<E> it = set.iterator();
215
216 for (int i = 0; i < 10; i++) {
217 assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
218 }
219
220 for (int i = 0; i < 10; i += 2) {
221 assertTrue(set.remove(Integer.toString(i)),
222 "Must be able to remove int");
223 }
224
225 it = set.iterator();
226 for (int i = 1; i < 10; i += 2) {
227 assertEquals(Integer.toString(i), it.next(),
228 "Sequence is wrong after remove ");
229 }
230
231 for (int i = 0; i < 10; i++) {
232 set.add((E) Integer.toString(i));
233 }
234
235 assertEquals(10, set.size(), "Size of set is wrong!");
236
237 it = set.iterator();
238 for (int i = 1; i < 10; i += 2) {
239 assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
240 }
241 for (int i = 0; i < 10; i += 2) {
242 assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
243 }
244 }
245
246 @Test
247 @SuppressWarnings("unchecked")
248 public void testRetainAll() {
249 final List<E> list = new ArrayList<>(10);
250 final Set<E> set = new HashSet<>(10);
251 final ListOrderedSet<E> orderedSet = ListOrderedSet.listOrderedSet(set, list);
252 for (int i = 0; i < 10; ++i) {
253 orderedSet.add((E) Integer.valueOf(10 - i - 1));
254 }
255
256 final Collection<E> retained = new ArrayList<>(5);
257 for (int i = 0; i < 5; ++i) {
258 retained.add((E) Integer.valueOf(i * 2));
259 }
260
261 assertTrue(orderedSet.retainAll(retained));
262 assertEquals(5, orderedSet.size());
263
264 assertEquals(Integer.valueOf(8), orderedSet.get(0));
265 assertEquals(Integer.valueOf(6), orderedSet.get(1));
266 assertEquals(Integer.valueOf(4), orderedSet.get(2));
267 assertEquals(Integer.valueOf(2), orderedSet.get(3));
268 assertEquals(Integer.valueOf(0), orderedSet.get(4));
269 }
270
271
272
273
274
275
276
277
278 }