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 }