1 package org.unicode.cldr.draft; 2 3 import com.ibm.icu.dev.test.TestFmwk; 4 import com.ibm.icu.text.StringTransform; 5 import com.ibm.icu.text.Transliterator; 6 import com.ibm.icu.text.UnicodeFilter; 7 import org.unicode.cldr.util.Timer; 8 9 public class TransformTest extends TestFmwk { 10 11 private static final boolean SHOW = false; 12 private static final int TIMING_ITERATIONS = 10000; 13 main(String[] args)14 public static void main(String[] args) { 15 new TransformTest().run(args); 16 } 17 TestFix()18 public void TestFix() { 19 String[][] tests = { 20 {"!=", "([:m:])*"}, 21 {"==", "(\\[:m:])*"}, 22 {"==", "\\Q([:m:])*\\E"}, 23 {"a(?:gh|[b])", "a[b{gh}]"}, 24 }; 25 for (String[] test : tests) { 26 if (test[0].equals("!=")) { 27 assertNotEquals("Should be different", test[1], PatternFixer.fixJava(test[1])); 28 } else { 29 assertEquals( 30 "Should be equal", 31 test[0].equals("==") ? test[1] : test[0], 32 PatternFixer.fixJava(test[1])); 33 } 34 } 35 } 36 TestSomeBasic()37 public void TestSomeBasic() { 38 String[] tests = { 39 "RULES", 40 "ab > AB; ::NULL; BA > CD;", 41 "ABAB", 42 "RULES", 43 "ab > AB; BA > CD;", 44 "ABAB", 45 "RULES", 46 "D { a > A;" + "c {(d)} e > X$1;" + "d > D", 47 "dabcdefgd", 48 "ad", 49 "Da", 50 "RULES", 51 "::[a-z];" 52 + "[:L:] { b } > B;" 53 + "B > M;" 54 + "z > Z;" 55 + "w > W;" 56 + "x > X;" 57 + "q > Q;" 58 + "C > Y;", 59 "zB", 60 "abXbCabXbCabXbCabXbCabXbCabXbCabXbCabXbCabXbCabXbCabX" 61 }; 62 boolean setRules = true; 63 String rules; 64 StringTransform transform = null; 65 Transliterator oldTransform = null; 66 for (String testCase : tests) { 67 if (testCase.equalsIgnoreCase("rules")) { 68 setRules = true; 69 continue; 70 } 71 if (setRules) { 72 rules = testCase; 73 transform = RegexTransformBuilder.createFromRules(rules); 74 if (SHOW) logln("New:\n" + transform.toString()); 75 oldTransform = Transliterator.createFromRules("foo", rules, Transliterator.FORWARD); 76 if (SHOW) show(oldTransform); 77 setRules = false; 78 continue; 79 } 80 check(TIMING_ITERATIONS, testCase, transform, transform); 81 } 82 } 83 TestCyrillic()84 public void TestCyrillic() { 85 checkAgainstCurrent("Latin-Cyrillic", "abc", "Def", "ango"); 86 } 87 TestGreek()88 public void TestGreek() { 89 checkAgainstCurrent("Latin-Greek", "abk", "Delpho", "ango", "ago"); 90 } 91 checkAgainstCurrent(String translitId, String... tests)92 public void checkAgainstCurrent(String translitId, String... tests) { 93 Transliterator oldGreek = Transliterator.getInstance(translitId); 94 String rules = oldGreek.toRules(false); 95 if (SHOW) logln(rules); 96 StringTransform newGreek = RegexTransformBuilder.createFromRules(rules); 97 if (SHOW) logln(newGreek.toString()); 98 for (String test : tests) { 99 check(TIMING_ITERATIONS, test, newGreek, oldGreek); 100 } 101 } 102 check( int iterations, String test, StringTransform newTransform, StringTransform oldTransform)103 private void check( 104 int iterations, 105 String test, 106 StringTransform newTransform, 107 StringTransform oldTransform) { 108 109 Timer t = new Timer(); 110 String result = null; 111 String oldResult = null; 112 t.start(); 113 for (int i = 0; i < iterations; ++i) { 114 result = newTransform.transform(test); 115 } 116 t.stop(); 117 long newDuration = t.getDuration(); 118 119 t.start(); 120 for (int i = 0; i < iterations; ++i) { 121 oldResult = oldTransform.transform(test); 122 } 123 t.stop(); 124 final long oldDuration = t.getDuration(); 125 126 if (!result.equals(oldResult)) { 127 errln("BAD:\t" + test + "\t=>\tnew:\t" + result + "\t!=\told:\t" + oldResult); 128 } else { 129 logln("OK:\t" + test + "\t=>\t" + result); 130 } 131 final String percent = 132 oldDuration == 0 ? "INF" : String.valueOf(newDuration * 100 / oldDuration - 100); 133 logln( 134 "new time: " 135 + newDuration / 1.0 / iterations 136 + "\told time: " 137 + oldDuration / 1.0 / iterations 138 + "\tnew%: " 139 + percent 140 + "%"); 141 } 142 show(Transliterator oldTransform)143 private void show(Transliterator oldTransform) { 144 UnicodeFilter filter = oldTransform.getFilter(); 145 logln( 146 "Old:\n" 147 + (filter == null ? "" : filter.toString() + ";\n") 148 + oldTransform.toRules(true)); 149 } 150 } 151