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 java.util.ArrayList;
     20 import java.util.Collection;
     21 import java.util.EnumSet;
     22 import java.util.Iterator;
     23 import java.util.NoSuchElementException;
     24 import java.util.Set;
     25 
     26 import junit.framework.TestCase;
     27 
     28 import org.apache.harmony.testframework.serialization.SerializationTest;
     29 
     30 public class EnumSetTest extends TestCase {
     31     static final boolean disableRIBugs = true;
     32 
     33     static enum EnumWithInnerClass {
     34         a, b, c, d, e, f {
     35         },
     36     }
     37 
     38     enum EnumWithAllInnerClass {
     39         a {},
     40         b {},
     41     }
     42 
     43     static enum EnumFoo {
     44         a, b,c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, aa, bb, cc, dd, ee, ff, gg, hh, ii, jj, kk, ll,
     45     }
     46 
     47     static enum EmptyEnum {
     48         // expected
     49     }
     50 
     51     static enum HugeEnumWithInnerClass {
     52         a{}, b{}, c{}, d{}, e{}, f{}, g{}, h{}, i{}, j{}, k{}, l{}, m{}, n{}, o{}, p{}, q{}, r{}, s{}, t{}, u{}, v{}, w{}, x{}, y{}, z{}, A{}, B{}, C{}, D{}, E{}, F{}, G{}, H{}, I{}, J{}, K{}, L{}, M{}, N{}, O{}, P{}, Q{}, R{}, S{}, T{}, U{}, V{}, W{}, X{}, Y{}, Z{}, aa{}, bb{}, cc{}, dd{}, ee{}, ff{}, gg{}, hh{}, ii{}, jj{}, kk{}, ll{}, mm{},
     53     }
     54 
     55     static enum HugeEnum {
     56         a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, aa, bb, cc, dd, ee, ff, gg, hh, ii, jj, kk, ll, mm,
     57     }
     58 
     59     static enum HugeEnumCount {
     60         NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, NO10, NO11, NO12, NO13, NO14, NO15, NO16, NO17, NO18, NO19, NO20,
     61         NO21, NO22, NO23, NO24, NO25, NO26, NO27, NO28, NO29, NO30, NO31, NO32, NO33, NO34, NO35, NO36, NO37, NO38, NO39, NO40,
     62         NO41, NO42, NO43, NO44, NO45, NO46, NO47, NO48, NO49, NO50, NO51, NO52, NO53, NO54, NO55, NO56, NO57, NO58, NO59, NO60,
     63         NO61, NO62, NO63, NO64, NO65, NO66, NO67, NO68, NO69, NO70, NO71, NO72, NO73, NO74, NO75, NO76, NO77, NO78, NO79, NO80,
     64         NO81, NO82, NO83, NO84, NO85, NO86, NO87, NO88, NO89, NO90, NO91, NO92, NO93, NO94, NO95, NO96, NO97, NO98, NO99, NO100,
     65         NO101, NO102, NO103, NO104, NO105, NO106, NO107, NO108, NO109, NO110, NO111, NO112, NO113, NO114, NO115, NO116, NO117, NO118, NO119, NO120,
     66         NO121, NO122, NO123, NO124, NO125, NO126, NO127, NO128, NO129, NO130,
     67     }
     68 
     69     /**
     70      * java.util.EnumSet#noneOf(java.lang.Class)
     71      */
     72     @SuppressWarnings("unchecked")
     73     public void test_NoneOf_LClass() {
     74         try {
     75             EnumSet.noneOf((Class) null);
     76             fail("Should throw NullPointerException");
     77         } catch (NullPointerException e) {
     78             // expected
     79         }
     80 
     81         try {
     82             EnumSet.noneOf(Enum.class);
     83             fail("Should throw ClassCastException");
     84         } catch (ClassCastException cce) {
     85             // expected
     86         }
     87 
     88         Class<EnumWithAllInnerClass> c = (Class<EnumWithAllInnerClass>) EnumWithAllInnerClass.a
     89                 .getClass();
     90         try {
     91             EnumSet.noneOf(c);
     92             fail("Should throw ClassCastException");
     93         } catch (ClassCastException e) {
     94             // expected
     95         }
     96 
     97         EnumSet<EnumWithAllInnerClass> setWithInnerClass = EnumSet
     98                 .noneOf(EnumWithAllInnerClass.class);
     99         assertNotNull(setWithInnerClass);
    100 
    101         // test enum type with more than 64 elements
    102         Class<HugeEnumWithInnerClass> hc = (Class<HugeEnumWithInnerClass>) HugeEnumWithInnerClass.a
    103             .getClass();
    104         try {
    105             EnumSet.noneOf(hc);
    106             fail("Should throw ClassCastException");
    107         } catch (ClassCastException e) {
    108             // expected
    109         }
    110 
    111         EnumSet<HugeEnumWithInnerClass> hugeSetWithInnerClass = EnumSet
    112             .noneOf(HugeEnumWithInnerClass.class);
    113         assertNotNull(hugeSetWithInnerClass);
    114     }
    115 
    116     /**
    117      * java.util.HugeEnumSet#iterator()
    118      */
    119     public void test_iterator_HugeEnumSet() {
    120         EnumSet<HugeEnumCount> set;
    121         Object[] array;
    122 
    123         // Test HugeEnumSet with 65 elements
    124         // which is more than the bits of Long
    125         set = EnumSet.range(HugeEnumCount.NO1, HugeEnumCount.NO65);
    126         array = set.toArray();
    127         for (HugeEnumCount count : set) {
    128             assertEquals(count, (HugeEnumCount) array[count.ordinal()]);
    129         }
    130 
    131         // Test HugeEnumSet with 130 elements
    132         // which is more than twice of the bits of Long
    133         set = EnumSet.range(HugeEnumCount.NO1, HugeEnumCount.NO130);
    134         array = set.toArray();
    135         for (HugeEnumCount count : set) {
    136             assertEquals(count, (HugeEnumCount) array[count.ordinal()]);
    137         }
    138     }
    139 
    140     public void testRemoveIteratorRemoveFromHugeEnumSet() {
    141         EnumSet<HugeEnumCount> set = EnumSet.noneOf(HugeEnumCount.class);
    142         set.add(HugeEnumCount.NO64);
    143         set.add(HugeEnumCount.NO65);
    144         set.add(HugeEnumCount.NO128);
    145         Iterator<HugeEnumCount> iterator = set.iterator();
    146         assertTrue(iterator.hasNext());
    147         assertEquals(HugeEnumCount.NO64, iterator.next());
    148         assertTrue(iterator.hasNext());
    149         iterator.remove();
    150         assertEquals(HugeEnumCount.NO65, iterator.next());
    151         assertTrue(iterator.hasNext());
    152         assertEquals(HugeEnumCount.NO128, iterator.next());
    153         assertFalse(iterator.hasNext());
    154         assertEquals(EnumSet.of(HugeEnumCount.NO65, HugeEnumCount.NO128), set);
    155         iterator.remove();
    156         assertEquals(EnumSet.of(HugeEnumCount.NO65), set);
    157     }
    158 
    159     /**
    160      * java.util.EnumSet#allOf(java.lang.Class)
    161      */
    162     @SuppressWarnings("unchecked")
    163     public void test_AllOf_LClass() {
    164         try {
    165             EnumSet.allOf((Class) null);
    166             fail("Should throw NullPointerException");
    167         } catch (NullPointerException e) {
    168             // expected
    169         }
    170 
    171         try {
    172             EnumSet.allOf(Enum.class);
    173             fail("Should throw ClassCastException");
    174         } catch (ClassCastException cce) {
    175             // expected
    176         }
    177 
    178         EnumSet<EnumFoo> enumSet = EnumSet.allOf(EnumFoo.class);
    179         assertEquals("Size of enumSet should be 64", 64, enumSet.size());
    180 
    181         assertFalse(
    182                 "enumSet should not contain null value", enumSet.contains(null));
    183         assertTrue(
    184                 "enumSet should contain EnumFoo.a", enumSet.contains(EnumFoo.a));
    185         assertTrue(
    186                 "enumSet should contain EnumFoo.b", enumSet.contains(EnumFoo.b));
    187 
    188         enumSet.add(EnumFoo.a);
    189         assertEquals("Should be equal", 64, enumSet.size());
    190 
    191         EnumSet<EnumFoo> anotherSet = EnumSet.allOf(EnumFoo.class);
    192         assertEquals("Should be equal", enumSet, anotherSet);
    193         assertNotSame("Should not be identical", enumSet, anotherSet);
    194 
    195         // test enum with more than 64 elements
    196         EnumSet<HugeEnum> hugeEnumSet = EnumSet.allOf(HugeEnum.class);
    197         assertEquals(65, hugeEnumSet.size());
    198 
    199         assertFalse(hugeEnumSet.contains(null));
    200         assertTrue(hugeEnumSet.contains(HugeEnum.a));
    201         assertTrue(hugeEnumSet.contains(HugeEnum.b));
    202 
    203         hugeEnumSet.add(HugeEnum.a);
    204         assertEquals(65, hugeEnumSet.size());
    205 
    206         EnumSet<HugeEnum> anotherHugeSet = EnumSet.allOf(HugeEnum.class);
    207         assertEquals(hugeEnumSet, anotherHugeSet);
    208         assertNotSame(hugeEnumSet, anotherHugeSet);
    209 
    210     }
    211 
    212     /**
    213      * java.util.EnumSet#add(E)
    214      */
    215     @SuppressWarnings("unchecked")
    216     public void test_add_E() {
    217         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    218         set.add(EnumFoo.a);
    219         set.add(EnumFoo.b);
    220 
    221         try {
    222             set.add(null);
    223             fail("Should throw NullPointerException");
    224         } catch (NullPointerException e) {
    225             // expected
    226         }
    227 
    228         // test enum type with more than 64 elements
    229         Set rawSet = set;
    230         try {
    231             rawSet.add(HugeEnumWithInnerClass.b);
    232             fail("Should throw ClassCastException");
    233         } catch (ClassCastException e) {
    234             // expected
    235         }
    236 
    237         set.clear();
    238         try {
    239             set.add(null);
    240             fail("Should throw NullPointerException");
    241         } catch (NullPointerException e) {
    242             // expected
    243         }
    244 
    245         boolean result = set.add(EnumFoo.a);
    246         assertEquals("Size should be 1:", 1, set.size());
    247         assertTrue("Return value should be true", result);
    248 
    249         result = set.add(EnumFoo.a);
    250         assertEquals("Size should be 1:", 1, set.size());
    251         assertFalse("Return value should be false", result);
    252 
    253         set.add(EnumFoo.b);
    254         assertEquals("Size should be 2:", 2, set.size());
    255 
    256         rawSet = set;
    257         try {
    258             rawSet.add(EnumWithAllInnerClass.a);
    259             fail("Should throw ClassCastException");
    260         } catch(ClassCastException e) {
    261             // expected
    262         }
    263 
    264         try {
    265             rawSet.add(EnumWithInnerClass.a);
    266             fail("Should throw ClassCastException");
    267         } catch(ClassCastException e) {
    268             // expected
    269         }
    270 
    271         try {
    272             rawSet.add(new Object());
    273             fail("Should throw ClassCastException");
    274         } catch(ClassCastException e) {
    275             // expected
    276         }
    277 
    278         // test enum type with more than 64 elements
    279         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    280         result = hugeSet.add(HugeEnum.a);
    281         assertTrue(result);
    282 
    283         result = hugeSet.add(HugeEnum.a);
    284         assertFalse(result);
    285 
    286         try {
    287             hugeSet.add(null);
    288             fail("Should throw NullPointerException");
    289         } catch (NullPointerException e) {
    290             // expected
    291         }
    292 
    293         rawSet = hugeSet;
    294         try {
    295             rawSet.add(HugeEnumWithInnerClass.b);
    296             fail("Should throw ClassCastException");
    297         } catch (ClassCastException e) {
    298             // expected
    299         }
    300 
    301         try {
    302             rawSet.add(new Object());
    303             fail("Should throw ClassCastException");
    304         } catch (ClassCastException e) {
    305             // expected
    306         }
    307 
    308         result = hugeSet.add(HugeEnum.mm);
    309         assertTrue(result);
    310         result = hugeSet.add(HugeEnum.mm);
    311         assertFalse(result);
    312         assertEquals(2, hugeSet.size());
    313 
    314     }
    315 
    316     /**
    317      * java.util.EnumSet#addAll(Collection)
    318      */
    319     @SuppressWarnings( { "unchecked", "boxing" })
    320     public void test_addAll_LCollection() {
    321 
    322         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    323         assertEquals("Size should be 0:", 0, set.size());
    324 
    325         try {
    326             set.addAll(null);
    327             fail("Should throw NullPointerException");
    328         } catch (NullPointerException e) {
    329             // expected
    330         }
    331 
    332         Set emptySet = EnumSet.noneOf(EmptyEnum.class);
    333         Enum[] elements = EmptyEnum.class.getEnumConstants();
    334         for(int i = 0; i < elements.length; i++) {
    335             emptySet.add(elements[i]);
    336         }
    337         boolean result = set.addAll(emptySet);
    338         assertFalse(result);
    339 
    340         Collection<EnumFoo> collection = new ArrayList<EnumFoo>();
    341         collection.add(EnumFoo.a);
    342         collection.add(EnumFoo.b);
    343         result = set.addAll(collection);
    344         assertTrue("addAll should be successful", result);
    345         assertEquals("Size should be 2:", 2, set.size());
    346 
    347         set = EnumSet.noneOf(EnumFoo.class);
    348 
    349         Collection rawCollection = new ArrayList<Integer>();
    350         result = set.addAll(rawCollection);
    351         assertFalse(result);
    352         rawCollection.add(1);
    353         try {
    354             set.addAll(rawCollection);
    355             fail("Should throw ClassCastException");
    356         } catch (ClassCastException e) {
    357             // expected
    358         }
    359 
    360         Set<EnumFoo> fullSet = EnumSet.noneOf(EnumFoo.class);
    361         fullSet.add(EnumFoo.a);
    362         fullSet.add(EnumFoo.b);
    363         result = set.addAll(fullSet);
    364         assertTrue("addAll should be successful", result);
    365         assertEquals("Size of set should be 2", 2, set.size());
    366 
    367         try {
    368             fullSet.addAll(null);
    369             fail("Should throw NullPointerException");
    370         } catch (NullPointerException e) {
    371             // expected
    372         }
    373 
    374         Set fullSetWithSubclass = EnumSet.noneOf(EnumWithInnerClass.class);
    375         elements = EnumWithInnerClass.class.getEnumConstants();
    376         for(int i = 0; i < elements.length; i++) {
    377             fullSetWithSubclass.add(elements[i]);
    378         }
    379         try {
    380             set.addAll(fullSetWithSubclass);
    381             fail("Should throw ClassCastException");
    382         } catch (ClassCastException e) {
    383             // expected
    384         }
    385         Set<EnumWithInnerClass> setWithSubclass = fullSetWithSubclass;
    386         result = setWithSubclass.addAll(setWithSubclass);
    387         assertFalse("Should return false", result);
    388 
    389         Set<EnumWithInnerClass> anotherSetWithSubclass = EnumSet
    390                 .noneOf(EnumWithInnerClass.class);
    391         elements = EnumWithInnerClass.class.getEnumConstants();
    392         for(int i = 0; i < elements.length; i++) {
    393             anotherSetWithSubclass.add((EnumWithInnerClass) elements[i]);
    394         }
    395         result = setWithSubclass.addAll(anotherSetWithSubclass);
    396         assertFalse("Should return false", result);
    397 
    398         anotherSetWithSubclass.remove(EnumWithInnerClass.a);
    399         result = setWithSubclass.addAll(anotherSetWithSubclass);
    400         assertFalse("Should return false", result);
    401 
    402         // test enum type with more than 64 elements
    403         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    404         assertEquals(0, hugeSet.size());
    405 
    406         try {
    407             hugeSet.addAll(null);
    408             fail("Should throw NullPointerException");
    409         } catch (NullPointerException e) {
    410             // expected
    411         }
    412 
    413         hugeSet = EnumSet.allOf(HugeEnum.class);
    414         result = hugeSet.addAll(hugeSet);
    415         assertFalse(result);
    416 
    417         hugeSet = EnumSet.noneOf(HugeEnum.class);
    418         Collection<HugeEnum> hugeCollection = new ArrayList<HugeEnum>();
    419         hugeCollection.add(HugeEnum.a);
    420         hugeCollection.add(HugeEnum.b);
    421         result = hugeSet.addAll(hugeCollection);
    422         assertTrue(result);
    423         assertEquals(2, set.size());
    424 
    425         hugeSet = EnumSet.noneOf(HugeEnum.class);
    426 
    427         rawCollection = new ArrayList<Integer>();
    428         result = hugeSet.addAll(rawCollection);
    429         assertFalse(result);
    430         rawCollection.add(1);
    431         try {
    432             hugeSet.addAll(rawCollection);
    433             fail("Should throw ClassCastException");
    434         } catch (ClassCastException e) {
    435             // expected
    436         }
    437 
    438         EnumSet<HugeEnum> aHugeSet = EnumSet.noneOf(HugeEnum.class);
    439         aHugeSet.add(HugeEnum.a);
    440         aHugeSet.add(HugeEnum.b);
    441         result = hugeSet.addAll(aHugeSet);
    442         assertTrue(result);
    443         assertEquals(2, hugeSet.size());
    444 
    445         try {
    446             aHugeSet.addAll(null);
    447             fail("Should throw NullPointerException");
    448         } catch (NullPointerException e) {
    449             // expected
    450         }
    451 
    452         Set hugeSetWithSubclass = EnumSet.allOf(HugeEnumWithInnerClass.class);
    453         try {
    454             hugeSet.addAll(hugeSetWithSubclass);
    455             fail("Should throw ClassCastException");
    456         } catch (ClassCastException e) {
    457             // expected
    458         }
    459         Set<HugeEnumWithInnerClass> hugeSetWithInnerSubclass = hugeSetWithSubclass;
    460         result = hugeSetWithInnerSubclass.addAll(hugeSetWithInnerSubclass);
    461         assertFalse(result);
    462 
    463         Set<HugeEnumWithInnerClass> anotherHugeSetWithSubclass = EnumSet
    464                 .allOf(HugeEnumWithInnerClass.class);
    465         result = hugeSetWithSubclass.addAll(anotherHugeSetWithSubclass);
    466         assertFalse(result);
    467 
    468         anotherHugeSetWithSubclass.remove(HugeEnumWithInnerClass.a);
    469         result = setWithSubclass.addAll(anotherSetWithSubclass);
    470         assertFalse(result);
    471 
    472     }
    473 
    474     /**
    475      * java.util.EnumSet#remove(Object)
    476      */
    477     public void test_remove_LOject() {
    478         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    479         Enum[] elements = EnumFoo.class.getEnumConstants();
    480         for(int i = 0; i < elements.length; i++) {
    481             set.add((EnumFoo) elements[i]);
    482         }
    483 
    484         boolean result = set.remove(null);
    485         assertFalse("'set' does not contain null", result);
    486 
    487         result = set.remove(EnumFoo.a);
    488         assertTrue("Should return true", result);
    489         result = set.remove(EnumFoo.a);
    490         assertFalse("Should return false", result);
    491 
    492         assertEquals("Size of set should be 63:", 63, set.size());
    493 
    494         result = set.remove(EnumWithInnerClass.a);
    495         assertFalse("Should return false", result);
    496         result = set.remove(EnumWithInnerClass.f);
    497         assertFalse("Should return false", result);
    498 
    499         // test enum with more than 64 elements
    500         Set<HugeEnum> hugeSet = EnumSet.allOf(HugeEnum.class);
    501 
    502         result = hugeSet.remove(null);
    503         assertFalse("'set' does not contain null", result);
    504 
    505         result = hugeSet.remove(HugeEnum.a);
    506         assertTrue("Should return true", result);
    507         result = hugeSet.remove(HugeEnum.a);
    508         assertFalse("Should return false", result);
    509 
    510         assertEquals("Size of set should be 64:", 64, hugeSet.size());
    511 
    512         result = hugeSet.remove(HugeEnumWithInnerClass.a);
    513         assertFalse("Should return false", result);
    514         result = hugeSet.remove(HugeEnumWithInnerClass.f);
    515         assertFalse("Should return false", result);
    516     }
    517 
    518     /**
    519      * java.util.EnumSet#equals(Object)
    520      */
    521     public void test_equals_LObject() {
    522         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    523         Enum[] elements = EnumFoo.class.getEnumConstants();
    524         for(int i = 0; i < elements.length; i++) {
    525             set.add((EnumFoo) elements[i]);
    526         }
    527 
    528         assertFalse("Should return false", set.equals(null));
    529         assertFalse(
    530                 "Should return false", set.equals(new Object()));
    531 
    532         Set<EnumFoo> anotherSet = EnumSet.noneOf(EnumFoo.class);
    533         elements = EnumFoo.class.getEnumConstants();
    534         for(int i = 0; i < elements.length; i++) {
    535             anotherSet.add((EnumFoo) elements[i]);
    536         }
    537         assertTrue("Should return true", set.equals(anotherSet));
    538 
    539         anotherSet.remove(EnumFoo.a);
    540         assertFalse(
    541                 "Should return false", set.equals(anotherSet));
    542 
    543         Set<EnumWithInnerClass> setWithInnerClass = EnumSet
    544                 .noneOf(EnumWithInnerClass.class);
    545         elements = EnumWithInnerClass.class.getEnumConstants();
    546         for(int i = 0; i < elements.length; i++) {
    547             setWithInnerClass.add((EnumWithInnerClass) elements[i]);
    548         }
    549 
    550         assertFalse(
    551                 "Should return false", set.equals(setWithInnerClass));
    552 
    553         setWithInnerClass.clear();
    554         set.clear();
    555         assertTrue("Should be equal", set.equals(setWithInnerClass));
    556 
    557         // test enum type with more than 64 elements
    558         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    559         assertTrue(hugeSet.equals(set));
    560 
    561         hugeSet = EnumSet.allOf(HugeEnum.class);
    562         assertFalse(hugeSet.equals(null));
    563         assertFalse(hugeSet.equals(new Object()));
    564 
    565         Set<HugeEnum> anotherHugeSet = EnumSet.allOf(HugeEnum.class);
    566         anotherHugeSet.remove(HugeEnum.a);
    567         assertFalse(hugeSet.equals(anotherHugeSet));
    568 
    569         Set<HugeEnumWithInnerClass> hugeSetWithInnerClass = EnumSet
    570                 .allOf(HugeEnumWithInnerClass.class);
    571         assertFalse(hugeSet.equals(hugeSetWithInnerClass));
    572         hugeSetWithInnerClass.clear();
    573         hugeSet.clear();
    574         assertTrue(hugeSet.equals(hugeSetWithInnerClass));
    575     }
    576 
    577     /**
    578      * java.util.EnumSet#clear()
    579      */
    580     public void test_clear() {
    581         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    582         set.add(EnumFoo.a);
    583         set.add(EnumFoo.b);
    584         assertEquals("Size should be 2", 2, set.size());
    585 
    586         set.clear();
    587 
    588         assertEquals("Size should be 0", 0, set.size());
    589 
    590         // test enum type with more than 64 elements
    591         Set<HugeEnum> hugeSet = EnumSet.allOf(HugeEnum.class);
    592         assertEquals(65, hugeSet.size());
    593 
    594         boolean result = hugeSet.contains(HugeEnum.aa);
    595         assertTrue(result);
    596 
    597         hugeSet.clear();
    598         assertEquals(0, hugeSet.size());
    599         result = hugeSet.contains(HugeEnum.aa);
    600         assertFalse(result);
    601     }
    602 
    603     /**
    604      * java.util.EnumSet#size()
    605      */
    606     public void test_size() {
    607         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    608         set.add(EnumFoo.a);
    609         set.add(EnumFoo.b);
    610         assertEquals("Size should be 2", 2, set.size());
    611 
    612         // test enum type with more than 64 elements
    613         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    614         hugeSet.add(HugeEnum.a);
    615         hugeSet.add(HugeEnum.bb);
    616         assertEquals("Size should be 2", 2, hugeSet.size());
    617     }
    618 
    619     /**
    620      * java.util.EnumSet#complementOf(java.util.EnumSet)
    621      */
    622     public void test_ComplementOf_LEnumSet() {
    623 
    624         try {
    625             EnumSet.complementOf((EnumSet<EnumFoo>) null);
    626             fail("Should throw NullPointerException");
    627         } catch (NullPointerException npe) {
    628             // expected
    629         }
    630 
    631         EnumSet<EnumWithInnerClass> set = EnumSet
    632                 .noneOf(EnumWithInnerClass.class);
    633         set.add(EnumWithInnerClass.d);
    634         set.add(EnumWithInnerClass.e);
    635         set.add(EnumWithInnerClass.f);
    636 
    637         assertEquals("Size should be 3:", 3, set.size());
    638 
    639         EnumSet<EnumWithInnerClass> complementOfE = EnumSet.complementOf(set);
    640         assertTrue(set.contains(EnumWithInnerClass.d));
    641         assertEquals(
    642                 "complementOfE should have size 3", 3, complementOfE.size());
    643         assertTrue("complementOfE should contain EnumWithSubclass.a:",
    644                 complementOfE.contains(EnumWithInnerClass.a));
    645         assertTrue("complementOfE should contain EnumWithSubclass.b:",
    646                 complementOfE.contains(EnumWithInnerClass.b));
    647         assertTrue("complementOfE should contain EnumWithSubclass.c:",
    648                 complementOfE.contains(EnumWithInnerClass.c));
    649 
    650         // test enum type with more than 64 elements
    651         EnumSet<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    652         assertEquals(0, hugeSet.size());
    653         Set<HugeEnum> complementHugeSet = EnumSet.complementOf(hugeSet);
    654         assertEquals(65, complementHugeSet.size());
    655 
    656         hugeSet.add(HugeEnum.A);
    657         hugeSet.add(HugeEnum.mm);
    658         complementHugeSet = EnumSet.complementOf(hugeSet);
    659         assertEquals(63, complementHugeSet.size());
    660 
    661         try {
    662             EnumSet.complementOf((EnumSet<HugeEnum>) null);
    663             fail("Should throw NullPointerException");
    664         } catch (NullPointerException npe) {
    665             // expected
    666         }
    667     }
    668 
    669     /**
    670      * java.util.EnumSet#contains(Object)
    671      */
    672     public void test_contains_LObject() {
    673         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    674         Enum[] elements = EnumFoo.class.getEnumConstants();
    675         for(int i = 0; i < elements.length; i++) {
    676             set.add((EnumFoo)elements[i]);
    677         }
    678         boolean result = set.contains(null);
    679         assertFalse("Should not contain null:", result);
    680 
    681         result = set.contains(EnumFoo.a);
    682         assertTrue("Should contain EnumFoo.a", result);
    683         result = set.contains(EnumFoo.ll);
    684         assertTrue("Should contain EnumFoo.ll", result);
    685 
    686         result = set.contains(EnumFoo.b);
    687         assertTrue("Should contain EnumFoo.b", result);
    688 
    689         result = set.contains(new Object());
    690         assertFalse("Should not contain Object instance", result);
    691 
    692         result = set.contains(EnumWithInnerClass.a);
    693         assertFalse("Should not contain EnumWithSubclass.a", result);
    694 
    695         set = EnumSet.noneOf(EnumFoo.class);
    696         set.add(EnumFoo.aa);
    697         set.add(EnumFoo.bb);
    698         set.add(EnumFoo.cc);
    699 
    700         assertEquals("Size of set should be 3", 3, set.size());
    701         assertTrue("set should contain EnumFoo.aa", set.contains(EnumFoo.aa));
    702 
    703         Set<EnumWithInnerClass> setWithSubclass = EnumSet
    704                 .noneOf(EnumWithInnerClass.class);
    705         setWithSubclass.add(EnumWithInnerClass.a);
    706         setWithSubclass.add(EnumWithInnerClass.b);
    707         setWithSubclass.add(EnumWithInnerClass.c);
    708         setWithSubclass.add(EnumWithInnerClass.d);
    709         setWithSubclass.add(EnumWithInnerClass.e);
    710         setWithSubclass.add(EnumWithInnerClass.f);
    711         result = setWithSubclass.contains(EnumWithInnerClass.f);
    712         assertTrue("Should contain EnumWithSubclass.f", result);
    713 
    714         // test enum type with more than 64 elements
    715         Set<HugeEnum> hugeSet = EnumSet.allOf(HugeEnum.class);
    716         hugeSet.add(HugeEnum.a);
    717         result = hugeSet.contains(HugeEnum.a);
    718         assertTrue(result);
    719 
    720         result = hugeSet.contains(HugeEnum.b);
    721         assertTrue(result);
    722 
    723         result = hugeSet.contains(null);
    724         assertFalse(result);
    725 
    726         result = hugeSet.contains(HugeEnum.a);
    727         assertTrue(result);
    728 
    729         result = hugeSet.contains(HugeEnum.ll);
    730         assertTrue(result);
    731 
    732         result = hugeSet.contains(new Object());
    733         assertFalse(result);
    734 
    735         result = hugeSet.contains(Enum.class);
    736         assertFalse(result);
    737 
    738     }
    739 
    740     /**
    741      * java.util.EnumSet#containsAll(Collection)
    742      */
    743     @SuppressWarnings( { "unchecked", "boxing" })
    744     public void test_containsAll_LCollection() {
    745         EnumSet<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
    746         Enum[] elements = EnumFoo.class.getEnumConstants();
    747         for(int i = 0; i < elements.length; i++) {
    748             set.add((EnumFoo)elements[i]);
    749         }
    750         try {
    751             set.containsAll(null);
    752             fail("Should throw NullPointerException");
    753         } catch (NullPointerException e) {
    754             // expected
    755         }
    756 
    757         EnumSet<EmptyEnum> emptySet = EnumSet.noneOf(EmptyEnum.class);
    758         elements = EmptyEnum.class.getEnumConstants();
    759         for(int i = 0; i < elements.length; i++) {
    760             emptySet.add((EmptyEnum)elements[i]);
    761         }
    762         boolean result = set.containsAll(emptySet);
    763         assertTrue("Should return true", result);
    764 
    765         Collection rawCollection = new ArrayList();
    766         result = set.containsAll(rawCollection);
    767         assertTrue("Should contain empty collection:", result);
    768 
    769         rawCollection.add(1);
    770         result = set.containsAll(rawCollection);
    771         assertFalse("Should return false", result);
    772 
    773         rawCollection.add(EnumWithInnerClass.a);
    774         result = set.containsAll(rawCollection);
    775         assertFalse("Should return false", result);
    776 
    777         EnumSet rawSet = EnumSet.noneOf(EnumFoo.class);
    778         result = set.containsAll(rawSet);
    779         assertTrue("Should contain empty set", result);
    780 
    781         emptySet = EnumSet.noneOf(EmptyEnum.class);
    782         result = set.containsAll(emptySet);
    783         assertTrue("No class cast should be performed on empty set", result);
    784 
    785         Collection<EnumFoo> collection = new ArrayList<EnumFoo>();
    786         collection.add(EnumFoo.a);
    787         result = set.containsAll(collection);
    788         assertTrue("Should contain all elements in collection", result);
    789 
    790         EnumSet<EnumFoo> fooSet = EnumSet.noneOf(EnumFoo.class);
    791         fooSet.add(EnumFoo.a);
    792         result = set.containsAll(fooSet);
    793         assertTrue("Should return true", result);
    794 
    795         set.clear();
    796         try {
    797             set.containsAll(null);
    798             fail("Should throw NullPointerException");
    799         } catch (NullPointerException e) {
    800             // expected
    801         }
    802 
    803         Collection<EnumWithInnerClass> collectionWithSubclass = new ArrayList<EnumWithInnerClass>();
    804         collectionWithSubclass.add(EnumWithInnerClass.a);
    805         result = set.containsAll(collectionWithSubclass);
    806         assertFalse("Should return false", result);
    807 
    808         EnumSet<EnumWithInnerClass> setWithSubclass = EnumSet
    809                 .noneOf(EnumWithInnerClass.class);
    810         setWithSubclass.add(EnumWithInnerClass.a);
    811         result = set.containsAll(setWithSubclass);
    812         assertFalse("Should return false", result);
    813 
    814         // test enum type with more than 64 elements
    815         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
    816         hugeSet.add(HugeEnum.a);
    817         hugeSet.add(HugeEnum.b);
    818         hugeSet.add(HugeEnum.aa);
    819         hugeSet.add(HugeEnum.bb);
    820         hugeSet.add(HugeEnum.cc);
    821         hugeSet.add(HugeEnum.dd);
    822 
    823         Set<HugeEnum> anotherHugeSet = EnumSet.noneOf(HugeEnum.class);
    824         hugeSet.add(HugeEnum.b);
    825         hugeSet.add(HugeEnum.cc);
    826         result = hugeSet.containsAll(anotherHugeSet);
    827         assertTrue(result);
    828 
    829         try {
    830             hugeSet.containsAll(null);
    831             fail("Should throw NullPointerException");
    832         } catch(NullPointerException e) {
    833             // expected
    834         }
    835 
    836         Set<HugeEnumWithInnerClass> hugeSetWithInnerClass = EnumSet
    837                 .noneOf(HugeEnumWithInnerClass.class);
    838         hugeSetWithInnerClass.add(HugeEnumWithInnerClass.a);
    839         hugeSetWithInnerClass.add(HugeEnumWithInnerClass.b);
    840         result = hugeSetWithInnerClass.containsAll(hugeSetWithInnerClass);
    841         assertTrue(result);
    842         result = hugeSet.containsAll(hugeSetWithInnerClass);
    843         assertFalse(result);
    844 
    845         rawCollection = new ArrayList();
    846         result = hugeSet.containsAll(rawCollection);
    847         assertTrue("Should contain empty collection:", result);
    848 
    849         rawCollection.add(1);
    850         result = hugeSet.containsAll(rawCollection);
    851         assertFalse("Should return false", result);
    852 
    853         rawCollection.add(EnumWithInnerClass.a);
    854         result = set.containsAll(rawCollection);
    855         assertFalse("Should return false", result);
    856 
    857         rawSet = EnumSet.noneOf(HugeEnum.class);
    858         result = hugeSet.containsAll(rawSet);
    859         assertTrue("Should contain empty set", result);
    860 
    861         EnumSet<HugeEnumWithInnerClass> emptyHugeSet
    862             = EnumSet.noneOf(HugeEnumWithInnerClass.class);
    863         result = hugeSet.containsAll(emptyHugeSet);
    864         assertTrue("No class cast should be performed on empty set", result);
    865 
    866         Collection<HugeEnum> hugeCollection = new ArrayList<HugeEnum>();
    867         hugeCollection.add(HugeEnum.a);
    868         result = hugeSet.containsAll(hugeCollection);
    869         assertTrue("Should contain all elements in collection", result);
    870 
    871         hugeSet.clear();
    872         try {
    873             hugeSet.containsAll(null);
    874             fail("Should throw NullPointerException");
    875         } catch (NullPointerException e) {
    876             // expected
    877         }
    878 
    879         Collection<HugeEnumWithInnerClass> hugeCollectionWithSubclass = new ArrayList<HugeEnumWithInnerClass>();
    880         hugeCollectionWithSubclass.add(HugeEnumWithInnerClass.a);
    881         result = hugeSet.containsAll(hugeCollectionWithSubclass);
    882         assertFalse("Should return false", result);
    883 
    884         EnumSet<HugeEnumWithInnerClass> hugeSetWithSubclass = EnumSet
    885                 .noneOf(HugeEnumWithInnerClass.class);
    886         hugeSetWithSubclass.add(HugeEnumWithInnerClass.a);
    887         result = hugeSet.containsAll(hugeSetWithSubclass);
    888         assertFalse("Should return false", result);
    889     }
    890 
    891     /**
    892      * java.util.EnumSet#copyOf(java.util.Collection)
    893      */
    894     @SuppressWarnings("unchecked")
    895     public void test_CopyOf_LCollection() {
    896         try {
    897             EnumSet.copyOf((Collection) null);
    898             fail("Should throw NullPointerException");
    899         } catch (NullPointerException npe) {
    900             // expected
    901         }
    902 
    903         Collection collection = new ArrayList();
    904         try {
    905             EnumSet.copyOf(collection);
    906             fail("Should throw IllegalArgumentException");
    907         } catch (IllegalArgumentException e) {
    908             // expected
    909         }
    910 
    911         collection.add(new Object());
    912         try {
    913             EnumSet.copyOf(collection);
    914             fail("Should throw ClassCastException");
    915         } catch (ClassCastException e) {
    916             // expected
    917         }
    918 
    919         Collection<EnumFoo> enumCollection = new ArrayList<EnumFoo>();
    920         enumCollection.add(EnumFoo.b);
    921 
    922         EnumSet<EnumFoo> copyOfEnumCollection = EnumSet.copyOf(enumCollection);
    923         assertEquals("Size of copyOfEnumCollection should be 1:",
    924                 1, copyOfEnumCollection.size());
    925         assertTrue("copyOfEnumCollection should contain EnumFoo.b:",
    926                 copyOfEnumCollection.contains(EnumFoo.b));
    927 
    928         enumCollection.add(null);
    929         assertEquals("Size of enumCollection should be 2:",
    930                 2, enumCollection.size());
    931 
    932         try {
    933             copyOfEnumCollection = EnumSet.copyOf(enumCollection);
    934             fail("Should throw NullPointerException");
    935         } catch (NullPointerException npe) {
    936             // expected
    937         }
    938 
    939         Collection rawEnumCollection = new ArrayList();
    940         rawEnumCollection.add(EnumFoo.a);
    941         rawEnumCollection.add(EnumWithInnerClass.a);
    942         try {
    943             EnumSet.copyOf(rawEnumCollection);
    944             fail("Should throw ClassCastException");
    945         } catch(ClassCastException e) {
    946             // expected
    947         }
    948 
    949         // test enum type with more than 64 elements
    950         Collection<HugeEnum> hugeEnumCollection = new ArrayList<HugeEnum>();
    951         hugeEnumCollection.add(HugeEnum.b);
    952 
    953         EnumSet<HugeEnum> copyOfHugeEnumCollection = EnumSet.copyOf(hugeEnumCollection);
    954         assertEquals(1, copyOfHugeEnumCollection.size());
    955         assertTrue(copyOfHugeEnumCollection.contains(HugeEnum.b));
    956 
    957         hugeEnumCollection.add(null);
    958         assertEquals(2, hugeEnumCollection.size());
    959 
    960         try {
    961             copyOfHugeEnumCollection = EnumSet.copyOf(hugeEnumCollection);
    962             fail("Should throw NullPointerException");
    963         } catch (NullPointerException npe) {
    964             // expected
    965         }
    966 
    967         rawEnumCollection = new ArrayList();
    968         rawEnumCollection.add(HugeEnum.a);
    969         rawEnumCollection.add(HugeEnumWithInnerClass.a);
    970         try {
    971             EnumSet.copyOf(rawEnumCollection);
    972             fail("Should throw ClassCastException");
    973         } catch(ClassCastException e) {
    974             // expected
    975         }
    976     }
    977 
    978     /**
    979      * java.util.EnumSet#copyOf(java.util.EnumSet)
    980      */
    981     @SuppressWarnings("unchecked")
    982     public void test_CopyOf_LEnumSet() {
    983         EnumSet<EnumWithInnerClass> enumSet = EnumSet
    984                 .noneOf(EnumWithInnerClass.class);
    985         enumSet.add(EnumWithInnerClass.a);
    986         enumSet.add(EnumWithInnerClass.f);
    987         EnumSet<EnumWithInnerClass> copyOfE = EnumSet.copyOf(enumSet);
    988         assertEquals("Size of enumSet and copyOfE should be equal",
    989                 enumSet.size(), copyOfE.size());
    990 
    991         assertTrue("EnumWithSubclass.a should be contained in copyOfE",
    992                 copyOfE.contains(EnumWithInnerClass.a));
    993         assertTrue("EnumWithSubclass.f should be contained in copyOfE",
    994                 copyOfE.contains(EnumWithInnerClass.f));
    995 
    996         Object[] enumValue = copyOfE.toArray();
    997         assertSame("enumValue[0] should be identical with EnumWithSubclass.a",
    998                 enumValue[0], EnumWithInnerClass.a);
    999         assertSame("enumValue[1] should be identical with EnumWithSubclass.f",
   1000                 enumValue[1], EnumWithInnerClass.f);
   1001 
   1002         try {
   1003             EnumSet.copyOf((EnumSet) null);
   1004             fail("Should throw NullPointerException");
   1005         } catch (NullPointerException npe) {
   1006             // expected
   1007         }
   1008 
   1009         // test enum type with more than 64 elements
   1010         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet
   1011             .noneOf(HugeEnumWithInnerClass.class);
   1012         hugeEnumSet.add(HugeEnumWithInnerClass.a);
   1013         hugeEnumSet.add(HugeEnumWithInnerClass.f);
   1014         EnumSet<HugeEnumWithInnerClass> copyOfHugeEnum = EnumSet.copyOf(hugeEnumSet);
   1015         assertEquals(enumSet.size(), copyOfE.size());
   1016 
   1017         assertTrue(copyOfHugeEnum.contains(HugeEnumWithInnerClass.a));
   1018         assertTrue(copyOfHugeEnum.contains(HugeEnumWithInnerClass.f));
   1019 
   1020         Object[] hugeEnumValue = copyOfHugeEnum.toArray();
   1021         assertSame(hugeEnumValue[0], HugeEnumWithInnerClass.a);
   1022         assertSame(hugeEnumValue[1], HugeEnumWithInnerClass.f);
   1023     }
   1024 
   1025     /**
   1026      * java.util.EnumSet#removeAll(Collection)
   1027      */
   1028     @SuppressWarnings("unchecked")
   1029     public void test_removeAll_LCollection() {
   1030         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
   1031         try {
   1032             set.removeAll(null);
   1033             fail("Should throw NullPointerException");
   1034         } catch (NullPointerException e) {
   1035             // expected
   1036         }
   1037 
   1038         set = EnumSet.allOf(EnumFoo.class);
   1039         assertEquals("Size of set should be 64:", 64, set.size());
   1040 
   1041         try {
   1042             set.removeAll(null);
   1043             fail("Should throw NullPointerException");
   1044         } catch (NullPointerException e) {
   1045             // expected
   1046         }
   1047 
   1048         Collection<EnumFoo> collection = new ArrayList<EnumFoo>();
   1049         collection.add(EnumFoo.a);
   1050 
   1051         boolean result = set.removeAll(collection);
   1052         assertTrue("Should return true", result);
   1053         assertEquals("Size of set should be 63", 63, set.size());
   1054 
   1055         collection = new ArrayList();
   1056         result = set.removeAll(collection);
   1057         assertFalse("Should return false", result);
   1058 
   1059         Set<EmptyEnum> emptySet = EnumSet.noneOf(EmptyEnum.class);
   1060         result = set.removeAll(emptySet);
   1061         assertFalse("Should return false", result);
   1062 
   1063         EnumSet<EnumFoo> emptyFooSet = EnumSet.noneOf(EnumFoo.class);
   1064         result = set.removeAll(emptyFooSet);
   1065         assertFalse("Should return false", result);
   1066 
   1067         emptyFooSet.add(EnumFoo.a);
   1068         result = set.removeAll(emptyFooSet);
   1069         assertFalse("Should return false", result);
   1070 
   1071         Set<EnumWithInnerClass> setWithSubclass = EnumSet
   1072                 .noneOf(EnumWithInnerClass.class);
   1073         result = set.removeAll(setWithSubclass);
   1074         assertFalse("Should return false", result);
   1075 
   1076         setWithSubclass.add(EnumWithInnerClass.a);
   1077         result = set.removeAll(setWithSubclass);
   1078         assertFalse("Should return false", result);
   1079 
   1080         Set<EnumFoo> anotherSet = EnumSet.noneOf(EnumFoo.class);
   1081         anotherSet.add(EnumFoo.a);
   1082 
   1083         set = EnumSet.allOf(EnumFoo.class);
   1084         result = set.removeAll(anotherSet);
   1085         assertTrue("Should return true", result);
   1086         assertEquals("Size of set should be 63:", 63, set.size());
   1087 
   1088         Set<EnumWithInnerClass> setWithInnerClass = EnumSet
   1089                 .noneOf(EnumWithInnerClass.class);
   1090         setWithInnerClass.add(EnumWithInnerClass.a);
   1091         setWithInnerClass.add(EnumWithInnerClass.b);
   1092 
   1093         Set<EnumWithInnerClass> anotherSetWithInnerClass = EnumSet
   1094                 .noneOf(EnumWithInnerClass.class);
   1095         anotherSetWithInnerClass.add(EnumWithInnerClass.c);
   1096         anotherSetWithInnerClass.add(EnumWithInnerClass.d);
   1097         result = anotherSetWithInnerClass.removeAll(setWithInnerClass);
   1098         assertFalse("Should return false", result);
   1099 
   1100         anotherSetWithInnerClass.add(EnumWithInnerClass.a);
   1101         result = anotherSetWithInnerClass.removeAll(setWithInnerClass);
   1102         assertTrue("Should return true", result);
   1103         assertEquals("Size of anotherSetWithInnerClass should remain 2",
   1104                 2, anotherSetWithInnerClass.size());
   1105 
   1106         anotherSetWithInnerClass.remove(EnumWithInnerClass.c);
   1107         anotherSetWithInnerClass.remove(EnumWithInnerClass.d);
   1108         result = anotherSetWithInnerClass.remove(setWithInnerClass);
   1109         assertFalse("Should return false", result);
   1110 
   1111         Set rawSet = EnumSet.allOf(EnumWithAllInnerClass.class);
   1112         result = rawSet.removeAll(EnumSet.allOf(EnumFoo.class));
   1113         assertFalse("Should return false", result);
   1114 
   1115         setWithInnerClass = EnumSet.allOf(EnumWithInnerClass.class);
   1116         anotherSetWithInnerClass = EnumSet.allOf(EnumWithInnerClass.class);
   1117         setWithInnerClass.remove(EnumWithInnerClass.a);
   1118         anotherSetWithInnerClass.remove(EnumWithInnerClass.f);
   1119         result = setWithInnerClass.removeAll(anotherSetWithInnerClass);
   1120         assertTrue("Should return true", result);
   1121         assertEquals("Size of setWithInnerClass should be 1", 1, setWithInnerClass.size());
   1122 
   1123         result = setWithInnerClass.contains(EnumWithInnerClass.f);
   1124         assertTrue("Should return true", result);
   1125 
   1126         // test enum type with more than 64 elements
   1127         Set<HugeEnum> hugeSet = EnumSet.allOf(HugeEnum.class);
   1128 
   1129         Collection<HugeEnum> hugeCollection = new ArrayList<HugeEnum>();
   1130         hugeCollection.add(HugeEnum.a);
   1131 
   1132         result = hugeSet.removeAll(hugeCollection);
   1133         assertTrue(result);
   1134         assertEquals(64, hugeSet.size());
   1135 
   1136         collection = new ArrayList();
   1137         result = hugeSet.removeAll(collection);
   1138         assertFalse(result);
   1139 
   1140         Set<HugeEnum> emptyHugeSet = EnumSet.noneOf(HugeEnum.class);
   1141         result = hugeSet.removeAll(emptyHugeSet);
   1142         assertFalse(result);
   1143 
   1144         Set<HugeEnumWithInnerClass> hugeSetWithSubclass = EnumSet
   1145                 .noneOf(HugeEnumWithInnerClass.class);
   1146         result = hugeSet.removeAll(hugeSetWithSubclass);
   1147         assertFalse(result);
   1148 
   1149         hugeSetWithSubclass.add(HugeEnumWithInnerClass.a);
   1150         result = hugeSet.removeAll(hugeSetWithSubclass);
   1151         assertFalse(result);
   1152 
   1153         Set<HugeEnum> anotherHugeSet = EnumSet.noneOf(HugeEnum.class);
   1154         anotherHugeSet.add(HugeEnum.a);
   1155 
   1156         hugeSet = EnumSet.allOf(HugeEnum.class);
   1157         result = hugeSet.removeAll(anotherHugeSet);
   1158         assertTrue(result);
   1159         assertEquals(63, set.size());
   1160 
   1161         Set<HugeEnumWithInnerClass> hugeSetWithInnerClass = EnumSet
   1162                 .noneOf(HugeEnumWithInnerClass.class);
   1163         hugeSetWithInnerClass.add(HugeEnumWithInnerClass.a);
   1164         hugeSetWithInnerClass.add(HugeEnumWithInnerClass.b);
   1165 
   1166         Set<HugeEnumWithInnerClass> anotherHugeSetWithInnerClass = EnumSet
   1167                 .noneOf(HugeEnumWithInnerClass.class);
   1168         anotherHugeSetWithInnerClass.add(HugeEnumWithInnerClass.c);
   1169         anotherHugeSetWithInnerClass.add(HugeEnumWithInnerClass.d);
   1170         result = anotherHugeSetWithInnerClass.removeAll(setWithInnerClass);
   1171         assertFalse("Should return false", result);
   1172 
   1173         anotherHugeSetWithInnerClass.add(HugeEnumWithInnerClass.a);
   1174         result = anotherHugeSetWithInnerClass.removeAll(hugeSetWithInnerClass);
   1175         assertTrue(result);
   1176         assertEquals(2, anotherHugeSetWithInnerClass.size());
   1177 
   1178         anotherHugeSetWithInnerClass.remove(HugeEnumWithInnerClass.c);
   1179         anotherHugeSetWithInnerClass.remove(HugeEnumWithInnerClass.d);
   1180         result = anotherHugeSetWithInnerClass.remove(hugeSetWithInnerClass);
   1181         assertFalse(result);
   1182 
   1183         rawSet = EnumSet.allOf(HugeEnumWithInnerClass.class);
   1184         result = rawSet.removeAll(EnumSet.allOf(HugeEnum.class));
   1185         assertFalse(result);
   1186 
   1187         hugeSetWithInnerClass = EnumSet.allOf(HugeEnumWithInnerClass.class);
   1188         anotherHugeSetWithInnerClass = EnumSet.allOf(HugeEnumWithInnerClass.class);
   1189         hugeSetWithInnerClass.remove(HugeEnumWithInnerClass.a);
   1190         anotherHugeSetWithInnerClass.remove(HugeEnumWithInnerClass.f);
   1191         result = hugeSetWithInnerClass.removeAll(anotherHugeSetWithInnerClass);
   1192         assertTrue(result);
   1193         assertEquals(1, hugeSetWithInnerClass.size());
   1194 
   1195         result = hugeSetWithInnerClass.contains(HugeEnumWithInnerClass.f);
   1196         assertTrue(result);
   1197     }
   1198 
   1199     /**
   1200      * java.util.EnumSet#retainAll(Collection)
   1201      */
   1202     @SuppressWarnings("unchecked")
   1203     public void test_retainAll_LCollection() {
   1204         Set<EnumFoo> set = EnumSet.allOf(EnumFoo.class);
   1205 
   1206         try {
   1207             set.retainAll(null);
   1208             fail("Should throw NullPointerException");
   1209         } catch (NullPointerException e) {
   1210             // expected
   1211         }
   1212 
   1213         set.clear();
   1214         boolean result = set.retainAll(null);
   1215         assertFalse("Should return false", result);
   1216 
   1217         Collection rawCollection = new ArrayList();
   1218         result = set.retainAll(rawCollection);
   1219         assertFalse("Should return false", result);
   1220 
   1221         rawCollection.add(EnumFoo.a);
   1222         result = set.retainAll(rawCollection);
   1223         assertFalse("Should return false", result);
   1224 
   1225         rawCollection.add(EnumWithInnerClass.a);
   1226         result = set.retainAll(rawCollection);
   1227         assertFalse("Should return false", result);
   1228         assertEquals("Size of set should be 0:", 0, set.size());
   1229 
   1230         rawCollection.remove(EnumFoo.a);
   1231         result = set.retainAll(rawCollection);
   1232         assertFalse("Should return false", result);
   1233 
   1234         Set<EnumFoo> anotherSet = EnumSet.allOf(EnumFoo.class);
   1235         result = set.retainAll(anotherSet);
   1236         assertFalse("Should return false", result);
   1237         assertEquals("Size of set should be 0", 0, set.size());
   1238 
   1239         Set<EnumWithInnerClass> setWithInnerClass = EnumSet
   1240                 .allOf(EnumWithInnerClass.class);
   1241         result = set.retainAll(setWithInnerClass);
   1242         assertFalse("Should return false", result);
   1243         assertEquals("Size of set should be 0", 0, set.size());
   1244 
   1245         setWithInnerClass = EnumSet.noneOf(EnumWithInnerClass.class);
   1246         result = set.retainAll(setWithInnerClass);
   1247         assertFalse("Should return false", result);
   1248 
   1249         Set<EmptyEnum> emptySet = EnumSet.allOf(EmptyEnum.class);
   1250         result = set.retainAll(emptySet);
   1251         assertFalse("Should return false", result);
   1252 
   1253         Set<EnumWithAllInnerClass> setWithAllInnerClass = EnumSet
   1254                 .allOf(EnumWithAllInnerClass.class);
   1255         result = set.retainAll(setWithAllInnerClass);
   1256         assertFalse("Should return false", result);
   1257 
   1258         set.add(EnumFoo.a);
   1259         result = set.retainAll(setWithInnerClass);
   1260         assertTrue("Should return true", result);
   1261         assertEquals("Size of set should be 0", 0, set.size());
   1262 
   1263         setWithInnerClass = EnumSet.allOf(EnumWithInnerClass.class);
   1264         setWithInnerClass.remove(EnumWithInnerClass.f);
   1265         Set<EnumWithInnerClass> anotherSetWithInnerClass = EnumSet
   1266                 .noneOf(EnumWithInnerClass.class);
   1267         anotherSetWithInnerClass.add(EnumWithInnerClass.e);
   1268         anotherSetWithInnerClass.add(EnumWithInnerClass.f);
   1269 
   1270         result = setWithInnerClass.retainAll(anotherSetWithInnerClass);
   1271         assertTrue("Should return true", result);
   1272         result = setWithInnerClass.contains(EnumWithInnerClass.e);
   1273         assertTrue("Should contain EnumWithInnerClass.e", result);
   1274         result = setWithInnerClass.contains(EnumWithInnerClass.b);
   1275         assertFalse("Should not contain EnumWithInnerClass.b", result);
   1276         assertEquals("Size of set should be 1:", 1, setWithInnerClass.size());
   1277 
   1278         anotherSetWithInnerClass = EnumSet.allOf(EnumWithInnerClass.class);
   1279         result = setWithInnerClass.retainAll(anotherSetWithInnerClass);
   1280 
   1281         assertFalse("Return value should be false", result);
   1282 
   1283         rawCollection = new ArrayList();
   1284         rawCollection.add(EnumWithInnerClass.e);
   1285         rawCollection.add(EnumWithInnerClass.f);
   1286         result = setWithInnerClass.retainAll(rawCollection);
   1287         assertFalse("Should return false", result);
   1288 
   1289         set = EnumSet.allOf(EnumFoo.class);
   1290         set.remove(EnumFoo.a);
   1291         anotherSet = EnumSet.noneOf(EnumFoo.class);
   1292         anotherSet.add(EnumFoo.a);
   1293         result = set.retainAll(anotherSet);
   1294         assertTrue("Should return true", result);
   1295         assertEquals("size should be 0", 0, set.size());
   1296 
   1297         // test enum type with more than 64 elements
   1298         Set<HugeEnum> hugeSet = EnumSet.allOf(HugeEnum.class);
   1299 
   1300         try {
   1301             hugeSet.retainAll(null);
   1302             fail("Should throw NullPointerException");
   1303         } catch (NullPointerException e) {
   1304             // expected
   1305         }
   1306 
   1307         hugeSet.clear();
   1308         result = hugeSet.retainAll(null);
   1309         assertFalse(result);
   1310 
   1311         rawCollection = new ArrayList();
   1312         result = hugeSet.retainAll(rawCollection);
   1313         assertFalse(result);
   1314 
   1315         rawCollection.add(HugeEnum.a);
   1316         result = hugeSet.retainAll(rawCollection);
   1317         assertFalse(result);
   1318 
   1319         rawCollection.add(HugeEnumWithInnerClass.a);
   1320         result = hugeSet.retainAll(rawCollection);
   1321         assertFalse(result);
   1322         assertEquals(0, set.size());
   1323 
   1324         rawCollection.remove(HugeEnum.a);
   1325         result = set.retainAll(rawCollection);
   1326         assertFalse(result);
   1327 
   1328         Set<HugeEnum> anotherHugeSet = EnumSet.allOf(HugeEnum.class);
   1329         result = hugeSet.retainAll(anotherHugeSet);
   1330         assertFalse(result);
   1331         assertEquals(0, hugeSet.size());
   1332 
   1333         Set<HugeEnumWithInnerClass> hugeSetWithInnerClass = EnumSet
   1334                 .allOf(HugeEnumWithInnerClass.class);
   1335         result = hugeSet.retainAll(hugeSetWithInnerClass);
   1336         assertFalse(result);
   1337         assertEquals(0, hugeSet.size());
   1338 
   1339         hugeSetWithInnerClass = EnumSet.noneOf(HugeEnumWithInnerClass.class);
   1340         result = hugeSet.retainAll(hugeSetWithInnerClass);
   1341         assertFalse(result);
   1342 
   1343         Set<HugeEnumWithInnerClass> hugeSetWithAllInnerClass = EnumSet
   1344                 .allOf(HugeEnumWithInnerClass.class);
   1345         result = hugeSet.retainAll(hugeSetWithAllInnerClass);
   1346         assertFalse(result);
   1347 
   1348         hugeSet.add(HugeEnum.a);
   1349         result = hugeSet.retainAll(hugeSetWithInnerClass);
   1350         assertTrue(result);
   1351         assertEquals(0, hugeSet.size());
   1352 
   1353         hugeSetWithInnerClass = EnumSet.allOf(HugeEnumWithInnerClass.class);
   1354         hugeSetWithInnerClass.remove(HugeEnumWithInnerClass.f);
   1355         Set<HugeEnumWithInnerClass> anotherHugeSetWithInnerClass = EnumSet
   1356                 .noneOf(HugeEnumWithInnerClass.class);
   1357         anotherHugeSetWithInnerClass.add(HugeEnumWithInnerClass.e);
   1358         anotherHugeSetWithInnerClass.add(HugeEnumWithInnerClass.f);
   1359 
   1360         result = hugeSetWithInnerClass.retainAll(anotherHugeSetWithInnerClass);
   1361         assertTrue(result);
   1362         result = hugeSetWithInnerClass.contains(HugeEnumWithInnerClass.e);
   1363         assertTrue("Should contain HugeEnumWithInnerClass.e", result);
   1364         result = hugeSetWithInnerClass.contains(HugeEnumWithInnerClass.b);
   1365         assertFalse("Should not contain HugeEnumWithInnerClass.b", result);
   1366         assertEquals("Size of hugeSet should be 1:", 1, hugeSetWithInnerClass.size());
   1367 
   1368         anotherHugeSetWithInnerClass = EnumSet.allOf(HugeEnumWithInnerClass.class);
   1369         result = hugeSetWithInnerClass.retainAll(anotherHugeSetWithInnerClass);
   1370 
   1371         assertFalse("Return value should be false", result);
   1372 
   1373         rawCollection = new ArrayList();
   1374         rawCollection.add(HugeEnumWithInnerClass.e);
   1375         rawCollection.add(HugeEnumWithInnerClass.f);
   1376         result = hugeSetWithInnerClass.retainAll(rawCollection);
   1377         assertFalse(result);
   1378 
   1379         hugeSet = EnumSet.allOf(HugeEnum.class);
   1380         hugeSet.remove(HugeEnum.a);
   1381         anotherHugeSet = EnumSet.noneOf(HugeEnum.class);
   1382         anotherHugeSet.add(HugeEnum.a);
   1383         result = hugeSet.retainAll(anotherHugeSet);
   1384         assertTrue(result);
   1385         assertEquals(0, hugeSet.size());
   1386     }
   1387 
   1388     /**
   1389      * java.util.EnumSet#iterator()
   1390      */
   1391     public void test_iterator() {
   1392         Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
   1393         set.add(EnumFoo.a);
   1394         set.add(EnumFoo.b);
   1395 
   1396         Iterator<EnumFoo> iterator = set.iterator();
   1397         Iterator<EnumFoo> anotherIterator = set.iterator();
   1398         assertNotSame("Should not be same", iterator, anotherIterator);
   1399         try {
   1400             iterator.remove();
   1401             fail("Should throw IllegalStateException");
   1402         } catch (IllegalStateException e) {
   1403             // expectedd
   1404         }
   1405 
   1406         assertTrue("Should has next element:", iterator.hasNext());
   1407         assertSame("Should be identical", EnumFoo.a, iterator.next());
   1408         iterator.remove();
   1409         assertTrue("Should has next element:", iterator.hasNext());
   1410         assertSame("Should be identical", EnumFoo.b, iterator.next());
   1411         assertFalse("Should not has next element:", iterator.hasNext());
   1412         assertFalse("Should not has next element:", iterator.hasNext());
   1413 
   1414         assertEquals("Size should be 1:", 1, set.size());
   1415 
   1416         try {
   1417             iterator.next();
   1418             fail("Should throw NoSuchElementException");
   1419         } catch (NoSuchElementException e) {
   1420             // expected
   1421         }
   1422         set = EnumSet.noneOf(EnumFoo.class);
   1423         set.add(EnumFoo.a);
   1424         iterator = set.iterator();
   1425         assertEquals("Should be equal", EnumFoo.a, iterator.next());
   1426         iterator.remove();
   1427         try {
   1428             iterator.remove();
   1429             fail("Should throw IllegalStateException");
   1430         } catch(IllegalStateException e) {
   1431             // expected
   1432         }
   1433 
   1434         Set<EmptyEnum> emptySet = EnumSet.allOf(EmptyEnum.class);
   1435         Iterator<EmptyEnum> emptyIterator = emptySet.iterator();
   1436         try {
   1437             emptyIterator.next();
   1438             fail("Should throw NoSuchElementException");
   1439         } catch (NoSuchElementException e) {
   1440             // expected
   1441         }
   1442 
   1443         Set<EnumWithInnerClass> setWithSubclass = EnumSet
   1444                 .allOf(EnumWithInnerClass.class);
   1445         setWithSubclass.remove(EnumWithInnerClass.e);
   1446         Iterator<EnumWithInnerClass> iteratorWithSubclass = setWithSubclass
   1447                 .iterator();
   1448         assertSame("Should be same", EnumWithInnerClass.a, iteratorWithSubclass.next());
   1449 
   1450         assertTrue("Should return true", iteratorWithSubclass.hasNext());
   1451         assertSame("Should be same", EnumWithInnerClass.b, iteratorWithSubclass.next());
   1452 
   1453         setWithSubclass.remove(EnumWithInnerClass.c);
   1454         assertTrue("Should return true", iteratorWithSubclass.hasNext());
   1455         assertSame("Should be same", EnumWithInnerClass.c, iteratorWithSubclass.next());
   1456 
   1457         assertTrue("Should return true", iteratorWithSubclass.hasNext());
   1458         assertSame("Should be same", EnumWithInnerClass.d, iteratorWithSubclass.next());
   1459 
   1460         setWithSubclass.add(EnumWithInnerClass.e);
   1461         assertTrue("Should return true", iteratorWithSubclass.hasNext());
   1462         assertSame("Should be same", EnumWithInnerClass.f, iteratorWithSubclass.next());
   1463 
   1464         set = EnumSet.noneOf(EnumFoo.class);
   1465         iterator = set.iterator();
   1466         try {
   1467             iterator.next();
   1468             fail("Should throw NoSuchElementException");
   1469         } catch (NoSuchElementException e) {
   1470             // expected
   1471         }
   1472 
   1473         set.add(EnumFoo.a);
   1474         iterator = set.iterator();
   1475         assertEquals("Should return EnumFoo.a", EnumFoo.a, iterator.next());
   1476         assertEquals("Size of set should be 1", 1, set.size());
   1477         iterator.remove();
   1478         assertEquals("Size of set should be 0", 0, set.size());
   1479         assertFalse("Should return false", set.contains(EnumFoo.a));
   1480 
   1481         set.add(EnumFoo.a);
   1482         set.add(EnumFoo.b);
   1483         iterator = set.iterator();
   1484         assertEquals("Should be equals", EnumFoo.a, iterator.next());
   1485         iterator.remove();
   1486         try {
   1487             iterator.remove();
   1488             fail("Should throw IllegalStateException");
   1489         } catch(IllegalStateException e) {
   1490             // expected
   1491         }
   1492 
   1493         assertTrue("Should have next element", iterator.hasNext());
   1494         try {
   1495             iterator.remove();
   1496             fail("Should throw IllegalStateException");
   1497         } catch (IllegalStateException e) {
   1498             // expected
   1499         }
   1500         assertEquals("Size of set should be 1", 1, set.size());
   1501         assertTrue("Should have next element", iterator.hasNext());
   1502         assertEquals("Should return EnumFoo.b", EnumFoo.b, iterator.next());
   1503         set.remove(EnumFoo.b);
   1504         assertEquals("Size of set should be 0", 0, set.size());
   1505         iterator.remove();
   1506         assertFalse("Should return false", set.contains(EnumFoo.a));
   1507 
   1508         // RI's bug, EnumFoo.b should not exist at the moment.
   1509         if (!disableRIBugs) {
   1510             assertFalse("Should return false", set.contains(EnumFoo.b));
   1511         }
   1512 
   1513         // test enum type with more than 64 elements
   1514         Set<HugeEnum> hugeSet = EnumSet.noneOf(HugeEnum.class);
   1515         hugeSet.add(HugeEnum.a);
   1516         hugeSet.add(HugeEnum.b);
   1517 
   1518         Iterator<HugeEnum> hIterator = hugeSet.iterator();
   1519         Iterator<HugeEnum> anotherHugeIterator = hugeSet.iterator();
   1520         assertNotSame(hIterator, anotherHugeIterator);
   1521         try {
   1522             hIterator.remove();
   1523             fail("Should throw IllegalStateException");
   1524         } catch (IllegalStateException e) {
   1525             // expectedd
   1526         }
   1527 
   1528         assertTrue(hIterator.hasNext());
   1529         assertSame(HugeEnum.a, hIterator.next());
   1530         hIterator.remove();
   1531         assertTrue(hIterator.hasNext());
   1532         assertSame(HugeEnum.b, hIterator.next());
   1533         assertFalse(hIterator.hasNext());
   1534         assertFalse(hIterator.hasNext());
   1535 
   1536         assertEquals(1, hugeSet.size());
   1537 
   1538         try {
   1539             hIterator.next();
   1540             fail("Should throw NoSuchElementException");
   1541         } catch (NoSuchElementException e) {
   1542             // expected
   1543         }
   1544 
   1545         Set<HugeEnumWithInnerClass> hugeSetWithSubclass = EnumSet
   1546                 .allOf(HugeEnumWithInnerClass.class);
   1547         hugeSetWithSubclass.remove(HugeEnumWithInnerClass.e);
   1548         Iterator<HugeEnumWithInnerClass> hugeIteratorWithSubclass = hugeSetWithSubclass
   1549                 .iterator();
   1550         assertSame(HugeEnumWithInnerClass.a, hugeIteratorWithSubclass.next());
   1551 
   1552         assertTrue(hugeIteratorWithSubclass.hasNext());
   1553         assertSame(HugeEnumWithInnerClass.b, hugeIteratorWithSubclass.next());
   1554 
   1555         setWithSubclass.remove(HugeEnumWithInnerClass.c);
   1556         assertTrue(hugeIteratorWithSubclass.hasNext());
   1557         assertSame(HugeEnumWithInnerClass.c, hugeIteratorWithSubclass.next());
   1558 
   1559         assertTrue(hugeIteratorWithSubclass.hasNext());
   1560         assertSame(HugeEnumWithInnerClass.d, hugeIteratorWithSubclass.next());
   1561 
   1562         hugeSetWithSubclass.add(HugeEnumWithInnerClass.e);
   1563         assertTrue(hugeIteratorWithSubclass.hasNext());
   1564         assertSame(HugeEnumWithInnerClass.f, hugeIteratorWithSubclass.next());
   1565 
   1566         hugeSet = EnumSet.noneOf(HugeEnum.class);
   1567         hIterator = hugeSet.iterator();
   1568         try {
   1569             hIterator.next();
   1570             fail("Should throw NoSuchElementException");
   1571         } catch (NoSuchElementException e) {
   1572             // expected
   1573         }
   1574 
   1575         hugeSet.add(HugeEnum.a);
   1576         hIterator = hugeSet.iterator();
   1577         assertEquals(HugeEnum.a, hIterator.next());
   1578         assertEquals(1, hugeSet.size());
   1579         hIterator.remove();
   1580         assertEquals(0, hugeSet.size());
   1581         assertFalse(hugeSet.contains(HugeEnum.a));
   1582 
   1583         hugeSet.add(HugeEnum.a);
   1584         hugeSet.add(HugeEnum.b);
   1585         hIterator = hugeSet.iterator();
   1586         hIterator.next();
   1587         hIterator.remove();
   1588 
   1589         assertTrue(hIterator.hasNext());
   1590         try {
   1591             hIterator.remove();
   1592             fail("Should throw IllegalStateException");
   1593         } catch (IllegalStateException e) {
   1594             // expected
   1595         }
   1596         assertEquals(1, hugeSet.size());
   1597         assertTrue(hIterator.hasNext());
   1598         assertEquals(HugeEnum.b, hIterator.next());
   1599         hugeSet.remove(HugeEnum.b);
   1600         assertEquals(0, hugeSet.size());
   1601         hIterator.remove();
   1602         assertFalse(hugeSet.contains(HugeEnum.a));
   1603         // RI's bug, EnumFoo.b should not exist at the moment.
   1604         if(!disableRIBugs) {
   1605             assertFalse("Should return false", set.contains(EnumFoo.b));
   1606         }
   1607     }
   1608 
   1609     /**
   1610      * java.util.EnumSet#of(E)
   1611      */
   1612     public void test_Of_E() {
   1613         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a);
   1614         assertEquals("enumSet should have length 1:", 1, enumSet.size());
   1615 
   1616         assertTrue("enumSet should contain EnumWithSubclass.a:",
   1617                 enumSet.contains(EnumWithInnerClass.a));
   1618 
   1619         try {
   1620             EnumSet.of((EnumWithInnerClass) null);
   1621             fail("Should throw NullPointerException");
   1622         } catch (NullPointerException npe) {
   1623             // expected
   1624         }
   1625 
   1626         // test enum type with more than 64 elements
   1627         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a);
   1628         assertEquals(1, hugeEnumSet.size());
   1629 
   1630         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1631     }
   1632 
   1633     /**
   1634      * java.util.EnumSet#of(E, E)
   1635      */
   1636     public void test_Of_EE() {
   1637         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a,
   1638                 EnumWithInnerClass.b);
   1639         assertEquals("enumSet should have length 2:", 2, enumSet.size());
   1640 
   1641         assertTrue("enumSet should contain EnumWithSubclass.a:",
   1642                 enumSet.contains(EnumWithInnerClass.a));
   1643         assertTrue("enumSet should contain EnumWithSubclass.b:",
   1644                 enumSet.contains(EnumWithInnerClass.b));
   1645 
   1646         try {
   1647             EnumSet.of((EnumWithInnerClass) null, EnumWithInnerClass.a);
   1648             fail("Should throw NullPointerException");
   1649         } catch (NullPointerException npe) {
   1650             // expected
   1651         }
   1652 
   1653         try {
   1654             EnumSet.of( EnumWithInnerClass.a, (EnumWithInnerClass) null);
   1655             fail("Should throw NullPointerException");
   1656         } catch (NullPointerException npe) {
   1657             // expected
   1658         }
   1659 
   1660         try {
   1661             EnumSet.of( (EnumWithInnerClass) null, (EnumWithInnerClass) null);
   1662             fail("Should throw NullPointerException");
   1663         } catch (NullPointerException npe) {
   1664             // expected
   1665         }
   1666 
   1667         enumSet = EnumSet.of(EnumWithInnerClass.a, EnumWithInnerClass.a);
   1668         assertEquals("Size of enumSet should be 1",
   1669                 1, enumSet.size());
   1670 
   1671         // test enum type with more than 64 elements
   1672         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a,
   1673                 HugeEnumWithInnerClass.b);
   1674         assertEquals(2, hugeEnumSet.size());
   1675 
   1676         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1677         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.b));
   1678 
   1679         try {
   1680             EnumSet.of((HugeEnumWithInnerClass) null, HugeEnumWithInnerClass.a);
   1681             fail("Should throw NullPointerException");
   1682         } catch (NullPointerException npe) {
   1683             // expected
   1684         }
   1685 
   1686         try {
   1687             EnumSet.of( HugeEnumWithInnerClass.a, (HugeEnumWithInnerClass) null);
   1688             fail("Should throw NullPointerException");
   1689         } catch (NullPointerException npe) {
   1690             // expected
   1691         }
   1692 
   1693         try {
   1694             EnumSet.of( (HugeEnumWithInnerClass) null, (HugeEnumWithInnerClass) null);
   1695             fail("Should throw NullPointerException");
   1696         } catch (NullPointerException npe) {
   1697             // expected
   1698         }
   1699 
   1700         hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a, HugeEnumWithInnerClass.a);
   1701         assertEquals(1, hugeEnumSet.size());
   1702     }
   1703 
   1704     /**
   1705      * java.util.EnumSet#of(E, E, E)
   1706      */
   1707     public void test_Of_EEE() {
   1708         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a,
   1709                 EnumWithInnerClass.b, EnumWithInnerClass.c);
   1710         assertEquals("Size of enumSet should be 3:", 3, enumSet.size());
   1711 
   1712         assertTrue(
   1713                 "enumSet should contain EnumWithSubclass.a:", enumSet.contains(EnumWithInnerClass.a));
   1714         assertTrue("Should return true", enumSet.contains(EnumWithInnerClass.c));
   1715 
   1716         try {
   1717             EnumSet.of((EnumWithInnerClass) null, null, null);
   1718             fail("Should throw NullPointerException");
   1719         } catch (NullPointerException npe) {
   1720             // expected
   1721         }
   1722 
   1723         enumSet = EnumSet.of(EnumWithInnerClass.a, EnumWithInnerClass.b,
   1724                 EnumWithInnerClass.b);
   1725         assertEquals("enumSet should contain 2 elements:", 2, enumSet.size());
   1726 
   1727         // test enum type with more than 64 elements
   1728         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a,
   1729                 HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.c);
   1730         assertEquals(3, hugeEnumSet.size());
   1731 
   1732         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1733         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.c));
   1734 
   1735         try {
   1736             EnumSet.of((HugeEnumWithInnerClass) null, null, null);
   1737             fail("Should throw NullPointerException");
   1738         } catch (NullPointerException npe) {
   1739             // expected
   1740         }
   1741 
   1742         hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a, HugeEnumWithInnerClass.b,
   1743                 HugeEnumWithInnerClass.b);
   1744         assertEquals(2, hugeEnumSet.size());
   1745     }
   1746 
   1747     /**
   1748      * java.util.EnumSet#of(E, E, E, E)
   1749      */
   1750     public void test_Of_EEEE() {
   1751         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a,
   1752                 EnumWithInnerClass.b, EnumWithInnerClass.c,
   1753                 EnumWithInnerClass.d);
   1754         assertEquals("Size of enumSet should be 4", 4, enumSet.size());
   1755 
   1756         assertTrue(
   1757                 "enumSet should contain EnumWithSubclass.a:", enumSet.contains(EnumWithInnerClass.a));
   1758         assertTrue("enumSet should contain EnumWithSubclass.d:", enumSet
   1759                 .contains(EnumWithInnerClass.d));
   1760 
   1761         try {
   1762             EnumSet.of((EnumWithInnerClass) null, null, null, null);
   1763             fail("Should throw NullPointerException");
   1764         } catch (NullPointerException npe) {
   1765             // expected
   1766         }
   1767 
   1768         // test enum type with more than 64 elements
   1769         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a,
   1770                 HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.c,
   1771                 HugeEnumWithInnerClass.d);
   1772         assertEquals(4, hugeEnumSet.size());
   1773 
   1774         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1775         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.d));
   1776 
   1777         try {
   1778             EnumSet.of((HugeEnumWithInnerClass) null, null, null, null);
   1779             fail("Should throw NullPointerException");
   1780         } catch (NullPointerException npe) {
   1781             // expected
   1782         }
   1783     }
   1784 
   1785     /**
   1786      * java.util.EnumSet#of(E, E, E, E, E)
   1787      */
   1788     public void test_Of_EEEEE() {
   1789         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a,
   1790                 EnumWithInnerClass.b, EnumWithInnerClass.c,
   1791                 EnumWithInnerClass.d, EnumWithInnerClass.e);
   1792         assertEquals("Size of enumSet should be 5:", 5, enumSet.size());
   1793 
   1794         assertTrue("Should return true", enumSet.contains(EnumWithInnerClass.a));
   1795         assertTrue("Should return true", enumSet.contains(EnumWithInnerClass.e));
   1796 
   1797         try {
   1798             EnumSet.of((EnumWithInnerClass) null, null, null, null, null);
   1799             fail("Should throw NullPointerException");
   1800         } catch (NullPointerException npe) {
   1801             // expected
   1802         }
   1803 
   1804         // test enum with more than 64 elements
   1805         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a,
   1806                 HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.c,
   1807                 HugeEnumWithInnerClass.d, HugeEnumWithInnerClass.e);
   1808         assertEquals(5, hugeEnumSet.size());
   1809 
   1810         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1811         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.e));
   1812 
   1813         try {
   1814             EnumSet.of((HugeEnumWithInnerClass) null, null, null, null, null);
   1815             fail("Should throw NullPointerException");
   1816         } catch (NullPointerException npe) {
   1817             // expected
   1818         }
   1819     }
   1820 
   1821     /**
   1822      * java.util.EnumSet#of(E, E...)
   1823      */
   1824     public void test_Of_EEArray() {
   1825         EnumWithInnerClass[] enumArray = new EnumWithInnerClass[] {
   1826                 EnumWithInnerClass.b, EnumWithInnerClass.c };
   1827         EnumSet<EnumWithInnerClass> enumSet = EnumSet.of(EnumWithInnerClass.a,
   1828                 enumArray);
   1829         assertEquals("Should be equal", 3, enumSet.size());
   1830 
   1831         assertTrue("Should return true", enumSet.contains(EnumWithInnerClass.a));
   1832         assertTrue("Should return true", enumSet.contains(EnumWithInnerClass.c));
   1833 
   1834         try {
   1835             EnumSet.of(EnumWithInnerClass.a, (EnumWithInnerClass[])null);
   1836             fail("Should throw NullPointerException");
   1837         } catch (NullPointerException npe) {
   1838             // expected
   1839         }
   1840 
   1841         EnumFoo[] foos = {EnumFoo.a, EnumFoo.c, EnumFoo.d};
   1842         EnumSet<EnumFoo> set = EnumSet.of(EnumFoo.c, foos);
   1843         assertEquals("size of set should be 1", 3, set.size());
   1844         assertTrue("Should contain EnumFoo.a", set.contains(EnumFoo.a));
   1845         assertTrue("Should contain EnumFoo.c", set.contains(EnumFoo.c));
   1846         assertTrue("Should contain EnumFoo.d", set.contains(EnumFoo.d));
   1847 
   1848         // test enum type with more than 64 elements
   1849         HugeEnumWithInnerClass[] hugeEnumArray = new HugeEnumWithInnerClass[] {
   1850                 HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.c };
   1851         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.of(HugeEnumWithInnerClass.a,
   1852                 hugeEnumArray);
   1853         assertEquals(3, hugeEnumSet.size());
   1854 
   1855         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.a));
   1856         assertTrue(hugeEnumSet.contains(HugeEnumWithInnerClass.c));
   1857 
   1858         try {
   1859             EnumSet.of(HugeEnumWithInnerClass.a, (HugeEnumWithInnerClass[])null);
   1860             fail("Should throw NullPointerException");
   1861         } catch (NullPointerException npe) {
   1862             // expected
   1863         }
   1864 
   1865         HugeEnumWithInnerClass[] huges = {HugeEnumWithInnerClass.a, HugeEnumWithInnerClass.c, HugeEnumWithInnerClass.d};
   1866         EnumSet<HugeEnumWithInnerClass> hugeSet = EnumSet.of(HugeEnumWithInnerClass.c, huges);
   1867         assertEquals(3, hugeSet.size());
   1868         assertTrue(hugeSet.contains(HugeEnumWithInnerClass.a));
   1869         assertTrue(hugeSet.contains(HugeEnumWithInnerClass.c));
   1870         assertTrue(hugeSet.contains(HugeEnumWithInnerClass.d));
   1871     }
   1872 
   1873     /**
   1874      * java.util.EnumSet#range(E, E)
   1875      */
   1876     public void test_Range_EE() {
   1877         try {
   1878             EnumSet.range(EnumWithInnerClass.c, null);
   1879             fail("Should throw NullPointerException");
   1880         } catch (NullPointerException e) {
   1881             // expected
   1882         }
   1883 
   1884         try {
   1885             EnumSet.range(null, EnumWithInnerClass.c);
   1886             fail("Should throw NullPointerException");
   1887         } catch (NullPointerException e) {
   1888             // expected
   1889         }
   1890 
   1891         try {
   1892             EnumSet.range(null, (EnumWithInnerClass) null);
   1893             fail("Should throw NullPointerException");
   1894         } catch (NullPointerException e) {
   1895             // expected
   1896         }
   1897 
   1898         try {
   1899             EnumSet.range(EnumWithInnerClass.b, EnumWithInnerClass.a);
   1900             fail("Should throw IllegalArgumentException");
   1901         } catch (IllegalArgumentException e) {
   1902             // expected
   1903         }
   1904 
   1905         EnumSet<EnumWithInnerClass> enumSet = EnumSet.range(
   1906                 EnumWithInnerClass.a, EnumWithInnerClass.a);
   1907         assertEquals("Size of enumSet should be 1", 1, enumSet.size());
   1908 
   1909         enumSet = EnumSet.range(
   1910                 EnumWithInnerClass.a, EnumWithInnerClass.c);
   1911         assertEquals("Size of enumSet should be 3", 3, enumSet.size());
   1912 
   1913         // test enum with more than 64 elements
   1914         try {
   1915             EnumSet.range(HugeEnumWithInnerClass.c, null);
   1916             fail("Should throw NullPointerException");
   1917         } catch (NullPointerException e) {
   1918             // expected
   1919         }
   1920 
   1921         try {
   1922             EnumSet.range(null, HugeEnumWithInnerClass.c);
   1923             fail("Should throw NullPointerException");
   1924         } catch (NullPointerException e) {
   1925             // expected
   1926         }
   1927 
   1928         try {
   1929             EnumSet.range(null, (HugeEnumWithInnerClass) null);
   1930             fail("Should throw NullPointerException");
   1931         } catch (NullPointerException e) {
   1932             // expected
   1933         }
   1934 
   1935         try {
   1936             EnumSet.range(HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.a);
   1937             fail("Should throw IllegalArgumentException");
   1938         } catch (IllegalArgumentException e) {
   1939             // expected
   1940         }
   1941 
   1942         EnumSet<HugeEnumWithInnerClass> hugeEnumSet = EnumSet.range(
   1943                 HugeEnumWithInnerClass.a, HugeEnumWithInnerClass.a);
   1944         assertEquals(1, hugeEnumSet.size());
   1945 
   1946         hugeEnumSet = EnumSet.range(
   1947                 HugeEnumWithInnerClass.c, HugeEnumWithInnerClass.aa);
   1948         assertEquals(51, hugeEnumSet.size());
   1949 
   1950         hugeEnumSet = EnumSet.range(
   1951                 HugeEnumWithInnerClass.a, HugeEnumWithInnerClass.mm);
   1952         assertEquals(65, hugeEnumSet.size());
   1953 
   1954         hugeEnumSet = EnumSet.range(
   1955                 HugeEnumWithInnerClass.b, HugeEnumWithInnerClass.mm);
   1956         assertEquals(64, hugeEnumSet.size());
   1957     }
   1958 
   1959     /**
   1960      * java.util.EnumSet#clone()
   1961      */
   1962     public void test_Clone() {
   1963         EnumSet<EnumFoo> enumSet = EnumSet.allOf(EnumFoo.class);
   1964         EnumSet<EnumFoo> clonedEnumSet = enumSet.clone();
   1965         assertEquals(enumSet, clonedEnumSet);
   1966         assertNotSame(enumSet, clonedEnumSet);
   1967         assertTrue(clonedEnumSet.contains(EnumFoo.a));
   1968         assertTrue(clonedEnumSet.contains(EnumFoo.b));
   1969         assertEquals(64, clonedEnumSet.size());
   1970 
   1971         // test enum type with more than 64 elements
   1972         EnumSet<HugeEnum> hugeEnumSet = EnumSet.allOf(HugeEnum.class);
   1973         EnumSet<HugeEnum> hugeClonedEnumSet = hugeEnumSet.clone();
   1974         assertEquals(hugeEnumSet, hugeClonedEnumSet);
   1975         assertNotSame(hugeEnumSet, hugeClonedEnumSet);
   1976         assertTrue(hugeClonedEnumSet.contains(HugeEnum.a));
   1977         assertTrue(hugeClonedEnumSet.contains(HugeEnum.b));
   1978         assertEquals(65, hugeClonedEnumSet.size());
   1979 
   1980         hugeClonedEnumSet.remove(HugeEnum.a);
   1981         assertEquals(64, hugeClonedEnumSet.size());
   1982         assertFalse(hugeClonedEnumSet.contains(HugeEnum.a));
   1983         assertEquals(65, hugeEnumSet.size());
   1984         assertTrue(hugeEnumSet.contains(HugeEnum.a));
   1985     }
   1986 
   1987     /**
   1988      * java.util.EnumSet#Serialization()
   1989      */
   1990     public void test_serialization() throws Exception {
   1991         EnumSet<EnumFoo> set = EnumSet.allOf(EnumFoo.class);
   1992         SerializationTest.verifySelf(set);
   1993     }
   1994 
   1995     /**
   1996      * serialization/deserialization compatibility with RI.
   1997      */
   1998     @SuppressWarnings( { "unchecked", "boxing" })
   1999     public void testSerializationCompatibility() throws Exception {
   2000         EnumSet<EnumFoo> set = EnumSet.allOf(EnumFoo.class);
   2001         SerializationTest.verifyGolden(this, set);
   2002     }
   2003 }
   2004