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