1 /*
   2  * Copyright (c) 2018, 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 8200696
  27  * @summary Initial capacity of Class.enumConstantDirectory is not optimal
  28  * @library /lib/testlibrary
  29  * @modules java.base/java.lang:open
  30  * @build jdk.testlibrary.OptimalCapacity
  31  * @run main ConstantDirectoryOptimalCapacity
  32  */
  33 
  34 import jdk.testlibrary.OptimalCapacity;
  35 
  36 public class ConstantDirectoryOptimalCapacity {
  37 
  38     public static void main(String[] args) throws Throwable {
  39         test(E1.class);
  40         test(E2.class);
  41         test(E3.class);
  42         test(E4.class);
  43         test(E5.class);
  44         test(E6.class);
  45         test(E7.class);
  46         test(E8.class);
  47         test(E9.class);
  48         test(E10.class);
  49         test(E11.class);
  50         test(E12.class);
  51         test(E13.class);
  52         test(E14.class);
  53         test(E15.class);
  54         test(E16.class);
  55         test(E17.class);
  56         test(E18.class);
  57         test(E19.class);
  58         test(E20.class);
  59         test(E21.class);
  60         test(E22.class);
  61         test(E23.class);
  62         test(E24.class);
  63         test(E25.class);
  64         test(E26.class);
  65     }
  66 
  67     private static void test(Class<? extends Enum> e) {
  68         Enum.valueOf(e, "V0"); // trigger init of enumConstantDirectory
  69 
  70         int initialCapacity = (int)(e.getEnumConstants().length / 0.75f + 1.0f);
  71         OptimalCapacity.ofHashMap(e.getClass(), e, "enumConstantDirectory",
  72             initialCapacity);
  73     }
  74 
  75     enum E1 { V0 }
  76     enum E2 { V0, V1 }
  77     enum E3 { V0, V1, V2 }
  78     enum E4 { V0, V1, V2, V3 }
  79     enum E5 { V0, V1, V2, V3, V4 }
  80     enum E6 { V0, V1, V2, V3, V4, V5 }
  81     enum E7 { V0, V1, V2, V3, V4, V5, V6 }
  82     enum E8 { V0, V1, V2, V3, V4, V5, V6, V7 }
  83     enum E9 { V0, V1, V2, V3, V4, V5, V6, V7, V8 }
  84     enum E10 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9 }
  85     enum E11 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10 }
  86     enum E12 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11 }
  87     enum E13 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12 }
  88     enum E14 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13 }
  89     enum E15 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
  90                V14 }
  91     enum E16 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
  92                V14, V15 }
  93     enum E17 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
  94                V14, V15, V16 }
  95     enum E18 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
  96                V14, V15, V16, V17 }
  97     enum E19 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
  98                V14, V15, V16, V17, V18 }
  99     enum E20 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 100                V14, V15, V16, V17, V18, V19 }
 101     enum E21 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 102                V14, V15, V16, V17, V18, V19, V20 }
 103     enum E22 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 104                V14, V15, V16, V17, V18, V19, V20, V21 }
 105     enum E23 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 106                V14, V15, V16, V17, V18, V19, V20, V21, V22 }
 107     enum E24 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 108                V14, V15, V16, V17, V18, V19, V20, V21, V22, V23 }
 109     enum E25 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 110                V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24 }
 111     enum E26 { V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
 112                V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25 }
 113 }