< prev index next >

test/java/lang/Character/UnicodeBlock/OptimalMapSize.java

Print this page
rev 12026 : [mq]: 8081027-Create-common-test-to-check-adequacy-of-initial-size

@@ -19,54 +19,39 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-
 /**
  * @test
  * @bug 8080535
  * @summary Expected size of Character.UnicodeBlock.map is not optimal
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.OptimalCapacity
+ * @run main OptimalMapSize
  */
 
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class NonOptimalMapSize {
-    public static void main(String[] args) throws Throwable {
-        Class<?> ubCls = Character.UnicodeBlock.class;
-        Field mapField = ubCls.getDeclaredField("map");
-        mapField.setAccessible(true);
-        Map<?,?> map = (Map<?,?>)mapField.get(null);
-        if (!map.getClass().equals(HashMap.class)) {
-            throw new RuntimeException(
-                    "Character.UnicodeBlock.map is expected to be HashMap");
-        }
-        int mapSize = map.size();
+import jdk.testlibrary.OptimalCapacity;
 
-        Field sizeField = ubCls.getDeclaredField("INITIAL_CAPACITY");
-        sizeField.setAccessible(true);
-        int INITIAL_CAPACITY = sizeField.getInt(null);
+// What will be the number of the Unicode blocks in the future.
+//
+// According to http://www.unicode.org/versions/Unicode7.0.0/ ,
+// in Unicode 7 there will be added 32 new blocks (96 with aliases).
+// According to http://www.unicode.org/versions/beta-8.0.0.html ,
+// in Unicode 8 there will be added 10 more blocks (30 with aliases).
+//
+// After implementing support of Unicode 7 and 8 in Java, there will
+// be 510+96+30 = 636 entries in Character.UnicodeBlock.map.
+//
+// Initialization of the map and this test will have to be adjusted
+// accordingly then.
 
-        // Construct a HashMap with specified initial capacity
-        HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
-        Class<?> hmCls = HashMap.class;
-        Field tableField = hmCls.getDeclaredField("table");
-        tableField.setAccessible(true);
-        // ... and fill it up
-        map1.put(new Object(), new Object());
-        final Object initialTable = tableField.get(map1);
-        while (map1.size() < map.size() &&
-                initialTable == tableField.get(map1)) {
-            map1.put(new Object(), new Object());
-        }
+public class OptimalMapSize {
+    public static void main(String[] args) throws Throwable {
+        // The initial size of Character.UnicodeBlock.map.
+        // See src/java.base/share/classes/java/lang/Character.java
+        int initialCapacity = (int)(510 / 0.75f + 1.0f);
 
-        // Now check that internal storage didn't change
-        if (initialTable != tableField.get(map1)) {
-            throw new RuntimeException(
-                    "Initial capacity " + INITIAL_CAPACITY +
-                    " was only enough to hold " + (map1.size()-1) +
-                    " entries, but needed " + map.size());
-        }
+        OptimalCapacity.ofHashMap(Character.UnicodeBlock.class,
+                "map", initialCapacity);
     }
 }
< prev index next >