ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityQueueTest.java
Revision: 1.45
Committed: Sun May 6 22:09:42 2018 UTC (5 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.44: +10 -2 lines
Log Message:
Add tests for PriorityQueue with Comparator

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 java.util.Arrays;
10 import java.util.Collection;
11 import java.util.Comparator;
12 import java.util.Iterator;
13 import java.util.NoSuchElementException;
14 import java.util.PriorityQueue;
15 import java.util.Queue;
16
17 import junit.framework.Test;
18
19 public class PriorityQueueTest extends JSR166TestCase {
20 public static void main(String[] args) {
21 main(suite(), args);
22 }
23 public static Test suite() {
24 class Implementation implements CollectionImplementation {
25 public Class<?> klazz() { return PriorityQueue.class; }
26 public Collection emptyCollection() { return new PriorityQueue(); }
27 public Object makeElement(int i) { return i; }
28 public boolean isConcurrent() { return false; }
29 public boolean permitsNulls() { return false; }
30 }
31 class ComparatorImplementation implements CollectionImplementation {
32 public Class<?> klazz() { return PriorityQueue.class; }
33 public Collection emptyCollection() { return new PriorityQueue(new MyReverseComparator()); }
34 public Object makeElement(int i) { return i; }
35 public boolean isConcurrent() { return false; }
36 public boolean permitsNulls() { return false; }
37 }
38 return newTestSuite(PriorityQueueTest.class,
39 CollectionTest.testSuite(new Implementation()),
40 CollectionTest.testSuite(new ComparatorImplementation()));
41 }
42
43 static class MyReverseComparator implements Comparator, java.io.Serializable {
44 public int compare(Object x, Object y) {
45 return ((Comparable)y).compareTo(x);
46 }
47 }
48
49 /**
50 * Returns a new queue of given size containing consecutive
51 * Integers 0 ... n - 1.
52 */
53 private static PriorityQueue<Integer> populatedQueue(int n) {
54 PriorityQueue<Integer> q = new PriorityQueue<>(n);
55 assertTrue(q.isEmpty());
56 for (int i = n - 1; i >= 0; i -= 2)
57 assertTrue(q.offer(new Integer(i)));
58 for (int i = (n & 1); i < n; i += 2)
59 assertTrue(q.offer(new Integer(i)));
60 assertFalse(q.isEmpty());
61 assertEquals(n, q.size());
62 assertEquals((Integer) 0, q.peek());
63 return q;
64 }
65
66 /**
67 * A new queue has unbounded capacity
68 */
69 public void testConstructor1() {
70 assertEquals(0, new PriorityQueue(SIZE).size());
71 }
72
73 /**
74 * Constructor throws IllegalArgumentException if capacity argument nonpositive
75 */
76 public void testConstructor2() {
77 try {
78 new PriorityQueue(0);
79 shouldThrow();
80 } catch (IllegalArgumentException success) {}
81 }
82
83 /**
84 * Initializing from null Collection throws NPE
85 */
86 public void testConstructor3() {
87 try {
88 new PriorityQueue((Collection)null);
89 shouldThrow();
90 } catch (NullPointerException success) {}
91 }
92
93 /**
94 * Initializing from Collection of null elements throws NPE
95 */
96 public void testConstructor4() {
97 try {
98 new PriorityQueue(Arrays.asList(new Integer[SIZE]));
99 shouldThrow();
100 } catch (NullPointerException success) {}
101 }
102
103 /**
104 * Initializing from Collection with some null elements throws NPE
105 */
106 public void testConstructor5() {
107 Integer[] ints = new Integer[SIZE];
108 for (int i = 0; i < SIZE - 1; ++i)
109 ints[i] = new Integer(i);
110 try {
111 new PriorityQueue(Arrays.asList(ints));
112 shouldThrow();
113 } catch (NullPointerException success) {}
114 }
115
116 /**
117 * Queue contains all elements of collection used to initialize
118 */
119 public void testConstructor6() {
120 Integer[] ints = new Integer[SIZE];
121 for (int i = 0; i < SIZE; ++i)
122 ints[i] = new Integer(i);
123 PriorityQueue q = new PriorityQueue(Arrays.asList(ints));
124 for (int i = 0; i < SIZE; ++i)
125 assertEquals(ints[i], q.poll());
126 }
127
128 /**
129 * The comparator used in constructor is used
130 */
131 public void testConstructor7() {
132 MyReverseComparator cmp = new MyReverseComparator();
133 PriorityQueue q = new PriorityQueue(SIZE, cmp);
134 assertEquals(cmp, q.comparator());
135 Integer[] ints = new Integer[SIZE];
136 for (int i = 0; i < SIZE; ++i)
137 ints[i] = new Integer(i);
138 q.addAll(Arrays.asList(ints));
139 for (int i = SIZE - 1; i >= 0; --i)
140 assertEquals(ints[i], q.poll());
141 }
142
143 /**
144 * isEmpty is true before add, false after
145 */
146 public void testEmpty() {
147 PriorityQueue q = new PriorityQueue(2);
148 assertTrue(q.isEmpty());
149 q.add(new Integer(1));
150 assertFalse(q.isEmpty());
151 q.add(new Integer(2));
152 q.remove();
153 q.remove();
154 assertTrue(q.isEmpty());
155 }
156
157 /**
158 * size changes when elements added and removed
159 */
160 public void testSize() {
161 PriorityQueue q = populatedQueue(SIZE);
162 for (int i = 0; i < SIZE; ++i) {
163 assertEquals(SIZE - i, q.size());
164 q.remove();
165 }
166 for (int i = 0; i < SIZE; ++i) {
167 assertEquals(i, q.size());
168 q.add(new Integer(i));
169 }
170 }
171
172 /**
173 * offer(null) throws NPE
174 */
175 public void testOfferNull() {
176 PriorityQueue q = new PriorityQueue(1);
177 try {
178 q.offer(null);
179 shouldThrow();
180 } catch (NullPointerException success) {}
181 }
182
183 /**
184 * add(null) throws NPE
185 */
186 public void testAddNull() {
187 PriorityQueue q = new PriorityQueue(1);
188 try {
189 q.add(null);
190 shouldThrow();
191 } catch (NullPointerException success) {}
192 }
193
194 /**
195 * Offer of comparable element succeeds
196 */
197 public void testOffer() {
198 PriorityQueue q = new PriorityQueue(1);
199 assertTrue(q.offer(zero));
200 assertTrue(q.offer(one));
201 }
202
203 /**
204 * Offer of non-Comparable throws CCE
205 */
206 public void testOfferNonComparable() {
207 PriorityQueue q = new PriorityQueue(1);
208 try {
209 q.offer(new Object());
210 shouldThrow();
211 } catch (ClassCastException success) {
212 assertTrue(q.isEmpty());
213 assertEquals(0, q.size());
214 assertNull(q.poll());
215 }
216 }
217
218 /**
219 * add of comparable succeeds
220 */
221 public void testAdd() {
222 PriorityQueue q = new PriorityQueue(SIZE);
223 for (int i = 0; i < SIZE; ++i) {
224 assertEquals(i, q.size());
225 assertTrue(q.add(new Integer(i)));
226 }
227 }
228
229 /**
230 * addAll(null) throws NPE
231 */
232 public void testAddAll1() {
233 PriorityQueue q = new PriorityQueue(1);
234 try {
235 q.addAll(null);
236 shouldThrow();
237 } catch (NullPointerException success) {}
238 }
239
240 /**
241 * addAll of a collection with null elements throws NPE
242 */
243 public void testAddAll2() {
244 PriorityQueue q = new PriorityQueue(SIZE);
245 try {
246 q.addAll(Arrays.asList(new Integer[SIZE]));
247 shouldThrow();
248 } catch (NullPointerException success) {}
249 }
250
251 /**
252 * addAll of a collection with any null elements throws NPE after
253 * possibly adding some elements
254 */
255 public void testAddAll3() {
256 PriorityQueue q = new PriorityQueue(SIZE);
257 Integer[] ints = new Integer[SIZE];
258 for (int i = 0; i < SIZE - 1; ++i)
259 ints[i] = new Integer(i);
260 try {
261 q.addAll(Arrays.asList(ints));
262 shouldThrow();
263 } catch (NullPointerException success) {}
264 }
265
266 /**
267 * Queue contains all elements of successful addAll
268 */
269 public void testAddAll5() {
270 Integer[] empty = new Integer[0];
271 Integer[] ints = new Integer[SIZE];
272 for (int i = 0; i < SIZE; ++i)
273 ints[i] = new Integer(SIZE - 1 - i);
274 PriorityQueue q = new PriorityQueue(SIZE);
275 assertFalse(q.addAll(Arrays.asList(empty)));
276 assertTrue(q.addAll(Arrays.asList(ints)));
277 for (int i = 0; i < SIZE; ++i)
278 assertEquals(new Integer(i), q.poll());
279 }
280
281 /**
282 * poll succeeds unless empty
283 */
284 public void testPoll() {
285 PriorityQueue q = populatedQueue(SIZE);
286 for (int i = 0; i < SIZE; ++i) {
287 assertEquals(i, q.poll());
288 }
289 assertNull(q.poll());
290 }
291
292 /**
293 * peek returns next element, or null if empty
294 */
295 public void testPeek() {
296 PriorityQueue q = populatedQueue(SIZE);
297 for (int i = 0; i < SIZE; ++i) {
298 assertEquals(i, q.peek());
299 assertEquals(i, q.poll());
300 assertTrue(q.peek() == null ||
301 !q.peek().equals(i));
302 }
303 assertNull(q.peek());
304 }
305
306 /**
307 * element returns next element, or throws NSEE if empty
308 */
309 public void testElement() {
310 PriorityQueue q = populatedQueue(SIZE);
311 for (int i = 0; i < SIZE; ++i) {
312 assertEquals(i, q.element());
313 assertEquals(i, q.poll());
314 }
315 try {
316 q.element();
317 shouldThrow();
318 } catch (NoSuchElementException success) {}
319 }
320
321 /**
322 * remove removes next element, or throws NSEE if empty
323 */
324 public void testRemove() {
325 PriorityQueue q = populatedQueue(SIZE);
326 for (int i = 0; i < SIZE; ++i) {
327 assertEquals(i, q.remove());
328 }
329 try {
330 q.remove();
331 shouldThrow();
332 } catch (NoSuchElementException success) {}
333 }
334
335 /**
336 * remove(x) removes x and returns true if present
337 */
338 public void testRemoveElement() {
339 PriorityQueue q = populatedQueue(SIZE);
340 for (int i = 1; i < SIZE; i += 2) {
341 assertTrue(q.contains(i));
342 assertTrue(q.remove(i));
343 assertFalse(q.contains(i));
344 assertTrue(q.contains(i - 1));
345 }
346 for (int i = 0; i < SIZE; i += 2) {
347 assertTrue(q.contains(i));
348 assertTrue(q.remove(i));
349 assertFalse(q.contains(i));
350 assertFalse(q.remove(i + 1));
351 assertFalse(q.contains(i + 1));
352 }
353 assertTrue(q.isEmpty());
354 }
355
356 /**
357 * contains(x) reports true when elements added but not yet removed
358 */
359 public void testContains() {
360 PriorityQueue q = populatedQueue(SIZE);
361 for (int i = 0; i < SIZE; ++i) {
362 assertTrue(q.contains(new Integer(i)));
363 q.poll();
364 assertFalse(q.contains(new Integer(i)));
365 }
366 }
367
368 /**
369 * clear removes all elements
370 */
371 public void testClear() {
372 PriorityQueue q = populatedQueue(SIZE);
373 q.clear();
374 assertTrue(q.isEmpty());
375 assertEquals(0, q.size());
376 q.add(new Integer(1));
377 assertFalse(q.isEmpty());
378 q.clear();
379 assertTrue(q.isEmpty());
380 }
381
382 /**
383 * containsAll(c) is true when c contains a subset of elements
384 */
385 public void testContainsAll() {
386 PriorityQueue q = populatedQueue(SIZE);
387 PriorityQueue p = new PriorityQueue(SIZE);
388 for (int i = 0; i < SIZE; ++i) {
389 assertTrue(q.containsAll(p));
390 assertFalse(p.containsAll(q));
391 p.add(new Integer(i));
392 }
393 assertTrue(p.containsAll(q));
394 }
395
396 /**
397 * retainAll(c) retains only those elements of c and reports true if changed
398 */
399 public void testRetainAll() {
400 PriorityQueue q = populatedQueue(SIZE);
401 PriorityQueue p = populatedQueue(SIZE);
402 for (int i = 0; i < SIZE; ++i) {
403 boolean changed = q.retainAll(p);
404 if (i == 0)
405 assertFalse(changed);
406 else
407 assertTrue(changed);
408
409 assertTrue(q.containsAll(p));
410 assertEquals(SIZE - i, q.size());
411 p.remove();
412 }
413 }
414
415 /**
416 * removeAll(c) removes only those elements of c and reports true if changed
417 */
418 public void testRemoveAll() {
419 for (int i = 1; i < SIZE; ++i) {
420 PriorityQueue q = populatedQueue(SIZE);
421 PriorityQueue p = populatedQueue(i);
422 assertTrue(q.removeAll(p));
423 assertEquals(SIZE - i, q.size());
424 for (int j = 0; j < i; ++j) {
425 Integer x = (Integer)(p.remove());
426 assertFalse(q.contains(x));
427 }
428 }
429 }
430
431 /**
432 * toArray contains all elements
433 */
434 public void testToArray() {
435 PriorityQueue q = populatedQueue(SIZE);
436 Object[] o = q.toArray();
437 Arrays.sort(o);
438 for (int i = 0; i < o.length; i++)
439 assertSame(o[i], q.poll());
440 }
441
442 /**
443 * toArray(a) contains all elements
444 */
445 public void testToArray2() {
446 PriorityQueue<Integer> q = populatedQueue(SIZE);
447 Integer[] ints = new Integer[SIZE];
448 Integer[] array = q.toArray(ints);
449 assertSame(ints, array);
450 Arrays.sort(ints);
451 for (int i = 0; i < ints.length; i++)
452 assertSame(ints[i], q.poll());
453 }
454
455 /**
456 * iterator iterates through all elements
457 */
458 public void testIterator() {
459 PriorityQueue q = populatedQueue(SIZE);
460 Iterator it = q.iterator();
461 int i;
462 for (i = 0; it.hasNext(); i++)
463 assertTrue(q.contains(it.next()));
464 assertEquals(i, SIZE);
465 assertIteratorExhausted(it);
466 }
467
468 /**
469 * iterator of empty collection has no elements
470 */
471 public void testEmptyIterator() {
472 assertIteratorExhausted(new PriorityQueue().iterator());
473 }
474
475 /**
476 * iterator.remove removes current element
477 */
478 public void testIteratorRemove() {
479 final PriorityQueue q = new PriorityQueue(3);
480 q.add(new Integer(2));
481 q.add(new Integer(1));
482 q.add(new Integer(3));
483
484 Iterator it = q.iterator();
485 it.next();
486 it.remove();
487
488 it = q.iterator();
489 assertEquals(it.next(), new Integer(2));
490 assertEquals(it.next(), new Integer(3));
491 assertFalse(it.hasNext());
492 }
493
494 /**
495 * toString contains toStrings of elements
496 */
497 public void testToString() {
498 PriorityQueue q = populatedQueue(SIZE);
499 String s = q.toString();
500 for (int i = 0; i < SIZE; ++i) {
501 assertTrue(s.contains(String.valueOf(i)));
502 }
503 }
504
505 /**
506 * A deserialized/reserialized queue has same elements
507 */
508 public void testSerialization() throws Exception {
509 Queue x = populatedQueue(SIZE);
510 Queue y = serialClone(x);
511
512 assertNotSame(x, y);
513 assertEquals(x.size(), y.size());
514 while (!x.isEmpty()) {
515 assertFalse(y.isEmpty());
516 assertEquals(x.remove(), y.remove());
517 }
518 assertTrue(y.isEmpty());
519 }
520 }