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