ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.74
Committed: Sat May 13 22:49:01 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.73: +1 -1 lines
Log Message:
claw back some millis using assertThreadBlocks

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