• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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