1 /* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.apache.harmony.tests.java.util; 18 19 import dalvik.annotation.AndroidOnly; 20 21 import java.util.ArrayList; 22 import java.util.Collection; 23 import java.util.EnumMap; 24 import java.util.HashMap; 25 import java.util.Iterator; 26 import java.util.Map; 27 import java.util.NoSuchElementException; 28 import java.util.Set; 29 30 import org.apache.harmony.testframework.serialization.SerializationTest; 31 32 import junit.framework.TestCase; 33 34 public class EnumMapTest extends TestCase { 35 enum Size { 36 Small, Middle, Big {}; 37 } 38 39 enum Color { 40 Red, Green, Blue {}; 41 } 42 43 enum Empty { 44 //Empty 45 } 46 47 private static class MockEntry<K, V> implements Map.Entry<K, V> { 48 private K key; 49 50 private V value; 51 52 public MockEntry(K key, V value) { 53 this.key = key; 54 this.value = value; 55 } 56 57 @Override 58 public int hashCode() { 59 return (key == null ? 0 : key.hashCode()) 60 ^ (value == null ? 0 : value.hashCode()); 61 } 62 63 public K getKey() { 64 return key; 65 } 66 67 public V getValue() { 68 return value; 69 } 70 71 public V setValue(V object) { 72 V oldValue = value; 73 value = object; 74 return oldValue; 75 } 76 } 77 78 /** 79 * java.util.EnumMap#EnumMap(Class) 80 */ 81 @SuppressWarnings({ "unchecked", "boxing" }) 82 public void test_ConstructorLjava_lang_Class() { 83 try { 84 new EnumMap((Class) null); 85 fail("Expected NullPointerException"); 86 } catch (NullPointerException e) { 87 // Expected 88 } 89 90 91 try { 92 new EnumMap(Size.Big.getClass()); 93 fail("Expected NullPointerException"); 94 } catch (NullPointerException e) { 95 // Expected 96 } 97 98 try { 99 new EnumMap(Integer.class); 100 fail("Expected NullPointerException"); 101 } catch (NullPointerException e) { 102 // Expected 103 } 104 105 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 106 assertNull("Return non-null for non mapped key", enumColorMap.put( 107 Color.Green, 2)); 108 assertEquals("Get returned incorrect value for given key", 2, 109 enumColorMap.get(Color.Green)); 110 111 EnumMap enumEmptyMap = new EnumMap<Empty, Double>(Empty.class); 112 try { 113 enumEmptyMap.put(Color.Red, 2); 114 fail("Expected ClassCastException"); 115 } catch (ClassCastException e) { 116 // Expected 117 } 118 119 EnumMap enumSizeMap = new EnumMap(Size.class); 120 assertNull("Return non-null for non mapped key", enumSizeMap.put( 121 Size.Big, 2)); 122 assertEquals("Get returned incorrect value for given key", 2, 123 enumSizeMap.get(Size.Big)); 124 try { 125 enumSizeMap.put(Color.Red, 2); 126 fail("Expected ClassCastException"); 127 } catch (ClassCastException e) { 128 // Expected 129 } 130 131 enumSizeMap = new EnumMap(Size.Middle.getClass()); 132 assertNull("Return non-null for non mapped key", enumSizeMap.put( 133 Size.Small, 1)); 134 assertEquals("Get returned incorrect value for given key", 1, 135 enumSizeMap.get(Size.Small)); 136 try { 137 enumSizeMap.put(Color.Red, 2); 138 fail("Expected ClassCastException"); 139 } catch (ClassCastException e) { 140 // Expected 141 } 142 } 143 144 /** 145 * java.util.EnumMap#EnumMap(EnumMap) 146 */ 147 @SuppressWarnings({ "unchecked", "boxing" }) 148 public void test_ConstructorLjava_util_EnumMap() { 149 EnumMap enumMap; 150 EnumMap enumColorMap = null; 151 try { 152 enumMap = new EnumMap(enumColorMap); 153 fail("Expected NullPointerException"); 154 } catch (NullPointerException e) { 155 // Expected 156 } 157 158 enumColorMap = new EnumMap<Color, Double>(Color.class); 159 Double double1 = new Double(1); 160 enumColorMap.put(Color.Green, 2); 161 enumColorMap.put(Color.Blue, double1); 162 163 enumMap = new EnumMap(enumColorMap); 164 assertEquals("Constructor fails", 2, enumMap.get(Color.Green)); 165 assertSame("Constructor fails", double1, enumMap.get(Color.Blue)); 166 assertNull("Constructor fails", enumMap.get(Color.Red)); 167 enumMap.put(Color.Red, 1); 168 assertEquals("Wrong value", 1, enumMap.get(Color.Red)); 169 170 try { 171 enumMap.put(Size.Middle, 2); 172 fail("Expected ClassCastException"); 173 } catch (ClassCastException e) { 174 // Expected 175 } 176 } 177 178 /** 179 * java.util.EnumMap#EnumMap(Map) 180 */ 181 @SuppressWarnings({ "unchecked", "boxing" }) 182 public void test_ConstructorLjava_util_Map() { 183 EnumMap enumMap; 184 Map enumColorMap = null; 185 try { 186 enumMap = new EnumMap(enumColorMap); 187 fail("Expected NullPointerException"); 188 } catch (NullPointerException e) { 189 // Expected 190 } 191 enumColorMap = new EnumMap<Color, Double>(Color.class); 192 enumMap = new EnumMap(enumColorMap); 193 enumColorMap.put(Color.Blue, 3); 194 enumMap = new EnumMap(enumColorMap); 195 196 HashMap hashColorMap = null; 197 try { 198 enumMap = new EnumMap(hashColorMap); 199 fail("Expected NullPointerException"); 200 } catch (NullPointerException e) { 201 // Expected 202 } 203 204 hashColorMap = new HashMap(); 205 try { 206 enumMap = new EnumMap(hashColorMap); 207 fail("Expected IllegalArgumentException"); 208 } catch (IllegalArgumentException e) { 209 // Expected 210 } 211 212 hashColorMap.put(Color.Green, 2); 213 enumMap = new EnumMap(hashColorMap); 214 assertEquals("Constructor fails", 2, enumMap.get(Color.Green)); 215 assertNull("Constructor fails", enumMap.get(Color.Red)); 216 enumMap.put(Color.Red, 1); 217 assertEquals("Wrong value", 1, enumMap.get(Color.Red)); 218 hashColorMap.put(Size.Big, 3); 219 try { 220 enumMap = new EnumMap(hashColorMap); 221 fail("Expected ClassCastException"); 222 } catch (ClassCastException e) { 223 // Expected 224 } 225 226 hashColorMap = new HashMap(); 227 hashColorMap.put(new Integer(1), 1); 228 try { 229 enumMap = new EnumMap(hashColorMap); 230 fail("Expected ClassCastException"); 231 } catch (ClassCastException e) { 232 // Expected 233 } 234 } 235 236 /** 237 * java.util.EnumMap#clear() 238 */ 239 @SuppressWarnings({ "unchecked", "boxing" }) 240 public void test_clear() { 241 EnumMap enumSizeMap = new EnumMap(Size.class); 242 enumSizeMap.put(Size.Small, 1); 243 enumSizeMap.clear(); 244 assertNull("Failed to clear all elements", enumSizeMap.get(Size.Small)); 245 } 246 247 /** 248 * java.util.EnumMap#containsKey(Object) 249 */ 250 @SuppressWarnings( { "unchecked", "boxing" }) 251 public void test_containsKeyLjava_lang_Object() { 252 EnumMap enumSizeMap = new EnumMap(Size.class); 253 assertFalse("Returned true for uncontained key", enumSizeMap 254 .containsKey(Size.Small)); 255 enumSizeMap.put(Size.Small, 1); 256 assertTrue("Returned false for contained key", enumSizeMap 257 .containsKey(Size.Small)); 258 259 enumSizeMap.put(Size.Big, null); 260 assertTrue("Returned false for contained key", enumSizeMap 261 .containsKey(Size.Big)); 262 263 assertFalse("Returned true for uncontained key", enumSizeMap 264 .containsKey(Color.Red)); 265 assertFalse("Returned true for uncontained key", enumSizeMap 266 .containsKey(new Integer("3"))); 267 assertFalse("Returned true for uncontained key", enumSizeMap 268 .containsKey(null)); 269 } 270 271 /** 272 * java.util.EnumMap#clone() 273 */ 274 @SuppressWarnings( { "unchecked", "boxing" }) 275 public void test_clone() { 276 EnumMap enumSizeMap = new EnumMap(Size.class); 277 Integer integer = new Integer("3"); 278 enumSizeMap.put(Size.Small, integer); 279 EnumMap enumSizeMapClone = enumSizeMap.clone(); 280 assertNotSame("Should not be same", enumSizeMap, enumSizeMapClone); 281 assertEquals("Clone answered unequal EnumMap", enumSizeMap, 282 enumSizeMapClone); 283 284 assertSame("Should be same", enumSizeMap.get(Size.Small), 285 enumSizeMapClone.get(Size.Small)); 286 assertSame("Clone is not shallow clone", integer, enumSizeMapClone 287 .get(Size.Small)); 288 enumSizeMap.remove(Size.Small); 289 assertSame("Clone is not shallow clone", integer, enumSizeMapClone 290 .get(Size.Small)); 291 } 292 293 /** 294 * java.util.EnumMap#containsValue(Object) 295 */ 296 @SuppressWarnings( { "unchecked", "boxing" }) 297 public void test_containsValueLjava_lang_Object() { 298 EnumMap enumSizeMap = new EnumMap(Size.class); 299 Double double1 = new Double(3); 300 Double double2 = new Double(3); 301 302 assertFalse("Returned true for uncontained value", enumSizeMap 303 .containsValue(double1)); 304 enumSizeMap.put(Size.Middle, 2); 305 enumSizeMap.put(Size.Small, double1); 306 assertTrue("Returned false for contained value", enumSizeMap 307 .containsValue(double1)); 308 assertTrue("Returned false for contained value", enumSizeMap 309 .containsValue(double2)); 310 assertTrue("Returned false for contained value", enumSizeMap 311 .containsValue(2)); 312 assertFalse("Returned true for uncontained value", enumSizeMap 313 .containsValue(1)); 314 315 assertFalse("Returned true for uncontained value", enumSizeMap 316 .containsValue(null)); 317 enumSizeMap.put(Size.Big, null); 318 assertTrue("Returned false for contained value", enumSizeMap 319 .containsValue(null)); 320 } 321 322 /** 323 * java.util.EnumMap#entrySet() 324 */ 325 @AndroidOnly("Map.Entry is indirectly modified on RI when Iterator.next() is invoked") 326 @SuppressWarnings({ "unchecked", "boxing" }) 327 public void test_entrySet() { 328 EnumMap enumSizeMap = new EnumMap(Size.class); 329 enumSizeMap.put(Size.Middle, 1); 330 enumSizeMap.put(Size.Big, null); 331 MockEntry mockEntry = new MockEntry(Size.Middle, 1); 332 Set set = enumSizeMap.entrySet(); 333 334 Set set1 = enumSizeMap.entrySet(); 335 assertSame("Should be same", set1, set); 336 try { 337 set.add(mockEntry); 338 fail("Should throw UnsupportedOperationException"); 339 } catch (UnsupportedOperationException e) { 340 // Expected 341 } 342 343 assertTrue("Returned false for contained object", set 344 .contains(mockEntry)); 345 mockEntry = new MockEntry(Size.Middle, null); 346 assertFalse("Returned true for uncontained object", set 347 .contains(mockEntry)); 348 assertFalse("Returned true for uncontained object", set 349 .contains(Size.Small)); 350 mockEntry = new MockEntry(new Integer(1), 1); 351 assertFalse("Returned true for uncontained object", set 352 .contains(mockEntry)); 353 assertFalse("Returned true for uncontained object", set 354 .contains(new Integer(1))); 355 356 mockEntry = new MockEntry(Size.Big, null); 357 assertTrue("Returned false for contained object", set 358 .contains(mockEntry)); 359 assertTrue("Returned false when the object can be removed", set 360 .remove(mockEntry)); 361 assertFalse("Returned true for uncontained object", set 362 .contains(mockEntry)); 363 assertFalse("Returned true when the object can not be removed", set 364 .remove(mockEntry)); 365 mockEntry = new MockEntry(new Integer(1), 1); 366 assertFalse("Returned true when the object can not be removed", set 367 .remove(mockEntry)); 368 assertFalse("Returned true when the object can not be removed", set 369 .remove(new Integer(1))); 370 371 // The set is backed by the map so changes to one are reflected by the 372 // other. 373 enumSizeMap.put(Size.Big, 3); 374 mockEntry = new MockEntry(Size.Big, 3); 375 assertTrue("Returned false for contained object", set 376 .contains(mockEntry)); 377 enumSizeMap.remove(Size.Big); 378 assertFalse("Returned true for uncontained object", set 379 .contains(mockEntry)); 380 381 assertEquals("Wrong size", 1, set.size()); 382 set.clear(); 383 assertEquals("Wrong size", 0, set.size()); 384 385 enumSizeMap = new EnumMap(Size.class); 386 enumSizeMap.put(Size.Middle, 1); 387 enumSizeMap.put(Size.Big, null); 388 set = enumSizeMap.entrySet(); 389 Collection c = new ArrayList(); 390 c.add(new MockEntry(Size.Middle, 1)); 391 assertTrue("Return wrong value", set.containsAll(c)); 392 assertTrue("Remove does not success", set.removeAll(c)); 393 394 enumSizeMap.put(Size.Middle, 1); 395 c.add(new MockEntry(Size.Big, 3)); 396 assertTrue("Remove does not success", set.removeAll(c)); 397 assertFalse("Should return false", set.removeAll(c)); 398 assertEquals("Wrong size", 1, set.size()); 399 400 enumSizeMap = new EnumMap(Size.class); 401 enumSizeMap.put(Size.Middle, 1); 402 enumSizeMap.put(Size.Big, null); 403 set = enumSizeMap.entrySet(); 404 c = new ArrayList(); 405 c.add(new MockEntry(Size.Middle, 1)); 406 c.add(new MockEntry(Size.Big, 3)); 407 408 assertTrue("Retain does not success", set.retainAll(c)); 409 assertEquals("Wrong size", 1, set.size()); 410 assertFalse("Should return false", set.retainAll(c)); 411 412 enumSizeMap = new EnumMap(Size.class); 413 enumSizeMap.put(Size.Middle, 1); 414 enumSizeMap.put(Size.Big, null); 415 416 set = enumSizeMap.entrySet(); 417 Object[] array = set.toArray(); 418 assertEquals("Wrong length", 2, array.length); 419 Map.Entry entry = (Map.Entry) array[0]; 420 assertEquals("Wrong key", Size.Middle, entry.getKey()); 421 assertEquals("Wrong value", 1, entry.getValue()); 422 423 Object[] array1 = new Object[10]; 424 array1 = set.toArray(); 425 assertEquals("Wrong length", 2, array1.length); 426 entry = (Map.Entry) array[0]; 427 assertEquals("Wrong key", Size.Middle, entry.getKey()); 428 assertEquals("Wrong value", 1, entry.getValue()); 429 430 array1 = new Object[10]; 431 array1 = set.toArray(array1); 432 assertEquals("Wrong length", 10, array1.length); 433 entry = (Map.Entry) array[1]; 434 assertEquals("Wrong key", Size.Big, entry.getKey()); 435 assertNull("Should be null", array1[2]); 436 437 set = enumSizeMap.entrySet(); 438 Integer integer = new Integer("1"); 439 assertFalse("Returned true when the object can not be removed", set 440 .remove(integer)); 441 assertTrue("Returned false when the object can be removed", set 442 .remove(entry)); 443 444 enumSizeMap = new EnumMap(Size.class); 445 enumSizeMap.put(Size.Middle, 1); 446 enumSizeMap.put(Size.Big, null); 447 set = enumSizeMap.entrySet(); 448 Iterator iter = set.iterator(); 449 entry = (Map.Entry) iter.next(); 450 assertTrue("Returned false for contained object", set.contains(entry)); 451 mockEntry = new MockEntry(Size.Middle, 2); 452 assertFalse("Returned true for uncontained object", set 453 .contains(mockEntry)); 454 mockEntry = new MockEntry(new Integer(2), 2); 455 assertFalse("Returned true for uncontained object", set 456 .contains(mockEntry)); 457 entry = (Map.Entry) iter.next(); 458 assertTrue("Returned false for contained object", set.contains(entry)); 459 460 enumSizeMap.put(Size.Middle, 1); 461 enumSizeMap.remove(Size.Big); 462 mockEntry = new MockEntry(Size.Big, null); 463 assertEquals("Wrong size", 1, set.size()); 464 assertFalse("Returned true for uncontained object", set.contains(mockEntry)); 465 enumSizeMap.put(Size.Big, 2); 466 mockEntry = new MockEntry(Size.Big, 2); 467 assertTrue("Returned false for contained object", set 468 .contains(mockEntry)); 469 470 iter.remove(); 471 try { 472 iter.remove(); 473 fail("Should throw IllegalStateException"); 474 } catch (IllegalStateException e) { 475 // Expected 476 } 477 try { 478 entry.setValue(2); 479 fail("Should throw IllegalStateException"); 480 } catch (IllegalStateException e) { 481 // Expected 482 } 483 try { 484 set.contains(entry); 485 fail("Should throw IllegalStateException"); 486 } catch (IllegalStateException e) { 487 // Expected 488 } 489 490 enumSizeMap = new EnumMap(Size.class); 491 enumSizeMap.put(Size.Middle, 1); 492 enumSizeMap.put(Size.Big, null); 493 set = enumSizeMap.entrySet(); 494 iter = set.iterator(); 495 entry = (Map.Entry) iter.next(); 496 assertEquals("Wrong key", Size.Middle, entry.getKey()); 497 498 assertTrue("Returned false for contained object", set.contains(entry)); 499 enumSizeMap.put(Size.Middle, 3); 500 assertTrue("Returned false for contained object", set.contains(entry)); 501 entry.setValue(2); 502 assertTrue("Returned false for contained object", set.contains(entry)); 503 assertFalse("Returned true for uncontained object", set 504 .remove(new Integer(1))); 505 506 iter.next(); 507 assertEquals("Wrong key", Size.Middle, entry.getKey()); 508 set.clear(); 509 assertEquals("Wrong size", 0, set.size()); 510 511 enumSizeMap = new EnumMap(Size.class); 512 enumSizeMap.put(Size.Middle, 1); 513 enumSizeMap.put(Size.Big, null); 514 set = enumSizeMap.entrySet(); 515 iter = set.iterator(); 516 mockEntry = new MockEntry(Size.Middle, 1); 517 518 assertFalse("Wrong result", entry.equals(mockEntry)); 519 try { 520 iter.remove(); 521 fail("Should throw IllegalStateException"); 522 } catch (IllegalStateException e) { 523 // Expected 524 } 525 entry = (Map.Entry) iter.next(); 526 assertEquals("Wrong key", Size.Middle, entry.getKey()); 527 assertTrue("Should return true", entry.equals(mockEntry)); 528 assertEquals("Should be equal", mockEntry.hashCode(), entry.hashCode()); 529 mockEntry = new MockEntry(Size.Big, 1); 530 assertFalse("Wrong result", entry.equals(mockEntry)); 531 532 entry = (Map.Entry) iter.next(); 533 assertFalse("Wrong result", entry.equals(mockEntry)); 534 assertEquals("Wrong key", Size.Big, entry.getKey()); 535 iter.remove(); 536 assertFalse("Wrong result", entry.equals(mockEntry)); 537 assertEquals("Wrong size", 1, set.size()); 538 try { 539 iter.remove(); 540 fail("Should throw IllegalStateException"); 541 } catch (IllegalStateException e) { 542 // Expected 543 } 544 try { 545 iter.next(); 546 fail("Should throw NoSuchElementException"); 547 } catch (NoSuchElementException e) { 548 // Expected 549 } 550 } 551 552 /** 553 * java.util.EnumMap#equals(Object) 554 */ 555 @SuppressWarnings( { "unchecked", "boxing" }) 556 public void test_equalsLjava_lang_Object() { 557 EnumMap enumMap = new EnumMap(Size.class); 558 enumMap.put(Size.Small, 1); 559 560 EnumMap enumSizeMap = new EnumMap(Size.class); 561 assertFalse("Returned true for unequal EnumMap", enumSizeMap 562 .equals(enumMap)); 563 enumSizeMap.put(Size.Small, 1); 564 assertTrue("Returned false for equal EnumMap", enumSizeMap 565 .equals(enumMap)); 566 enumSizeMap.put(Size.Big, null); 567 assertFalse("Returned true for unequal EnumMap", enumSizeMap 568 .equals(enumMap)); 569 570 enumMap.put(Size.Middle, null); 571 assertFalse("Returned true for unequal EnumMap", enumSizeMap 572 .equals(enumMap)); 573 enumMap.remove(Size.Middle); 574 enumMap.put(Size.Big, 3); 575 assertFalse("Returned true for unequal EnumMap", enumSizeMap 576 .equals(enumMap)); 577 enumMap.put(Size.Big, null); 578 assertTrue("Returned false for equal EnumMap", enumSizeMap 579 .equals(enumMap)); 580 581 HashMap hashMap = new HashMap(); 582 hashMap.put(Size.Small, 1); 583 assertFalse("Returned true for unequal EnumMap", hashMap 584 .equals(enumMap)); 585 hashMap.put(Size.Big, null); 586 assertTrue("Returned false for equal EnumMap", enumMap.equals(hashMap)); 587 588 assertFalse("Should return false", enumSizeMap 589 .equals(new Integer(1))); 590 } 591 592 /** 593 * java.util.EnumMap#keySet() 594 */ 595 @SuppressWarnings( { "unchecked", "boxing" }) 596 public void test_keySet() { 597 EnumMap enumSizeMap = new EnumMap(Size.class); 598 enumSizeMap.put(Size.Middle, 2); 599 enumSizeMap.put(Size.Big, null); 600 Set set = enumSizeMap.keySet(); 601 602 Set set1 = enumSizeMap.keySet(); 603 assertSame("Should be same", set1, set); 604 try { 605 set.add(Size.Big); 606 fail("Should throw UnsupportedOperationException"); 607 } catch (UnsupportedOperationException e) { 608 // Expected 609 } 610 611 assertTrue("Returned false for contained object", set 612 .contains(Size.Middle)); 613 assertTrue("Returned false for contained object", set 614 .contains(Size.Big)); 615 assertFalse("Returned true for uncontained object", set 616 .contains(Size.Small)); 617 assertFalse("Returned true for uncontained object", set 618 .contains(new Integer(1))); 619 assertTrue("Returned false when the object can be removed", set 620 .remove(Size.Big)); 621 assertFalse("Returned true for uncontained object", set 622 .contains(Size.Big)); 623 assertFalse("Returned true when the object can not be removed", set 624 .remove(Size.Big)); 625 assertFalse("Returned true when the object can not be removed", set 626 .remove(new Integer(1))); 627 628 // The set is backed by the map so changes to one are reflected by the 629 // other. 630 enumSizeMap.put(Size.Big, 3); 631 assertTrue("Returned false for contained object", set 632 .contains(Size.Big)); 633 enumSizeMap.remove(Size.Big); 634 assertFalse("Returned true for uncontained object", set 635 .contains(Size.Big)); 636 637 assertEquals("Wrong size", 1, set.size()); 638 set.clear(); 639 assertEquals("Wrong size", 0, set.size()); 640 641 enumSizeMap = new EnumMap(Size.class); 642 enumSizeMap.put(Size.Middle, 1); 643 enumSizeMap.put(Size.Big, null); 644 set = enumSizeMap.keySet(); 645 Collection c = new ArrayList(); 646 c.add(Size.Big); 647 assertTrue("Should return true", set.containsAll(c)); 648 c.add(Size.Small); 649 assertFalse("Should return false", set.containsAll(c)); 650 assertTrue("Should return true", set.removeAll(c)); 651 assertEquals("Wrong size", 1, set.size()); 652 assertFalse("Should return false", set.removeAll(c)); 653 assertEquals("Wrong size", 1, set.size()); 654 try { 655 set.addAll(c); 656 fail("Should throw UnsupportedOperationException"); 657 } catch (UnsupportedOperationException e) { 658 // Expected 659 } 660 661 enumSizeMap.put(Size.Big, null); 662 assertEquals("Wrong size", 2, set.size()); 663 assertTrue("Should return true", set.retainAll(c)); 664 assertEquals("Wrong size", 1, set.size()); 665 assertFalse("Should return false", set.retainAll(c)); 666 assertEquals(1, set.size()); 667 Object[] array = set.toArray(); 668 assertEquals("Wrong length", 1, array.length); 669 assertEquals("Wrong key", Size.Big, array[0]); 670 671 enumSizeMap = new EnumMap(Size.class); 672 enumSizeMap.put(Size.Middle, 1); 673 enumSizeMap.put(Size.Big, null); 674 set = enumSizeMap.keySet(); 675 c = new ArrayList(); 676 c.add(Color.Blue); 677 assertFalse("Should return false", set.remove(c)); 678 assertEquals("Wrong size", 2, set.size()); 679 assertTrue("Should return true", set.retainAll(c)); 680 assertEquals("Wrong size", 0, set.size()); 681 682 enumSizeMap = new EnumMap(Size.class); 683 enumSizeMap.put(Size.Middle, 1); 684 enumSizeMap.put(Size.Big, null); 685 set = enumSizeMap.keySet(); 686 687 Iterator iter = set.iterator(); 688 Enum enumKey = (Enum) iter.next(); 689 assertTrue("Returned false for contained object", set.contains(enumKey)); 690 enumKey = (Enum) iter.next(); 691 assertTrue("Returned false for contained object", set.contains(enumKey)); 692 693 enumSizeMap.remove(Size.Big); 694 assertFalse("Returned true for uncontained object", set 695 .contains(enumKey)); 696 iter.remove(); 697 try { 698 iter.remove(); 699 fail("Should throw IllegalStateException"); 700 } catch (IllegalStateException e) { 701 // Expected 702 } 703 assertFalse("Returned true for uncontained object", set 704 .contains(enumKey)); 705 706 iter = set.iterator(); 707 enumKey = (Enum) iter.next(); 708 assertTrue("Returned false for contained object", set.contains(enumKey)); 709 enumSizeMap.put(Size.Middle, 3); 710 assertTrue("Returned false for contained object", set.contains(enumKey)); 711 712 enumSizeMap = new EnumMap(Size.class); 713 enumSizeMap.put(Size.Middle, 1); 714 enumSizeMap.put(Size.Big, null); 715 set = enumSizeMap.keySet(); 716 iter = set.iterator(); 717 try { 718 iter.remove(); 719 fail("Should throw IllegalStateException"); 720 } catch (IllegalStateException e) { 721 // Expected 722 } 723 enumKey = (Enum) iter.next(); 724 assertEquals("Wrong key", Size.Middle, enumKey); 725 assertSame("Wrong key", Size.Middle, enumKey); 726 assertFalse("Returned true for unequal object", iter.equals(enumKey)); 727 iter.remove(); 728 assertFalse("Returned true for uncontained object", set 729 .contains(enumKey)); 730 try { 731 iter.remove(); 732 fail("Should throw IllegalStateException"); 733 } catch (IllegalStateException e) { 734 // Expected 735 } 736 737 assertEquals("Wrong size", 1, set.size()); 738 enumKey = (Enum) iter.next(); 739 assertEquals("Wrong key", Size.Big, enumKey); 740 iter.remove(); 741 try { 742 iter.next(); 743 fail("Should throw NoSuchElementException"); 744 } catch (NoSuchElementException e) { 745 // Expected 746 } 747 } 748 749 /** 750 * java.util.EnumMap#get(Object) 751 */ 752 @SuppressWarnings({ "unchecked", "boxing" }) 753 public void test_getLjava_lang_Object() { 754 EnumMap enumSizeMap = new EnumMap(Size.class); 755 assertNull("Get returned non-null for non mapped key", enumSizeMap 756 .get(Size.Big)); 757 enumSizeMap.put(Size.Big, 1); 758 assertEquals("Get returned incorrect value for given key", 1, 759 enumSizeMap.get(Size.Big)); 760 761 assertNull("Get returned non-null for non mapped key", enumSizeMap 762 .get(Size.Small)); 763 assertNull("Get returned non-null for non existent key", enumSizeMap 764 .get(Color.Red)); 765 assertNull("Get returned non-null for non existent key", enumSizeMap 766 .get(new Integer(1))); 767 assertNull("Get returned non-null for non existent key", enumSizeMap 768 .get(null)); 769 770 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 771 assertNull("Get returned non-null for non mapped key", enumColorMap 772 .get(Color.Green)); 773 enumColorMap.put(Color.Green, 2); 774 assertEquals("Get returned incorrect value for given key", 2, 775 enumColorMap.get(Color.Green)); 776 assertNull("Get returned non-null for non mapped key", enumColorMap 777 .get(Color.Blue)); 778 779 enumColorMap.put(Color.Green, new Double(4)); 780 assertEquals("Get returned incorrect value for given key", 781 new Double(4), enumColorMap.get(Color.Green)); 782 enumColorMap.put(Color.Green, new Integer("3")); 783 assertEquals("Get returned incorrect value for given key", new Integer( 784 "3"), enumColorMap.get(Color.Green)); 785 enumColorMap.put(Color.Green, null); 786 assertNull("Can not handle null value", enumColorMap.get(Color.Green)); 787 Float f = new Float("3.4"); 788 enumColorMap.put(Color.Green, f); 789 assertSame("Get returned incorrect value for given key", f, 790 enumColorMap.get(Color.Green)); 791 } 792 793 /** 794 * java.util.EnumMap#put(Object,Object) 795 */ 796 public void test_putLjava_lang_ObjectLjava_lang_Object() { 797 EnumMap enumSizeMap = new EnumMap(Size.class); 798 try { 799 enumSizeMap.put(Color.Red, 2); 800 fail("Expected ClassCastException"); 801 } catch (ClassCastException e) { 802 // Expected 803 } 804 assertNull("Return non-null for non mapped key", enumSizeMap.put( 805 Size.Small, 1)); 806 807 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 808 try { 809 enumColorMap.put(Size.Big, 2); 810 fail("Expected ClassCastException"); 811 } catch (ClassCastException e) { 812 // Expected 813 } 814 try { 815 enumColorMap.put(null, 2); 816 fail("Expected NullPointerException"); 817 } catch (NullPointerException e) { 818 // Expected 819 } 820 assertNull("Return non-null for non mapped key", enumColorMap.put( 821 Color.Green, 2)); 822 assertEquals("Return wrong value", 2, enumColorMap.put(Color.Green, 823 new Double(4))); 824 assertEquals("Return wrong value", new Double(4), enumColorMap.put( 825 Color.Green, new Integer("3"))); 826 assertEquals("Return wrong value", new Integer("3"), enumColorMap.put( 827 Color.Green, null)); 828 Float f = new Float("3.4"); 829 assertNull("Return non-null for non mapped key", enumColorMap.put( 830 Color.Green, f)); 831 assertNull("Return non-null for non mapped key", enumColorMap.put( 832 Color.Blue, 2)); 833 assertEquals("Return wrong value", 2, enumColorMap.put(Color.Blue, 834 new Double(4))); 835 } 836 837 /** 838 * java.util.EnumMap#putAll(Map) 839 */ 840 @SuppressWarnings({ "unchecked", "boxing" }) 841 public void test_putAllLjava_util_Map() { 842 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 843 enumColorMap.put(Color.Green, 2); 844 845 EnumMap enumSizeMap = new EnumMap(Size.class); 846 enumColorMap.putAll(enumSizeMap); 847 848 enumSizeMap.put(Size.Big, 1); 849 try { 850 enumColorMap.putAll(enumSizeMap); 851 fail("Expected ClassCastException"); 852 } catch (ClassCastException e) { 853 // Expected 854 } 855 856 EnumMap enumColorMap1 = new EnumMap<Color, Double>(Color.class); 857 enumColorMap1.put(Color.Blue, 3); 858 enumColorMap.putAll(enumColorMap1); 859 assertEquals("Get returned incorrect value for given key", 3, 860 enumColorMap.get(Color.Blue)); 861 assertEquals("Wrong Size", 2, enumColorMap.size()); 862 863 enumColorMap = new EnumMap<Color, Double>(Color.class); 864 865 HashMap hashColorMap = null; 866 try { 867 enumColorMap.putAll(hashColorMap); 868 fail("Expected NullPointerException"); 869 } catch (NullPointerException e) { 870 // Expected 871 } 872 873 hashColorMap = new HashMap(); 874 enumColorMap.putAll(hashColorMap); 875 876 hashColorMap.put(Color.Green, 2); 877 enumColorMap.putAll(hashColorMap); 878 assertEquals("Get returned incorrect value for given key", 2, 879 enumColorMap.get(Color.Green)); 880 assertNull("Get returned non-null for non mapped key", enumColorMap 881 .get(Color.Red)); 882 hashColorMap.put(Color.Red, new Integer(1)); 883 enumColorMap.putAll(hashColorMap); 884 assertEquals("Get returned incorrect value for given key", new Integer( 885 2), enumColorMap.get(Color.Green)); 886 hashColorMap.put(Size.Big, 3); 887 try { 888 enumColorMap.putAll(hashColorMap); 889 fail("Expected ClassCastException"); 890 } catch (ClassCastException e) { 891 // Expected 892 } 893 894 hashColorMap = new HashMap(); 895 hashColorMap.put(new Integer(1), 1); 896 try { 897 enumColorMap.putAll(hashColorMap); 898 fail("Expected ClassCastException"); 899 } catch (ClassCastException e) { 900 // Expected 901 } 902 } 903 904 /** 905 * java.util.EnumMap#remove(Object) 906 */ 907 @SuppressWarnings({ "unchecked", "boxing" }) 908 public void test_removeLjava_lang_Object() { 909 EnumMap enumSizeMap = new EnumMap(Size.class); 910 assertNull("Remove of non-mapped key returned non-null", enumSizeMap 911 .remove(Size.Big)); 912 enumSizeMap.put(Size.Big, 3); 913 enumSizeMap.put(Size.Middle, 2); 914 915 assertNull("Get returned non-null for non mapped key", enumSizeMap 916 .get(Size.Small)); 917 assertEquals("Remove returned incorrect value", 3, enumSizeMap 918 .remove(Size.Big)); 919 assertNull("Get returned non-null for non mapped key", enumSizeMap 920 .get(Size.Big)); 921 assertNull("Remove of non-mapped key returned non-null", enumSizeMap 922 .remove(Size.Big)); 923 assertNull("Remove of non-existent key returned non-null", enumSizeMap 924 .remove(Color.Red)); 925 assertNull("Remove of non-existent key returned non-null", enumSizeMap 926 .remove(new Double(4))); 927 assertNull("Remove of non-existent key returned non-null", enumSizeMap 928 .remove(null)); 929 930 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 931 assertNull("Get returned non-null for non mapped key", enumColorMap 932 .get(Color.Green)); 933 enumColorMap.put(Color.Green, new Double(4)); 934 assertEquals("Remove returned incorrect value", new Double(4), 935 enumColorMap.remove(Color.Green)); 936 assertNull("Get returned non-null for non mapped key", enumColorMap 937 .get(Color.Green)); 938 enumColorMap.put(Color.Green, null); 939 assertNull("Can not handle null value", enumColorMap 940 .remove(Color.Green)); 941 assertNull("Get returned non-null for non mapped key", enumColorMap 942 .get(Color.Green)); 943 } 944 945 /** 946 * java.util.EnumMap#size() 947 */ 948 @SuppressWarnings({ "unchecked", "boxing" }) 949 public void test_size() { 950 EnumMap enumSizeMap = new EnumMap(Size.class); 951 assertEquals("Wrong size", 0, enumSizeMap.size()); 952 enumSizeMap.put(Size.Small, 1); 953 assertEquals("Wrong size", 1, enumSizeMap.size()); 954 enumSizeMap.put(Size.Small, 0); 955 assertEquals("Wrong size", 1, enumSizeMap.size()); 956 try { 957 enumSizeMap.put(Color.Red, 2); 958 fail("Expected ClassCastException"); 959 } catch (ClassCastException e) { 960 // Expected 961 } 962 assertEquals("Wrong size", 1, enumSizeMap.size()); 963 964 enumSizeMap.put(Size.Middle, null); 965 assertEquals("Wrong size", 2, enumSizeMap.size()); 966 enumSizeMap.remove(Size.Big); 967 assertEquals("Wrong size", 2, enumSizeMap.size()); 968 enumSizeMap.remove(Size.Middle); 969 assertEquals("Wrong size", 1, enumSizeMap.size()); 970 enumSizeMap.remove(Color.Green); 971 assertEquals("Wrong size", 1, enumSizeMap.size()); 972 973 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 974 enumColorMap.put(Color.Green, 2); 975 assertEquals("Wrong size", 1, enumColorMap.size()); 976 enumColorMap.remove(Color.Green); 977 assertEquals("Wrong size", 0, enumColorMap.size()); 978 979 EnumMap enumEmptyMap = new EnumMap<Empty, Double>(Empty.class); 980 assertEquals("Wrong size", 0, enumEmptyMap.size()); 981 } 982 983 /** 984 * java.util.EnumMap#values() 985 */ 986 @SuppressWarnings( { "unchecked", "boxing" }) 987 public void test_values() { 988 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 989 enumColorMap.put(Color.Red, 1); 990 enumColorMap.put(Color.Blue, null); 991 Collection collection = enumColorMap.values(); 992 993 Collection collection1 = enumColorMap.values(); 994 assertSame("Should be same", collection1, collection); 995 try { 996 collection.add(new Integer(1)); 997 fail("Should throw UnsupportedOperationException"); 998 } catch (UnsupportedOperationException e) { 999 // Expected 1000 } 1001 1002 assertTrue("Returned false for contained object", collection 1003 .contains(1)); 1004 assertTrue("Returned false for contained object", collection 1005 .contains(null)); 1006 assertFalse("Returned true for uncontained object", collection 1007 .contains(2)); 1008 1009 assertTrue("Returned false when the object can be removed", collection 1010 .remove(null)); 1011 assertFalse("Returned true for uncontained object", collection 1012 .contains(null)); 1013 assertFalse("Returned true when the object can not be removed", 1014 collection.remove(null)); 1015 1016 // The set is backed by the map so changes to one are reflected by the 1017 // other. 1018 enumColorMap.put(Color.Blue, 3); 1019 assertTrue("Returned false for contained object", collection 1020 .contains(3)); 1021 enumColorMap.remove(Color.Blue); 1022 assertFalse("Returned true for uncontained object", collection 1023 .contains(3)); 1024 1025 assertEquals("Wrong size", 1, collection.size()); 1026 collection.clear(); 1027 assertEquals("Wrong size", 0, collection.size()); 1028 1029 enumColorMap = new EnumMap<Color, Double>(Color.class); 1030 enumColorMap.put(Color.Red, 1); 1031 enumColorMap.put(Color.Blue, null); 1032 collection = enumColorMap.values(); 1033 Collection c = new ArrayList(); 1034 c.add(new Integer(1)); 1035 assertTrue("Should return true", collection.containsAll(c)); 1036 c.add(new Double(3.4)); 1037 assertFalse("Should return false", collection.containsAll(c)); 1038 assertTrue("Should return true", collection.removeAll(c)); 1039 assertEquals("Wrong size", 1, collection.size()); 1040 assertFalse("Should return false", collection.removeAll(c)); 1041 assertEquals("Wrong size", 1, collection.size()); 1042 try { 1043 collection.addAll(c); 1044 fail("Should throw UnsupportedOperationException"); 1045 } catch (UnsupportedOperationException e) { 1046 // Expected 1047 } 1048 1049 enumColorMap.put(Color.Red, 1); 1050 assertEquals("Wrong size", 2, collection.size()); 1051 assertTrue("Should return true", collection.retainAll(c)); 1052 assertEquals("Wrong size", 1, collection.size()); 1053 assertFalse("Should return false", collection.retainAll(c)); 1054 assertEquals(1, collection.size()); 1055 Object[] array = collection.toArray(); 1056 assertEquals("Wrong length", 1, array.length); 1057 assertEquals("Wrong key", 1, array[0]); 1058 1059 enumColorMap = new EnumMap<Color, Double>(Color.class); 1060 enumColorMap.put(Color.Red, 1); 1061 enumColorMap.put(Color.Blue, null); 1062 collection = enumColorMap.values(); 1063 1064 assertEquals("Wrong size", 2, collection.size()); 1065 assertFalse("Returned true when the object can not be removed", 1066 collection.remove(new Integer("10"))); 1067 1068 Iterator iter = enumColorMap.values().iterator(); 1069 Object value = iter.next(); 1070 assertTrue("Returned false for contained object", collection 1071 .contains(value)); 1072 value = iter.next(); 1073 assertTrue("Returned false for contained object", collection 1074 .contains(value)); 1075 1076 enumColorMap.put(Color.Green, 1); 1077 enumColorMap.remove(Color.Blue); 1078 assertFalse("Returned true for uncontained object", collection 1079 .contains(value)); 1080 iter.remove(); 1081 try { 1082 iter.remove(); 1083 fail("Should throw IllegalStateException"); 1084 } catch (IllegalStateException e) { 1085 // Expected 1086 } 1087 assertFalse("Returned true for uncontained object", collection 1088 .contains(value)); 1089 1090 iter = enumColorMap.values().iterator(); 1091 value = iter.next(); 1092 assertTrue("Returned false for contained object", collection 1093 .contains(value)); 1094 enumColorMap.put(Color.Green, 3); 1095 assertTrue("Returned false for contained object", collection 1096 .contains(value)); 1097 assertTrue("Returned false for contained object", collection 1098 .remove(new Integer("1"))); 1099 assertEquals("Wrong size", 1, collection.size()); 1100 collection.clear(); 1101 assertEquals("Wrong size", 0, collection.size()); 1102 1103 enumColorMap = new EnumMap<Color, Double>(Color.class); 1104 Integer integer1 = new Integer(1); 1105 enumColorMap.put(Color.Green, integer1); 1106 enumColorMap.put(Color.Blue, null); 1107 collection = enumColorMap.values(); 1108 iter = enumColorMap.values().iterator(); 1109 try { 1110 iter.remove(); 1111 fail("Should throw IllegalStateException"); 1112 } catch (IllegalStateException e) { 1113 // Expected 1114 } 1115 value = iter.next(); 1116 assertEquals("Wrong value", integer1, value); 1117 assertSame("Wrong value", integer1, value); 1118 assertFalse("Returned true for unequal object", iter.equals(value)); 1119 iter.remove(); 1120 assertFalse("Returned true for unequal object", iter.equals(value)); 1121 try { 1122 iter.remove(); 1123 fail("Should throw IllegalStateException"); 1124 } catch (IllegalStateException e) { 1125 // Expected 1126 } 1127 assertEquals("Wrong size", 1, collection.size()); 1128 value = iter.next(); 1129 assertFalse("Returned true for unequal object", iter.equals(value)); 1130 iter.remove(); 1131 try { 1132 iter.next(); 1133 fail("Should throw NoSuchElementException"); 1134 } catch (NoSuchElementException e) { 1135 // Expected 1136 } 1137 } 1138 1139 /** 1140 * serialization/deserialization. 1141 */ 1142 @SuppressWarnings({ "unchecked", "boxing" }) 1143 public void testSerializationSelf() throws Exception { 1144 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 1145 enumColorMap.put(Color.Blue, 3); 1146 SerializationTest.verifySelf(enumColorMap); 1147 } 1148 1149 /** 1150 * serialization/deserialization compatibility with RI. 1151 */ 1152 @SuppressWarnings({ "unchecked", "boxing" }) 1153 public void testSerializationCompatibility() throws Exception { 1154 EnumMap enumColorMap = new EnumMap<Color, Double>(Color.class); 1155 enumColorMap.put(Color.Red, 1); 1156 enumColorMap.put(Color.Blue, 3); 1157 SerializationTest.verifyGolden(this, enumColorMap); 1158 } 1159 1160 /** 1161 * Sets up the fixture. 1162 */ 1163 @Override 1164 protected void setUp() throws Exception { 1165 super.setUp(); 1166 } 1167 1168 /** 1169 * Tears down the fixture. 1170 */ 1171 @Override 1172 protected void tearDown() throws Exception{ 1173 super.tearDown(); 1174 } 1175 } 1176