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