ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CopyOnWriteArraySetTest.java
Revision: 1.36
Committed: Wed Aug 10 01:28:14 2016 UTC (7 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +3 -3 lines
Log Message:
introduce shuffle(T[]) utility method

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.6 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.17 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.8 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.25 import java.util.ArrayList;
10 jsr166 1.19 import java.util.Arrays;
11 jsr166 1.22 import java.util.Collection;
12 jsr166 1.21 import java.util.Collections;
13 jsr166 1.19 import java.util.Iterator;
14 jsr166 1.24 import java.util.NoSuchElementException;
15 jsr166 1.19 import java.util.Set;
16     import java.util.concurrent.CopyOnWriteArraySet;
17 dl 1.1
18 jsr166 1.28 import junit.framework.Test;
19     import junit.framework.TestSuite;
20    
21 dl 1.3 public class CopyOnWriteArraySetTest extends JSR166TestCase {
22 dl 1.1 public static void main(String[] args) {
23 jsr166 1.32 main(suite(), args);
24 dl 1.1 }
25     public static Test suite() {
26 jsr166 1.11 return new TestSuite(CopyOnWriteArraySetTest.class);
27 dl 1.1 }
28    
29 jsr166 1.21 static CopyOnWriteArraySet<Integer> populatedSet(int n) {
30     CopyOnWriteArraySet<Integer> a = new CopyOnWriteArraySet<Integer>();
31 dl 1.1 assertTrue(a.isEmpty());
32 jsr166 1.22 for (int i = 0; i < n; i++)
33 jsr166 1.21 a.add(i);
34 jsr166 1.31 assertEquals(n == 0, a.isEmpty());
35 dl 1.1 assertEquals(n, a.size());
36     return a;
37     }
38    
39 jsr166 1.21 static CopyOnWriteArraySet populatedSet(Integer[] elements) {
40     CopyOnWriteArraySet<Integer> a = new CopyOnWriteArraySet<Integer>();
41     assertTrue(a.isEmpty());
42     for (int i = 0; i < elements.length; i++)
43     a.add(elements[i]);
44     assertFalse(a.isEmpty());
45     assertEquals(elements.length, a.size());
46     return a;
47     }
48    
49 dl 1.4 /**
50     * Default-constructed set is empty
51     */
52 dl 1.3 public void testConstructor() {
53 jsr166 1.11 CopyOnWriteArraySet a = new CopyOnWriteArraySet();
54 dl 1.3 assertTrue(a.isEmpty());
55     }
56    
57 dl 1.4 /**
58 dl 1.5 * Collection-constructed set holds all of its elements
59 dl 1.4 */
60 dl 1.3 public void testConstructor3() {
61     Integer[] ints = new Integer[SIZE];
62 jsr166 1.34 for (int i = 0; i < SIZE - 1; ++i)
63 dl 1.3 ints[i] = new Integer(i);
64 jsr166 1.11 CopyOnWriteArraySet a = new CopyOnWriteArraySet(Arrays.asList(ints));
65 jsr166 1.8 for (int i = 0; i < SIZE; ++i)
66 dl 1.3 assertTrue(a.contains(ints[i]));
67     }
68 jsr166 1.8
69 dl 1.1 /**
70 jsr166 1.31 * addAll adds each non-duplicate element from the given collection
71 dl 1.1 */
72 dl 1.4 public void testAddAll() {
73 jsr166 1.31 Set full = populatedSet(3);
74 jsr166 1.30 assertTrue(full.addAll(Arrays.asList(three, four, five)));
75     assertEquals(6, full.size());
76     assertFalse(full.addAll(Arrays.asList(three, four, five)));
77 jsr166 1.11 assertEquals(6, full.size());
78 dl 1.1 }
79    
80     /**
81 jsr166 1.31 * addAll adds each non-duplicate element from the given collection
82 dl 1.1 */
83 dl 1.4 public void testAddAll2() {
84 jsr166 1.31 Set full = populatedSet(3);
85 jsr166 1.30 // "one" is duplicate and will not be added
86     assertTrue(full.addAll(Arrays.asList(three, four, one)));
87     assertEquals(5, full.size());
88     assertFalse(full.addAll(Arrays.asList(three, four, one)));
89 jsr166 1.11 assertEquals(5, full.size());
90 dl 1.1 }
91    
92     /**
93 jsr166 1.16 * add will not add the element if it already exists in the set
94 dl 1.1 */
95 dl 1.4 public void testAdd2() {
96 jsr166 1.31 Set full = populatedSet(3);
97 jsr166 1.11 full.add(one);
98     assertEquals(3, full.size());
99 dl 1.1 }
100    
101     /**
102 jsr166 1.16 * add adds the element when it does not exist in the set
103 dl 1.1 */
104 dl 1.4 public void testAdd3() {
105 jsr166 1.31 Set full = populatedSet(3);
106 dl 1.3 full.add(three);
107     assertTrue(full.contains(three));
108 dl 1.1 }
109    
110     /**
111 jsr166 1.16 * clear removes all elements from the set
112 dl 1.1 */
113 dl 1.4 public void testClear() {
114 jsr166 1.31 Collection full = populatedSet(3);
115 jsr166 1.11 full.clear();
116     assertEquals(0, full.size());
117 jsr166 1.31 assertTrue(full.isEmpty());
118 dl 1.1 }
119    
120     /**
121 jsr166 1.16 * contains returns true for added elements
122 dl 1.1 */
123 dl 1.4 public void testContains() {
124 jsr166 1.31 Collection full = populatedSet(3);
125 jsr166 1.11 assertTrue(full.contains(one));
126     assertFalse(full.contains(five));
127 dl 1.1 }
128    
129 dl 1.4 /**
130     * Sets with equal elements are equal
131     */
132 dl 1.1 public void testEquals() {
133 jsr166 1.11 CopyOnWriteArraySet a = populatedSet(3);
134     CopyOnWriteArraySet b = populatedSet(3);
135 dl 1.1 assertTrue(a.equals(b));
136     assertTrue(b.equals(a));
137 jsr166 1.35 assertTrue(a.containsAll(b));
138     assertTrue(b.containsAll(a));
139 dl 1.1 assertEquals(a.hashCode(), b.hashCode());
140 jsr166 1.35 assertEquals(a.size(), b.size());
141    
142 dl 1.3 a.add(m1);
143 dl 1.1 assertFalse(a.equals(b));
144     assertFalse(b.equals(a));
145 jsr166 1.35 assertTrue(a.containsAll(b));
146     assertFalse(b.containsAll(a));
147 dl 1.3 b.add(m1);
148 dl 1.1 assertTrue(a.equals(b));
149     assertTrue(b.equals(a));
150 jsr166 1.35 assertTrue(a.containsAll(b));
151     assertTrue(b.containsAll(a));
152     assertEquals(a.hashCode(), b.hashCode());
153    
154     Object x = a.iterator().next();
155     a.remove(x);
156     assertFalse(a.equals(b));
157     assertFalse(b.equals(a));
158     assertFalse(a.containsAll(b));
159     assertTrue(b.containsAll(a));
160     a.add(x);
161     assertTrue(a.equals(b));
162     assertTrue(b.equals(a));
163     assertTrue(a.containsAll(b));
164     assertTrue(b.containsAll(a));
165 dl 1.1 assertEquals(a.hashCode(), b.hashCode());
166 jsr166 1.35 assertEquals(a.size(), b.size());
167    
168     CopyOnWriteArraySet empty1 = new CopyOnWriteArraySet(Arrays.asList());
169     CopyOnWriteArraySet empty2 = new CopyOnWriteArraySet(Arrays.asList());
170     assertTrue(empty1.equals(empty1));
171     assertTrue(empty1.equals(empty2));
172    
173     assertFalse(empty1.equals(a));
174     assertFalse(a.equals(empty1));
175    
176     assertFalse(a.equals(null));
177 dl 1.1 }
178    
179     /**
180 jsr166 1.16 * containsAll returns true for collections with subset of elements
181 dl 1.1 */
182 dl 1.4 public void testContainsAll() {
183 jsr166 1.31 Collection full = populatedSet(3);
184 jsr166 1.35 assertTrue(full.containsAll(full));
185 jsr166 1.30 assertTrue(full.containsAll(Arrays.asList()));
186     assertTrue(full.containsAll(Arrays.asList(one)));
187     assertTrue(full.containsAll(Arrays.asList(one, two)));
188     assertFalse(full.containsAll(Arrays.asList(one, two, six)));
189     assertFalse(full.containsAll(Arrays.asList(six)));
190 jsr166 1.35
191     CopyOnWriteArraySet empty1 = new CopyOnWriteArraySet(Arrays.asList());
192     CopyOnWriteArraySet empty2 = new CopyOnWriteArraySet(Arrays.asList());
193     assertTrue(empty1.containsAll(empty2));
194     assertTrue(empty1.containsAll(empty1));
195     assertFalse(empty1.containsAll(full));
196     assertTrue(full.containsAll(empty1));
197    
198     try {
199     full.containsAll(null);
200     shouldThrow();
201     } catch (NullPointerException success) {}
202 dl 1.1 }
203    
204     /**
205 jsr166 1.16 * isEmpty is true when empty, else false
206 dl 1.1 */
207 dl 1.4 public void testIsEmpty() {
208 jsr166 1.31 assertTrue(populatedSet(0).isEmpty());
209     assertFalse(populatedSet(3).isEmpty());
210 dl 1.1 }
211    
212     /**
213 jsr166 1.24 * iterator() returns an iterator containing the elements of the
214     * set in insertion order
215 dl 1.1 */
216 dl 1.4 public void testIterator() {
217 jsr166 1.25 Collection empty = new CopyOnWriteArraySet();
218 jsr166 1.24 assertFalse(empty.iterator().hasNext());
219     try {
220     empty.iterator().next();
221     shouldThrow();
222     } catch (NoSuchElementException success) {}
223    
224     Integer[] elements = new Integer[SIZE];
225     for (int i = 0; i < SIZE; i++)
226     elements[i] = i;
227 jsr166 1.36 shuffle(elements);
228 jsr166 1.24 Collection<Integer> full = populatedSet(elements);
229    
230     Iterator it = full.iterator();
231     for (int j = 0; j < SIZE; j++) {
232     assertTrue(it.hasNext());
233     assertEquals(elements[j], it.next());
234     }
235 jsr166 1.29 assertIteratorExhausted(it);
236     }
237    
238     /**
239     * iterator of empty collection has no elements
240     */
241     public void testEmptyIterator() {
242     assertIteratorExhausted(new CopyOnWriteArraySet().iterator());
243 dl 1.1 }
244    
245 dl 1.4 /**
246     * iterator remove is unsupported
247     */
248 jsr166 1.15 public void testIteratorRemove() {
249 jsr166 1.31 Collection full = populatedSet(3);
250 dl 1.1 Iterator it = full.iterator();
251     it.next();
252     try {
253     it.remove();
254 dl 1.4 shouldThrow();
255 jsr166 1.12 } catch (UnsupportedOperationException success) {}
256 dl 1.1 }
257    
258 dl 1.4 /**
259     * toString holds toString of elements
260     */
261     public void testToString() {
262 jsr166 1.25 assertEquals("[]", new CopyOnWriteArraySet().toString());
263 jsr166 1.31 Collection full = populatedSet(3);
264 dl 1.1 String s = full.toString();
265 jsr166 1.25 for (int i = 0; i < 3; ++i)
266 jsr166 1.18 assertTrue(s.contains(String.valueOf(i)));
267 jsr166 1.25 assertEquals(new ArrayList(full).toString(),
268     full.toString());
269 jsr166 1.8 }
270 dl 1.1
271     /**
272 jsr166 1.16 * removeAll removes all elements from the given collection
273 dl 1.1 */
274 dl 1.4 public void testRemoveAll() {
275 jsr166 1.31 Set full = populatedSet(3);
276 jsr166 1.30 assertTrue(full.removeAll(Arrays.asList(one, two)));
277     assertEquals(1, full.size());
278     assertFalse(full.removeAll(Arrays.asList(one, two)));
279 jsr166 1.11 assertEquals(1, full.size());
280 dl 1.1 }
281    
282 dl 1.4 /**
283     * remove removes an element
284     */
285     public void testRemove() {
286 jsr166 1.31 Collection full = populatedSet(3);
287 jsr166 1.11 full.remove(one);
288 dl 1.3 assertFalse(full.contains(one));
289 jsr166 1.11 assertEquals(2, full.size());
290 dl 1.1 }
291    
292     /**
293 jsr166 1.16 * size returns the number of elements
294 dl 1.1 */
295 dl 1.4 public void testSize() {
296 jsr166 1.31 Collection empty = new CopyOnWriteArraySet();
297     Collection full = populatedSet(3);
298 jsr166 1.11 assertEquals(3, full.size());
299     assertEquals(0, empty.size());
300 dl 1.1 }
301    
302     /**
303 jsr166 1.21 * toArray() returns an Object array containing all elements from
304     * the set in insertion order
305 dl 1.1 */
306 dl 1.4 public void testToArray() {
307 jsr166 1.21 Object[] a = new CopyOnWriteArraySet().toArray();
308     assertTrue(Arrays.equals(new Object[0], a));
309     assertSame(Object[].class, a.getClass());
310    
311     Integer[] elements = new Integer[SIZE];
312 jsr166 1.20 for (int i = 0; i < SIZE; i++)
313 jsr166 1.21 elements[i] = i;
314 jsr166 1.36 shuffle(elements);
315 jsr166 1.22 Collection<Integer> full = populatedSet(elements);
316 jsr166 1.21
317     assertTrue(Arrays.equals(elements, full.toArray()));
318     assertSame(Object[].class, full.toArray().getClass());
319 dl 1.1 }
320    
321     /**
322 jsr166 1.21 * toArray(Integer array) returns an Integer array containing all
323     * elements from the set in insertion order
324 dl 1.1 */
325 dl 1.4 public void testToArray2() {
326 jsr166 1.22 Collection empty = new CopyOnWriteArraySet();
327 jsr166 1.21 Integer[] a;
328    
329     a = new Integer[0];
330     assertSame(a, empty.toArray(a));
331    
332 jsr166 1.34 a = new Integer[SIZE / 2];
333 jsr166 1.21 Arrays.fill(a, 42);
334     assertSame(a, empty.toArray(a));
335     assertNull(a[0]);
336     for (int i = 1; i < a.length; i++)
337     assertEquals(42, (int) a[i]);
338    
339     Integer[] elements = new Integer[SIZE];
340 jsr166 1.20 for (int i = 0; i < SIZE; i++)
341 jsr166 1.21 elements[i] = i;
342 jsr166 1.36 shuffle(elements);
343 jsr166 1.22 Collection<Integer> full = populatedSet(elements);
344 jsr166 1.21
345     Arrays.fill(a, 42);
346     assertTrue(Arrays.equals(elements, full.toArray(a)));
347     for (int i = 0; i < a.length; i++)
348     assertEquals(42, (int) a[i]);
349     assertSame(Integer[].class, full.toArray(a).getClass());
350    
351     a = new Integer[SIZE];
352     Arrays.fill(a, 42);
353     assertSame(a, full.toArray(a));
354     assertTrue(Arrays.equals(elements, a));
355    
356 jsr166 1.34 a = new Integer[2 * SIZE];
357 jsr166 1.21 Arrays.fill(a, 42);
358     assertSame(a, full.toArray(a));
359     assertTrue(Arrays.equals(elements, Arrays.copyOf(a, SIZE)));
360     assertNull(a[SIZE]);
361     for (int i = SIZE + 1; i < a.length; i++)
362     assertEquals(42, (int) a[i]);
363 dl 1.1 }
364    
365     /**
366 jsr166 1.16 * toArray throws an ArrayStoreException when the given array can
367     * not store the objects inside the set
368 dl 1.1 */
369 dl 1.4 public void testToArray_ArrayStoreException() {
370 jsr166 1.33 CopyOnWriteArraySet c = new CopyOnWriteArraySet();
371     c.add("zfasdfsdf");
372     c.add("asdadasd");
373 dl 1.4 try {
374 dl 1.1 c.toArray(new Long[5]);
375 jsr166 1.11 shouldThrow();
376 jsr166 1.13 } catch (ArrayStoreException success) {}
377 dl 1.2 }
378    
379 dl 1.4 /**
380 dl 1.7 * A deserialized serialized set is equal
381 dl 1.4 */
382 jsr166 1.12 public void testSerialization() throws Exception {
383 jsr166 1.19 Set x = populatedSet(SIZE);
384     Set y = serialClone(x);
385 dl 1.2
386 jsr166 1.27 assertNotSame(y, x);
387 jsr166 1.19 assertEquals(x.size(), y.size());
388 jsr166 1.23 assertEquals(x.toString(), y.toString());
389     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
390 jsr166 1.19 assertEquals(x, y);
391     assertEquals(y, x);
392 dl 1.1 }
393    
394 jsr166 1.26 /**
395     * addAll is idempotent
396     */
397     public void testAddAll_idempotent() throws Exception {
398     Set x = populatedSet(SIZE);
399     Set y = new CopyOnWriteArraySet(x);
400     y.addAll(x);
401     assertEquals(x, y);
402     assertEquals(y, x);
403     }
404    
405 dl 1.1 }