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