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