ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.16
Committed: Sat Nov 21 02:07:27 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.15: +26 -26 lines
Log Message:
untabify

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