EnumMapBash.java revision 2362:00cd9dc3c2b5
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
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}
336