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