2 *******************************************************************************
\r
3 * Copyright (C) 1996-2007, 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.text.*;
\r
9 import com.ibm.icu.dev.test.*;
\r
10 import com.ibm.icu.impl.Utility;
\r
16 * @summary General test of CompoundTransliterator
\r
18 public class CompoundTransliteratorTest extends TestFmwk {
\r
20 public static void main(String[] args) throws Exception {
\r
21 new CompoundTransliteratorTest().run(args);
\r
24 public void TestConstruction(){
\r
25 logln("Testing the construction of the compound Transliterator");
\r
26 String names[]={"Greek-Latin", "Latin-Devanagari", "Devanagari-Latin", "Latin-Greek"};
\r
29 Transliterator.getInstance(names[0]);
\r
30 Transliterator.getInstance(names[1]);
\r
31 Transliterator.getInstance(names[2]);
\r
32 Transliterator.getInstance(names[3]);
\r
33 }catch(IllegalArgumentException ex) {
\r
34 errln("FAIL: Transliterator construction failed" + ex.getMessage());
\r
38 final String IDs[]={
\r
40 names[0]+";"+names[3],
\r
41 names[3]+";"+names[1]+";"+names[2],
\r
42 names[0]+";"+names[1]+";"+names[2]+";"+names[3]
\r
46 for(int i=0; i<4; i++){
\r
48 Transliterator.getInstance(IDs[i]);
\r
49 }catch(IllegalArgumentException ex1) {
\r
50 errln("FAIL: construction using CompoundTransliterator(String ID) failed for " + IDs[i]);
\r
55 Transliterator.getInstance(IDs[i], Transliterator.FORWARD);
\r
56 }catch(IllegalArgumentException ex2) {
\r
57 errln("FAIL: construction using CompoundTransliterator(String ID, int direction=FORWARD) failed for " + IDs[i]);
\r
62 Transliterator.getInstance(IDs[i], Transliterator.REVERSE);
\r
63 }catch(IllegalArgumentException ex3) {
\r
64 errln("FAIL: construction using CompoundTransliterator(String ID, int direction=REVERSE) failed for " + IDs[i]);
\r
69 // CompoundTransliterator cpdtrans=new CompoundTransliterator(IDs[i], Transliterator.FORWARD, null);
\r
71 // }catch(IllegalArgumentException ex4) {
\r
72 // errln("FAIL: construction using CompoundTransliterator(String ID, int direction=FORWARD," +
\r
73 // "UnicodeFilter adoptedFilter=0) failed for " + IDs[i]);
\r
79 // CompoundTransliterator cpdtrans2=new CompoundTransliterator(transarray[i], null);
\r
80 // cpdtrans2 = null;
\r
81 // }catch(IllegalArgumentException ex5) {
\r
82 // errln("FAIL: Construction using CompoundTransliterator(Transliterator transliterators[]," +
\r
83 // "UnicodeFilter adoptedFilter = 0) failed");
\r
92 public void TestGetTransliterator(){
\r
93 logln("Testing the getTransliterator() API of CompoundTransliterator");
\r
94 String ID="Latin-Greek;Greek-Latin;Latin-Devanagari;Devanagari-Latin;Latin-Cyrillic;Cyrillic-Latin;Any-Hex;Hex-Any";
\r
95 Transliterator ct1=null;
\r
97 //ct1=new CompoundTransliterator(ID);
\r
98 ct1 = Transliterator.getInstance(ID);
\r
99 }catch(IllegalArgumentException iae) {
\r
100 errln("CompoundTransliterator construction failed for ID=" + ID);
\r
103 //int count=ct1.getCount();
\r
104 Transliterator elems[] = ct1.getElements();
\r
105 int count = elems.length;
\r
106 String array[]=split(ID, ';');
\r
107 if (count != array.length) {
\r
108 errln("Error: getCount() failed. Expected:" + array.length + " got:" + count);
\r
110 for(int i=0; i < count; i++){
\r
111 //String child= ct1.getTransliterator(i).getID();
\r
112 String child = elems[i].getID();
\r
113 if(!child.equals(array[i])){
\r
114 errln("Error getTransliterator() failed: Expected->" + array[i] + " Got->" + child);
\r
116 logln("OK: getTransliterator() passed: Expected->" + array[i] + " Got->" + child);
\r
124 public void TestTransliterate(){
\r
125 logln("Testing the handleTransliterate() API of CompoundTransliterator");
\r
126 Transliterator ct1=null;
\r
128 ct1=Transliterator.getInstance("Any-Hex;Hex-Any");
\r
129 }catch(IllegalArgumentException iae){
\r
130 errln("FAIL: construction using CompoundTransliterator(String ID) failed for " + "Any-Hex;Hex-Any");
\r
136 Transliterator.Position index = new Transliterator.Position();
\r
137 ReplaceableString rsource2=new ReplaceableString(s);
\r
138 String expectedResult=s;
\r
139 ct1.transliterate(rsource2, index);
\r
140 ct1.finishTransliteration(rsource2, index);
\r
141 String result=rsource2.toString();
\r
142 expectAux(ct1.getID() + ":ReplaceableString, index(0,0,0,0)", s + "->" + rsource2, result.equals(expectedResult), expectedResult);
\r
144 Transliterator.Position index2 = new Transliterator.Position(1,3,2,3);
\r
145 ReplaceableString rsource3=new ReplaceableString(s);
\r
146 ct1.transliterate(rsource3, index2);
\r
147 ct1.finishTransliteration(rsource3, index2);
\r
148 result=rsource3.toString();
\r
149 expectAux(ct1.getID() + ":String, index2(1,2,2,3)", s + "->" + rsource3, result.equals(expectedResult), expectedResult);
\r
153 //ID, input string, transliterated string
\r
154 "Any-Hex;Hex-Any;Any-Hex", "hello", "\\u0068\\u0065\\u006C\\u006C\\u006F",
\r
155 "Any-Hex;Hex-Any", "hello! How are you?", "hello! How are you?",
\r
156 "Devanagari-Latin;Latin-Devanagari", "\u092D\u0948'\u0930'\u0935", "\u092D\u0948\u0930\u0935", // quotes lost
\r
157 "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
158 "Latin-Greek;Greek-Latin", "ABGabgAKLMN", "ABGabgAKLMN",
\r
159 //"Latin-Arabic;Arabic-Latin", "Ad'r'a'b'i'k'dh'dd'gh", "Adrabikdhddgh",
\r
160 "Hiragana-Katakana", "\u3041\u308f\u3099\u306e\u304b\u3092\u3099",
\r
161 "\u30A1\u30f7\u30ce\u30ab\u30fa",
\r
162 "Hiragana-Katakana;Katakana-Hiragana", "\u3041\u308f\u3099\u306e\u304b\u3051",
\r
163 "\u3041\u308f\u3099\u306e\u304b\u3051",
\r
164 "Katakana-Hiragana;Hiragana-Katakana", "\u30A1\u30f7\u30ce\u30f5\u30f6",
\r
165 "\u30A1\u30f7\u30ce\u30ab\u30b1",
\r
166 "Latin-Katakana;Katakana-Latin", "vavivuvevohuzizuzoninunasesuzezu",
\r
167 "vavivuvevohuzizuzoninunasesuzezu",
\r
169 Transliterator ct2=null;
\r
170 for(int i=0; i<Data.length; i+=3){
\r
172 ct2=Transliterator.getInstance(Data[i+0]);
\r
173 }catch(IllegalArgumentException iae2){
\r
174 errln("FAIL: CompoundTransliterator construction failed for " + Data[i+0]);
\r
177 expect(ct2, Data[i+1], Data[i+2]);
\r
183 //======================================================================
\r
185 //======================================================================
\r
190 private static String[] split(String s, char divider) {
\r
192 // see how many there are
\r
194 for (int i = 0; i < s.length(); ++i) {
\r
195 if (s.charAt(i) == divider) ++count;
\r
198 // make an array with them
\r
199 String[] result = new String[count];
\r
203 for (i = 0; i < s.length(); ++i) {
\r
204 if (s.charAt(i) == divider) {
\r
205 result[current++] = s.substring(last,i);
\r
209 result[current++] = s.substring(last,i);
\r
213 private void expect(Transliterator t, String source, String expectedResult) {
\r
214 String result = t.transliterate(source);
\r
215 expectAux(t.getID() + ":String", source, result, expectedResult);
\r
217 ReplaceableString rsource = new ReplaceableString(source);
\r
218 t.transliterate(rsource);
\r
219 result = rsource.toString();
\r
220 expectAux(t.getID() + ":Replaceable", source, result, expectedResult);
\r
222 // Test keyboard (incremental) transliteration -- this result
\r
223 // must be the same after we finalize (see below).
\r
224 rsource.replace(0, rsource.length(), "");
\r
225 Transliterator.Position index = new Transliterator.Position();
\r
226 StringBuffer log = new StringBuffer();
\r
228 for (int i=0; i<source.length(); ++i) {
\r
232 log.append(source.charAt(i)).append(" -> ");
\r
233 t.transliterate(rsource, index,
\r
234 String.valueOf(source.charAt(i)));
\r
235 // Append the string buffer with a vertical bar '|' where
\r
236 // the committed index is.
\r
237 String s = rsource.toString();
\r
238 log.append(s.substring(0, index.start)).
\r
240 append(s.substring(index.start));
\r
243 // As a final step in keyboard transliteration, we must call
\r
244 // transliterate to finish off any pending partial matches that
\r
245 // were waiting for more input.
\r
246 t.finishTransliteration(rsource, index);
\r
247 result = rsource.toString();
\r
248 log.append(" => ").append(rsource.toString());
\r
249 expectAux(t.getID() + ":Keyboard", log.toString(),
\r
250 result.equals(expectedResult),
\r
254 private void expectAux(String tag, String source,
\r
255 String result, String expectedResult) {
\r
256 expectAux(tag, source + " -> " + result,
\r
257 result.equals(expectedResult),
\r
261 private void expectAux(String tag, String summary, boolean pass, String expectedResult) {
\r
263 logln("(" + tag + ") " + Utility.escape(summary));
\r
265 errln("FAIL: (" + tag+ ") "
\r
266 + Utility.escape(summary)
\r
267 + ", expected " + Utility.escape(expectedResult));
\r