ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ArrayDequeTest.java
Revision: 1.39
Committed: Mon Oct 10 14:18:06 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.38: +12 -0 lines
Log Message:
add more assertions

File Contents

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