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