ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityQueueTest.java
Revision: 1.37
Committed: Wed Jun 1 16:08:04 2016 UTC (7 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.36: +5 -2 lines
Log Message:
8066070: PriorityQueue corrupted when adding non-Comparable

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