Home | History | Annotate | Download | only in util
      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