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