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