• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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