ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CopyOnWriteArrayListTest.java
Revision: 1.48
Committed: Tue Apr 3 00:58:28 2018 UTC (6 years, 1 month ago) by jsr166
Branch: MAIN
Changes since 1.47: +172 -322 lines
Log Message:
many small improvements

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.19 * 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.27 import java.util.ArrayList;
10 jsr166 1.22 import java.util.Arrays;
11 jsr166 1.26 import java.util.Collection;
12 jsr166 1.48 import java.util.Collections;
13 jsr166 1.22 import java.util.Iterator;
14     import java.util.List;
15     import java.util.ListIterator;
16 jsr166 1.27 import java.util.NoSuchElementException;
17 jsr166 1.22 import java.util.concurrent.CopyOnWriteArrayList;
18 jsr166 1.48 import java.util.concurrent.ThreadLocalRandom;
19 dl 1.1
20 jsr166 1.31 import junit.framework.Test;
21    
22 jsr166 1.10 public class CopyOnWriteArrayListTest extends JSR166TestCase {
23 jsr166 1.8
24 dl 1.1 public static void main(String[] args) {
25 jsr166 1.34 main(suite(), args);
26 dl 1.1 }
27    
28     public static Test suite() {
29 jsr166 1.40 class Implementation implements CollectionImplementation {
30 jsr166 1.43 public Class<?> klazz() { return CopyOnWriteArrayList.class; }
31 jsr166 1.40 public List emptyCollection() { return new CopyOnWriteArrayList(); }
32     public Object makeElement(int i) { return i; }
33     public boolean isConcurrent() { return true; }
34     public boolean permitsNulls() { return true; }
35     }
36     class SubListImplementation extends Implementation {
37     public List emptyCollection() {
38     return super.emptyCollection().subList(0, 0);
39     }
40     }
41     return newTestSuite(
42     CopyOnWriteArrayListTest.class,
43 jsr166 1.41 CollectionTest.testSuite(new Implementation()),
44     CollectionTest.testSuite(new SubListImplementation()));
45 dl 1.1 }
46    
47 jsr166 1.48 static CopyOnWriteArrayList<Integer> populatedList(int n) {
48     CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
49     assertTrue(list.isEmpty());
50 jsr166 1.26 for (int i = 0; i < n; i++)
51 jsr166 1.48 list.add(i);
52     assertEquals(n <= 0, list.isEmpty());
53     assertEquals(n, list.size());
54     return list;
55 dl 1.1 }
56    
57 jsr166 1.48 static CopyOnWriteArrayList<Integer> populatedList(Integer[] elements) {
58     CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
59     assertTrue(list.isEmpty());
60 jsr166 1.46 for (Integer element : elements)
61 jsr166 1.48 list.add(element);
62     assertFalse(list.isEmpty());
63     assertEquals(elements.length, list.size());
64     return list;
65 jsr166 1.26 }
66    
67 dl 1.4 /**
68 dl 1.5 * a new list is empty
69 dl 1.4 */
70 dl 1.3 public void testConstructor() {
71 jsr166 1.48 List list = new CopyOnWriteArrayList();
72     assertTrue(list.isEmpty());
73 dl 1.3 }
74    
75 dl 1.4 /**
76 dl 1.5 * new list contains all elements of initializing array
77 dl 1.4 */
78 dl 1.3 public void testConstructor2() {
79 jsr166 1.48 Integer[] elts = new Integer[SIZE];
80 jsr166 1.35 for (int i = 0; i < SIZE - 1; ++i)
81 jsr166 1.48 elts[i] = i;
82     List list = new CopyOnWriteArrayList(elts);
83 jsr166 1.8 for (int i = 0; i < SIZE; ++i)
84 jsr166 1.48 assertEquals(elts[i], list.get(i));
85 dl 1.3 }
86    
87 dl 1.4 /**
88 dl 1.5 * new list contains all elements of initializing collection
89 dl 1.4 */
90 dl 1.3 public void testConstructor3() {
91 jsr166 1.48 Integer[] elts = new Integer[SIZE];
92 jsr166 1.35 for (int i = 0; i < SIZE - 1; ++i)
93 jsr166 1.48 elts[i] = i;
94     List list = new CopyOnWriteArrayList(Arrays.asList(elts));
95 jsr166 1.8 for (int i = 0; i < SIZE; ++i)
96 jsr166 1.48 assertEquals(elts[i], list.get(i));
97 dl 1.3 }
98 jsr166 1.8
99 dl 1.1 /**
100 jsr166 1.33 * addAll adds each element from the given collection, including duplicates
101 dl 1.1 */
102 dl 1.4 public void testAddAll() {
103 jsr166 1.48 List list = populatedList(3);
104     assertTrue(list.addAll(Arrays.asList(three, four, five)));
105     assertEquals(6, list.size());
106     assertTrue(list.addAll(Arrays.asList(three, four, five)));
107     assertEquals(9, list.size());
108 dl 1.1 }
109    
110     /**
111 jsr166 1.18 * addAllAbsent adds each element from the given collection that did not
112     * already exist in the List
113 dl 1.1 */
114 dl 1.4 public void testAddAllAbsent() {
115 jsr166 1.48 CopyOnWriteArrayList list = populatedList(3);
116 jsr166 1.33 // "one" is duplicate and will not be added
117 jsr166 1.48 assertEquals(2, list.addAllAbsent(Arrays.asList(three, four, one)));
118     assertEquals(5, list.size());
119     assertEquals(0, list.addAllAbsent(Arrays.asList(three, four, one)));
120     assertEquals(5, list.size());
121 dl 1.1 }
122    
123     /**
124 jsr166 1.18 * addIfAbsent will not add the element if it already exists in the list
125 dl 1.1 */
126 dl 1.4 public void testAddIfAbsent() {
127 jsr166 1.48 CopyOnWriteArrayList list = populatedList(SIZE);
128     list.addIfAbsent(one);
129     assertEquals(SIZE, list.size());
130 dl 1.1 }
131    
132     /**
133 jsr166 1.18 * addIfAbsent adds the element when it does not exist in the list
134 dl 1.1 */
135 dl 1.4 public void testAddIfAbsent2() {
136 jsr166 1.48 CopyOnWriteArrayList list = populatedList(SIZE);
137     list.addIfAbsent(three);
138     assertTrue(list.contains(three));
139 dl 1.1 }
140    
141     /**
142 jsr166 1.18 * clear removes all elements from the list
143 dl 1.1 */
144 dl 1.4 public void testClear() {
145 jsr166 1.48 List list = populatedList(SIZE);
146     list.clear();
147     assertEquals(0, list.size());
148 dl 1.1 }
149    
150 dl 1.4 /**
151 jsr166 1.18 * Cloned list is equal
152 dl 1.4 */
153     public void testClone() {
154 jsr166 1.48 CopyOnWriteArrayList l1 = populatedList(SIZE);
155 jsr166 1.11 CopyOnWriteArrayList l2 = (CopyOnWriteArrayList)(l1.clone());
156 dl 1.4 assertEquals(l1, l2);
157 jsr166 1.11 l1.clear();
158 dl 1.4 assertFalse(l1.equals(l2));
159     }
160    
161 dl 1.1 /**
162 jsr166 1.18 * contains is true for added elements
163 dl 1.1 */
164 dl 1.4 public void testContains() {
165 jsr166 1.48 List list = populatedList(3);
166     assertTrue(list.contains(one));
167     assertFalse(list.contains(five));
168 dl 1.1 }
169    
170 dl 1.4 /**
171 dl 1.7 * adding at an index places it in the indicated index
172 dl 1.4 */
173 dl 1.1 public void testAddIndex() {
174 jsr166 1.48 List list = populatedList(3);
175     list.add(0, m1);
176     assertEquals(4, list.size());
177     assertEquals(m1, list.get(0));
178     assertEquals(zero, list.get(1));
179    
180     list.add(2, m2);
181     assertEquals(5, list.size());
182     assertEquals(m2, list.get(2));
183     assertEquals(two, list.get(4));
184 dl 1.1 }
185    
186 dl 1.4 /**
187 dl 1.5 * lists with same elements are equal and have same hashCode
188 dl 1.4 */
189 dl 1.1 public void testEquals() {
190 jsr166 1.48 List a = populatedList(3);
191     List b = populatedList(3);
192 dl 1.1 assertTrue(a.equals(b));
193     assertTrue(b.equals(a));
194 jsr166 1.37 assertTrue(a.containsAll(b));
195     assertTrue(b.containsAll(a));
196 dl 1.1 assertEquals(a.hashCode(), b.hashCode());
197 dl 1.3 a.add(m1);
198 dl 1.1 assertFalse(a.equals(b));
199     assertFalse(b.equals(a));
200 jsr166 1.37 assertTrue(a.containsAll(b));
201     assertFalse(b.containsAll(a));
202 dl 1.3 b.add(m1);
203 dl 1.1 assertTrue(a.equals(b));
204     assertTrue(b.equals(a));
205 jsr166 1.37 assertTrue(a.containsAll(b));
206     assertTrue(b.containsAll(a));
207 dl 1.1 assertEquals(a.hashCode(), b.hashCode());
208 jsr166 1.37
209     assertFalse(a.equals(null));
210 dl 1.1 }
211    
212     /**
213 jsr166 1.37 * containsAll returns true for collections with subset of elements
214 dl 1.1 */
215 dl 1.4 public void testContainsAll() {
216 jsr166 1.48 List list = populatedList(3);
217     assertTrue(list.containsAll(Arrays.asList()));
218     assertTrue(list.containsAll(Arrays.asList(one)));
219     assertTrue(list.containsAll(Arrays.asList(one, two)));
220     assertFalse(list.containsAll(Arrays.asList(one, two, six)));
221     assertFalse(list.containsAll(Arrays.asList(six)));
222 jsr166 1.37
223     try {
224 jsr166 1.48 list.containsAll(null);
225 jsr166 1.37 shouldThrow();
226     } catch (NullPointerException success) {}
227 dl 1.1 }
228    
229     /**
230 jsr166 1.18 * get returns the value at the given index
231 dl 1.1 */
232 dl 1.4 public void testGet() {
233 jsr166 1.48 List list = populatedList(3);
234     assertEquals(0, list.get(0));
235 dl 1.1 }
236    
237     /**
238 jsr166 1.47 * indexOf(Object) returns the index of the first occurrence of the
239     * specified element in this list, or -1 if this list does not
240     * contain the element
241 dl 1.1 */
242 dl 1.4 public void testIndexOf() {
243 jsr166 1.48 List list = populatedList(3);
244 jsr166 1.47 assertEquals(-1, list.indexOf(-42));
245     int size = list.size();
246     for (int i = 0; i < size; i++) {
247     assertEquals(i, list.indexOf(i));
248     assertEquals(i, list.subList(0, size).indexOf(i));
249     assertEquals(i, list.subList(0, i + 1).indexOf(i));
250     assertEquals(-1, list.subList(0, i).indexOf(i));
251     assertEquals(0, list.subList(i, size).indexOf(i));
252     assertEquals(-1, list.subList(i + 1, size).indexOf(i));
253     }
254    
255     list.add(1);
256     assertEquals(1, list.indexOf(1));
257     assertEquals(1, list.subList(0, size + 1).indexOf(1));
258     assertEquals(0, list.subList(1, size + 1).indexOf(1));
259     assertEquals(size - 2, list.subList(2, size + 1).indexOf(1));
260     assertEquals(0, list.subList(size, size + 1).indexOf(1));
261     assertEquals(-1, list.subList(size + 1, size + 1).indexOf(1));
262 dl 1.1 }
263    
264     /**
265 jsr166 1.47 * indexOf(E, int) returns the index of the first occurrence of the
266     * specified element in this list, searching forwards from index,
267     * or returns -1 if the element is not found
268 dl 1.1 */
269 dl 1.4 public void testIndexOf2() {
270 jsr166 1.48 CopyOnWriteArrayList list = populatedList(3);
271 jsr166 1.47 int size = list.size();
272     assertEquals(-1, list.indexOf(-42, 0));
273    
274     // we might expect IOOBE, but spec says otherwise
275     assertEquals(-1, list.indexOf(0, size));
276     assertEquals(-1, list.indexOf(0, Integer.MAX_VALUE));
277    
278     assertThrows(
279     IndexOutOfBoundsException.class,
280     () -> list.indexOf(0, -1),
281     () -> list.indexOf(0, Integer.MIN_VALUE));
282    
283     for (int i = 0; i < size; i++) {
284     assertEquals(i, list.indexOf(i, 0));
285     assertEquals(i, list.indexOf(i, i));
286     assertEquals(-1, list.indexOf(i, i + 1));
287     }
288    
289     list.add(1);
290     assertEquals(1, list.indexOf(1, 0));
291     assertEquals(1, list.indexOf(1, 1));
292     assertEquals(size, list.indexOf(1, 2));
293     assertEquals(size, list.indexOf(1, size));
294 dl 1.1 }
295    
296     /**
297 jsr166 1.18 * isEmpty returns true when empty, else false
298 dl 1.1 */
299 dl 1.4 public void testIsEmpty() {
300 jsr166 1.48 List empty = new CopyOnWriteArrayList();
301 jsr166 1.11 assertTrue(empty.isEmpty());
302 jsr166 1.48 assertTrue(empty.subList(0, 0).isEmpty());
303    
304     List full = populatedList(SIZE);
305 jsr166 1.11 assertFalse(full.isEmpty());
306 jsr166 1.48 assertTrue(full.subList(0, 0).isEmpty());
307     assertTrue(full.subList(SIZE, SIZE).isEmpty());
308 dl 1.1 }
309    
310     /**
311 jsr166 1.27 * iterator() returns an iterator containing the elements of the
312     * list in insertion order
313 dl 1.1 */
314 dl 1.4 public void testIterator() {
315 jsr166 1.27 Collection empty = new CopyOnWriteArrayList();
316     assertFalse(empty.iterator().hasNext());
317     try {
318     empty.iterator().next();
319     shouldThrow();
320     } catch (NoSuchElementException success) {}
321    
322     Integer[] elements = new Integer[SIZE];
323     for (int i = 0; i < SIZE; i++)
324     elements[i] = i;
325 jsr166 1.38 shuffle(elements);
326 jsr166 1.48 Collection<Integer> full = populatedList(elements);
327 jsr166 1.27
328     Iterator it = full.iterator();
329     for (int j = 0; j < SIZE; j++) {
330     assertTrue(it.hasNext());
331     assertEquals(elements[j], it.next());
332     }
333 jsr166 1.32 assertIteratorExhausted(it);
334     }
335    
336     /**
337     * iterator of empty collection has no elements
338     */
339     public void testEmptyIterator() {
340     Collection c = new CopyOnWriteArrayList();
341     assertIteratorExhausted(c.iterator());
342 dl 1.1 }
343    
344 dl 1.4 /**
345 dl 1.5 * iterator.remove throws UnsupportedOperationException
346 dl 1.4 */
347 jsr166 1.17 public void testIteratorRemove() {
348 jsr166 1.48 CopyOnWriteArrayList list = populatedList(SIZE);
349     Iterator it = list.iterator();
350 dl 1.1 it.next();
351     try {
352     it.remove();
353 dl 1.4 shouldThrow();
354 jsr166 1.12 } catch (UnsupportedOperationException success) {}
355 dl 1.1 }
356    
357 dl 1.4 /**
358 dl 1.5 * toString contains toString of elements
359 dl 1.4 */
360     public void testToString() {
361 jsr166 1.27 assertEquals("[]", new CopyOnWriteArrayList().toString());
362 jsr166 1.48 List list = populatedList(3);
363     String s = list.toString();
364 jsr166 1.27 for (int i = 0; i < 3; ++i)
365 jsr166 1.20 assertTrue(s.contains(String.valueOf(i)));
366 jsr166 1.48 assertEquals(new ArrayList(list).toString(),
367     list.toString());
368 jsr166 1.8 }
369 dl 1.1
370     /**
371 jsr166 1.47 * lastIndexOf(Object) returns the index of the last occurrence of
372     * the specified element in this list, or -1 if this list does not
373     * contain the element
374 dl 1.1 */
375 dl 1.4 public void testLastIndexOf1() {
376 jsr166 1.48 List list = populatedList(3);
377 jsr166 1.47 assertEquals(-1, list.lastIndexOf(-42));
378     int size = list.size();
379     for (int i = 0; i < size; i++) {
380     assertEquals(i, list.lastIndexOf(i));
381     assertEquals(i, list.subList(0, size).lastIndexOf(i));
382     assertEquals(i, list.subList(0, i + 1).lastIndexOf(i));
383     assertEquals(-1, list.subList(0, i).lastIndexOf(i));
384     assertEquals(0, list.subList(i, size).lastIndexOf(i));
385     assertEquals(-1, list.subList(i + 1, size).lastIndexOf(i));
386     }
387    
388     list.add(1);
389     assertEquals(size, list.lastIndexOf(1));
390     assertEquals(size, list.subList(0, size + 1).lastIndexOf(1));
391     assertEquals(1, list.subList(0, size).lastIndexOf(1));
392     assertEquals(0, list.subList(1, 2).lastIndexOf(1));
393     assertEquals(-1, list.subList(0, 1).indexOf(1));
394 dl 1.1 }
395    
396     /**
397 jsr166 1.47 * lastIndexOf(E, int) returns the index of the last occurrence of the
398     * specified element in this list, searching backwards from index, or
399     * returns -1 if the element is not found
400 dl 1.1 */
401 jsr166 1.21 public void testLastIndexOf2() {
402 jsr166 1.48 CopyOnWriteArrayList list = populatedList(3);
403 jsr166 1.47
404     // we might expect IOOBE, but spec says otherwise
405     assertEquals(-1, list.lastIndexOf(0, -1));
406    
407     int size = list.size();
408     assertThrows(
409     IndexOutOfBoundsException.class,
410     () -> list.lastIndexOf(0, size),
411     () -> list.lastIndexOf(0, Integer.MAX_VALUE));
412    
413     for (int i = 0; i < size; i++) {
414     assertEquals(i, list.lastIndexOf(i, i));
415     assertEquals(list.indexOf(i), list.lastIndexOf(i, i));
416     if (i > 0)
417     assertEquals(-1, list.lastIndexOf(i, i - 1));
418     }
419     list.add(one);
420     list.add(three);
421     assertEquals(1, list.lastIndexOf(one, 1));
422     assertEquals(1, list.lastIndexOf(one, 2));
423     assertEquals(3, list.lastIndexOf(one, 3));
424     assertEquals(3, list.lastIndexOf(one, 4));
425     assertEquals(-1, list.lastIndexOf(three, 3));
426 dl 1.1 }
427    
428     /**
429 jsr166 1.18 * listIterator traverses all elements
430 dl 1.1 */
431 dl 1.4 public void testListIterator1() {
432 jsr166 1.48 List list = populatedList(SIZE);
433     ListIterator i = list.listIterator();
434 jsr166 1.11 int j;
435     for (j = 0; i.hasNext(); j++)
436 jsr166 1.14 assertEquals(j, i.next());
437 jsr166 1.11 assertEquals(SIZE, j);
438 dl 1.1 }
439    
440     /**
441 jsr166 1.18 * listIterator only returns those elements after the given index
442 dl 1.1 */
443 dl 1.4 public void testListIterator2() {
444 jsr166 1.48 List list = populatedList(3);
445     ListIterator i = list.listIterator(1);
446 jsr166 1.11 int j;
447     for (j = 0; i.hasNext(); j++)
448 jsr166 1.36 assertEquals(j + 1, i.next());
449 jsr166 1.11 assertEquals(2, j);
450 dl 1.1 }
451    
452     /**
453 jsr166 1.28 * remove(int) removes and returns the object at the given index
454 dl 1.1 */
455 jsr166 1.28 public void testRemove_int() {
456     int SIZE = 3;
457     for (int i = 0; i < SIZE; i++) {
458 jsr166 1.48 List list = populatedList(SIZE);
459     assertEquals(i, list.remove(i));
460     assertEquals(SIZE - 1, list.size());
461     assertFalse(list.contains(new Integer(i)));
462 jsr166 1.28 }
463     }
464    
465     /**
466     * remove(Object) removes the object if found and returns true
467     */
468     public void testRemove_Object() {
469     int SIZE = 3;
470     for (int i = 0; i < SIZE; i++) {
471 jsr166 1.48 List list = populatedList(SIZE);
472     assertFalse(list.remove(new Integer(-42)));
473     assertTrue(list.remove(new Integer(i)));
474     assertEquals(SIZE - 1, list.size());
475     assertFalse(list.contains(new Integer(i)));
476 jsr166 1.28 }
477     CopyOnWriteArrayList x = new CopyOnWriteArrayList(Arrays.asList(4, 5, 6));
478     assertTrue(x.remove(new Integer(6)));
479     assertEquals(x, Arrays.asList(4, 5));
480     assertTrue(x.remove(new Integer(4)));
481     assertEquals(x, Arrays.asList(5));
482     assertTrue(x.remove(new Integer(5)));
483     assertEquals(x, Arrays.asList());
484     assertFalse(x.remove(new Integer(5)));
485 dl 1.1 }
486    
487     /**
488 jsr166 1.18 * removeAll removes all elements from the given collection
489 dl 1.1 */
490 dl 1.4 public void testRemoveAll() {
491 jsr166 1.48 List list = populatedList(3);
492     assertTrue(list.removeAll(Arrays.asList(one, two)));
493     assertEquals(1, list.size());
494     assertFalse(list.removeAll(Arrays.asList(one, two)));
495     assertEquals(1, list.size());
496 dl 1.1 }
497    
498     /**
499 jsr166 1.18 * set changes the element at the given index
500 dl 1.1 */
501 dl 1.4 public void testSet() {
502 jsr166 1.48 List list = populatedList(3);
503     assertEquals(2, list.set(2, four));
504     assertEquals(4, list.get(2));
505 dl 1.1 }
506    
507     /**
508 jsr166 1.18 * size returns the number of elements
509 dl 1.1 */
510 dl 1.4 public void testSize() {
511 jsr166 1.48 List empty = new CopyOnWriteArrayList();
512     assertEquals(0, empty.size());
513     assertEquals(0, empty.subList(0, 0).size());
514    
515     List full = populatedList(SIZE);
516 jsr166 1.11 assertEquals(SIZE, full.size());
517 jsr166 1.48 assertEquals(0, full.subList(0, 0).size());
518     assertEquals(0, full.subList(SIZE, SIZE).size());
519 dl 1.1 }
520    
521     /**
522 jsr166 1.26 * toArray() returns an Object array containing all elements from
523     * the list in insertion order
524 dl 1.1 */
525 dl 1.4 public void testToArray() {
526 jsr166 1.26 Object[] a = new CopyOnWriteArrayList().toArray();
527     assertTrue(Arrays.equals(new Object[0], a));
528     assertSame(Object[].class, a.getClass());
529    
530     Integer[] elements = new Integer[SIZE];
531     for (int i = 0; i < SIZE; i++)
532     elements[i] = i;
533 jsr166 1.38 shuffle(elements);
534 jsr166 1.48 Collection<Integer> full = populatedList(elements);
535 jsr166 1.26
536     assertTrue(Arrays.equals(elements, full.toArray()));
537     assertSame(Object[].class, full.toArray().getClass());
538 dl 1.1 }
539    
540     /**
541 jsr166 1.26 * toArray(Integer array) returns an Integer array containing all
542     * elements from the list in insertion order
543 dl 1.1 */
544 dl 1.4 public void testToArray2() {
545 jsr166 1.26 Collection empty = new CopyOnWriteArrayList();
546     Integer[] a;
547    
548     a = new Integer[0];
549     assertSame(a, empty.toArray(a));
550    
551 jsr166 1.35 a = new Integer[SIZE / 2];
552 jsr166 1.26 Arrays.fill(a, 42);
553     assertSame(a, empty.toArray(a));
554     assertNull(a[0]);
555     for (int i = 1; i < a.length; i++)
556     assertEquals(42, (int) a[i]);
557    
558     Integer[] elements = new Integer[SIZE];
559     for (int i = 0; i < SIZE; i++)
560     elements[i] = i;
561 jsr166 1.38 shuffle(elements);
562 jsr166 1.48 Collection<Integer> full = populatedList(elements);
563 jsr166 1.26
564     Arrays.fill(a, 42);
565     assertTrue(Arrays.equals(elements, full.toArray(a)));
566     for (int i = 0; i < a.length; i++)
567     assertEquals(42, (int) a[i]);
568     assertSame(Integer[].class, full.toArray(a).getClass());
569    
570     a = new Integer[SIZE];
571     Arrays.fill(a, 42);
572     assertSame(a, full.toArray(a));
573     assertTrue(Arrays.equals(elements, a));
574    
575 jsr166 1.35 a = new Integer[2 * SIZE];
576 jsr166 1.26 Arrays.fill(a, 42);
577     assertSame(a, full.toArray(a));
578     assertTrue(Arrays.equals(elements, Arrays.copyOf(a, SIZE)));
579     assertNull(a[SIZE]);
580     for (int i = SIZE + 1; i < a.length; i++)
581     assertEquals(42, (int) a[i]);
582 dl 1.1 }
583    
584 dl 1.4 /**
585 dl 1.5 * sublists contains elements at indexes offset from their base
586 dl 1.4 */
587 dl 1.1 public void testSubList() {
588 jsr166 1.48 List a = populatedList(10);
589 dl 1.1 assertTrue(a.subList(1,1).isEmpty());
590 jsr166 1.11 for (int j = 0; j < 9; ++j) {
591     for (int i = j ; i < 10; ++i) {
592     List b = a.subList(j,i);
593     for (int k = j; k < i; ++k) {
594     assertEquals(new Integer(k), b.get(k-j));
595     }
596     }
597     }
598 dl 1.1
599 jsr166 1.11 List s = a.subList(2, 5);
600 jsr166 1.24 assertEquals(3, s.size());
601 dl 1.3 s.set(2, m1);
602 dl 1.1 assertEquals(a.get(4), m1);
603 jsr166 1.11 s.clear();
604 jsr166 1.24 assertEquals(7, a.size());
605 jsr166 1.47
606     assertThrows(
607     IndexOutOfBoundsException.class,
608     () -> s.get(0),
609     () -> s.set(0, 42));
610 dl 1.1 }
611    
612     // Exception tests
613    
614     /**
615 jsr166 1.18 * toArray throws an ArrayStoreException when the given array
616     * can not store the objects inside the list
617 dl 1.1 */
618 dl 1.4 public void testToArray_ArrayStoreException() {
619 jsr166 1.48 List list = new CopyOnWriteArrayList();
620     // Integers are not auto-converted to Longs
621     list.add(86);
622     list.add(99);
623     assertThrows(
624     ArrayStoreException.class,
625     () -> list.toArray(new Long[0]),
626     () -> list.toArray(new Long[5]));
627 dl 1.1 }
628    
629 jsr166 1.48 void testIndexOutOfBoundsException(List list) {
630     int size = list.size();
631     assertThrows(
632     IndexOutOfBoundsException.class,
633     () -> list.get(-1),
634     () -> list.get(size),
635     () -> list.set(-1, "qwerty"),
636     () -> list.set(size, "qwerty"),
637     () -> list.add(-1, "qwerty"),
638     () -> list.add(size + 1, "qwerty"),
639     () -> list.remove(-1),
640     () -> list.remove(size),
641     () -> list.addAll(-1, Collections.emptyList()),
642     () -> list.addAll(size + 1, Collections.emptyList()),
643     () -> list.listIterator(-1),
644     () -> list.listIterator(size + 1),
645     () -> list.subList(-1, size),
646     () -> list.subList(0, size + 1));
647    
648     // Conversely, operations that must not throw
649     list.addAll(0, Collections.emptyList());
650     list.addAll(size, Collections.emptyList());
651     list.add(0, "qwerty");
652     list.add(list.size(), "qwerty");
653     list.get(0);
654     list.get(list.size() - 1);
655     list.set(0, "azerty");
656     list.set(list.size() - 1, "azerty");
657     list.listIterator(0);
658     list.listIterator(list.size());
659     list.subList(0, list.size());
660     list.remove(list.size() - 1);
661 dl 1.1 }
662 jsr166 1.8
663 dl 1.1 /**
664 jsr166 1.48 * IndexOutOfBoundsException is thrown when specified
665     */
666     public void testIndexOutOfBoundsException() {
667     ThreadLocalRandom rnd = ThreadLocalRandom.current();
668     List x = populatedList(rnd.nextInt(5));
669     testIndexOutOfBoundsException(x);
670 dl 1.1
671 jsr166 1.48 int start = rnd.nextInt(x.size() + 1);
672     int end = rnd.nextInt(start, x.size() + 1);
673     assertThrows(
674     IndexOutOfBoundsException.class,
675     () -> x.subList(start, start - 1));
676     List subList = x.subList(start, end);
677     testIndexOutOfBoundsException(x);
678 dl 1.2 }
679    
680 dl 1.4 /**
681 jsr166 1.45 * a deserialized/reserialized list equals original
682 dl 1.4 */
683 jsr166 1.12 public void testSerialization() throws Exception {
684 jsr166 1.48 List x = populatedList(SIZE);
685 jsr166 1.22 List y = serialClone(x);
686 dl 1.2
687 jsr166 1.29 assertNotSame(x, y);
688 jsr166 1.22 assertEquals(x.size(), y.size());
689     assertEquals(x.toString(), y.toString());
690     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
691     assertEquals(x, y);
692     assertEquals(y, x);
693     while (!x.isEmpty()) {
694     assertFalse(y.isEmpty());
695     assertEquals(x.remove(0), y.remove(0));
696     }
697     assertTrue(y.isEmpty());
698 dl 1.1 }
699 jsr166 1.8
700 dl 1.1 }