ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayDequeTest.java
Revision: 1.59
Committed: Tue Jan 26 13:33:05 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.58: +210 -218 lines
Log Message:
Replace Integer with Item class

File Contents

# User Rev Content
1 dl 1.1 /*
2 jsr166 1.44 * Written by Doug Lea and Martin Buchholz with assistance from
3     * members of JCP JSR-166 Expert Group and released to the public
4     * domain, as explained at
5 jsr166 1.22 * http://creativecommons.org/publicdomain/zero/1.0/
6 dl 1.1 */
7    
8 jsr166 1.30 import java.util.ArrayDeque;
9 jsr166 1.24 import java.util.Arrays;
10     import java.util.Collection;
11     import java.util.Deque;
12     import java.util.Iterator;
13     import java.util.NoSuchElementException;
14     import java.util.Queue;
15     import java.util.Random;
16 jsr166 1.42 import java.util.concurrent.ThreadLocalRandom;
17 dl 1.1
18 jsr166 1.30 import junit.framework.Test;
19    
20 dl 1.1 public class ArrayDequeTest extends JSR166TestCase {
21     public static void main(String[] args) {
22 jsr166 1.34 main(suite(), args);
23 dl 1.1 }
24    
25     public static Test suite() {
26 jsr166 1.40 class Implementation implements CollectionImplementation {
27     public Class<?> klazz() { return ArrayDeque.class; }
28 jsr166 1.45 public Collection emptyCollection() { return populatedDeque(0); }
29 dl 1.59 public Object makeElement(int i) { return JSR166TestCase.itemFor(i); }
30 jsr166 1.40 public boolean isConcurrent() { return false; }
31     public boolean permitsNulls() { return false; }
32     }
33     return newTestSuite(ArrayDequeTest.class,
34     CollectionTest.testSuite(new Implementation()));
35 dl 1.1 }
36    
37     /**
38 jsr166 1.26 * Returns a new deque of given size containing consecutive
39 dl 1.59 * Items 0 ... n - 1.
40 dl 1.1 */
41 dl 1.59 private static ArrayDeque<Item> populatedDeque(int n) {
42 jsr166 1.42 // Randomize various aspects of memory layout, including
43 jsr166 1.54 // capacity slop and wraparound.
44 dl 1.59 final ArrayDeque<Item> q;
45 jsr166 1.42 ThreadLocalRandom rnd = ThreadLocalRandom.current();
46     switch (rnd.nextInt(6)) {
47 dl 1.59 case 0: q = new ArrayDeque<Item>(); break;
48     case 1: q = new ArrayDeque<Item>(0); break;
49     case 2: q = new ArrayDeque<Item>(1); break;
50     case 3: q = new ArrayDeque<Item>(Math.max(0, n - 1)); break;
51     case 4: q = new ArrayDeque<Item>(n); break;
52     case 5: q = new ArrayDeque<Item>(n + 1); break;
53 jsr166 1.42 default: throw new AssertionError();
54     }
55     switch (rnd.nextInt(3)) {
56     case 0:
57 dl 1.59 q.addFirst(fortytwo);
58     mustEqual(42, q.removeLast());
59 jsr166 1.42 break;
60     case 1:
61 dl 1.59 q.addLast(fortytwo);
62     mustEqual(42, q.removeFirst());
63 jsr166 1.42 break;
64     case 2: /* do nothing */ break;
65     default: throw new AssertionError();
66     }
67 dl 1.1 assertTrue(q.isEmpty());
68 jsr166 1.42 if (rnd.nextBoolean())
69     for (int i = 0; i < n; i++)
70 dl 1.59 assertTrue(q.offerLast(itemFor(i)));
71 jsr166 1.42 else
72     for (int i = n; --i >= 0; )
73 dl 1.59 q.addFirst(itemFor(i));
74     mustEqual(n, q.size());
75 jsr166 1.43 if (n > 0) {
76     assertFalse(q.isEmpty());
77 dl 1.59 mustEqual(0, q.peekFirst());
78     mustEqual((n - 1), q.peekLast());
79 jsr166 1.43 }
80 dl 1.1 return q;
81     }
82 jsr166 1.5
83 dl 1.1 /**
84 jsr166 1.16 * new deque is empty
85 dl 1.1 */
86     public void testConstructor1() {
87 dl 1.59 mustEqual(0, new ArrayDeque<Item>().size());
88 dl 1.1 }
89    
90     /**
91     * Initializing from null Collection throws NPE
92     */
93     public void testConstructor3() {
94     try {
95 dl 1.59 new ArrayDeque<Object>((Collection<Object>)null);
96 dl 1.1 shouldThrow();
97 jsr166 1.9 } catch (NullPointerException success) {}
98 dl 1.1 }
99    
100     /**
101 jsr166 1.16 * Initializing from Collection of null elements throws NPE
102     */
103     public void testConstructor4() {
104     try {
105 dl 1.59 new ArrayDeque<Item>(Arrays.asList(new Item[SIZE]));
106 jsr166 1.16 shouldThrow();
107     } catch (NullPointerException success) {}
108     }
109 dl 1.1
110 jsr166 1.16 /**
111     * Initializing from Collection with some null elements throws NPE
112     */
113     public void testConstructor5() {
114 dl 1.59 Item[] items = new Item[2]; items[0] = zero;
115 jsr166 1.16 try {
116 dl 1.59 new ArrayDeque<Item>(Arrays.asList(items));
117 jsr166 1.16 shouldThrow();
118     } catch (NullPointerException success) {}
119     }
120    
121     /**
122     * Deque contains all elements of collection used to initialize
123 dl 1.1 */
124     public void testConstructor6() {
125 dl 1.59 Item[] items = defaultItems;
126     ArrayDeque<Item> q = new ArrayDeque<Item>(Arrays.asList(items));
127 jsr166 1.9 for (int i = 0; i < SIZE; ++i)
128 dl 1.59 mustEqual(items[i], q.pollFirst());
129 dl 1.1 }
130    
131     /**
132     * isEmpty is true before add, false after
133     */
134     public void testEmpty() {
135 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
136 dl 1.1 assertTrue(q.isEmpty());
137 dl 1.59 q.add(one);
138 dl 1.1 assertFalse(q.isEmpty());
139 dl 1.59 q.add(two);
140 dl 1.1 q.removeFirst();
141     q.removeFirst();
142     assertTrue(q.isEmpty());
143     }
144    
145     /**
146     * size changes when elements added and removed
147     */
148     public void testSize() {
149 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
150 dl 1.1 for (int i = 0; i < SIZE; ++i) {
151 dl 1.59 mustEqual(SIZE - i, q.size());
152 dl 1.1 q.removeFirst();
153     }
154     for (int i = 0; i < SIZE; ++i) {
155 dl 1.59 mustEqual(i, q.size());
156     mustAdd(q, i);
157 dl 1.1 }
158     }
159    
160     /**
161     * push(null) throws NPE
162     */
163     public void testPushNull() {
164 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>(1);
165 jsr166 1.8 try {
166 dl 1.1 q.push(null);
167     shouldThrow();
168 jsr166 1.9 } catch (NullPointerException success) {}
169 dl 1.1 }
170    
171     /**
172 jsr166 1.16 * peekFirst() returns element inserted with push
173 dl 1.1 */
174     public void testPush() {
175 dl 1.59 ArrayDeque<Item> q = populatedDeque(3);
176 dl 1.1 q.pollLast();
177 jsr166 1.8 q.push(four);
178 jsr166 1.12 assertSame(four, q.peekFirst());
179 jsr166 1.5 }
180 dl 1.1
181     /**
182 jsr166 1.16 * pop() removes next element, or throws NSEE if empty
183 dl 1.1 */
184     public void testPop() {
185 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
186 dl 1.1 for (int i = 0; i < SIZE; ++i) {
187 dl 1.59 mustEqual(i, q.pop());
188 dl 1.1 }
189     try {
190     q.pop();
191     shouldThrow();
192 jsr166 1.9 } catch (NoSuchElementException success) {}
193 dl 1.1 }
194    
195     /**
196     * offer(null) throws NPE
197     */
198 jsr166 1.16 public void testOfferNull() {
199 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
200 jsr166 1.16 try {
201     q.offer(null);
202     shouldThrow();
203     } catch (NullPointerException success) {}
204     }
205    
206     /**
207     * offerFirst(null) throws NPE
208     */
209 dl 1.1 public void testOfferFirstNull() {
210 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
211 jsr166 1.8 try {
212 dl 1.1 q.offerFirst(null);
213     shouldThrow();
214 jsr166 1.9 } catch (NullPointerException success) {}
215 dl 1.1 }
216    
217     /**
218 jsr166 1.16 * offerLast(null) throws NPE
219     */
220     public void testOfferLastNull() {
221 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
222 jsr166 1.16 try {
223     q.offerLast(null);
224     shouldThrow();
225     } catch (NullPointerException success) {}
226     }
227    
228     /**
229     * offer(x) succeeds
230     */
231     public void testOffer() {
232 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
233 jsr166 1.16 assertTrue(q.offer(zero));
234     assertTrue(q.offer(one));
235     assertSame(zero, q.peekFirst());
236     assertSame(one, q.peekLast());
237     }
238    
239     /**
240     * offerFirst(x) succeeds
241 dl 1.1 */
242     public void testOfferFirst() {
243 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
244 jsr166 1.16 assertTrue(q.offerFirst(zero));
245     assertTrue(q.offerFirst(one));
246     assertSame(one, q.peekFirst());
247     assertSame(zero, q.peekLast());
248 dl 1.1 }
249    
250     /**
251 jsr166 1.16 * offerLast(x) succeeds
252 dl 1.1 */
253     public void testOfferLast() {
254 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
255 jsr166 1.16 assertTrue(q.offerLast(zero));
256     assertTrue(q.offerLast(one));
257     assertSame(zero, q.peekFirst());
258     assertSame(one, q.peekLast());
259 dl 1.1 }
260    
261     /**
262 jsr166 1.16 * add(null) throws NPE
263     */
264     public void testAddNull() {
265 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
266 jsr166 1.16 try {
267     q.add(null);
268     shouldThrow();
269     } catch (NullPointerException success) {}
270     }
271    
272     /**
273     * addFirst(null) throws NPE
274     */
275     public void testAddFirstNull() {
276 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
277 jsr166 1.16 try {
278     q.addFirst(null);
279     shouldThrow();
280     } catch (NullPointerException success) {}
281     }
282    
283     /**
284     * addLast(null) throws NPE
285     */
286     public void testAddLastNull() {
287 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
288 jsr166 1.16 try {
289     q.addLast(null);
290     shouldThrow();
291     } catch (NullPointerException success) {}
292     }
293    
294     /**
295     * add(x) succeeds
296 dl 1.1 */
297     public void testAdd() {
298 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
299 jsr166 1.16 assertTrue(q.add(zero));
300     assertTrue(q.add(one));
301     assertSame(zero, q.peekFirst());
302     assertSame(one, q.peekLast());
303     }
304    
305     /**
306     * addFirst(x) succeeds
307     */
308     public void testAddFirst() {
309 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
310 jsr166 1.16 q.addFirst(zero);
311     q.addFirst(one);
312     assertSame(one, q.peekFirst());
313     assertSame(zero, q.peekLast());
314     }
315    
316     /**
317     * addLast(x) succeeds
318     */
319     public void testAddLast() {
320 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
321 jsr166 1.16 q.addLast(zero);
322     q.addLast(one);
323     assertSame(zero, q.peekFirst());
324     assertSame(one, q.peekLast());
325 dl 1.1 }
326    
327     /**
328     * addAll(null) throws NPE
329     */
330     public void testAddAll1() {
331 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
332 dl 1.1 try {
333     q.addAll(null);
334     shouldThrow();
335 jsr166 1.9 } catch (NullPointerException success) {}
336 dl 1.1 }
337    
338     /**
339 jsr166 1.16 * addAll of a collection with null elements throws NPE
340     */
341     public void testAddAll2() {
342 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
343 jsr166 1.16 try {
344 dl 1.59 q.addAll(Arrays.asList(new Item[SIZE]));
345 jsr166 1.16 shouldThrow();
346     } catch (NullPointerException success) {}
347     }
348    
349     /**
350     * addAll of a collection with any null elements throws NPE after
351     * possibly adding some elements
352     */
353     public void testAddAll3() {
354 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<Item>();
355     Item[] items = new Item[2]; items[0] = zero;
356 jsr166 1.16 try {
357 dl 1.59 q.addAll(Arrays.asList(items));
358 jsr166 1.16 shouldThrow();
359     } catch (NullPointerException success) {}
360     }
361    
362     /**
363     * Deque contains all elements, in traversal order, of successful addAll
364 dl 1.1 */
365     public void testAddAll5() {
366 dl 1.59 Item[] empty = new Item[0];
367     Item[] items = defaultItems;
368     ArrayDeque<Item> q = new ArrayDeque<Item>();
369 jsr166 1.10 assertFalse(q.addAll(Arrays.asList(empty)));
370 dl 1.59 assertTrue(q.addAll(Arrays.asList(items)));
371 jsr166 1.10 for (int i = 0; i < SIZE; ++i)
372 dl 1.59 mustEqual(items[i], q.pollFirst());
373 dl 1.1 }
374    
375     /**
376 jsr166 1.16 * pollFirst() succeeds unless empty
377 dl 1.1 */
378     public void testPollFirst() {
379 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
380 dl 1.1 for (int i = 0; i < SIZE; ++i) {
381 dl 1.59 mustEqual(i, q.pollFirst());
382 dl 1.1 }
383 jsr166 1.8 assertNull(q.pollFirst());
384 dl 1.1 }
385    
386     /**
387 jsr166 1.16 * pollLast() succeeds unless empty
388 dl 1.1 */
389     public void testPollLast() {
390 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
391 jsr166 1.36 for (int i = SIZE - 1; i >= 0; --i) {
392 dl 1.59 mustEqual(i, q.pollLast());
393 dl 1.1 }
394 jsr166 1.8 assertNull(q.pollLast());
395 dl 1.1 }
396    
397     /**
398 jsr166 1.16 * poll() succeeds unless empty
399 dl 1.1 */
400     public void testPoll() {
401 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
402 dl 1.1 for (int i = 0; i < SIZE; ++i) {
403 dl 1.59 mustEqual(i, q.poll());
404 dl 1.1 }
405 jsr166 1.8 assertNull(q.poll());
406 dl 1.1 }
407    
408     /**
409 jsr166 1.16 * remove() removes next element, or throws NSEE if empty
410 dl 1.1 */
411     public void testRemove() {
412 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
413 dl 1.1 for (int i = 0; i < SIZE; ++i) {
414 dl 1.59 mustEqual(i, q.remove());
415 dl 1.1 }
416     try {
417     q.remove();
418     shouldThrow();
419 jsr166 1.9 } catch (NoSuchElementException success) {}
420 dl 1.1 }
421    
422     /**
423 jsr166 1.16 * remove(x) removes x and returns true if present
424     */
425     public void testRemoveElement() {
426 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
427 jsr166 1.31 for (int i = 1; i < SIZE; i += 2) {
428 dl 1.59 mustContain(q, i);
429     mustRemove(q, i);
430     mustNotContain(q, i);
431     mustContain(q, i - 1);
432 jsr166 1.16 }
433 jsr166 1.31 for (int i = 0; i < SIZE; i += 2) {
434 dl 1.59 mustContain(q, i);
435     mustRemove(q, i);
436     mustNotContain(q, i);
437     mustNotRemove(q, i + 1);
438     mustNotContain(q, i + 1);
439 jsr166 1.16 }
440     assertTrue(q.isEmpty());
441     }
442    
443     /**
444     * peekFirst() returns next element, or null if empty
445 dl 1.1 */
446     public void testPeekFirst() {
447 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
448 dl 1.1 for (int i = 0; i < SIZE; ++i) {
449 dl 1.59 mustEqual(i, q.peekFirst());
450     mustEqual(i, q.pollFirst());
451 dl 1.1 assertTrue(q.peekFirst() == null ||
452 jsr166 1.12 !q.peekFirst().equals(i));
453 dl 1.1 }
454 jsr166 1.8 assertNull(q.peekFirst());
455 dl 1.1 }
456    
457     /**
458 jsr166 1.16 * peek() returns next element, or null if empty
459 dl 1.1 */
460     public void testPeek() {
461 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
462 dl 1.1 for (int i = 0; i < SIZE; ++i) {
463 dl 1.59 mustEqual(i, q.peek());
464     mustEqual(i, q.poll());
465 dl 1.1 assertTrue(q.peek() == null ||
466 jsr166 1.12 !q.peek().equals(i));
467 dl 1.1 }
468 jsr166 1.8 assertNull(q.peek());
469 dl 1.1 }
470    
471     /**
472 jsr166 1.16 * peekLast() returns next element, or null if empty
473 dl 1.1 */
474     public void testPeekLast() {
475 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
476 jsr166 1.36 for (int i = SIZE - 1; i >= 0; --i) {
477 dl 1.59 mustEqual(i, q.peekLast());
478     mustEqual(i, q.pollLast());
479 dl 1.1 assertTrue(q.peekLast() == null ||
480 jsr166 1.12 !q.peekLast().equals(i));
481 dl 1.1 }
482 jsr166 1.8 assertNull(q.peekLast());
483 dl 1.1 }
484    
485     /**
486 jsr166 1.16 * element() returns first element, or throws NSEE if empty
487     */
488     public void testElement() {
489 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
490 jsr166 1.16 for (int i = 0; i < SIZE; ++i) {
491 dl 1.59 mustEqual(i, q.element());
492     mustEqual(i, q.poll());
493 jsr166 1.16 }
494     try {
495     q.element();
496     shouldThrow();
497     } catch (NoSuchElementException success) {}
498     }
499    
500     /**
501     * getFirst() returns first element, or throws NSEE if empty
502 dl 1.1 */
503     public void testFirstElement() {
504 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
505 dl 1.1 for (int i = 0; i < SIZE; ++i) {
506 dl 1.59 mustEqual(i, q.getFirst());
507     mustEqual(i, q.pollFirst());
508 dl 1.1 }
509     try {
510     q.getFirst();
511     shouldThrow();
512 jsr166 1.9 } catch (NoSuchElementException success) {}
513 dl 1.1 }
514    
515     /**
516 jsr166 1.16 * getLast() returns last element, or throws NSEE if empty
517 dl 1.1 */
518     public void testLastElement() {
519 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
520 jsr166 1.36 for (int i = SIZE - 1; i >= 0; --i) {
521 dl 1.59 mustEqual(i, q.getLast());
522     mustEqual(i, q.pollLast());
523 dl 1.1 }
524     try {
525     q.getLast();
526     shouldThrow();
527 jsr166 1.9 } catch (NoSuchElementException success) {}
528 jsr166 1.8 assertNull(q.peekLast());
529 dl 1.1 }
530    
531     /**
532 jsr166 1.16 * removeFirst() removes first element, or throws NSEE if empty
533 dl 1.1 */
534     public void testRemoveFirst() {
535 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
536 dl 1.1 for (int i = 0; i < SIZE; ++i) {
537 dl 1.59 mustEqual(i, q.removeFirst());
538 dl 1.1 }
539     try {
540     q.removeFirst();
541     shouldThrow();
542 jsr166 1.9 } catch (NoSuchElementException success) {}
543 jsr166 1.16 assertNull(q.peekFirst());
544     }
545    
546     /**
547     * removeLast() removes last element, or throws NSEE if empty
548     */
549     public void testRemoveLast() {
550 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
551 jsr166 1.16 for (int i = SIZE - 1; i >= 0; --i) {
552 dl 1.59 mustEqual(i, q.removeLast());
553 jsr166 1.16 }
554     try {
555     q.removeLast();
556     shouldThrow();
557     } catch (NoSuchElementException success) {}
558     assertNull(q.peekLast());
559 dl 1.1 }
560    
561     /**
562     * removeFirstOccurrence(x) removes x and returns true if present
563     */
564     public void testRemoveFirstOccurrence() {
565 dl 1.59 Deque<Item> q = populatedDeque(SIZE);
566 jsr166 1.39 assertFalse(q.removeFirstOccurrence(null));
567 jsr166 1.31 for (int i = 1; i < SIZE; i += 2) {
568 dl 1.59 assertTrue(q.removeFirstOccurrence(itemFor(i)));
569     mustNotContain(q, i);
570 dl 1.1 }
571 jsr166 1.31 for (int i = 0; i < SIZE; i += 2) {
572 dl 1.59 assertTrue(q.removeFirstOccurrence(itemFor(i)));
573     assertFalse(q.removeFirstOccurrence(itemFor(i + 1)));
574     mustNotContain(q, i);
575     mustNotContain(q, i + 1);
576 dl 1.1 }
577     assertTrue(q.isEmpty());
578 jsr166 1.39 assertFalse(q.removeFirstOccurrence(null));
579 dl 1.59 assertFalse(q.removeFirstOccurrence(fortytwo));
580     q = new ArrayDeque<Item>();
581 jsr166 1.39 assertFalse(q.removeFirstOccurrence(null));
582 dl 1.59 assertFalse(q.removeFirstOccurrence(fortytwo));
583 dl 1.1 }
584    
585     /**
586     * removeLastOccurrence(x) removes x and returns true if present
587     */
588     public void testRemoveLastOccurrence() {
589 dl 1.59 Deque<Item> q = populatedDeque(SIZE);
590 jsr166 1.39 assertFalse(q.removeLastOccurrence(null));
591 jsr166 1.31 for (int i = 1; i < SIZE; i += 2) {
592 dl 1.59 assertTrue(q.removeLastOccurrence(itemFor(i)));
593     mustNotContain(q, i);
594 dl 1.1 }
595 jsr166 1.31 for (int i = 0; i < SIZE; i += 2) {
596 dl 1.59 assertTrue(q.removeLastOccurrence(itemFor(i)));
597     assertFalse(q.removeLastOccurrence(itemFor(i + 1)));
598     mustNotContain(q, i);
599     mustNotContain(q, i + 1);
600 dl 1.1 }
601     assertTrue(q.isEmpty());
602 jsr166 1.39 assertFalse(q.removeLastOccurrence(null));
603 dl 1.59 assertFalse(q.removeLastOccurrence(fortytwo));
604     q = new ArrayDeque<Item>();
605 jsr166 1.39 assertFalse(q.removeLastOccurrence(null));
606 dl 1.59 assertFalse(q.removeLastOccurrence(fortytwo));
607 dl 1.1 }
608    
609     /**
610     * contains(x) reports true when elements added but not yet removed
611     */
612     public void testContains() {
613 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
614 dl 1.1 for (int i = 0; i < SIZE; ++i) {
615 dl 1.59 mustContain(q, i);
616     mustEqual(i, q.pollFirst());
617     mustNotContain(q, i);
618 dl 1.1 }
619     }
620    
621     /**
622     * clear removes all elements
623     */
624     public void testClear() {
625 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
626 dl 1.1 q.clear();
627     assertTrue(q.isEmpty());
628 dl 1.59 mustEqual(0, q.size());
629     mustAdd(q, one);
630 dl 1.1 assertFalse(q.isEmpty());
631     q.clear();
632     assertTrue(q.isEmpty());
633     }
634    
635     /**
636     * containsAll(c) is true when c contains a subset of elements
637     */
638     public void testContainsAll() {
639 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
640     ArrayDeque<Item> p = new ArrayDeque<Item>();
641 dl 1.1 for (int i = 0; i < SIZE; ++i) {
642     assertTrue(q.containsAll(p));
643     assertFalse(p.containsAll(q));
644 dl 1.59 mustAdd(p, i);
645 dl 1.1 }
646     assertTrue(p.containsAll(q));
647     }
648    
649     /**
650     * retainAll(c) retains only those elements of c and reports true if changed
651     */
652     public void testRetainAll() {
653 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
654     ArrayDeque<Item> p = populatedDeque(SIZE);
655 dl 1.1 for (int i = 0; i < SIZE; ++i) {
656     boolean changed = q.retainAll(p);
657 dl 1.59 mustEqual(changed, (i > 0));
658 dl 1.1 assertTrue(q.containsAll(p));
659 dl 1.59 mustEqual(SIZE - i, q.size());
660 dl 1.1 p.removeFirst();
661     }
662     }
663    
664     /**
665     * removeAll(c) removes only those elements of c and reports true if changed
666     */
667     public void testRemoveAll() {
668     for (int i = 1; i < SIZE; ++i) {
669 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
670     ArrayDeque<Item> p = populatedDeque(i);
671 dl 1.1 assertTrue(q.removeAll(p));
672 dl 1.59 mustEqual(SIZE - i, q.size());
673 dl 1.1 for (int j = 0; j < i; ++j) {
674 dl 1.59 mustNotContain(q, p.removeFirst());
675 dl 1.1 }
676     }
677     }
678    
679 dl 1.59 void checkToArray(ArrayDeque<Item> q) {
680 jsr166 1.27 int size = q.size();
681 jsr166 1.52 Object[] a1 = q.toArray();
682 dl 1.59 mustEqual(size, a1.length);
683     Item[] a2 = q.toArray(new Item[0]);
684     mustEqual(size, a2.length);
685     Item[] a3 = q.toArray(new Item[Math.max(0, size - 1)]);
686     mustEqual(size, a3.length);
687     Item[] a4 = new Item[size];
688 jsr166 1.52 assertSame(a4, q.toArray(a4));
689 dl 1.59 Item[] a5 = new Item[size + 1];
690     Arrays.fill(a5, fortytwo);
691 jsr166 1.52 assertSame(a5, q.toArray(a5));
692 dl 1.59 Item[] a6 = new Item[size + 2];
693     Arrays.fill(a6, fortytwo);
694 jsr166 1.52 assertSame(a6, q.toArray(a6));
695     Object[][] as = { a1, a2, a3, a4, a5, a6 };
696     for (Object[] a : as) {
697     if (a.length > size) assertNull(a[size]);
698 dl 1.59 if (a.length > size + 1) mustEqual(fortytwo, a[size + 1]);
699 jsr166 1.52 }
700 dl 1.59 Iterator<? extends Item> it = q.iterator();
701     Item s = q.peekFirst();
702 jsr166 1.27 for (int i = 0; i < size; i++) {
703 dl 1.59 Item x = (Item) it.next();
704     mustEqual(s.value + i, x);
705 jsr166 1.52 for (Object[] a : as)
706 jsr166 1.58 assertSame(a[i], x);
707 jsr166 1.27 }
708     }
709    
710 dl 1.1 /**
711 jsr166 1.52 * toArray() and toArray(a) contain all elements in FIFO order
712 dl 1.1 */
713     public void testToArray() {
714 jsr166 1.52 final int size = ThreadLocalRandom.current().nextInt(10);
715 dl 1.59 ArrayDeque<Item> q = new ArrayDeque<>(size);
716 jsr166 1.52 for (int i = 0; i < size; i++) {
717 jsr166 1.27 checkToArray(q);
718 dl 1.59 q.addLast(itemFor(i));
719 jsr166 1.27 }
720     // Provoke wraparound
721 jsr166 1.52 int added = size * 2;
722     for (int i = 0; i < added; i++) {
723 jsr166 1.27 checkToArray(q);
724 dl 1.59 mustEqual(i, q.poll());
725     q.addLast(itemFor(size + i));
726 jsr166 1.27 }
727 jsr166 1.52 for (int i = 0; i < size; i++) {
728 jsr166 1.27 checkToArray(q);
729 dl 1.59 mustEqual((added + i), q.poll());
730 jsr166 1.27 }
731 dl 1.1 }
732    
733     /**
734 jsr166 1.18 * toArray(null) throws NullPointerException
735 dl 1.1 */
736 jsr166 1.18 public void testToArray_NullArg() {
737 dl 1.59 ArrayDeque<Item> l = new ArrayDeque<Item>();
738     l.add(zero);
739 jsr166 1.8 try {
740 jsr166 1.57 l.toArray((Object[])null);
741 jsr166 1.8 shouldThrow();
742     } catch (NullPointerException success) {}
743 dl 1.1 }
744    
745     /**
746 jsr166 1.17 * toArray(incompatible array type) throws ArrayStoreException
747 dl 1.1 */
748 jsr166 1.52 public void testToArray_incompatibleArrayType() {
749 dl 1.59 ArrayDeque<Item> l = new ArrayDeque<Item>();
750     l.add(five);
751 jsr166 1.8 try {
752 jsr166 1.17 l.toArray(new String[10]);
753 jsr166 1.8 shouldThrow();
754 jsr166 1.9 } catch (ArrayStoreException success) {}
755 jsr166 1.52 try {
756     l.toArray(new String[0]);
757     shouldThrow();
758     } catch (ArrayStoreException success) {}
759 dl 1.1 }
760 jsr166 1.5
761 dl 1.1 /**
762 jsr166 1.16 * Iterator iterates through all elements
763 dl 1.1 */
764     public void testIterator() {
765 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
766     Iterator<? extends Item> it = q.iterator();
767 jsr166 1.32 int i;
768     for (i = 0; it.hasNext(); i++)
769 dl 1.59 mustContain(q, it.next());
770     mustEqual(i, SIZE);
771 jsr166 1.32 assertIteratorExhausted(it);
772     }
773    
774     /**
775     * iterator of empty collection has no elements
776     */
777     public void testEmptyIterator() {
778 dl 1.59 Deque<Item> c = new ArrayDeque<Item>();
779 jsr166 1.32 assertIteratorExhausted(c.iterator());
780     assertIteratorExhausted(c.descendingIterator());
781 dl 1.1 }
782    
783     /**
784 jsr166 1.16 * Iterator ordering is FIFO
785 dl 1.1 */
786     public void testIteratorOrdering() {
787 dl 1.59 final ArrayDeque<Item> q = new ArrayDeque<Item>();
788 jsr166 1.16 q.add(one);
789     q.add(two);
790     q.add(three);
791 dl 1.1 int k = 0;
792 dl 1.59 for (Iterator<? extends Item> it = q.iterator(); it.hasNext();) {
793     mustEqual(++k, it.next());
794 dl 1.1 }
795    
796 dl 1.59 mustEqual(3, k);
797 dl 1.1 }
798    
799     /**
800 jsr166 1.16 * iterator.remove() removes current element
801 dl 1.1 */
802 jsr166 1.16 public void testIteratorRemove() {
803 dl 1.59 final ArrayDeque<Item> q = new ArrayDeque<Item>();
804 dl 1.4 final Random rng = new Random();
805 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
806 dl 1.4 int max = rng.nextInt(5) + 2;
807 jsr166 1.38 int split = rng.nextInt(max - 1) + 1;
808 dl 1.4 for (int j = 1; j <= max; ++j)
809 dl 1.59 mustAdd(q, j);
810     Iterator<? extends Item> it = q.iterator();
811 jsr166 1.5 for (int j = 1; j <= split; ++j)
812 dl 1.59 mustEqual(it.next(), j);
813 dl 1.3 it.remove();
814 dl 1.59 mustEqual(it.next(), split + 1);
815 jsr166 1.5 for (int j = 1; j <= split; ++j)
816 dl 1.59 q.remove(itemFor(j));
817 dl 1.3 it = q.iterator();
818 jsr166 1.38 for (int j = split + 1; j <= max; ++j) {
819 dl 1.59 mustEqual(it.next(), j);
820 dl 1.4 it.remove();
821     }
822 dl 1.3 assertFalse(it.hasNext());
823 dl 1.4 assertTrue(q.isEmpty());
824 dl 1.3 }
825 dl 1.1 }
826    
827 dl 1.2 /**
828 jsr166 1.16 * Descending iterator iterates through all elements
829 dl 1.2 */
830     public void testDescendingIterator() {
831 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
832 dl 1.2 int i = 0;
833 dl 1.59 Iterator<? extends Item> it = q.descendingIterator();
834 jsr166 1.6 while (it.hasNext()) {
835 dl 1.59 mustContain(q, it.next());
836 dl 1.2 ++i;
837     }
838 dl 1.59 mustEqual(i, SIZE);
839 dl 1.2 assertFalse(it.hasNext());
840     try {
841     it.next();
842 jsr166 1.11 shouldThrow();
843 jsr166 1.9 } catch (NoSuchElementException success) {}
844 dl 1.2 }
845    
846     /**
847 jsr166 1.16 * Descending iterator ordering is reverse FIFO
848 dl 1.2 */
849     public void testDescendingIteratorOrdering() {
850 dl 1.59 final ArrayDeque<Item> q = new ArrayDeque<Item>();
851 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
852 dl 1.59 q.add(three);
853     q.add(two);
854     q.add(one);
855 dl 1.3 int k = 0;
856 dl 1.59 for (Iterator<? extends Item> it = q.descendingIterator(); it.hasNext();) {
857     mustEqual(++k, it.next());
858 dl 1.3 }
859 jsr166 1.5
860 dl 1.59 mustEqual(3, k);
861 dl 1.3 q.remove();
862     q.remove();
863     q.remove();
864 dl 1.2 }
865     }
866    
867     /**
868 jsr166 1.16 * descendingIterator.remove() removes current element
869 dl 1.2 */
870 jsr166 1.16 public void testDescendingIteratorRemove() {
871 dl 1.59 final ArrayDeque<Item> q = new ArrayDeque<Item>();
872 dl 1.4 final Random rng = new Random();
873 dl 1.3 for (int iters = 0; iters < 100; ++iters) {
874 dl 1.4 int max = rng.nextInt(5) + 2;
875 jsr166 1.38 int split = rng.nextInt(max - 1) + 1;
876 dl 1.4 for (int j = max; j >= 1; --j)
877 dl 1.59 q.add(itemFor(j));
878     Iterator<? extends Item> it = q.descendingIterator();
879 jsr166 1.5 for (int j = 1; j <= split; ++j)
880 dl 1.59 mustEqual(it.next(), itemFor(j));
881 dl 1.3 it.remove();
882 dl 1.59 mustEqual(it.next(), itemFor(split + 1));
883 jsr166 1.5 for (int j = 1; j <= split; ++j)
884 dl 1.59 q.remove(itemFor(j));
885 dl 1.3 it = q.descendingIterator();
886 jsr166 1.38 for (int j = split + 1; j <= max; ++j) {
887 dl 1.59 mustEqual(it.next(), j);
888 dl 1.4 it.remove();
889     }
890 dl 1.3 assertFalse(it.hasNext());
891 dl 1.4 assertTrue(q.isEmpty());
892 dl 1.3 }
893 dl 1.2 }
894    
895 dl 1.1 /**
896 jsr166 1.16 * toString() contains toStrings of elements
897 dl 1.1 */
898     public void testToString() {
899 dl 1.59 ArrayDeque<Item> q = populatedDeque(SIZE);
900 dl 1.1 String s = q.toString();
901     for (int i = 0; i < SIZE; ++i) {
902 jsr166 1.23 assertTrue(s.contains(String.valueOf(i)));
903 dl 1.1 }
904 jsr166 1.5 }
905 dl 1.1
906     /**
907 jsr166 1.56 * A deserialized/reserialized deque has same elements in same order
908 dl 1.1 */
909 jsr166 1.16 public void testSerialization() throws Exception {
910 dl 1.59 Queue<Item> x = populatedDeque(SIZE);
911     Queue<Item> y = serialClone(x);
912 jsr166 1.24
913 jsr166 1.28 assertNotSame(y, x);
914 dl 1.59 mustEqual(x.size(), y.size());
915     mustEqual(x.toString(), y.toString());
916     mustEqual(Arrays.toString(x.toArray()), Arrays.toString(y.toArray()));
917 jsr166 1.24 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
918     while (!x.isEmpty()) {
919     assertFalse(y.isEmpty());
920 dl 1.59 mustEqual(x.remove(), y.remove());
921 jsr166 1.24 }
922     assertTrue(y.isEmpty());
923 jsr166 1.5 }
924 dl 1.1
925 jsr166 1.29 /**
926 jsr166 1.43 * A cloned deque has same elements in same order
927     */
928     public void testClone() throws Exception {
929 dl 1.59 ArrayDeque<Item> x = populatedDeque(SIZE);
930     ArrayDeque<Item> y = x.clone();
931 jsr166 1.43
932     assertNotSame(y, x);
933 dl 1.59 mustEqual(x.size(), y.size());
934     mustEqual(x.toString(), y.toString());
935 jsr166 1.43 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
936     while (!x.isEmpty()) {
937     assertFalse(y.isEmpty());
938 dl 1.59 mustEqual(x.remove(), y.remove());
939 jsr166 1.43 }
940     assertTrue(y.isEmpty());
941     }
942    
943     /**
944 jsr166 1.29 * remove(null), contains(null) always return false
945     */
946     public void testNeverContainsNull() {
947     Deque<?>[] qs = {
948     new ArrayDeque<Object>(),
949     populatedDeque(2),
950     };
951    
952     for (Deque<?> q : qs) {
953     assertFalse(q.contains(null));
954     assertFalse(q.remove(null));
955     assertFalse(q.removeFirstOccurrence(null));
956     assertFalse(q.removeLastOccurrence(null));
957     }
958     }
959    
960 dl 1.1 }