ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.69
Committed: Sun Oct 16 20:44:18 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.68: +2 -1 lines
Log Message:
improve populatedFoo methods

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