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