2 *******************************************************************************
\r
3 * Copyright (C) 1996-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\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
17 * @summary General test of CompoundTransliterator
\r
19 public class CompoundTransliteratorTest extends TestFmwk {
\r
21 public static void main(String[] args) throws Exception {
\r
22 new CompoundTransliteratorTest().run(args);
\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
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
39 final String IDs[]={
\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
47 for(int i=0; i<4; i++){
\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
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
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
70 // CompoundTransliterator cpdtrans=new CompoundTransliterator(IDs[i], Transliterator.FORWARD, 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
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
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
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
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
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
117 logln("OK: getTransliterator() passed: Expected->" + array[i] + " Got->" + child);
\r
125 public void TestTransliterate(){
\r
126 logln("Testing the handleTransliterate() API of CompoundTransliterator");
\r
127 Transliterator ct1=null;
\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
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
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
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
170 Transliterator ct2=null;
\r
171 for(int i=0; i<Data.length; i+=3){
\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
178 expect(ct2, Data[i+1], Data[i+2]);
\r
184 //======================================================================
\r
186 //======================================================================
\r
191 private static String[] split(String s, char divider) {
\r
193 // see how many there are
\r
195 for (int i = 0; i < s.length(); ++i) {
\r
196 if (s.charAt(i) == divider) ++count;
\r
199 // make an array with them
\r
200 String[] result = new String[count];
\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
210 result[current++] = s.substring(last,i);
\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
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
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
229 for (int i=0; i<source.length(); ++i) {
\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
241 append(s.substring(index.start));
\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
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
262 private void expectAux(String tag, String summary, boolean pass, String expectedResult) {
\r
264 logln("(" + tag + ") " + Utility.escape(summary));
\r
266 errln("FAIL: (" + tag+ ") "
\r
267 + Utility.escape(summary)
\r
268 + ", expected " + Utility.escape(expectedResult));
\r