]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/translit/src/com/ibm/icu/dev/test/translit/CompoundTransliteratorTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / translit / src / com / ibm / icu / dev / test / translit / CompoundTransliteratorTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.translit;\r
8 import com.ibm.icu.dev.test.TestFmwk;\r
9 import com.ibm.icu.impl.Utility;\r
10 import com.ibm.icu.text.ReplaceableString;\r
11 import com.ibm.icu.text.Transliterator;\r
12 \r
13 \r
14 \r
15 /**\r
16  * @test\r
17  * @summary General test of CompoundTransliterator\r
18  */\r
19 public class CompoundTransliteratorTest extends TestFmwk {\r
20 \r
21     public static void main(String[] args) throws Exception {\r
22         new CompoundTransliteratorTest().run(args);\r
23     }\r
24 \r
25     public void TestConstruction(){\r
26         logln("Testing the construction of the compound Transliterator");\r
27         String names[]={"Greek-Latin", "Latin-Devanagari", "Devanagari-Latin", "Latin-Greek"};\r
28 \r
29         try {\r
30             Transliterator.getInstance(names[0]);\r
31             Transliterator.getInstance(names[1]);\r
32             Transliterator.getInstance(names[2]);\r
33             Transliterator.getInstance(names[3]);\r
34         }catch(IllegalArgumentException ex) {\r
35             errln("FAIL: Transliterator construction failed" + ex.getMessage());\r
36             throw ex;\r
37         }\r
38   \r
39         final String IDs[]={\r
40             names[0], \r
41             names[0]+";"+names[3], \r
42             names[3]+";"+names[1]+";"+names[2], \r
43             names[0]+";"+names[1]+";"+names[2]+";"+names[3] \r
44         };\r
45 \r
46    \r
47         for(int i=0; i<4; i++){\r
48             try{\r
49                 Transliterator.getInstance(IDs[i]);\r
50             }catch(IllegalArgumentException ex1) {\r
51                 errln("FAIL: construction using CompoundTransliterator(String ID) failed for " + IDs[i]);\r
52                 throw ex1;\r
53             }\r
54 \r
55             try{\r
56                 Transliterator.getInstance(IDs[i], Transliterator.FORWARD);\r
57             }catch(IllegalArgumentException ex2) {\r
58                 errln("FAIL: construction using CompoundTransliterator(String ID, int direction=FORWARD) failed for " + IDs[i]);\r
59                 throw ex2;\r
60             }\r
61 \r
62             try{\r
63                 Transliterator.getInstance(IDs[i], Transliterator.REVERSE);\r
64             }catch(IllegalArgumentException ex3) {\r
65                 errln("FAIL: construction using CompoundTransliterator(String ID, int direction=REVERSE) failed for " + IDs[i]);\r
66                 throw ex3;\r
67             }\r
68 \r
69 //            try{\r
70 //                CompoundTransliterator cpdtrans=new CompoundTransliterator(IDs[i], Transliterator.FORWARD, null);\r
71 //                cpdtrans = null;\r
72 //            }catch(IllegalArgumentException ex4) {\r
73 //                errln("FAIL: construction using CompoundTransliterator(String ID, int direction=FORWARD," +\r
74 //                        "UnicodeFilter adoptedFilter=0) failed for " + IDs[i]);\r
75 //                throw ex4;\r
76 //            }\r
77 //  \r
78 //       \r
79 //            try{\r
80 //                CompoundTransliterator cpdtrans2=new CompoundTransliterator(transarray[i], null);\r
81 //                cpdtrans2 = null;\r
82 //            }catch(IllegalArgumentException ex5) {\r
83 //                errln("FAIL: Construction using CompoundTransliterator(Transliterator transliterators[]," +\r
84 //                       "UnicodeFilter adoptedFilter = 0)  failed");\r
85 //                throw ex5;\r
86 //            }\r
87 \r
88             \r
89         }\r
90    \r
91     }\r
92  \r
93     public void TestGetTransliterator(){\r
94         logln("Testing the getTransliterator() API of CompoundTransliterator");\r
95         String ID="Latin-Greek;Greek-Latin;Latin-Devanagari;Devanagari-Latin;Latin-Cyrillic;Cyrillic-Latin;Any-Hex;Hex-Any";\r
96         Transliterator ct1=null;\r
97         try{\r
98             //ct1=new CompoundTransliterator(ID);\r
99             ct1 = Transliterator.getInstance(ID);\r
100         }catch(IllegalArgumentException iae) {\r
101             errln("CompoundTransliterator construction failed for ID=" + ID);\r
102             throw iae;\r
103         }\r
104         //int count=ct1.getCount();\r
105         Transliterator elems[] = ct1.getElements();\r
106         int count = elems.length;\r
107         String array[]=split(ID, ';');\r
108         if (count != array.length) {\r
109             errln("Error: getCount() failed. Expected:" + array.length + " got:" + count);\r
110         }\r
111         for(int i=0; i < count; i++){\r
112             //String child= ct1.getTransliterator(i).getID();\r
113             String child = elems[i].getID();\r
114             if(!child.equals(array[i])){\r
115                 errln("Error getTransliterator() failed: Expected->" + array[i] + " Got->" + child);\r
116             }else {\r
117                 logln("OK: getTransliterator() passed: Expected->" + array[i] + " Got->" + child);\r
118             }\r
119         }\r
120 \r
121         \r
122     }\r
123  \r
124        \r
125     public void TestTransliterate(){\r
126         logln("Testing the handleTransliterate() API of CompoundTransliterator");\r
127         Transliterator ct1=null;\r
128         try{\r
129             ct1=Transliterator.getInstance("Any-Hex;Hex-Any");\r
130         }catch(IllegalArgumentException iae){\r
131             errln("FAIL: construction using CompoundTransliterator(String ID) failed for " + "Any-Hex;Hex-Any");\r
132             throw iae;\r
133         }\r
134     \r
135         String s="abcabc";\r
136         expect(ct1, s, s);\r
137         Transliterator.Position index = new Transliterator.Position();\r
138         ReplaceableString rsource2=new ReplaceableString(s);\r
139         String expectedResult=s;\r
140         ct1.transliterate(rsource2, index);\r
141         ct1.finishTransliteration(rsource2, index);\r
142         String result=rsource2.toString();\r
143         expectAux(ct1.getID() + ":ReplaceableString, index(0,0,0,0)", s + "->" + rsource2, result.equals(expectedResult), expectedResult);\r
144      \r
145         Transliterator.Position index2 = new Transliterator.Position(1,3,2,3);\r
146         ReplaceableString rsource3=new ReplaceableString(s);\r
147         ct1.transliterate(rsource3, index2); \r
148         ct1.finishTransliteration(rsource3, index2);\r
149         result=rsource3.toString();\r
150         expectAux(ct1.getID() + ":String, index2(1,2,2,3)", s + "->" + rsource3, result.equals(expectedResult), expectedResult);\r
151 \r
152        \r
153         String Data[]={\r
154              //ID, input string, transliterated string\r
155              "Any-Hex;Hex-Any;Any-Hex",     "hello",  "\\u0068\\u0065\\u006C\\u006C\\u006F", \r
156              "Any-Hex;Hex-Any",                 "hello! How are you?",  "hello! How are you?",\r
157              "Devanagari-Latin;Latin-Devanagari",       "\u092D\u0948'\u0930'\u0935",  "\u092D\u0948\u0930\u0935", // quotes lost\r
158              "Latin-Cyrillic;Cyrillic-Latin",           "a'b'k'd'e'f'g'h'i'j'Shch'shch'zh'h", "a'b'k'd'e'f'g'h'i'j'Shch'shch'zh'h",\r
159              "Latin-Greek;Greek-Latin",                 "ABGabgAKLMN", "ABGabgAKLMN",\r
160              //"Latin-Arabic;Arabic-Latin",               "Ad'r'a'b'i'k'dh'dd'gh", "Adrabikdhddgh",\r
161              "Hiragana-Katakana",                       "\u3041\u308f\u3099\u306e\u304b\u3092\u3099", \r
162                                                                  "\u30A1\u30f7\u30ce\u30ab\u30fa",  \r
163              "Hiragana-Katakana;Katakana-Hiragana",     "\u3041\u308f\u3099\u306e\u304b\u3051", \r
164                                                                  "\u3041\u308f\u3099\u306e\u304b\u3051",\r
165              "Katakana-Hiragana;Hiragana-Katakana",     "\u30A1\u30f7\u30ce\u30f5\u30f6", \r
166                                                                  "\u30A1\u30f7\u30ce\u30ab\u30b1",  \r
167              "Latin-Katakana;Katakana-Latin",                   "vavivuvevohuzizuzoninunasesuzezu", \r
168                                                                  "vavivuvevohuzizuzoninunasesuzezu",  \r
169         };\r
170         Transliterator ct2=null;\r
171         for(int i=0; i<Data.length; i+=3){\r
172             try{\r
173                 ct2=Transliterator.getInstance(Data[i+0]);\r
174             }catch(IllegalArgumentException iae2){\r
175                 errln("FAIL: CompoundTransliterator construction failed for " + Data[i+0]);\r
176                 throw iae2;\r
177             }\r
178         expect(ct2, Data[i+1], Data[i+2]);\r
179         }\r
180    \r
181     }\r
182  \r
183 \r
184     //======================================================================\r
185     // Support methods\r
186     //======================================================================\r
187 \r
188      /**\r
189      * Splits a string,\r
190     */\r
191     private static String[] split(String s, char divider) {\r
192       \r
193     // see how many there are\r
194         int count = 1;\r
195     for (int i = 0; i < s.length(); ++i) {\r
196        if (s.charAt(i) == divider) ++count;\r
197     }\r
198         \r
199     // make an array with them\r
200     String[] result = new String[count];\r
201     int last = 0;\r
202     int current = 0;\r
203     int i;\r
204     for (i = 0; i < s.length(); ++i) {\r
205         if (s.charAt(i) == divider) {\r
206             result[current++] = s.substring(last,i);\r
207             last = i+1;\r
208         }\r
209     }\r
210     result[current++] = s.substring(last,i);\r
211     return result;\r
212     }\r
213 \r
214     private void expect(Transliterator t, String source, String expectedResult) {\r
215         String result = t.transliterate(source);\r
216         expectAux(t.getID() + ":String", source, result, expectedResult);\r
217 \r
218         ReplaceableString rsource = new ReplaceableString(source);\r
219         t.transliterate(rsource);\r
220         result = rsource.toString();\r
221         expectAux(t.getID() + ":Replaceable", source, result, expectedResult);\r
222 \r
223         // Test keyboard (incremental) transliteration -- this result\r
224         // must be the same after we finalize (see below).\r
225         rsource.replace(0, rsource.length(), "");\r
226         Transliterator.Position index = new Transliterator.Position();\r
227         StringBuffer log = new StringBuffer();\r
228 \r
229         for (int i=0; i<source.length(); ++i) {\r
230             if (i != 0) {\r
231                 log.append(" + ");\r
232             }\r
233             log.append(source.charAt(i)).append(" -> ");\r
234             t.transliterate(rsource, index,\r
235                             String.valueOf(source.charAt(i)));\r
236             // Append the string buffer with a vertical bar '|' where\r
237             // the committed index is.\r
238             String s = rsource.toString();\r
239             log.append(s.substring(0, index.start)).\r
240                 append('|').\r
241                 append(s.substring(index.start));\r
242         }\r
243         \r
244         // As a final step in keyboard transliteration, we must call\r
245         // transliterate to finish off any pending partial matches that\r
246         // were waiting for more input.\r
247         t.finishTransliteration(rsource, index);\r
248         result = rsource.toString();\r
249         log.append(" => ").append(rsource.toString());\r
250         expectAux(t.getID() + ":Keyboard", log.toString(),\r
251                  result.equals(expectedResult),\r
252                  expectedResult);\r
253 \r
254     }\r
255     private void expectAux(String tag, String source,\r
256                   String result, String expectedResult) {\r
257         expectAux(tag, source + " -> " + result,\r
258                  result.equals(expectedResult),\r
259                  expectedResult);\r
260     }\r
261 \r
262     private void expectAux(String tag, String summary, boolean pass, String expectedResult) {\r
263         if (pass) {\r
264             logln("(" + tag + ") " + Utility.escape(summary));\r
265         } else {\r
266             errln("FAIL: (" + tag+ ") "\r
267                 + Utility.escape(summary)\r
268                 + ", expected " + Utility.escape(expectedResult));\r
269         }\r
270     }  \r
271 }\r
272 \r