ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.38
Committed: Fri Nov 5 00:17:22 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.37: +6 -4 lines
Log Message:
very small improvements to testToArray2

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/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 import java.io.*;
14
15 public class PriorityBlockingQueueTest extends JSR166TestCase {
16
17 public static class Generic extends BlockingQueueTest {
18 protected BlockingQueue emptyCollection() {
19 return new PriorityBlockingQueue();
20 }
21 }
22
23 public static class InitialCapacity extends BlockingQueueTest {
24 protected BlockingQueue emptyCollection() {
25 return new PriorityBlockingQueue(20);
26 }
27 }
28
29 public static void main(String[] args) {
30 junit.textui.TestRunner.run(suite());
31 }
32
33 public static Test suite() {
34 return newTestSuite(PriorityBlockingQueueTest.class,
35 new Generic().testSuite(),
36 new InitialCapacity().testSuite());
37 }
38
39 private static final int NOCAP = Integer.MAX_VALUE;
40
41 /** Sample Comparator */
42 static class MyReverseComparator implements Comparator {
43 public int compare(Object x, Object y) {
44 return ((Comparable)y).compareTo(x);
45 }
46 }
47
48 /**
49 * Create a queue of given size containing consecutive
50 * Integers 0 ... n.
51 */
52 private PriorityBlockingQueue<Integer> populatedQueue(int n) {
53 PriorityBlockingQueue<Integer> q =
54 new PriorityBlockingQueue<Integer>(n);
55 assertTrue(q.isEmpty());
56 for (int i = n-1; i >= 0; i-=2)
57 assertTrue(q.offer(new Integer(i)));
58 for (int i = (n & 1); i < n; i+=2)
59 assertTrue(q.offer(new Integer(i)));
60 assertFalse(q.isEmpty());
61 assertEquals(NOCAP, q.remainingCapacity());
62 assertEquals(n, q.size());
63 return q;
64 }
65
66 /**
67 * A new queue has unbounded capacity
68 */
69 public void testConstructor1() {
70 assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
71 }
72
73 /**
74 * Constructor throws IAE if capacity argument nonpositive
75 */
76 public void testConstructor2() {
77 try {
78 PriorityBlockingQueue q = new PriorityBlockingQueue(0);
79 shouldThrow();
80 } catch (IllegalArgumentException success) {}
81 }
82
83 /**
84 * Initializing from null Collection throws NPE
85 */
86 public void testConstructor3() {
87 try {
88 PriorityBlockingQueue q = new PriorityBlockingQueue(null);
89 shouldThrow();
90 } catch (NullPointerException success) {}
91 }
92
93 /**
94 * Initializing from Collection of null elements throws NPE
95 */
96 public void testConstructor4() {
97 try {
98 Integer[] ints = new Integer[SIZE];
99 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
100 shouldThrow();
101 } catch (NullPointerException success) {}
102 }
103
104 /**
105 * Initializing from Collection with some null elements throws NPE
106 */
107 public void testConstructor5() {
108 try {
109 Integer[] ints = new Integer[SIZE];
110 for (int i = 0; i < SIZE-1; ++i)
111 ints[i] = new Integer(i);
112 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
113 shouldThrow();
114 } catch (NullPointerException success) {}
115 }
116
117 /**
118 * Queue contains all elements of collection used to initialize
119 */
120 public void testConstructor6() {
121 Integer[] ints = new Integer[SIZE];
122 for (int i = 0; i < SIZE; ++i)
123 ints[i] = new Integer(i);
124 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
125 for (int i = 0; i < SIZE; ++i)
126 assertEquals(ints[i], q.poll());
127 }
128
129 /**
130 * The comparator used in constructor is used
131 */
132 public void testConstructor7() {
133 MyReverseComparator cmp = new MyReverseComparator();
134 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
135 assertEquals(cmp, q.comparator());
136 Integer[] ints = new Integer[SIZE];
137 for (int i = 0; i < SIZE; ++i)
138 ints[i] = new Integer(i);
139 q.addAll(Arrays.asList(ints));
140 for (int i = SIZE-1; i >= 0; --i)
141 assertEquals(ints[i], q.poll());
142 }
143
144 /**
145 * isEmpty is true before add, false after
146 */
147 public void testEmpty() {
148 PriorityBlockingQueue q = new PriorityBlockingQueue(2);
149 assertTrue(q.isEmpty());
150 assertEquals(NOCAP, q.remainingCapacity());
151 q.add(one);
152 assertFalse(q.isEmpty());
153 q.add(two);
154 q.remove();
155 q.remove();
156 assertTrue(q.isEmpty());
157 }
158
159 /**
160 * remainingCapacity does not change when elements added or removed,
161 * but size does
162 */
163 public void testRemainingCapacity() {
164 PriorityBlockingQueue q = populatedQueue(SIZE);
165 for (int i = 0; i < SIZE; ++i) {
166 assertEquals(NOCAP, q.remainingCapacity());
167 assertEquals(SIZE-i, q.size());
168 q.remove();
169 }
170 for (int i = 0; i < SIZE; ++i) {
171 assertEquals(NOCAP, q.remainingCapacity());
172 assertEquals(i, q.size());
173 q.add(new Integer(i));
174 }
175 }
176
177 /**
178 * offer(null) throws NPE
179 */
180 public void testOfferNull() {
181 try {
182 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
183 q.offer(null);
184 shouldThrow();
185 } catch (NullPointerException success) {}
186 }
187
188 /**
189 * add(null) throws NPE
190 */
191 public void testAddNull() {
192 try {
193 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
194 q.add(null);
195 shouldThrow();
196 } catch (NullPointerException success) {}
197 }
198
199 /**
200 * Offer of comparable element succeeds
201 */
202 public void testOffer() {
203 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
204 assertTrue(q.offer(zero));
205 assertTrue(q.offer(one));
206 }
207
208 /**
209 * Offer of non-Comparable throws CCE
210 */
211 public void testOfferNonComparable() {
212 try {
213 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
214 q.offer(new Object());
215 q.offer(new Object());
216 q.offer(new Object());
217 shouldThrow();
218 } catch (ClassCastException success) {}
219 }
220
221 /**
222 * add of comparable succeeds
223 */
224 public void testAdd() {
225 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
226 for (int i = 0; i < SIZE; ++i) {
227 assertEquals(i, q.size());
228 assertTrue(q.add(new Integer(i)));
229 }
230 }
231
232 /**
233 * addAll(null) throws NPE
234 */
235 public void testAddAll1() {
236 try {
237 PriorityBlockingQueue q = new PriorityBlockingQueue(1);
238 q.addAll(null);
239 shouldThrow();
240 } catch (NullPointerException success) {}
241 }
242
243 /**
244 * addAll(this) throws IAE
245 */
246 public void testAddAllSelf() {
247 try {
248 PriorityBlockingQueue q = populatedQueue(SIZE);
249 q.addAll(q);
250 shouldThrow();
251 } catch (IllegalArgumentException success) {}
252 }
253
254 /**
255 * addAll of a collection with null elements throws NPE
256 */
257 public void testAddAll2() {
258 try {
259 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
260 Integer[] ints = new Integer[SIZE];
261 q.addAll(Arrays.asList(ints));
262 shouldThrow();
263 } catch (NullPointerException success) {}
264 }
265
266 /**
267 * addAll of a collection with any null elements throws NPE after
268 * possibly adding some elements
269 */
270 public void testAddAll3() {
271 try {
272 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
273 Integer[] ints = new Integer[SIZE];
274 for (int i = 0; i < SIZE-1; ++i)
275 ints[i] = new Integer(i);
276 q.addAll(Arrays.asList(ints));
277 shouldThrow();
278 } catch (NullPointerException success) {}
279 }
280
281 /**
282 * Queue contains all elements of successful addAll
283 */
284 public void testAddAll5() {
285 Integer[] empty = new Integer[0];
286 Integer[] ints = new Integer[SIZE];
287 for (int i = SIZE-1; i >= 0; --i)
288 ints[i] = new Integer(i);
289 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
290 assertFalse(q.addAll(Arrays.asList(empty)));
291 assertTrue(q.addAll(Arrays.asList(ints)));
292 for (int i = 0; i < SIZE; ++i)
293 assertEquals(ints[i], q.poll());
294 }
295
296 /**
297 * put(null) throws NPE
298 */
299 public void testPutNull() {
300 try {
301 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
302 q.put(null);
303 shouldThrow();
304 } catch (NullPointerException success) {}
305 }
306
307 /**
308 * all elements successfully put are contained
309 */
310 public void testPut() {
311 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
312 for (int i = 0; i < SIZE; ++i) {
313 Integer I = new Integer(i);
314 q.put(I);
315 assertTrue(q.contains(I));
316 }
317 assertEquals(SIZE, q.size());
318 }
319
320 /**
321 * put doesn't block waiting for take
322 */
323 public void testPutWithTake() throws InterruptedException {
324 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
325 final int size = 4;
326 Thread t = new Thread(new CheckedRunnable() {
327 public void realRun() {
328 for (int i = 0; i < size; i++)
329 q.put(new Integer(0));
330 }});
331
332 t.start();
333 Thread.sleep(SHORT_DELAY_MS);
334 assertEquals(q.size(), size);
335 q.take();
336 t.interrupt();
337 t.join();
338 }
339
340 /**
341 * timed offer does not time out
342 */
343 public void testTimedOffer() throws InterruptedException {
344 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
345 Thread t = new Thread(new CheckedRunnable() {
346 public void realRun() {
347 q.put(new Integer(0));
348 q.put(new Integer(0));
349 assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
350 assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
351 }});
352
353 t.start();
354 Thread.sleep(SMALL_DELAY_MS);
355 t.interrupt();
356 t.join();
357 }
358
359 /**
360 * take retrieves elements in priority order
361 */
362 public void testTake() throws InterruptedException {
363 PriorityBlockingQueue q = populatedQueue(SIZE);
364 for (int i = 0; i < SIZE; ++i) {
365 assertEquals(i, q.take());
366 }
367 }
368
369 /**
370 * Take removes existing elements until empty, then blocks interruptibly
371 */
372 public void testBlockingTake() throws InterruptedException {
373 final PriorityBlockingQueue q = populatedQueue(SIZE);
374 Thread t = new Thread(new CheckedRunnable() {
375 public void realRun() throws InterruptedException {
376 for (int i = 0; i < SIZE; ++i) {
377 assertEquals(i, q.take());
378 }
379 try {
380 q.take();
381 shouldThrow();
382 } catch (InterruptedException success) {}
383 }});
384
385 t.start();
386 Thread.sleep(SHORT_DELAY_MS);
387 t.interrupt();
388 t.join();
389 }
390
391
392 /**
393 * poll succeeds unless empty
394 */
395 public void testPoll() {
396 PriorityBlockingQueue q = populatedQueue(SIZE);
397 for (int i = 0; i < SIZE; ++i) {
398 assertEquals(i, q.poll());
399 }
400 assertNull(q.poll());
401 }
402
403 /**
404 * timed poll with zero timeout succeeds when non-empty, else times out
405 */
406 public void testTimedPoll0() throws InterruptedException {
407 PriorityBlockingQueue q = populatedQueue(SIZE);
408 for (int i = 0; i < SIZE; ++i) {
409 assertEquals(i, q.poll(0, MILLISECONDS));
410 }
411 assertNull(q.poll(0, MILLISECONDS));
412 }
413
414 /**
415 * timed poll with nonzero timeout succeeds when non-empty, else times out
416 */
417 public void testTimedPoll() throws InterruptedException {
418 PriorityBlockingQueue q = populatedQueue(SIZE);
419 for (int i = 0; i < SIZE; ++i) {
420 assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
421 }
422 assertNull(q.poll(SHORT_DELAY_MS, MILLISECONDS));
423 }
424
425 /**
426 * Interrupted timed poll throws InterruptedException instead of
427 * returning timeout status
428 */
429 public void testInterruptedTimedPoll() throws InterruptedException {
430 Thread t = new Thread(new CheckedRunnable() {
431 public void realRun() throws InterruptedException {
432 PriorityBlockingQueue q = populatedQueue(SIZE);
433 for (int i = 0; i < SIZE; ++i) {
434 assertEquals(i, q.poll(SHORT_DELAY_MS, MILLISECONDS));
435 }
436 try {
437 q.poll(SMALL_DELAY_MS, MILLISECONDS);
438 shouldThrow();
439 } catch (InterruptedException success) {}
440 }});
441
442 t.start();
443 Thread.sleep(SHORT_DELAY_MS);
444 t.interrupt();
445 t.join();
446 }
447
448 /**
449 * peek returns next element, or null if empty
450 */
451 public void testPeek() {
452 PriorityBlockingQueue q = populatedQueue(SIZE);
453 for (int i = 0; i < SIZE; ++i) {
454 assertEquals(i, q.peek());
455 assertEquals(i, q.poll());
456 assertTrue(q.peek() == null ||
457 !q.peek().equals(i));
458 }
459 assertNull(q.peek());
460 }
461
462 /**
463 * element returns next element, or throws NSEE if empty
464 */
465 public void testElement() {
466 PriorityBlockingQueue q = populatedQueue(SIZE);
467 for (int i = 0; i < SIZE; ++i) {
468 assertEquals(i, q.element());
469 assertEquals(i, q.poll());
470 }
471 try {
472 q.element();
473 shouldThrow();
474 } catch (NoSuchElementException success) {}
475 }
476
477 /**
478 * remove removes next element, or throws NSEE if empty
479 */
480 public void testRemove() {
481 PriorityBlockingQueue q = populatedQueue(SIZE);
482 for (int i = 0; i < SIZE; ++i) {
483 assertEquals(i, q.remove());
484 }
485 try {
486 q.remove();
487 shouldThrow();
488 } catch (NoSuchElementException success) {}
489 }
490
491 /**
492 * remove(x) removes x and returns true if present
493 */
494 public void testRemoveElement() {
495 PriorityBlockingQueue q = populatedQueue(SIZE);
496 for (int i = 1; i < SIZE; i+=2) {
497 assertTrue(q.remove(new Integer(i)));
498 }
499 for (int i = 0; i < SIZE; i+=2) {
500 assertTrue(q.remove(new Integer(i)));
501 assertFalse(q.remove(new Integer(i+1)));
502 }
503 assertTrue(q.isEmpty());
504 }
505
506 /**
507 * contains(x) reports true when elements added but not yet removed
508 */
509 public void testContains() {
510 PriorityBlockingQueue q = populatedQueue(SIZE);
511 for (int i = 0; i < SIZE; ++i) {
512 assertTrue(q.contains(new Integer(i)));
513 q.poll();
514 assertFalse(q.contains(new Integer(i)));
515 }
516 }
517
518 /**
519 * clear removes all elements
520 */
521 public void testClear() {
522 PriorityBlockingQueue q = populatedQueue(SIZE);
523 q.clear();
524 assertTrue(q.isEmpty());
525 assertEquals(0, q.size());
526 q.add(one);
527 assertFalse(q.isEmpty());
528 assertTrue(q.contains(one));
529 q.clear();
530 assertTrue(q.isEmpty());
531 }
532
533 /**
534 * containsAll(c) is true when c contains a subset of elements
535 */
536 public void testContainsAll() {
537 PriorityBlockingQueue q = populatedQueue(SIZE);
538 PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
539 for (int i = 0; i < SIZE; ++i) {
540 assertTrue(q.containsAll(p));
541 assertFalse(p.containsAll(q));
542 p.add(new Integer(i));
543 }
544 assertTrue(p.containsAll(q));
545 }
546
547 /**
548 * retainAll(c) retains only those elements of c and reports true if changed
549 */
550 public void testRetainAll() {
551 PriorityBlockingQueue q = populatedQueue(SIZE);
552 PriorityBlockingQueue p = populatedQueue(SIZE);
553 for (int i = 0; i < SIZE; ++i) {
554 boolean changed = q.retainAll(p);
555 if (i == 0)
556 assertFalse(changed);
557 else
558 assertTrue(changed);
559
560 assertTrue(q.containsAll(p));
561 assertEquals(SIZE-i, q.size());
562 p.remove();
563 }
564 }
565
566 /**
567 * removeAll(c) removes only those elements of c and reports true if changed
568 */
569 public void testRemoveAll() {
570 for (int i = 1; i < SIZE; ++i) {
571 PriorityBlockingQueue q = populatedQueue(SIZE);
572 PriorityBlockingQueue p = populatedQueue(i);
573 assertTrue(q.removeAll(p));
574 assertEquals(SIZE-i, q.size());
575 for (int j = 0; j < i; ++j) {
576 Integer I = (Integer)(p.remove());
577 assertFalse(q.contains(I));
578 }
579 }
580 }
581
582 /**
583 * toArray contains all elements
584 */
585 public void testToArray() throws InterruptedException {
586 PriorityBlockingQueue q = populatedQueue(SIZE);
587 Object[] o = q.toArray();
588 Arrays.sort(o);
589 for (int i = 0; i < o.length; i++)
590 assertSame(o[i], q.take());
591 }
592
593 /**
594 * toArray(a) contains all elements
595 */
596 public void testToArray2() throws InterruptedException {
597 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
598 Integer[] ints = new Integer[SIZE];
599 Integer[] array = q.toArray(ints);
600 assertSame(ints, array);
601 Arrays.sort(ints);
602 for (int i = 0; i < ints.length; i++)
603 assertSame(ints[i], q.take());
604 }
605
606 /**
607 * toArray(null) throws NullPointerException
608 */
609 public void testToArray_NullArg() {
610 PriorityBlockingQueue q = populatedQueue(SIZE);
611 try {
612 q.toArray(null);
613 shouldThrow();
614 } catch (NullPointerException success) {}
615 }
616
617 /**
618 * toArray(incompatible array type) throws ArrayStoreException
619 */
620 public void testToArray1_BadArg() {
621 PriorityBlockingQueue q = populatedQueue(SIZE);
622 try {
623 q.toArray(new String[10]);
624 shouldThrow();
625 } catch (ArrayStoreException success) {}
626 }
627
628 /**
629 * iterator iterates through all elements
630 */
631 public void testIterator() {
632 PriorityBlockingQueue q = populatedQueue(SIZE);
633 int i = 0;
634 Iterator it = q.iterator();
635 while (it.hasNext()) {
636 assertTrue(q.contains(it.next()));
637 ++i;
638 }
639 assertEquals(i, SIZE);
640 }
641
642 /**
643 * iterator.remove removes current element
644 */
645 public void testIteratorRemove() {
646 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
647 q.add(new Integer(2));
648 q.add(new Integer(1));
649 q.add(new Integer(3));
650
651 Iterator it = q.iterator();
652 it.next();
653 it.remove();
654
655 it = q.iterator();
656 assertEquals(it.next(), new Integer(2));
657 assertEquals(it.next(), new Integer(3));
658 assertFalse(it.hasNext());
659 }
660
661
662 /**
663 * toString contains toStrings of elements
664 */
665 public void testToString() {
666 PriorityBlockingQueue q = populatedQueue(SIZE);
667 String s = q.toString();
668 for (int i = 0; i < SIZE; ++i) {
669 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
670 }
671 }
672
673 /**
674 * offer transfers elements across Executor tasks
675 */
676 public void testPollInExecutor() {
677 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
678 ExecutorService executor = Executors.newFixedThreadPool(2);
679 executor.execute(new CheckedRunnable() {
680 public void realRun() throws InterruptedException {
681 assertNull(q.poll());
682 assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
683 assertTrue(q.isEmpty());
684 }});
685
686 executor.execute(new CheckedRunnable() {
687 public void realRun() throws InterruptedException {
688 Thread.sleep(SMALL_DELAY_MS);
689 q.put(one);
690 }});
691
692 joinPool(executor);
693 }
694
695 /**
696 * A deserialized serialized queue has same elements
697 */
698 public void testSerialization() throws Exception {
699 PriorityBlockingQueue q = populatedQueue(SIZE);
700 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
701 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
702 out.writeObject(q);
703 out.close();
704
705 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
706 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
707 PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
708 assertEquals(q.size(), r.size());
709 while (!q.isEmpty())
710 assertEquals(q.remove(), r.remove());
711 }
712
713 /**
714 * drainTo(null) throws NPE
715 */
716 public void testDrainToNull() {
717 PriorityBlockingQueue q = populatedQueue(SIZE);
718 try {
719 q.drainTo(null);
720 shouldThrow();
721 } catch (NullPointerException success) {}
722 }
723
724 /**
725 * drainTo(this) throws IAE
726 */
727 public void testDrainToSelf() {
728 PriorityBlockingQueue q = populatedQueue(SIZE);
729 try {
730 q.drainTo(q);
731 shouldThrow();
732 } catch (IllegalArgumentException success) {}
733 }
734
735 /**
736 * drainTo(c) empties queue into another collection c
737 */
738 public void testDrainTo() {
739 PriorityBlockingQueue q = populatedQueue(SIZE);
740 ArrayList l = new ArrayList();
741 q.drainTo(l);
742 assertEquals(q.size(), 0);
743 assertEquals(l.size(), SIZE);
744 for (int i = 0; i < SIZE; ++i)
745 assertEquals(l.get(i), new Integer(i));
746 q.add(zero);
747 q.add(one);
748 assertFalse(q.isEmpty());
749 assertTrue(q.contains(zero));
750 assertTrue(q.contains(one));
751 l.clear();
752 q.drainTo(l);
753 assertEquals(q.size(), 0);
754 assertEquals(l.size(), 2);
755 for (int i = 0; i < 2; ++i)
756 assertEquals(l.get(i), new Integer(i));
757 }
758
759 /**
760 * drainTo empties queue
761 */
762 public void testDrainToWithActivePut() throws InterruptedException {
763 final PriorityBlockingQueue q = populatedQueue(SIZE);
764 Thread t = new Thread(new CheckedRunnable() {
765 public void realRun() {
766 q.put(new Integer(SIZE+1));
767 }});
768
769 t.start();
770 ArrayList l = new ArrayList();
771 q.drainTo(l);
772 assertTrue(l.size() >= SIZE);
773 for (int i = 0; i < SIZE; ++i)
774 assertEquals(l.get(i), new Integer(i));
775 t.join();
776 assertTrue(q.size() + l.size() >= SIZE);
777 }
778
779 /**
780 * drainTo(null, n) throws NPE
781 */
782 public void testDrainToNullN() {
783 PriorityBlockingQueue q = populatedQueue(SIZE);
784 try {
785 q.drainTo(null, 0);
786 shouldThrow();
787 } catch (NullPointerException success) {}
788 }
789
790 /**
791 * drainTo(this, n) throws IAE
792 */
793 public void testDrainToSelfN() {
794 PriorityBlockingQueue q = populatedQueue(SIZE);
795 try {
796 q.drainTo(q, 0);
797 shouldThrow();
798 } catch (IllegalArgumentException success) {}
799 }
800
801 /**
802 * drainTo(c, n) empties first min(n, size) elements of queue into c
803 */
804 public void testDrainToN() {
805 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
806 for (int i = 0; i < SIZE + 2; ++i) {
807 for (int j = 0; j < SIZE; j++)
808 assertTrue(q.offer(new Integer(j)));
809 ArrayList l = new ArrayList();
810 q.drainTo(l, i);
811 int k = (i < SIZE) ? i : SIZE;
812 assertEquals(l.size(), k);
813 assertEquals(q.size(), SIZE-k);
814 for (int j = 0; j < k; ++j)
815 assertEquals(l.get(j), new Integer(j));
816 while (q.poll() != null) ;
817 }
818 }
819
820 }