]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/transapi.cpp
ICU-8.11.tar.gz
[apple/icu.git] / icuSources / test / intltest / transapi.cpp
1 /************************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2000-2005, International Business Machines Corporation
4 * and others. All Rights Reserved.
5 ************************************************************************/
6 /************************************************************************
7 * Date Name Description
8 * 1/03/2000 Madhu Creation.
9 ************************************************************************/
10
11 #include "unicode/utypes.h"
12
13 #if !UCONFIG_NO_TRANSLITERATION
14
15 #include "ittrans.h"
16 #include "transapi.h"
17 #include "unicode/utypes.h"
18 #include "unicode/translit.h"
19 #include "rbt.h"
20 #include "unicode/unifilt.h"
21 #include "cpdtrans.h"
22 #include "nultrans.h"
23 #include <string.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include "unicode/rep.h"
27 #include "unicode/locid.h"
28 #include "unicode/uniset.h"
29
30 int32_t getInt(UnicodeString str)
31 {
32 char buffer[20];
33 int len=str.length();
34 if(len>=20) {
35 len=19;
36 }
37 str.extract(0, len, buffer, "");
38 buffer[len]=0;
39 return atoi(buffer);
40 }
41
42 //---------------------------------------------
43 // runIndexedTest
44 //---------------------------------------------
45
46 void
47 TransliteratorAPITest::runIndexedTest(int32_t index, UBool exec,
48 const char* &name, char* /*par*/) {
49 switch (index) {
50 TESTCASE(0,TestgetInverse);
51 TESTCASE(1,TestgetID);
52 TESTCASE(2,TestGetDisplayName);
53 TESTCASE(3,TestTransliterate1);
54 TESTCASE(4,TestTransliterate2);
55 TESTCASE(5,TestTransliterate3);
56 TESTCASE(6,TestSimpleKeyboardTransliterator);
57 TESTCASE(7,TestKeyboardTransliterator1);
58 TESTCASE(8,TestKeyboardTransliterator2);
59 TESTCASE(9,TestKeyboardTransliterator3);
60 TESTCASE(10,TestGetAdoptFilter);
61 TESTCASE(11,TestClone);
62 TESTCASE(12,TestNullTransliterator);
63 TESTCASE(13,TestRegisterUnregister);
64 TESTCASE(14,TestUnicodeFunctor);
65 default: name = ""; break;
66 }
67 }
68
69
70 void TransliteratorAPITest::TestgetID() {
71 UnicodeString trans="Latin-Greek";
72 UnicodeString ID;
73 UParseError parseError;
74 UErrorCode status = U_ZERO_ERROR;
75 Transliterator* t= Transliterator::createInstance(trans, UTRANS_FORWARD, parseError, status);
76 if(t==0 || U_FAILURE(status)){
77 errln("FAIL: construction of Latin-Greek");
78 return;
79 }else{
80 ID= t->getID();
81 if(ID != trans)
82 errln("FAIL: getID returned " + ID + " instead of Latin-Greek");
83 delete t;
84 }
85 int i;
86 for (i=0; i<Transliterator::countAvailableIDs(); i++){
87 status = U_ZERO_ERROR;
88 ID = (UnicodeString) Transliterator::getAvailableID(i);
89 if(ID.indexOf("Thai")>-1){
90 continue;
91 }
92 t = Transliterator::createInstance(ID, UTRANS_FORWARD, parseError, status);
93 if(t == 0){
94 errln("FAIL: " + ID);
95 continue;
96 }
97 if(ID != t->getID())
98 errln("FAIL: getID() returned " + t->getID() + " instead of " + ID);
99 delete t;
100 }
101 ID=(UnicodeString)Transliterator::getAvailableID(i);
102 if(ID != (UnicodeString)Transliterator::getAvailableID(0)){
103 errln("FAIL: calling getAvailableID(index > coundAvailableIDs) should make index=0\n");
104 }
105
106 Transliterator* t1=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
107 Transliterator* t2=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD, parseError, status);
108 if(t1 ==0 || t2 == 0){
109 errln("FAIL: construction");
110 return;
111 }
112 Transliterator* t3=t1->clone();
113 Transliterator* t4=t2->clone();
114
115 if(t1->getID() != t3->getID() || t2->getID() != t4->getID() ||
116 t1->getID() == t4->getID() || t2->getID() == t3->getID() ||
117 t1->getID()== t4->getID() )
118 errln("FAIL: getID or clone failed");
119
120
121 Transliterator* t5=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
122 if(t5 == 0)
123 errln("FAIL: construction");
124 if(t1->getID() != t5->getID() || t5->getID() != t3->getID() || t1->getID() != t3->getID())
125 errln("FAIL: getID or clone failed");
126
127
128 delete t1;
129 delete t2;
130 delete t3;
131 delete t4;
132 delete t5;
133 }
134
135 void TransliteratorAPITest::TestgetInverse() {
136 UErrorCode status = U_ZERO_ERROR;
137 UParseError parseError;
138 Transliterator* t1 = Transliterator::createInstance("Katakana-Latin", UTRANS_FORWARD, parseError, status);
139 Transliterator* invt1 = Transliterator::createInstance("Latin-Katakana", UTRANS_FORWARD, parseError, status);
140 Transliterator* t2 = Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
141 Transliterator* invt2 = Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD, parseError, status);
142 if(t1 == 0 || invt1 == 0 || t2 == 0 || invt2 == 0) {
143 errln("FAIL: in instantiation");
144 return;
145 }
146
147 Transliterator* inverse1=t1->createInverse(status);
148 Transliterator* inverse2=t2->createInverse(status);
149 if(inverse1->getID() != invt1->getID() || inverse2->getID() != invt2->getID()
150 || inverse1->getID() == invt2->getID() || inverse2->getID() == invt1->getID() )
151 errln("FAIL: getInverse() ");
152
153 UnicodeString TransID[]={
154 "Halfwidth-Fullwidth",
155 "Fullwidth-Halfwidth",
156 "Greek-Latin" ,
157 "Latin-Greek",
158 //"Arabic-Latin", // removed in 2.0
159 //"Latin-Arabic",
160 "Katakana-Latin",
161 "Latin-Katakana",
162 //"Hebrew-Latin", // removed in 2.0
163 //"Latin-Hebrew",
164 "Cyrillic-Latin",
165 "Latin-Cyrillic",
166 "Devanagari-Latin",
167 "Latin-Devanagari",
168 "Any-Hex",
169 "Hex-Any"
170 };
171 for(uint32_t i=0; i<sizeof(TransID)/sizeof(TransID[0]); i=i+2){
172 Transliterator *trans1=Transliterator::createInstance(TransID[i], UTRANS_FORWARD, parseError, status);
173 if(t1 == 0){
174 errln("FAIL: in instantiation for" + TransID[i]);
175 continue;
176 }
177 Transliterator *inver1=trans1->createInverse(status);
178 if(inver1->getID() != TransID[i+1] )
179 errln("FAIL :getInverse() for " + TransID[i] + " returned " + inver1->getID() + " instead of " + TransID[i+1]);
180 delete inver1;
181 delete trans1;
182 }
183 delete t1;
184 delete t2;
185 delete invt1;
186 delete invt2;
187 delete inverse1;
188 delete inverse2;
189
190 }
191
192 void TransliteratorAPITest::TestClone(){
193 Transliterator *t1, *t2, *t3, *t4;
194 UErrorCode status = U_ZERO_ERROR;
195 UParseError parseError;
196 t1=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
197 t2=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD, parseError, status);
198 if(t1 == 0 || t2 == 0){
199 errln("FAIL: construction");
200 return;
201 }
202 t3=t1->clone();
203 t4=t2->clone();
204
205 if(t1->getID() != t3->getID() || t2->getID() != t4->getID() )
206 errln("FAIL: clone or getID failed");
207 if(t1->getID()==t4->getID() || t2->getID()==t3->getID() || t1->getID()==t4->getID())
208 errln("FAIL: clone or getID failed");
209
210 delete t1;
211 delete t2;
212 delete t3;
213 delete t4;
214
215 }
216
217 void TransliteratorAPITest::TestGetDisplayName() {
218 UnicodeString dispNames[]= {
219 //ID, displayName
220 //"CurlyQuotes-StraightQuotes" ,"CurlyQuotes to StraightQuotes",
221 "Any-Hex" ,"Any to Hex Escape",
222 "Halfwidth-Fullwidth" ,"Halfwidth to Fullwidth" ,
223 //"Latin-Arabic" ,"Latin to Arabic" ,
224 "Latin-Devanagari" ,"Latin to Devanagari" ,
225 "Greek-Latin" ,"Greek to Latin" ,
226 //"Arabic-Latin" ,"Arabic to Latin" ,
227 "Hex-Any" ,"Hex Escape to Any",
228 "Cyrillic-Latin" ,"Cyrillic to Latin" ,
229 "Latin-Greek" ,"Latin to Greek" ,
230 "Latin-Katakana" ,"Latin to Katakana" ,
231 //"Latin-Hebrew" ,"Latin to Hebrew" ,
232 "Katakana-Latin" ,"Katakana to Latin"
233 };
234 UnicodeString name="";
235 Transliterator* t;
236 UnicodeString message;
237 UErrorCode status = U_ZERO_ERROR;
238 UParseError parseError;
239
240 #if UCONFIG_NO_FORMATTING
241 logln("Skipping, UCONFIG_NO_FORMATTING is set\n");
242 return;
243 #else
244
245 for (uint32_t i=0; i<sizeof(dispNames)/sizeof(dispNames[0]); i=i+2 ) {
246 t = Transliterator::createInstance(dispNames[i+0], UTRANS_FORWARD, parseError, status);
247 if(t==0){
248 errln("FAIL: construction: " + dispNames[i+0]);
249 status = U_ZERO_ERROR;
250 continue;
251 }
252 t->getDisplayName(t->getID(), name);
253 message="Display name for ID:" + t->getID();
254 // doTest(message, name, dispNames[i+1]); //!!! This will obviously fail for any locale other than english and its children!!!
255 name="";
256 t->getDisplayName(t->getID(), Locale::getUS(), name);
257 message.remove();
258 message.append("Display name for on english locale ID:");
259 message.append(t->getID());
260 // message="Display name for on english locale ID:" + t->getID();
261 doTest(message, name, dispNames[i+1]);
262 name="";
263
264 delete t;
265 }
266 #endif
267
268 }
269
270 void TransliteratorAPITest::TestTransliterate1(){
271
272 UnicodeString Data[]={
273 //ID, input string, transliterated string
274 "Any-Hex", "hello", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", "") ,
275 "Hex-Any", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), "hello" ,
276 "Latin-Devanagari",CharsToUnicodeString("bha\\u0304rata"), CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924") ,
277 "Latin-Devanagari",UnicodeString("kra ksha khra gra cra dya dhya",""), CharsToUnicodeString("\\u0915\\u094D\\u0930 \\u0915\\u094D\\u0936 \\u0916\\u094D\\u0930 \\u0917\\u094D\\u0930 \\u091a\\u094D\\u0930 \\u0926\\u094D\\u092F \\u0927\\u094D\\u092F") ,
278
279 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), UnicodeString("bh\\u0101rata"),
280 // "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042") ,
281 // "Expanded-Contracted", CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042"), CharsToUnicodeString("\\u00C0\\u00C1\\u0042") ,
282 //"Latin-Arabic", "aap", CharsToUnicodeString("\\u0627\\u06A4") ,
283 //"Arabic-Latin", CharsToUnicodeString("\\u0627\\u06A4"), "aap"
284 };
285
286 UnicodeString gotResult;
287 UnicodeString temp;
288 UnicodeString message;
289 Transliterator* t;
290 logln("Testing transliterate");
291 UErrorCode status = U_ZERO_ERROR;
292 UParseError parseError;
293
294 for(uint32_t i=0;i<sizeof(Data)/sizeof(Data[0]); i=i+3){
295 t=Transliterator::createInstance(Data[i+0], UTRANS_FORWARD, parseError, status);
296 if(t==0){
297 errln("FAIL: construction: " + Data[i+0] + " Error: " + u_errorName(status));
298 errln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) );
299 status = U_ZERO_ERROR;
300 continue;
301 }
302 gotResult = Data[i+1];
303 t->transliterate(gotResult);
304 message=t->getID() + "->transliterate(UnicodeString, UnicodeString) for\n\t Source:" + prettify(Data[i+1]);
305 doTest(message, gotResult, Data[i+2]);
306
307 //doubt here
308 temp=Data[i+1];
309 t->transliterate(temp);
310 message.remove();
311 message.append(t->getID());
312 message.append("->transliterate(Replaceable) for \n\tSource:");
313 message.append(Data[i][1]);
314 doTest(message, temp, Data[i+2]);
315
316 callEverything(t, __LINE__);
317 delete t;
318 }
319 }
320
321 void TransliteratorAPITest::TestTransliterate2(){
322 //testing tranliterate(String text, int start, int limit, StringBuffer result)
323 UnicodeString Data2[]={
324 //ID, input string, start, limit, transliterated string
325 "Any-Hex", "hello! How are you?", "0", "5", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F! How are you?", "") ,
326 "Any-Hex", "hello! How are you?", "7", "12", UnicodeString("\\u0048\\u006F\\u0077\\u0020\\u0061", ""), UnicodeString("hello! \\u0048\\u006F\\u0077\\u0020\\u0061re you?", ""),
327 "Hex-Any", CharsToUnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F\\u0021\\u0020"), "0", "5", "hello", "hello! " ,
328 // "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), "1", "2", CharsToUnicodeString("\\u0041\\u0301"), CharsToUnicodeString("\\u00C0\\u0041\\u0301\\u0042") ,
329 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "0", "1", "bha", CharsToUnicodeString("bha\\u093E\\u0930\\u0924") ,
330 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "1", "2", "\\u0314\\u0101", CharsToUnicodeString("\\u092D\\u0314\\u0101\\u0930\\u0924")
331
332 };
333 logln("\n Testing transliterate(String, int, int, StringBuffer)");
334 Transliterator* t;
335 UnicodeString gotResBuf;
336 UnicodeString temp;
337 int32_t start, limit;
338 UErrorCode status = U_ZERO_ERROR;
339 UParseError parseError;
340
341 for(uint32_t i=0; i<sizeof(Data2)/sizeof(Data2[0]); i=i+6){
342 t=Transliterator::createInstance(Data2[i+0], UTRANS_FORWARD, parseError, status);
343 if(t==0){
344 errln("FAIL: construction: " + prettify(Data2[i+0]));
345 continue;
346 }
347 start=getInt(Data2[i+2]);
348 limit=getInt(Data2[i+3]);
349 Data2[i+1].extractBetween(start, limit, gotResBuf);
350 t->transliterate(gotResBuf);
351 // errln("FAIL: calling transliterate on " + t->getID());
352 doTest(t->getID() + ".transliterate(UnicodeString, int32_t, int32_t, UnicodeString):(" + start + "," + limit + ") for \n\t source: " + prettify(Data2[i+1]), gotResBuf, Data2[i+4]);
353
354 temp=Data2[i+1];
355 t->transliterate(temp, start, limit);
356 doTest(t->getID() + ".transliterate(Replaceable, int32_t, int32_t, ):(" + start + "," + limit + ") for \n\t source: " + prettify(Data2[i+1]), temp, Data2[i+5]);
357 status = U_ZERO_ERROR;
358 callEverything(t, __LINE__);
359 delete t;
360 t = NULL;
361 }
362
363 status = U_ZERO_ERROR;
364 logln("\n Try calling transliterate with illegal start and limit values");
365 t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
366 if(U_FAILURE(status)) {
367 errln("Error creating transliterator %s", u_errorName(status));
368 delete t;
369 return;
370 }
371 gotResBuf = temp = "try start greater than limit";
372 t->transliterate(gotResBuf, 10, 5);
373 if(gotResBuf == temp) {
374 logln("OK: start greater than limit value handled correctly");
375 } else {
376 errln("FAIL: start greater than limit value returned" + gotResBuf);
377 }
378
379 callEverything(t, __LINE__);
380 delete t;
381
382 }
383 void TransliteratorAPITest::TestTransliterate3(){
384 UnicodeString rs="This is the replaceable String";
385 UnicodeString Data[] = {
386 "0", "0", "This is the replaceable String",
387 "2", "3", UnicodeString("Th\\u0069s is the replaceable String", ""),
388 "21", "23", UnicodeString("Th\\u0069s is the repl\\u0061\\u0063eable String", ""),
389 "14", "17", UnicodeString("Th\\u0069s is t\\u0068\\u0065\\u0020repl\\u0061\\u0063eable String", ""),
390 };
391 int start, limit;
392 UnicodeString message;
393 UParseError parseError;
394 UErrorCode status = U_ZERO_ERROR;
395 Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
396 if(U_FAILURE(status)) {
397 errln("Error creating transliterator %s", u_errorName(status));
398 delete t;
399 return;
400 }
401
402 if(t == 0)
403 errln("FAIL : construction");
404 for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+3){
405 start=getInt(Data[i+0]);
406 limit=getInt(Data[i+1]);
407 t->transliterate(rs, start, limit);
408 message=t->getID() + ".transliterate(ReplaceableString, start, limit):("+start+","+limit+"):";
409 doTest(message, rs, Data[i+2]);
410 }
411 delete t;
412 }
413
414 void TransliteratorAPITest::TestSimpleKeyboardTransliterator(){
415 logln("simple call to transliterate");
416 UErrorCode status=U_ZERO_ERROR;
417 UParseError parseError;
418 Transliterator* t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
419 if(t == 0) {
420 UnicodeString context;
421
422 if (parseError.preContext[0]) {
423 context += (UnicodeString)" at " + parseError.preContext;
424 }
425 if (parseError.postContext[0]) {
426 context += (UnicodeString)" | " + parseError.postContext;
427 }
428 errln((UnicodeString)"FAIL: can't create Any-Hex, " +
429 (UnicodeString)u_errorName(status) + context);
430 return;
431 }
432 UTransPosition index={19,20,20,20};
433 UnicodeString rs= "Transliterate this-''";
434 UnicodeString insertion="abc";
435 UnicodeString expected=UnicodeString("Transliterate this-'\\u0061\\u0062\\u0063'", "");
436 t->transliterate(rs, index, insertion, status);
437 if(U_FAILURE(status))
438 errln("FAIL: " + t->getID()+ ".translitere(Replaceable, int[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
439 t->finishTransliteration(rs, index);
440 UnicodeString message="transliterate";
441 doTest(message, rs, expected);
442
443 logln("try calling transliterate with invalid index values");
444 UTransPosition index1[]={
445 //START, LIMIT, CURSOR
446 {10, 10, 12, 10}, //invalid since CURSOR>LIMIT valid:-START <= CURSOR <= LIMIT
447 {17, 16, 17, 17}, //invalid since START>LIMIT valid:-0<=START<=LIMIT
448 {-1, 16, 14, 16}, //invalid since START<0
449 {3, 50, 2, 50} //invalid since LIMIT>text.length()
450 };
451 for(uint32_t i=0; i<sizeof(index1)/sizeof(index1[0]); i++){
452 status=U_ZERO_ERROR;
453 t->transliterate(rs, index1[i], insertion, status);
454 if(status == U_ILLEGAL_ARGUMENT_ERROR)
455 logln("OK: invalid index values handled correctly");
456 else
457 errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString)u_errorName(status));
458 }
459
460 delete t;
461 }
462 void TransliteratorAPITest::TestKeyboardTransliterator1(){
463 UnicodeString Data[]={
464 //insertion, buffer
465 "a", UnicodeString("\\u0061", "") ,
466 "bbb", UnicodeString("\\u0061\\u0062\\u0062\\u0062", "") ,
467 "ca", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061", "") ,
468 " ", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
469 "", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
470
471 "a", UnicodeString("\\u0061", "") ,
472 "b", UnicodeString("\\u0061\\u0062", "") ,
473 "z", UnicodeString("\\u0061\\u0062\\u007A", "") ,
474 "", UnicodeString("\\u0061\\u0062\\u007A", "")
475
476 };
477 UParseError parseError;
478 UErrorCode status = U_ZERO_ERROR;
479 Transliterator* t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
480 if(U_FAILURE(status)) {
481 errln("Error creating transliterator %s", u_errorName(status));
482 delete t;
483 return;
484 }
485 //keyboardAux(t, Data);
486 UTransPosition index={0, 0, 0, 0};
487 UnicodeString s;
488 uint32_t i;
489 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
490 for (i=0; i<10; i=i+2) {
491 UnicodeString log;
492 if (Data[i+0] != "") {
493 log = s + " + " + Data[i+0] + " -> ";
494 t->transliterate(s, index, Data[i+0], status);
495 if(U_FAILURE(status)){
496 errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
497 continue;
498 }
499 }else {
500 log = s + " => ";
501 t->finishTransliteration(s, index);
502 }
503 // Show the start index '{' and the cursor '|'
504 displayOutput(s, Data[i+1], log, index);
505
506 }
507
508 s="";
509 status=U_ZERO_ERROR;
510 index.contextStart = index.contextLimit = index.start = index.limit = 0;
511 logln("Testing transliterate(Replaceable, int32_t, UChar, UErrorCode)");
512 for(i=10; i<sizeof(Data)/sizeof(Data[0]); i=i+2){
513 UnicodeString log;
514 if (Data[i+0] != "") {
515 log = s + " + " + Data[i+0] + " -> ";
516 UChar c=Data[i+0].charAt(0);
517 t->transliterate(s, index, c, status);
518 if(U_FAILURE(status))
519 errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UChar, UErrorCode)-->" + (UnicodeString)u_errorName(status));
520 continue;
521 }else {
522 log = s + " => ";
523 t->finishTransliteration(s, index);
524 }
525 // Show the start index '{' and the cursor '|'
526 displayOutput(s, Data[i+1], log, index);
527 }
528
529 delete t;
530 }
531
532 void TransliteratorAPITest::TestKeyboardTransliterator2(){
533 UnicodeString Data[]={
534 //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
535 //data for Any-Hex
536 "abc", UnicodeString("Initial String: add-\\u0061\\u0062\\u0063-", ""), "19", "20", "20",
537 "a", UnicodeString("In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "2", "3", "2" ,
538 "b", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
539 "", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
540 //data for Latin-Devanagiri
541 CharsToUnicodeString("a\\u0304"), CharsToUnicodeString("Hindi -\\u0906-"), "6", "7", "6",
542 CharsToUnicodeString("ma\\u0304"), CharsToUnicodeString("Hindi -\\u0906\\u092E\\u093E-"), "7", "8", "7",
543 CharsToUnicodeString("ra\\u0304"), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2",
544 CharsToUnicodeString(""), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2"
545 //data for contracted-Expanded
546 // CharsToUnicodeString("\\u00C1"), CharsToUnicodeString("Ad\\u0041\\u0301d here:"), "1", "2", "1" ,
547 // CharsToUnicodeString("\\u00C0"), CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
548 // "", CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
549 };
550 Transliterator *t;
551 UnicodeString rs;
552 UnicodeString dataStr;
553 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
554 UErrorCode status = U_ZERO_ERROR;
555 UParseError parseError;
556 rs="Initial String: add--";
557 t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
558 if(t == 0)
559 errln("FAIL : construction");
560 else {
561 keyboardAux(t, Data, rs, 0, 20);
562 delete t;
563 }
564
565 rs="Hindi --";
566 t=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
567 if(t == 0)
568 errln("FAIL : construction");
569 else
570 keyboardAux(t, Data, rs, 20, 40);
571
572
573 // rs="Add here:";
574 // t=Transliterator::createInstance("Contracted-Expanded");
575 // keyboardAux(t, Data, rs, 35, 55);
576
577
578 delete t;
579 }
580
581 void TransliteratorAPITest::TestKeyboardTransliterator3(){
582 UnicodeString s="This is the main string";
583 UnicodeString Data[] = {
584 "0", "0", "0", "This is the main string",
585 "1", "3", "2", UnicodeString("Th\\u0069s is the main string", ""),
586 "20", "21", "20", UnicodeString("Th\\u0069s is the mai\\u006E string", "")
587 };
588
589 UErrorCode status=U_ZERO_ERROR;
590 UParseError parseError;
591 UTransPosition index={0, 0, 0, 0};
592 logln("Testing transliterate(Replaceable, int32_t, UErrorCode)");
593 Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
594 if(U_FAILURE(status)) {
595 errln("Error creating transliterator %s", u_errorName(status));
596 delete t;
597 return;
598 }
599 if(t == 0)
600 errln("FAIL : construction");
601 for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+4){
602 UnicodeString log;
603 index.contextStart=getInt(Data[i+0]);
604 index.contextLimit=index.limit=getInt(Data[i+1]);
605 index.start=getInt(Data[i+2]);
606 t->transliterate(s, index, status);
607 if(U_FAILURE(status)){
608 errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UErrorCode)-->" + (UnicodeString)u_errorName(status));
609 continue;
610 }
611 t->finishTransliteration(s, index);
612 log = s + " => ";
613 // Show the start index '{' and the cursor '|'
614 displayOutput(s, Data[i+3], log, index);
615 }
616
617 delete t;
618 }
619 void TransliteratorAPITest::TestNullTransliterator(){
620 UnicodeString s("Transliterate using null transliterator");
621 NullTransliterator *nullTrans=new NullTransliterator();
622 int32_t transLimit;
623 int32_t start=0;
624 int32_t limit=s.length();
625 UnicodeString replaceable=s;
626 transLimit=nullTrans->transliterate(replaceable, start, limit);
627 if(transLimit != limit){
628 errln("ERROR: NullTransliterator->transliterate() failed");
629 }
630 doTest((UnicodeString)"nulTrans->transliterate", replaceable, s);
631 replaceable.remove();
632 replaceable.append(s);
633 UTransPosition index;
634 index.contextStart =start;
635 index.contextLimit = limit;
636 index.start = 0;
637 index.limit = limit;
638 nullTrans->handleTransliterate(replaceable, index, TRUE);
639 if(index.start != limit){
640 errln("ERROR: NullTransliterator->handleTransliterate() failed");
641 }
642 doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s);
643 callEverything(nullTrans, __LINE__);
644 delete nullTrans;
645
646
647 }
648 void TransliteratorAPITest::TestRegisterUnregister(){
649
650 UErrorCode status=U_ZERO_ERROR;
651 UParseError parseError;
652 /* Make sure it doesn't exist */
653 if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status) != NULL) {
654 errln("FAIL: TestA-TestB already registered\n");
655 return;
656 }
657 /* Check inverse too
658 if (Transliterator::createInstance("TestA-TestB",
659 (UTransDirection)UTRANS_REVERSE) != NULL) {
660 errln("FAIL: TestA-TestB inverse already registered\n");
661 return;
662 }
663 */
664 status =U_ZERO_ERROR;
665
666 /* Create it */
667 Transliterator *t = new RuleBasedTransliterator("TestA-TestB",
668 "a<>b",
669 status);
670 /* Register it */
671 Transliterator::registerInstance(t);
672
673 /* Now check again -- should exist now*/
674 Transliterator *s = Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status);
675 if (s == NULL) {
676 errln("FAIL: TestA-TestB not registered\n");
677 return;
678 }
679 callEverything(s, __LINE__);
680 callEverything(t, __LINE__);
681 delete s;
682
683 /* Check inverse too
684 s = Transliterator::createInstance("TestA-TestB",
685 (UTransDirection)UTRANS_REVERSE);
686 if (s == NULL) {
687 errln("FAIL: TestA-TestB inverse not registered\n");
688 return;
689 }
690 delete s;
691 */
692
693 /*unregister the instance*/
694 Transliterator::unregister("TestA-TestB");
695 /* now Make sure it doesn't exist */
696 if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status) != NULL) {
697 errln("FAIL: TestA-TestB isn't unregistered\n");
698 return;
699 }
700
701 }
702
703
704 int gTestFilter1ClassID = 0;
705 int gTestFilter2ClassID = 0;
706 int gTestFilter3ClassID = 0;
707
708 /**
709 * Used by TestFiltering().
710 */
711 class TestFilter1 : public UnicodeFilter {
712 UClassID getDynamicClassID()const { return &gTestFilter1ClassID; }
713 virtual UnicodeFunctor* clone() const {
714 return new TestFilter1(*this);
715 }
716 virtual UBool contains(UChar32 c) const {
717 if(c==0x63 || c==0x61 || c==0x43 || c==0x41)
718 return FALSE;
719 else
720 return TRUE;
721 }
722 // Stubs
723 virtual UnicodeString& toPattern(UnicodeString& result,
724 UBool /*escapeUnprintable*/) const {
725 return result;
726 }
727 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
728 return FALSE;
729 }
730 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
731 };
732 class TestFilter2 : public UnicodeFilter {
733 UClassID getDynamicClassID()const { return &gTestFilter2ClassID; }
734 virtual UnicodeFunctor* clone() const {
735 return new TestFilter2(*this);
736 }
737 virtual UBool contains(UChar32 c) const {
738 if(c==0x65 || c==0x6c)
739 return FALSE;
740 else
741 return TRUE;
742 }
743 // Stubs
744 virtual UnicodeString& toPattern(UnicodeString& result,
745 UBool /*escapeUnprintable*/) const {
746 return result;
747 }
748 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
749 return FALSE;
750 }
751 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
752 };
753 class TestFilter3 : public UnicodeFilter {
754 UClassID getDynamicClassID()const { return &gTestFilter3ClassID; }
755 virtual UnicodeFunctor* clone() const {
756 return new TestFilter3(*this);
757 }
758 virtual UBool contains(UChar32 c) const {
759 if(c==0x6f || c==0x77)
760 return FALSE;
761 else
762 return TRUE;
763 }
764 // Stubs
765 virtual UnicodeString& toPattern(UnicodeString& result,
766 UBool /*escapeUnprintable*/) const {
767 return result;
768 }
769 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
770 return FALSE;
771 }
772 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
773 };
774
775
776 void TransliteratorAPITest::TestGetAdoptFilter(){
777 UErrorCode status = U_ZERO_ERROR;
778 UParseError parseError;
779 Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
780 if(U_FAILURE(status)) {
781 errln("Error creating transliterator %s", u_errorName(status));
782 delete t;
783 return;
784 }
785 if(t == 0)
786 errln("FAIL : construction");
787 const UnicodeFilter *u=t->getFilter();
788 if(u != NULL){
789 errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
790 }
791
792 UnicodeString got, temp, message;
793 UnicodeString data="ABCabcbbCBa";
794 temp = data;
795 t->transliterate(temp);
796 t->adoptFilter(new TestFilter1);
797
798 got = data;
799 t->transliterate(got);
800 UnicodeString exp=UnicodeString("A\\u0042Ca\\u0062c\\u0062\\u0062C\\u0042a", "");
801 message="transliteration after adoptFilter(a,A,c,C) ";
802 doTest(message, got, exp);
803
804 logln("Testing round trip");
805 t->adoptFilter((UnicodeFilter*)u);
806 if(t->getFilter() == NULL)
807 logln("OK: adoptFilter and getFilter round trip worked");
808 else
809 errln("FAIL: adoptFilter or getFilter round trip failed");
810
811 got = data;
812 t->transliterate(got);
813 exp=UnicodeString("\\u0041\\u0042\\u0043\\u0061\\u0062\\u0063\\u0062\\u0062\\u0043\\u0042\\u0061", "");
814 message="transliteration after adopting null filter";
815 doTest(message, got, exp);
816 message="adoptFilter round trip";
817 doTest("adoptFilter round trip", got, temp);
818
819 t->adoptFilter(new TestFilter2);
820 callEverything(t, __LINE__);
821 data="heelloe";
822 exp=UnicodeString("\\u0068eell\\u006Fe", "");
823 got = data;
824 t->transliterate(got);
825 message="transliteration using (e,l) filter";
826 doTest("transliteration using (e,l) filter", got, exp);
827
828 data="are well";
829 exp=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
830 got = data;
831 t->transliterate(got);
832 doTest(message, got, exp);
833
834 t->adoptFilter(new TestFilter3);
835 data="ho, wow!";
836 exp=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
837 got = data;
838 t->transliterate(got);
839 message="transliteration using (o,w) filter";
840 doTest("transliteration using (o,w) filter", got, exp);
841
842 data="owl";
843 exp=UnicodeString("ow\\u006C", "");
844 got = data;
845 t->transliterate(got);
846 doTest("transliteration using (o,w) filter", got, exp);
847
848 delete t;
849
850 }
851
852
853
854 void TransliteratorAPITest::keyboardAux(Transliterator *t, UnicodeString DATA[], UnicodeString& s, int32_t begin, int32_t end) {
855 UTransPosition index={0, 0, 0, 0};
856 UErrorCode status=U_ZERO_ERROR;
857 for (int32_t i=begin; i<end; i=i+5) {
858 UnicodeString log;
859 if (DATA[i+0] != "") {
860 log = s + " + " + DATA[i] + " -> ";
861 index.contextStart=getInt(DATA[i+2]);
862 index.contextLimit=index.limit=getInt(DATA[i+3]);
863 index.start=getInt(DATA[i+4]);
864 t->transliterate(s, index, DATA[i+0], status);
865 if(U_FAILURE(status)){
866 errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
867 continue;
868 }
869 log = s + " => ";
870 t->finishTransliteration(s, index);
871 }
872 // Show the start index '{' and the cursor '|'
873 displayOutput(s, DATA[i+1], log, index);
874
875 }
876 }
877
878 void TransliteratorAPITest::displayOutput(const UnicodeString& got, const UnicodeString& expected, UnicodeString& log, UTransPosition& index){
879 // Show the start index '{' and the cursor '|'
880 UnicodeString a, b, c, d, e;
881 got.extractBetween(0, index.contextStart, a);
882 got.extractBetween(index.contextStart, index.start, b);
883 got.extractBetween(index.start, index.limit, c);
884 got.extractBetween(index.limit, index.contextLimit, d);
885 got.extractBetween(index.contextLimit, got.length(), e);
886 log.append(a).
887 append((UChar)0x7b/*{*/).
888 append(b).
889 append((UChar)0x7c/*|*/).
890 append(c).
891 append((UChar)0x7c).
892 append(d).
893 append((UChar)0x7d/*}*/).
894 append(e);
895 if (got == expected)
896 logln("OK:" + prettify(log));
897 else
898 errln("FAIL: " + prettify(log) + ", expected " + prettify(expected));
899 }
900
901
902 /*Internal Functions used*/
903 void TransliteratorAPITest::doTest(const UnicodeString& message, const UnicodeString& result, const UnicodeString& expected){
904 if (prettify(result) == prettify(expected))
905 logln((UnicodeString)"Ok: " + prettify(message) + " passed \"" + prettify(expected) + "\"");
906 else
907 errln((UnicodeString)"FAIL:" + message + " failed Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) );
908 }
909
910
911 //
912 // callEverything call all of the const (non-destructive) methods on a
913 // transliterator, just to verify that they don't fail in some
914 // destructive way.
915 //
916 #define CEASSERT(a) {if (!(a)) { \
917 errln("FAIL at line %d from line %d: %s", __LINE__, line, #a); return; }}
918
919 void TransliteratorAPITest::callEverything(const Transliterator *tr, int line) {
920 Transliterator *clonedTR = tr->clone();
921 CEASSERT(clonedTR != NULL);
922
923 int32_t maxcl = tr->getMaximumContextLength();
924 CEASSERT(clonedTR->getMaximumContextLength() == maxcl);
925
926 UnicodeString id;
927 UnicodeString clonedId;
928 id = tr->getID();
929 clonedId = clonedTR->getID();
930 CEASSERT(id == clonedId);
931
932 const UnicodeFilter *filter = tr->getFilter();
933 const UnicodeFilter *clonedFilter = clonedTR->getFilter();
934 if (filter == NULL || clonedFilter == NULL) {
935 // If one filter is NULL they better both be NULL.
936 CEASSERT(filter == clonedFilter);
937 } else {
938 CEASSERT(filter != clonedFilter);
939 }
940
941 UnicodeString rules;
942 UnicodeString clonedRules;
943 rules = tr->toRules(rules, FALSE);
944 clonedRules = clonedTR->toRules(clonedRules, FALSE);
945 CEASSERT(rules == clonedRules);
946
947 UnicodeSet sourceSet;
948 UnicodeSet clonedSourceSet;
949 tr->getSourceSet(sourceSet);
950 clonedTR->getSourceSet(clonedSourceSet);
951 CEASSERT(clonedSourceSet == sourceSet);
952
953 UnicodeSet targetSet;
954 UnicodeSet clonedTargetSet;
955 tr->getTargetSet(targetSet);
956 clonedTR->getTargetSet(clonedTargetSet);
957 CEASSERT(targetSet == clonedTargetSet);
958
959 UClassID classID = tr->getDynamicClassID();
960 CEASSERT(classID == clonedTR->getDynamicClassID());
961 CEASSERT(classID != 0);
962
963 delete clonedTR;
964 }
965
966 static const int MyUnicodeFunctorTestClassID = 0;
967 class MyUnicodeFunctorTestClass : public UnicodeFunctor {
968 public:
969 virtual UnicodeFunctor* clone() const {return NULL;}
970 static UClassID getStaticClassID(void) {return (UClassID)&MyUnicodeFunctorTestClassID;}
971 virtual UClassID getDynamicClassID(void) const {return getStaticClassID();};
972 virtual void setData(const TransliterationRuleData*) {}
973 };
974
975 void TransliteratorAPITest::TestUnicodeFunctor() {
976 MyUnicodeFunctorTestClass myClass;
977 if (myClass.toMatcher() != NULL) {
978 errln("FAIL: UnicodeFunctor::toMatcher did not return NULL");
979 }
980 if (myClass.toReplacer() != NULL) {
981 errln("FAIL: UnicodeFunctor::toReplacer did not return NULL");
982 }
983 }
984
985
986 #endif /* #if !UCONFIG_NO_TRANSLITERATION */