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