ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CopyOnWriteArraySetTest.java
Revision: 1.24
Committed: Tue Nov 29 20:59:24 2011 UTC (12 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.23: +26 -7 lines
Log Message:
improve testIterator

File Contents

# Content
1 /*
2 * 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 * http://creativecommons.org/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.Arrays;
11 import java.util.Collection;
12 import java.util.Collections;
13 import java.util.Iterator;
14 import java.util.NoSuchElementException;
15 import java.util.Set;
16 import java.util.Vector;
17 import java.util.concurrent.CopyOnWriteArraySet;
18
19 public class CopyOnWriteArraySetTest extends JSR166TestCase {
20 public static void main(String[] args) {
21 junit.textui.TestRunner.run(suite());
22 }
23 public static Test suite() {
24 return new TestSuite(CopyOnWriteArraySetTest.class);
25 }
26
27 static CopyOnWriteArraySet<Integer> populatedSet(int n) {
28 CopyOnWriteArraySet<Integer> a = new CopyOnWriteArraySet<Integer>();
29 assertTrue(a.isEmpty());
30 for (int i = 0; i < n; i++)
31 a.add(i);
32 assertFalse(a.isEmpty());
33 assertEquals(n, a.size());
34 return a;
35 }
36
37 static CopyOnWriteArraySet populatedSet(Integer[] elements) {
38 CopyOnWriteArraySet<Integer> a = new CopyOnWriteArraySet<Integer>();
39 assertTrue(a.isEmpty());
40 for (int i = 0; i < elements.length; i++)
41 a.add(elements[i]);
42 assertFalse(a.isEmpty());
43 assertEquals(elements.length, a.size());
44 return a;
45 }
46
47 /**
48 * Default-constructed set is empty
49 */
50 public void testConstructor() {
51 CopyOnWriteArraySet a = new CopyOnWriteArraySet();
52 assertTrue(a.isEmpty());
53 }
54
55 /**
56 * Collection-constructed set holds all of its elements
57 */
58 public void testConstructor3() {
59 Integer[] ints = new Integer[SIZE];
60 for (int i = 0; i < SIZE-1; ++i)
61 ints[i] = new Integer(i);
62 CopyOnWriteArraySet a = new CopyOnWriteArraySet(Arrays.asList(ints));
63 for (int i = 0; i < SIZE; ++i)
64 assertTrue(a.contains(ints[i]));
65 }
66
67 /**
68 * addAll adds each element from the given collection
69 */
70 public void testAddAll() {
71 CopyOnWriteArraySet full = populatedSet(3);
72 Vector v = new Vector();
73 v.add(three);
74 v.add(four);
75 v.add(five);
76 full.addAll(v);
77 assertEquals(6, full.size());
78 }
79
80 /**
81 * addAll adds each element from the given collection that did not
82 * already exist in the set
83 */
84 public void testAddAll2() {
85 CopyOnWriteArraySet full = populatedSet(3);
86 Vector v = new Vector();
87 v.add(three);
88 v.add(four);
89 v.add(one); // will not add this element
90 full.addAll(v);
91 assertEquals(5, full.size());
92 }
93
94 /**
95 * add will not add the element if it already exists in the set
96 */
97 public void testAdd2() {
98 CopyOnWriteArraySet full = populatedSet(3);
99 full.add(one);
100 assertEquals(3, full.size());
101 }
102
103 /**
104 * add adds the element when it does not exist in the set
105 */
106 public void testAdd3() {
107 CopyOnWriteArraySet full = populatedSet(3);
108 full.add(three);
109 assertTrue(full.contains(three));
110 }
111
112 /**
113 * clear removes all elements from the set
114 */
115 public void testClear() {
116 CopyOnWriteArraySet full = populatedSet(3);
117 full.clear();
118 assertEquals(0, full.size());
119 }
120
121 /**
122 * contains returns true for added elements
123 */
124 public void testContains() {
125 CopyOnWriteArraySet full = populatedSet(3);
126 assertTrue(full.contains(one));
127 assertFalse(full.contains(five));
128 }
129
130 /**
131 * Sets with equal elements are equal
132 */
133 public void testEquals() {
134 CopyOnWriteArraySet a = populatedSet(3);
135 CopyOnWriteArraySet b = populatedSet(3);
136 assertTrue(a.equals(b));
137 assertTrue(b.equals(a));
138 assertEquals(a.hashCode(), b.hashCode());
139 a.add(m1);
140 assertFalse(a.equals(b));
141 assertFalse(b.equals(a));
142 b.add(m1);
143 assertTrue(a.equals(b));
144 assertTrue(b.equals(a));
145 assertEquals(a.hashCode(), b.hashCode());
146 }
147
148 /**
149 * containsAll returns true for collections with subset of elements
150 */
151 public void testContainsAll() {
152 CopyOnWriteArraySet full = populatedSet(3);
153 Vector v = new Vector();
154 v.add(one);
155 v.add(two);
156 assertTrue(full.containsAll(v));
157 v.add(six);
158 assertFalse(full.containsAll(v));
159 }
160
161 /**
162 * isEmpty is true when empty, else false
163 */
164 public void testIsEmpty() {
165 CopyOnWriteArraySet empty = new CopyOnWriteArraySet();
166 CopyOnWriteArraySet full = populatedSet(3);
167 assertTrue(empty.isEmpty());
168 assertFalse(full.isEmpty());
169 }
170
171 /**
172 * iterator() returns an iterator containing the elements of the
173 * set in insertion order
174 */
175 public void testIterator() {
176 Set empty = new CopyOnWriteArraySet();
177 assertFalse(empty.iterator().hasNext());
178 try {
179 empty.iterator().next();
180 shouldThrow();
181 } catch (NoSuchElementException success) {}
182
183 Integer[] elements = new Integer[SIZE];
184 for (int i = 0; i < SIZE; i++)
185 elements[i] = i;
186 Collections.shuffle(Arrays.asList(elements));
187 Collection<Integer> full = populatedSet(elements);
188
189 Iterator it = full.iterator();
190 for (int j = 0; j < SIZE; j++) {
191 assertTrue(it.hasNext());
192 assertEquals(elements[j], it.next());
193 }
194 assertFalse(it.hasNext());
195 try {
196 it.next();
197 shouldThrow();
198 } catch (NoSuchElementException success) {}
199 }
200
201 /**
202 * iterator remove is unsupported
203 */
204 public void testIteratorRemove() {
205 CopyOnWriteArraySet full = populatedSet(3);
206 Iterator it = full.iterator();
207 it.next();
208 try {
209 it.remove();
210 shouldThrow();
211 } catch (UnsupportedOperationException success) {}
212 }
213
214 /**
215 * toString holds toString of elements
216 */
217 public void testToString() {
218 CopyOnWriteArraySet full = populatedSet(3);
219 String s = full.toString();
220 for (int i = 0; i < 3; ++i) {
221 assertTrue(s.contains(String.valueOf(i)));
222 }
223 }
224
225 /**
226 * removeAll removes all elements from the given collection
227 */
228 public void testRemoveAll() {
229 CopyOnWriteArraySet full = populatedSet(3);
230 Vector v = new Vector();
231 v.add(one);
232 v.add(two);
233 full.removeAll(v);
234 assertEquals(1, full.size());
235 }
236
237 /**
238 * remove removes an element
239 */
240 public void testRemove() {
241 CopyOnWriteArraySet full = populatedSet(3);
242 full.remove(one);
243 assertFalse(full.contains(one));
244 assertEquals(2, full.size());
245 }
246
247 /**
248 * size returns the number of elements
249 */
250 public void testSize() {
251 CopyOnWriteArraySet empty = new CopyOnWriteArraySet();
252 CopyOnWriteArraySet full = populatedSet(3);
253 assertEquals(3, full.size());
254 assertEquals(0, empty.size());
255 }
256
257 /**
258 * toArray() returns an Object array containing all elements from
259 * the set in insertion order
260 */
261 public void testToArray() {
262 Object[] a = new CopyOnWriteArraySet().toArray();
263 assertTrue(Arrays.equals(new Object[0], a));
264 assertSame(Object[].class, a.getClass());
265
266 Integer[] elements = new Integer[SIZE];
267 for (int i = 0; i < SIZE; i++)
268 elements[i] = i;
269 Collections.shuffle(Arrays.asList(elements));
270 Collection<Integer> full = populatedSet(elements);
271
272 assertTrue(Arrays.equals(elements, full.toArray()));
273 assertSame(Object[].class, full.toArray().getClass());
274 }
275
276 /**
277 * toArray(Integer array) returns an Integer array containing all
278 * elements from the set in insertion order
279 */
280 public void testToArray2() {
281 Collection empty = new CopyOnWriteArraySet();
282 Integer[] a;
283
284 a = new Integer[0];
285 assertSame(a, empty.toArray(a));
286
287 a = new Integer[SIZE/2];
288 Arrays.fill(a, 42);
289 assertSame(a, empty.toArray(a));
290 assertNull(a[0]);
291 for (int i = 1; i < a.length; i++)
292 assertEquals(42, (int) a[i]);
293
294 Integer[] elements = new Integer[SIZE];
295 for (int i = 0; i < SIZE; i++)
296 elements[i] = i;
297 Collections.shuffle(Arrays.asList(elements));
298 Collection<Integer> full = populatedSet(elements);
299
300 Arrays.fill(a, 42);
301 assertTrue(Arrays.equals(elements, full.toArray(a)));
302 for (int i = 0; i < a.length; i++)
303 assertEquals(42, (int) a[i]);
304 assertSame(Integer[].class, full.toArray(a).getClass());
305
306 a = new Integer[SIZE];
307 Arrays.fill(a, 42);
308 assertSame(a, full.toArray(a));
309 assertTrue(Arrays.equals(elements, a));
310
311 a = new Integer[2*SIZE];
312 Arrays.fill(a, 42);
313 assertSame(a, full.toArray(a));
314 assertTrue(Arrays.equals(elements, Arrays.copyOf(a, SIZE)));
315 assertNull(a[SIZE]);
316 for (int i = SIZE + 1; i < a.length; i++)
317 assertEquals(42, (int) a[i]);
318 }
319
320 /**
321 * toArray throws an ArrayStoreException when the given array can
322 * not store the objects inside the set
323 */
324 public void testToArray_ArrayStoreException() {
325 try {
326 CopyOnWriteArraySet c = new CopyOnWriteArraySet();
327 c.add("zfasdfsdf");
328 c.add("asdadasd");
329 c.toArray(new Long[5]);
330 shouldThrow();
331 } catch (ArrayStoreException success) {}
332 }
333
334 /**
335 * A deserialized serialized set is equal
336 */
337 public void testSerialization() throws Exception {
338 Set x = populatedSet(SIZE);
339 Set y = serialClone(x);
340
341 assertTrue(x != y);
342 assertEquals(x.size(), y.size());
343 assertEquals(x.toString(), y.toString());
344 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
345 assertEquals(x, y);
346 assertEquals(y, x);
347 }
348
349 }