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 
  35 import java.util.*;
  36 import java.lang.reflect.Method;
  37 
  38 public 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         abstract public void foo();
 223     };
 224 
 225 }