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