jdk/test/java/util/EnumSet/EnumSetBash.java
changeset 2 90ce3da70b43
child 4347 ab0a9f495844
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    21  * have any questions.
       
    22  */
       
    23 
       
    24 /*
       
    25  * @test
       
    26  * @bug     4904135 4923181
       
    27  * @summary Unit test for EnumSet
       
    28  * @author  Josh Bloch
       
    29  * @author  Neal Gafter
       
    30  * @author  Yo Ma Ma
       
    31  *
       
    32  * @compile -source 1.5 EnumSetBash.java
       
    33  * @run main EnumSetBash
       
    34  */
       
    35 
       
    36 import java.util.*;
       
    37 import java.io.*;
       
    38 
       
    39 public class EnumSetBash {
       
    40     static Random rnd = new Random();
       
    41 
       
    42     public static void main(String[] args) {
       
    43         bash(Silly0.class);
       
    44         bash(Silly1.class);
       
    45         bash(Silly31.class);
       
    46         bash(Silly32.class);
       
    47         bash(Silly33.class);
       
    48         bash(Silly63.class);
       
    49         bash(Silly64.class);
       
    50         bash(Silly65.class);
       
    51         bash(Silly127.class);
       
    52         bash(Silly128.class);
       
    53         bash(Silly129.class);
       
    54         bash(Silly500.class);
       
    55     }
       
    56 
       
    57     static <T extends Enum<T>> void bash(Class<T> enumClass) {
       
    58         Enum[] universe = EnumSet.allOf(enumClass).toArray(new Enum[0]);
       
    59         int numItr = 1000;
       
    60 
       
    61         for (int i=0; i<numItr; i++) {
       
    62             EnumSet<T> s1 = EnumSet.noneOf(enumClass);
       
    63             EnumSet<T> s2 = clone(s1, enumClass);
       
    64             AddRandoms(s1, universe);
       
    65             AddRandoms(s2, universe);
       
    66 
       
    67             EnumSet<T> intersection = clone(s1, enumClass);
       
    68             intersection.retainAll(s2);
       
    69             EnumSet<T> diff1 = clone(s1, enumClass); diff1.removeAll(s2);
       
    70             EnumSet<T> diff2 = clone(s2, enumClass); diff2.removeAll(s1);
       
    71             EnumSet<T> union = clone(s1, enumClass); union.addAll(s2);
       
    72 
       
    73             if (diff1.removeAll(diff2))
       
    74                 fail("Set algebra identity 2 failed");
       
    75             if (diff1.removeAll(intersection))
       
    76                 fail("Set algebra identity 3 failed");
       
    77             if (diff2.removeAll(diff1))
       
    78                 fail("Set algebra identity 4 failed");
       
    79             if (diff2.removeAll(intersection))
       
    80                 fail("Set algebra identity 5 failed");
       
    81             if (intersection.removeAll(diff1))
       
    82                 fail("Set algebra identity 6 failed");
       
    83             if (intersection.removeAll(diff1))
       
    84                 fail("Set algebra identity 7 failed");
       
    85 
       
    86             intersection.addAll(diff1); intersection.addAll(diff2);
       
    87             if (!intersection.equals(union))
       
    88                 fail("Set algebra identity 1 failed");
       
    89 
       
    90             if (new HashSet<T>(union).hashCode() != union.hashCode())
       
    91                 fail("Incorrect hashCode computation.");
       
    92 
       
    93             Iterator e = union.iterator();
       
    94             while (e.hasNext())
       
    95                 if (!intersection.remove(e.next()))
       
    96                     fail("Couldn't remove element from copy.");
       
    97             if (!intersection.isEmpty())
       
    98                 fail("Copy nonempty after deleting all elements.");
       
    99 
       
   100             e = union.iterator();
       
   101             while (e.hasNext()) {
       
   102                 Object o = e.next();
       
   103                 if (!union.contains(o))
       
   104                     fail("Set doesn't contain one of its elements.");
       
   105                 e.remove();
       
   106                 if (union.contains(o))
       
   107                     fail("Set contains element after deletion.");
       
   108             }
       
   109             if (!union.isEmpty())
       
   110                 fail("Set nonempty after deleting all elements.");
       
   111 
       
   112             s1.clear();
       
   113             if (!s1.isEmpty())
       
   114                 fail("Set nonempty after clear.");
       
   115         }
       
   116     }
       
   117 
       
   118     // Done inefficiently so as to exercise various functions
       
   119     static <E extends Enum<E>> EnumSet<E> clone(EnumSet<E> s, Class<E> cl) {
       
   120         EnumSet<E> clone = null;
       
   121         int method = rnd.nextInt(6);
       
   122         switch(method) {
       
   123             case 0:
       
   124                 clone = s.clone();
       
   125                 break;
       
   126             case 1:
       
   127                 clone = EnumSet.noneOf(cl);
       
   128                 Collection arrayList = (Collection)Arrays.asList(s.toArray());
       
   129                 clone.addAll((Collection<E>)arrayList);
       
   130                 break;
       
   131             case 2:
       
   132                 clone = EnumSet.copyOf(s);
       
   133                 break;
       
   134             case 3:
       
   135                 clone = EnumSet.copyOf((Collection<E>)s);
       
   136                 break;
       
   137             case 4:
       
   138                 if (s.isEmpty())
       
   139                     clone = EnumSet.copyOf((Collection<E>)s);
       
   140                 else
       
   141                     clone = EnumSet.copyOf((Collection<E>)(Collection)
       
   142                                            Arrays.asList(s.toArray()));
       
   143                 break;
       
   144             case 5:
       
   145                 clone = (EnumSet<E>) deepCopy(s);
       
   146         }
       
   147         if (!s.equals(clone))
       
   148             fail("Set not equal to copy. " + method);
       
   149         if (!s.containsAll(clone))
       
   150             fail("Set does not contain copy. " + method);
       
   151         if (!clone.containsAll(s))
       
   152             fail("Copy does not contain set. " + method);
       
   153         return clone;
       
   154     }
       
   155 
       
   156     // Utility method to do a deep copy of an object *very slowly* using
       
   157     // serialization/deserialization
       
   158     static <T> T deepCopy(T oldObj) {
       
   159         try {
       
   160             ByteArrayOutputStream bos = new ByteArrayOutputStream();
       
   161             ObjectOutputStream oos = new ObjectOutputStream(bos);
       
   162             oos.writeObject(oldObj);
       
   163             oos.flush();
       
   164             ByteArrayInputStream bin = new ByteArrayInputStream(
       
   165                 bos.toByteArray());
       
   166             ObjectInputStream ois = new ObjectInputStream(bin);
       
   167             return (T) ois.readObject();
       
   168         } catch(Exception e) {
       
   169             throw new IllegalArgumentException(e.toString());
       
   170         }
       
   171     }
       
   172 
       
   173     static <T extends Enum<T>> void AddRandoms(EnumSet<T> s, Enum[] universe) {
       
   174         for (int i=0; i < universe.length * 2 / 3; i++) {
       
   175             T e = (T) universe[rnd.nextInt(universe.length)];
       
   176 
       
   177             boolean prePresent = s.contains(e);
       
   178             int preSize = s.size();
       
   179             boolean added = s.add(e);
       
   180             if (!s.contains(e))
       
   181                 fail ("Element not present after addition.");
       
   182             if (added == prePresent)
       
   183                 fail ("added == alreadyPresent");
       
   184             int postSize = s.size();
       
   185             if (added && preSize == postSize)
       
   186                 fail ("Add returned true, but size didn't change.");
       
   187             if (!added && preSize != postSize)
       
   188                 fail ("Add returned false, but size changed.");
       
   189         }
       
   190     }
       
   191 
       
   192     static void fail(String s) {
       
   193         throw new RuntimeException(s);
       
   194     }
       
   195 
       
   196     public enum Silly0 { };
       
   197 
       
   198     public enum Silly1 { e1 }
       
   199 
       
   200     public enum Silly31 {
       
   201         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   202         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30
       
   203     }
       
   204 
       
   205     public enum Silly32 {
       
   206         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   207         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31
       
   208     }
       
   209 
       
   210     public enum Silly33 {
       
   211         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   212         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   213         e32
       
   214     }
       
   215 
       
   216     public enum Silly63 {
       
   217         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   218         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   219         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   220         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   221         e62
       
   222     }
       
   223 
       
   224     public enum Silly64 {
       
   225         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   226         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   227         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   228         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   229         e62, e63
       
   230     }
       
   231 
       
   232     public enum Silly65 {
       
   233         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   234         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   235         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   236         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   237         e62, e63, e64
       
   238     }
       
   239 
       
   240     public enum Silly127 {
       
   241         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   242         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   243         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   244         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   245         e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
       
   246         e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
       
   247         e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
       
   248         e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
       
   249         e118, e119, e120, e121, e122, e123, e124, e125, e126
       
   250     }
       
   251 
       
   252     public enum Silly128 {
       
   253         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   254         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   255         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   256         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   257         e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
       
   258         e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
       
   259         e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
       
   260         e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
       
   261         e118, e119, e120, e121, e122, e123, e124, e125, e126, e127
       
   262     }
       
   263 
       
   264     public enum Silly129 {
       
   265         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   266         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   267         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   268         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   269         e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
       
   270         e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
       
   271         e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
       
   272         e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
       
   273         e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128
       
   274     }
       
   275 
       
   276     public enum Silly500 {
       
   277         e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
       
   278         e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
       
   279         e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
       
   280         e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
       
   281         e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
       
   282         e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
       
   283         e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
       
   284         e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
       
   285         e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128, e129,
       
   286         e130, e131, e132, e133, e134, e135, e136, e137, e138, e139, e140, e141,
       
   287         e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153,
       
   288         e154, e155, e156, e157, e158, e159, e160, e161, e162, e163, e164, e165,
       
   289         e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177,
       
   290         e178, e179, e180, e181, e182, e183, e184, e185, e186, e187, e188, e189,
       
   291         e190, e191, e192, e193, e194, e195, e196, e197, e198, e199, e200, e201,
       
   292         e202, e203, e204, e205, e206, e207, e208, e209, e210, e211, e212, e213,
       
   293         e214, e215, e216, e217, e218, e219, e220, e221, e222, e223, e224, e225,
       
   294         e226, e227, e228, e229, e230, e231, e232, e233, e234, e235, e236, e237,
       
   295         e238, e239, e240, e241, e242, e243, e244, e245, e246, e247, e248, e249,
       
   296         e250, e251, e252, e253, e254, e255, e256, e257, e258, e259, e260, e261,
       
   297         e262, e263, e264, e265, e266, e267, e268, e269, e270, e271, e272, e273,
       
   298         e274, e275, e276, e277, e278, e279, e280, e281, e282, e283, e284, e285,
       
   299         e286, e287, e288, e289, e290, e291, e292, e293, e294, e295, e296, e297,
       
   300         e298, e299, e300, e301, e302, e303, e304, e305, e306, e307, e308, e309,
       
   301         e310, e311, e312, e313, e314, e315, e316, e317, e318, e319, e320, e321,
       
   302         e322, e323, e324, e325, e326, e327, e328, e329, e330, e331, e332, e333,
       
   303         e334, e335, e336, e337, e338, e339, e340, e341, e342, e343, e344, e345,
       
   304         e346, e347, e348, e349, e350, e351, e352, e353, e354, e355, e356, e357,
       
   305         e358, e359, e360, e361, e362, e363, e364, e365, e366, e367, e368, e369,
       
   306         e370, e371, e372, e373, e374, e375, e376, e377, e378, e379, e380, e381,
       
   307         e382, e383, e384, e385, e386, e387, e388, e389, e390, e391, e392, e393,
       
   308         e394, e395, e396, e397, e398, e399, e400, e401, e402, e403, e404, e405,
       
   309         e406, e407, e408, e409, e410, e411, e412, e413, e414, e415, e416, e417,
       
   310         e418, e419, e420, e421, e422, e423, e424, e425, e426, e427, e428, e429,
       
   311         e430, e431, e432, e433, e434, e435, e436, e437, e438, e439, e440, e441,
       
   312         e442, e443, e444, e445, e446, e447, e448, e449, e450, e451, e452, e453,
       
   313         e454, e455, e456, e457, e458, e459, e460, e461, e462, e463, e464, e465,
       
   314         e466, e467, e468, e469, e470, e471, e472, e473, e474, e475, e476, e477,
       
   315         e478, e479, e480, e481, e482, e483, e484, e485, e486, e487, e488, e489,
       
   316         e490, e491, e492, e493, e494, e495, e496, e497, e498, e499
       
   317     }
       
   318 
       
   319 }