ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.56
Committed: Wed Dec 31 20:09:08 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.55: +2 -2 lines
Log Message:
whitespace

File Contents

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