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