ValueOf.java revision 12745:f068a4ffddd2
1/*
2 * Copyright (c) 2004, 2009, 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     4984908 5058132 6653154
27 * @summary Basic test of valueOf(String)
28 * @author  Josh Bloch
29 *
30 * @compile ValueOf.java
31 * @run main ValueOf
32 * @key randomness
33 */
34
35import java.util.*;
36import java.lang.reflect.Method;
37
38public class ValueOf {
39    static Random rnd = new Random();
40
41    public static void main(String[] args) throws Exception {
42        test(Silly0.class);
43        test(Silly1.class);
44        test(Silly31.class);
45        test(Silly32.class);
46        test(Silly33.class);
47        test(Silly63.class);
48        test(Silly64.class);
49        test(Silly65.class);
50        test(Silly127.class);
51        test(Silly128.class);
52        test(Silly129.class);
53        test(Silly500.class);
54        test(Specialized.class);
55
56        testMissingException();
57    }
58
59    static <T extends Enum<T>> void test(Class<T> enumClass) throws Exception {
60        Set<T> s  = EnumSet.allOf(enumClass);
61        test(enumClass, s);
62
63        // Delete half the elements from set at random
64        for (Iterator<T> i = s.iterator(); i.hasNext(); ) {
65            i.next();
66            if (rnd.nextBoolean())
67                i.remove();
68        }
69
70        test(enumClass, s);
71    }
72
73    static <T extends Enum<T>> void test(Class<T> enumClass, Set<T> s)
74        throws Exception
75    {
76        Method valueOf = enumClass.getDeclaredMethod("valueOf", String.class);
77        Set<T> copy  = EnumSet.noneOf(enumClass);
78        for (T e : s)
79            copy.add((T) valueOf.invoke(null, e.name()));
80        if (!copy.equals(s))
81            throw new Exception(copy + " != " + s);
82    }
83
84    static void testMissingException() {
85        try {
86            Enum.valueOf(Specialized.class, "BAZ");
87            throw new RuntimeException("Expected IllegalArgumentException not thrown.");
88        } catch(IllegalArgumentException iae) {
89            String message = iae.getMessage();
90            if (! "No enum constant ValueOf.Specialized.BAZ".equals(message))
91                throw new RuntimeException("Unexpected detail message: ``" + message + "''.");
92        }
93    }
94
95    enum Silly0 { };
96
97    enum Silly1 { e1 }
98
99    enum Silly31 {
100        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
101        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30
102    }
103
104    enum Silly32 {
105        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
106        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31
107    }
108
109    enum Silly33 {
110        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
111        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
112        e32
113    }
114
115    enum Silly63 {
116        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
117        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
118        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
119        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
120        e62
121    }
122
123    enum Silly64 {
124        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
125        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
126        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
127        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
128        e62, e63
129    }
130
131    enum Silly65 {
132        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
133        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
134        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
135        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
136        e62, e63, e64
137    }
138
139    enum Silly127 {
140        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
141        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
142        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
143        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
144        e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
145        e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
146        e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
147        e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
148        e118, e119, e120, e121, e122, e123, e124, e125, e126
149    }
150
151    enum Silly128 {
152        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
153        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
154        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
155        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
156        e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
157        e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
158        e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
159        e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
160        e118, e119, e120, e121, e122, e123, e124, e125, e126, e127
161    }
162
163    enum Silly129 {
164        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
165        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
166        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
167        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
168        e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
169        e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
170        e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
171        e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
172        e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128
173    }
174
175    enum Silly500 {
176        e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16,
177        e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31,
178        e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46,
179        e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61,
180        e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76,
181        e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91,
182        e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105,
183        e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117,
184        e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128, e129,
185        e130, e131, e132, e133, e134, e135, e136, e137, e138, e139, e140, e141,
186        e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153,
187        e154, e155, e156, e157, e158, e159, e160, e161, e162, e163, e164, e165,
188        e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177,
189        e178, e179, e180, e181, e182, e183, e184, e185, e186, e187, e188, e189,
190        e190, e191, e192, e193, e194, e195, e196, e197, e198, e199, e200, e201,
191        e202, e203, e204, e205, e206, e207, e208, e209, e210, e211, e212, e213,
192        e214, e215, e216, e217, e218, e219, e220, e221, e222, e223, e224, e225,
193        e226, e227, e228, e229, e230, e231, e232, e233, e234, e235, e236, e237,
194        e238, e239, e240, e241, e242, e243, e244, e245, e246, e247, e248, e249,
195        e250, e251, e252, e253, e254, e255, e256, e257, e258, e259, e260, e261,
196        e262, e263, e264, e265, e266, e267, e268, e269, e270, e271, e272, e273,
197        e274, e275, e276, e277, e278, e279, e280, e281, e282, e283, e284, e285,
198        e286, e287, e288, e289, e290, e291, e292, e293, e294, e295, e296, e297,
199        e298, e299, e300, e301, e302, e303, e304, e305, e306, e307, e308, e309,
200        e310, e311, e312, e313, e314, e315, e316, e317, e318, e319, e320, e321,
201        e322, e323, e324, e325, e326, e327, e328, e329, e330, e331, e332, e333,
202        e334, e335, e336, e337, e338, e339, e340, e341, e342, e343, e344, e345,
203        e346, e347, e348, e349, e350, e351, e352, e353, e354, e355, e356, e357,
204        e358, e359, e360, e361, e362, e363, e364, e365, e366, e367, e368, e369,
205        e370, e371, e372, e373, e374, e375, e376, e377, e378, e379, e380, e381,
206        e382, e383, e384, e385, e386, e387, e388, e389, e390, e391, e392, e393,
207        e394, e395, e396, e397, e398, e399, e400, e401, e402, e403, e404, e405,
208        e406, e407, e408, e409, e410, e411, e412, e413, e414, e415, e416, e417,
209        e418, e419, e420, e421, e422, e423, e424, e425, e426, e427, e428, e429,
210        e430, e431, e432, e433, e434, e435, e436, e437, e438, e439, e440, e441,
211        e442, e443, e444, e445, e446, e447, e448, e449, e450, e451, e452, e453,
212        e454, e455, e456, e457, e458, e459, e460, e461, e462, e463, e464, e465,
213        e466, e467, e468, e469, e470, e471, e472, e473, e474, e475, e476, e477,
214        e478, e479, e480, e481, e482, e483, e484, e485, e486, e487, e488, e489,
215        e490, e491, e492, e493, e494, e495, e496, e497, e498, e499
216    }
217
218    enum Specialized {
219        FOO {
220            public void foo() {}
221        };
222        public abstract void foo();
223    };
224
225}
226