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 // Android-changed: shard this test. 55 // bash(Silly127.class); 56 // bash(Silly128.class); 57 // bash(Silly129.class); 58 // bash(Silly500.class); 59 } 60 61 // Android-added: shard the testEnumSetBash test. 62 @Test testEnumSetBash127()63 public void testEnumSetBash127() { 64 bash(Silly127.class); 65 } 66 67 @Test testEnumSetBash128()68 public void testEnumSetBash128() { 69 bash(Silly128.class); 70 } 71 72 @Test testEnumSetBash129()73 public void testEnumSetBash129() { 74 bash(Silly129.class); 75 } 76 77 @Test testEnumSetBash500()78 public void testEnumSetBash500() { 79 bash(Silly500.class); 80 } 81 bash(Class<T> enumClass)82 static <T extends Enum<T>> void bash(Class<T> enumClass) { 83 Enum[] universe = EnumSet.allOf(enumClass).toArray(new Enum[0]); 84 int numItr = 1000; 85 86 for (int i=0; i<numItr; i++) { 87 EnumSet<T> s1 = EnumSet.noneOf(enumClass); 88 EnumSet<T> s2 = clone(s1, enumClass); 89 AddRandoms(s1, universe); 90 AddRandoms(s2, universe); 91 92 EnumSet<T> intersection = clone(s1, enumClass); 93 intersection.retainAll(s2); 94 EnumSet<T> diff1 = clone(s1, enumClass); diff1.removeAll(s2); 95 EnumSet<T> diff2 = clone(s2, enumClass); diff2.removeAll(s1); 96 EnumSet<T> union = clone(s1, enumClass); union.addAll(s2); 97 98 Assert.assertFalse(diff1.removeAll(diff2)); 99 Assert.assertFalse(diff1.removeAll(intersection)); 100 Assert.assertFalse(diff2.removeAll(diff1)); 101 Assert.assertFalse(diff2.removeAll(intersection)); 102 Assert.assertFalse(intersection.removeAll(diff1)); 103 Assert.assertFalse(intersection.removeAll(diff1)); 104 105 intersection.addAll(diff1); intersection.addAll(diff2); 106 Assert.assertTrue(intersection.equals(union)); 107 108 Assert.assertEquals(new HashSet<T>(union).hashCode(), union.hashCode()); 109 110 Iterator e = union.iterator(); 111 while (e.hasNext()) 112 Assert.assertTrue(intersection.remove(e.next())); 113 Assert.assertTrue(intersection.isEmpty()); 114 115 e = union.iterator(); 116 while (e.hasNext()) { 117 Object o = e.next(); 118 Assert.assertTrue(union.contains(o)); 119 e.remove(); 120 Assert.assertFalse(union.contains(o)); 121 } 122 Assert.assertTrue(union.isEmpty()); 123 124 s1.clear(); 125 Assert.assertTrue(s1.isEmpty()); 126 } 127 } 128 129 // Done inefficiently so as to exercise various functions clone(EnumSet<E> s, Class<E> cl)130 static <E extends Enum<E>> EnumSet<E> clone(EnumSet<E> s, Class<E> cl) { 131 EnumSet<E> clone = null; 132 int method = rnd.nextInt(6); 133 switch(method) { 134 case 0: 135 clone = s.clone(); 136 break; 137 case 1: 138 clone = EnumSet.noneOf(cl); 139 Collection arrayList = (Collection)Arrays.asList(s.toArray()); 140 clone.addAll((Collection<E>)arrayList); 141 break; 142 case 2: 143 clone = EnumSet.copyOf(s); 144 break; 145 case 3: 146 clone = EnumSet.copyOf((Collection<E>)s); 147 break; 148 case 4: 149 if (s.isEmpty()) 150 clone = EnumSet.copyOf((Collection<E>)s); 151 else 152 clone = EnumSet.copyOf((Collection<E>)(Collection) 153 Arrays.asList(s.toArray())); 154 break; 155 case 5: 156 clone = (EnumSet<E>) deepCopy(s); 157 } 158 Assert.assertTrue(s.equals(clone)); 159 Assert.assertTrue(s.containsAll(clone)); 160 Assert.assertTrue(clone.containsAll(s)); 161 return clone; 162 } 163 164 // Utility method to do a deep copy of an object *very slowly* using 165 // serialization/deserialization deepCopy(T oldObj)166 static <T> T deepCopy(T oldObj) { 167 try { 168 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 169 ObjectOutputStream oos = new ObjectOutputStream(bos); 170 oos.writeObject(oldObj); 171 oos.flush(); 172 ByteArrayInputStream bin = new ByteArrayInputStream( 173 bos.toByteArray()); 174 ObjectInputStream ois = new ObjectInputStream(bin); 175 return (T) ois.readObject(); 176 } catch(Exception e) { 177 throw new IllegalArgumentException(e.toString()); 178 } 179 } 180 AddRandoms(EnumSet<T> s, Enum[] universe)181 static <T extends Enum<T>> void AddRandoms(EnumSet<T> s, Enum[] universe) { 182 for (int i=0; i < universe.length * 2 / 3; i++) { 183 T e = (T) universe[rnd.nextInt(universe.length)]; 184 185 boolean prePresent = s.contains(e); 186 int preSize = s.size(); 187 boolean added = s.add(e); 188 Assert.assertTrue(s.contains(e)); 189 Assert.assertFalse(added == prePresent); 190 int postSize = s.size(); 191 Assert.assertFalse(added && preSize == postSize); 192 Assert.assertFalse(!added && preSize != postSize); 193 } 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 }