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