ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.39
Committed: Thu Nov 18 20:21:53 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.38: +9 -3 lines
Log Message:
add more assertions to testRemoveElement

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.contains(i));
498 assertTrue(q.remove(i));
499 assertFalse(q.contains(i));
500 assertTrue(q.contains(i-1));
501 }
502 for (int i = 0; i < SIZE; i+=2) {
503 assertTrue(q.contains(i));
504 assertTrue(q.remove(i));
505 assertFalse(q.contains(i));
506 assertFalse(q.remove(i+1));
507 assertFalse(q.contains(i+1));
508 }
509 assertTrue(q.isEmpty());
510 }
511
512 /**
513 * contains(x) reports true when elements added but not yet removed
514 */
515 public void testContains() {
516 PriorityBlockingQueue q = populatedQueue(SIZE);
517 for (int i = 0; i < SIZE; ++i) {
518 assertTrue(q.contains(new Integer(i)));
519 q.poll();
520 assertFalse(q.contains(new Integer(i)));
521 }
522 }
523
524 /**
525 * clear removes all elements
526 */
527 public void testClear() {
528 PriorityBlockingQueue q = populatedQueue(SIZE);
529 q.clear();
530 assertTrue(q.isEmpty());
531 assertEquals(0, q.size());
532 q.add(one);
533 assertFalse(q.isEmpty());
534 assertTrue(q.contains(one));
535 q.clear();
536 assertTrue(q.isEmpty());
537 }
538
539 /**
540 * containsAll(c) is true when c contains a subset of elements
541 */
542 public void testContainsAll() {
543 PriorityBlockingQueue q = populatedQueue(SIZE);
544 PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
545 for (int i = 0; i < SIZE; ++i) {
546 assertTrue(q.containsAll(p));
547 assertFalse(p.containsAll(q));
548 p.add(new Integer(i));
549 }
550 assertTrue(p.containsAll(q));
551 }
552
553 /**
554 * retainAll(c) retains only those elements of c and reports true if changed
555 */
556 public void testRetainAll() {
557 PriorityBlockingQueue q = populatedQueue(SIZE);
558 PriorityBlockingQueue p = populatedQueue(SIZE);
559 for (int i = 0; i < SIZE; ++i) {
560 boolean changed = q.retainAll(p);
561 if (i == 0)
562 assertFalse(changed);
563 else
564 assertTrue(changed);
565
566 assertTrue(q.containsAll(p));
567 assertEquals(SIZE-i, q.size());
568 p.remove();
569 }
570 }
571
572 /**
573 * removeAll(c) removes only those elements of c and reports true if changed
574 */
575 public void testRemoveAll() {
576 for (int i = 1; i < SIZE; ++i) {
577 PriorityBlockingQueue q = populatedQueue(SIZE);
578 PriorityBlockingQueue p = populatedQueue(i);
579 assertTrue(q.removeAll(p));
580 assertEquals(SIZE-i, q.size());
581 for (int j = 0; j < i; ++j) {
582 Integer I = (Integer)(p.remove());
583 assertFalse(q.contains(I));
584 }
585 }
586 }
587
588 /**
589 * toArray contains all elements
590 */
591 public void testToArray() throws InterruptedException {
592 PriorityBlockingQueue q = populatedQueue(SIZE);
593 Object[] o = q.toArray();
594 Arrays.sort(o);
595 for (int i = 0; i < o.length; i++)
596 assertSame(o[i], q.take());
597 }
598
599 /**
600 * toArray(a) contains all elements
601 */
602 public void testToArray2() throws InterruptedException {
603 PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
604 Integer[] ints = new Integer[SIZE];
605 Integer[] array = q.toArray(ints);
606 assertSame(ints, array);
607 Arrays.sort(ints);
608 for (int i = 0; i < ints.length; i++)
609 assertSame(ints[i], q.take());
610 }
611
612 /**
613 * toArray(null) throws NullPointerException
614 */
615 public void testToArray_NullArg() {
616 PriorityBlockingQueue q = populatedQueue(SIZE);
617 try {
618 q.toArray(null);
619 shouldThrow();
620 } catch (NullPointerException success) {}
621 }
622
623 /**
624 * toArray(incompatible array type) throws ArrayStoreException
625 */
626 public void testToArray1_BadArg() {
627 PriorityBlockingQueue q = populatedQueue(SIZE);
628 try {
629 q.toArray(new String[10]);
630 shouldThrow();
631 } catch (ArrayStoreException success) {}
632 }
633
634 /**
635 * iterator iterates through all elements
636 */
637 public void testIterator() {
638 PriorityBlockingQueue q = populatedQueue(SIZE);
639 int i = 0;
640 Iterator it = q.iterator();
641 while (it.hasNext()) {
642 assertTrue(q.contains(it.next()));
643 ++i;
644 }
645 assertEquals(i, SIZE);
646 }
647
648 /**
649 * iterator.remove removes current element
650 */
651 public void testIteratorRemove() {
652 final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
653 q.add(new Integer(2));
654 q.add(new Integer(1));
655 q.add(new Integer(3));
656
657 Iterator it = q.iterator();
658 it.next();
659 it.remove();
660
661 it = q.iterator();
662 assertEquals(it.next(), new Integer(2));
663 assertEquals(it.next(), new Integer(3));
664 assertFalse(it.hasNext());
665 }
666
667
668 /**
669 * toString contains toStrings of elements
670 */
671 public void testToString() {
672 PriorityBlockingQueue q = populatedQueue(SIZE);
673 String s = q.toString();
674 for (int i = 0; i < SIZE; ++i) {
675 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
676 }
677 }
678
679 /**
680 * offer transfers elements across Executor tasks
681 */
682 public void testPollInExecutor() {
683 final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
684 ExecutorService executor = Executors.newFixedThreadPool(2);
685 executor.execute(new CheckedRunnable() {
686 public void realRun() throws InterruptedException {
687 assertNull(q.poll());
688 assertSame(one, q.poll(MEDIUM_DELAY_MS, MILLISECONDS));
689 assertTrue(q.isEmpty());
690 }});
691
692 executor.execute(new CheckedRunnable() {
693 public void realRun() throws InterruptedException {
694 Thread.sleep(SMALL_DELAY_MS);
695 q.put(one);
696 }});
697
698 joinPool(executor);
699 }
700
701 /**
702 * A deserialized serialized queue has same elements
703 */
704 public void testSerialization() throws Exception {
705 PriorityBlockingQueue q = populatedQueue(SIZE);
706 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
707 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
708 out.writeObject(q);
709 out.close();
710
711 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
712 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
713 PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
714 assertEquals(q.size(), r.size());
715 while (!q.isEmpty())
716 assertEquals(q.remove(), r.remove());
717 }
718
719 /**
720 * drainTo(null) throws NPE
721 */
722 public void testDrainToNull() {
723 PriorityBlockingQueue q = populatedQueue(SIZE);
724 try {
725 q.drainTo(null);
726 shouldThrow();
727 } catch (NullPointerException success) {}
728 }
729
730 /**
731 * drainTo(this) throws IAE
732 */
733 public void testDrainToSelf() {
734 PriorityBlockingQueue q = populatedQueue(SIZE);
735 try {
736 q.drainTo(q);
737 shouldThrow();
738 } catch (IllegalArgumentException success) {}
739 }
740
741 /**
742 * drainTo(c) empties queue into another collection c
743 */
744 public void testDrainTo() {
745 PriorityBlockingQueue q = populatedQueue(SIZE);
746 ArrayList l = new ArrayList();
747 q.drainTo(l);
748 assertEquals(q.size(), 0);
749 assertEquals(l.size(), SIZE);
750 for (int i = 0; i < SIZE; ++i)
751 assertEquals(l.get(i), new Integer(i));
752 q.add(zero);
753 q.add(one);
754 assertFalse(q.isEmpty());
755 assertTrue(q.contains(zero));
756 assertTrue(q.contains(one));
757 l.clear();
758 q.drainTo(l);
759 assertEquals(q.size(), 0);
760 assertEquals(l.size(), 2);
761 for (int i = 0; i < 2; ++i)
762 assertEquals(l.get(i), new Integer(i));
763 }
764
765 /**
766 * drainTo empties queue
767 */
768 public void testDrainToWithActivePut() throws InterruptedException {
769 final PriorityBlockingQueue q = populatedQueue(SIZE);
770 Thread t = new Thread(new CheckedRunnable() {
771 public void realRun() {
772 q.put(new Integer(SIZE+1));
773 }});
774
775 t.start();
776 ArrayList l = new ArrayList();
777 q.drainTo(l);
778 assertTrue(l.size() >= SIZE);
779 for (int i = 0; i < SIZE; ++i)
780 assertEquals(l.get(i), new Integer(i));
781 t.join();
782 assertTrue(q.size() + l.size() >= SIZE);
783 }
784
785 /**
786 * drainTo(null, n) throws NPE
787 */
788 public void testDrainToNullN() {
789 PriorityBlockingQueue q = populatedQueue(SIZE);
790 try {
791 q.drainTo(null, 0);
792 shouldThrow();
793 } catch (NullPointerException success) {}
794 }
795
796 /**
797 * drainTo(this, n) throws IAE
798 */
799 public void testDrainToSelfN() {
800 PriorityBlockingQueue q = populatedQueue(SIZE);
801 try {
802 q.drainTo(q, 0);
803 shouldThrow();
804 } catch (IllegalArgumentException success) {}
805 }
806
807 /**
808 * drainTo(c, n) empties first min(n, size) elements of queue into c
809 */
810 public void testDrainToN() {
811 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE*2);
812 for (int i = 0; i < SIZE + 2; ++i) {
813 for (int j = 0; j < SIZE; j++)
814 assertTrue(q.offer(new Integer(j)));
815 ArrayList l = new ArrayList();
816 q.drainTo(l, i);
817 int k = (i < SIZE) ? i : SIZE;
818 assertEquals(l.size(), k);
819 assertEquals(q.size(), SIZE-k);
820 for (int j = 0; j < k; ++j)
821 assertEquals(l.get(j), new Integer(j));
822 while (q.poll() != null) ;
823 }
824 }
825
826 }