ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.45
Committed: Mon May 30 22:43:20 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.44: +21 -122 lines
Log Message:
refactor more generic BlockingQueue tests into BlockingQueueTest.java

File Contents

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