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.Assert;
39 import org.testng.annotations.Test;
40 
41 public class EnumSetBash {
42     static Random rnd = new Random();
43 
44     @Test
testEnumSetBash()45     public void testEnumSetBash() {
46         bash(Silly0.class);
47         bash(Silly1.class);
48         bash(Silly31.class);
49         bash(Silly32.class);
50         bash(Silly33.class);
51         bash(Silly63.class);
52         bash(Silly64.class);
53         bash(Silly65.class);
54         // Android-changed: shard this test.
55         // bash(Silly127.class);
56         // bash(Silly128.class);
57         // bash(Silly129.class);
58         // bash(Silly500.class);
59     }
60 
61     // Android-added: shard the testEnumSetBash test.
62     @Test
testEnumSetBash127()63     public void testEnumSetBash127() {
64         bash(Silly127.class);
65     }
66 
67     @Test
testEnumSetBash128()68     public void testEnumSetBash128() {
69         bash(Silly128.class);
70     }
71 
72     @Test
testEnumSetBash129()73     public void testEnumSetBash129() {
74         bash(Silly129.class);
75     }
76 
77     @Test
testEnumSetBash500()78     public void testEnumSetBash500() {
79         bash(Silly500.class);
80     }
81 
bash(Class<T> enumClass)82     static <T extends Enum<T>> void bash(Class<T> enumClass) {
83         Enum[] universe = EnumSet.allOf(enumClass).toArray(new Enum[0]);
84         int numItr = 1000;
85 
86         for (int i=0; i<numItr; i++) {
87             EnumSet<T> s1 = EnumSet.noneOf(enumClass);
88             EnumSet<T> s2 = clone(s1, enumClass);
89             AddRandoms(s1, universe);
90             AddRandoms(s2, universe);
91 
92             EnumSet<T> intersection = clone(s1, enumClass);
93             intersection.retainAll(s2);
94             EnumSet<T> diff1 = clone(s1, enumClass); diff1.removeAll(s2);
95             EnumSet<T> diff2 = clone(s2, enumClass); diff2.removeAll(s1);
96             EnumSet<T> union = clone(s1, enumClass); union.addAll(s2);
97 
98             Assert.assertFalse(diff1.removeAll(diff2));
99             Assert.assertFalse(diff1.removeAll(intersection));
100             Assert.assertFalse(diff2.removeAll(diff1));
101             Assert.assertFalse(diff2.removeAll(intersection));
102             Assert.assertFalse(intersection.removeAll(diff1));
103             Assert.assertFalse(intersection.removeAll(diff1));
104 
105             intersection.addAll(diff1); intersection.addAll(diff2);
106             Assert.assertTrue(intersection.equals(union));
107 
108             Assert.assertEquals(new HashSet<T>(union).hashCode(), union.hashCode());
109 
110             Iterator e = union.iterator();
111             while (e.hasNext())
112                 Assert.assertTrue(intersection.remove(e.next()));
113             Assert.assertTrue(intersection.isEmpty());
114 
115             e = union.iterator();
116             while (e.hasNext()) {
117                 Object o = e.next();
118                 Assert.assertTrue(union.contains(o));
119                 e.remove();
120                 Assert.assertFalse(union.contains(o));
121             }
122             Assert.assertTrue(union.isEmpty());
123 
124             s1.clear();
125             Assert.assertTrue(s1.isEmpty());
126         }
127     }
128 
129     // Done inefficiently so as to exercise various functions
clone(EnumSet<E> s, Class<E> cl)130     static <E extends Enum<E>> EnumSet<E> clone(EnumSet<E> s, Class<E> cl) {
131         EnumSet<E> clone = null;
132         int method = rnd.nextInt(6);
133         switch(method) {
134             case 0:
135                 clone = s.clone();
136                 break;
137             case 1:
138                 clone = EnumSet.noneOf(cl);
139                 Collection arrayList = (Collection)Arrays.asList(s.toArray());
140                 clone.addAll((Collection<E>)arrayList);
141                 break;
142             case 2:
143                 clone = EnumSet.copyOf(s);
144                 break;
145             case 3:
146                 clone = EnumSet.copyOf((Collection<E>)s);
147                 break;
148             case 4:
149                 if (s.isEmpty())
150                     clone = EnumSet.copyOf((Collection<E>)s);
151                 else
152                     clone = EnumSet.copyOf((Collection<E>)(Collection)
153                             Arrays.asList(s.toArray()));
154                 break;
155             case 5:
156                 clone = (EnumSet<E>) deepCopy(s);
157         }
158         Assert.assertTrue(s.equals(clone));
159         Assert.assertTrue(s.containsAll(clone));
160         Assert.assertTrue(clone.containsAll(s));
161         return clone;
162     }
163 
164     // Utility method to do a deep copy of an object *very slowly* using
165     // serialization/deserialization
deepCopy(T oldObj)166     static <T> T deepCopy(T oldObj) {
167         try {
168             ByteArrayOutputStream bos = new ByteArrayOutputStream();
169             ObjectOutputStream oos = new ObjectOutputStream(bos);
170             oos.writeObject(oldObj);
171             oos.flush();
172             ByteArrayInputStream bin = new ByteArrayInputStream(
173                     bos.toByteArray());
174             ObjectInputStream ois = new ObjectInputStream(bin);
175             return (T) ois.readObject();
176         } catch(Exception e) {
177             throw new IllegalArgumentException(e.toString());
178         }
179     }
180 
AddRandoms(EnumSet<T> s, Enum[] universe)181     static <T extends Enum<T>> void AddRandoms(EnumSet<T> s, Enum[] universe) {
182         for (int i=0; i < universe.length * 2 / 3; i++) {
183             T e = (T) universe[rnd.nextInt(universe.length)];
184 
185             boolean prePresent = s.contains(e);
186             int preSize = s.size();
187             boolean added = s.add(e);
188             Assert.assertTrue(s.contains(e));
189             Assert.assertFalse(added == prePresent);
190             int postSize = s.size();
191             Assert.assertFalse(added && preSize == postSize);
192             Assert.assertFalse(!added && preSize != postSize);
193         }
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 }