1 /** 2 * @test 3 * @bug 6945564 6959267 4 * @summary Check that the j.l.Character.UnicodeScript 5 */ 6 7 import java.io.*; 8 import java.lang.reflect.*; 9 import java.util.*; 10 import java.util.regex.*; 11 import java.lang.Character.UnicodeScript; 12 13 public class CheckScript { 14 15 public static void main(String[] args) throws Exception { 16 17 BufferedReader sbfr = null; 18 if (args.length == 0) { 19 sbfr = new BufferedReader(new FileReader(new File(System.getProperty("test.src", "."), "Scripts.txt"))); 20 } else if (args.length == 1) { 21 sbfr = new BufferedReader(new FileReader(args[0])); 22 } else { 23 System.out.println("java CharacterScript Scripts.txt"); 24 throw new RuntimeException("Datafile name should be specified."); 25 } 26 Matcher m = Pattern.compile("(\\p{XDigit}+)(?:\\.{2}(\\p{XDigit}+))?\\s+;\\s+(\\w+)\\s+#.*").matcher(""); 27 String line = null; 28 HashMap<String,ArrayList<Integer>> scripts = new HashMap<>(); 29 while ((line = sbfr.readLine()) != null) { 30 if (line.length() <= 1 || line.charAt(0) == '#') { 31 continue; 32 } 33 m.reset(line); 34 if (m.matches()) { 35 int start = Integer.parseInt(m.group(1), 16); 36 int end = (m.group(2)==null)?start 37 :Integer.parseInt(m.group(2), 16); 38 String name = m.group(3).toLowerCase(Locale.ENGLISH); 39 ArrayList<Integer> ranges = scripts.get(name); 40 if (ranges == null) { 41 ranges = new ArrayList<Integer>(); 42 scripts.put(name, ranges); 43 } 44 ranges.add(start); 45 ranges.add(end); 46 } 47 } 48 sbfr.close(); 49 // check all defined ranges 50 Integer[] ZEROSIZEARRAY = new Integer[0]; 51 for (String name : scripts.keySet()) { 52 System.out.println("Checking " + name + "..."); 53 Integer[] ranges = scripts.get(name).toArray(ZEROSIZEARRAY); 54 Character.UnicodeScript expected = 55 Character.UnicodeScript.forName(name); 56 57 int off = 0; 58 while (off < ranges.length) { 59 int start = ranges[off++]; 60 int end = ranges[off++]; 61 for (int cp = start; cp <= end; cp++) { 62 Character.UnicodeScript script = 63 Character.UnicodeScript.of(cp); 64 if (script != expected) { 65 throw new RuntimeException( 66 "UnicodeScript failed: cp=" + 67 Integer.toHexString(cp) + 68 ", of(cp)=<" + script + "> but <" + 69 expected + "> is expected"); 70 } 71 } 72 } 73 } 74 // check all codepoints 75 for (int cp = 0; cp < Character.MAX_CODE_POINT; cp++) { 76 Character.UnicodeScript script = Character.UnicodeScript.of(cp); 77 if (script == Character.UnicodeScript.UNKNOWN) { 78 if (Character.getType(cp) != Character.UNASSIGNED && 79 Character.getType(cp) != Character.SURROGATE && 80 Character.getType(cp) != Character.PRIVATE_USE) 81 throw new RuntimeException( 82 "UnicodeScript failed: cp=" + 83 Integer.toHexString(cp) + 84 ", of(cp)=<" + script + "> but UNKNOWN is expected"); 85 } else { 86 Integer[] ranges = 87 scripts.get(script.name().toLowerCase(Locale.ENGLISH)) 88 .toArray(ZEROSIZEARRAY); 89 int off = 0; 90 boolean found = false; 91 while (off < ranges.length) { 92 int start = ranges[off++]; 93 int end = ranges[off++]; 94 if (cp >= start && cp <= end) 95 found = true; 96 } 97 if (!found) { 98 throw new RuntimeException( 99 "UnicodeScript failed: cp=" + 100 Integer.toHexString(cp) + 101 ", of(cp)=<" + script + 102 "> but NOT in ranges of this script"); 103 104 } 105 } 106 } 107 } 108 }