1 /********************************************************************
3 * Copyright (c) 2000-2003, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6 /************************************************************************
7 * Date Name Description
8 * 1/03/2000 Madhu Creation.
9 ************************************************************************/
11 #include "unicode/utypes.h"
13 #if !UCONFIG_NO_TRANSLITERATION
17 #include "unicode/utypes.h"
18 #include "unicode/translit.h"
20 #include "unicode/unifilt.h"
26 #include "unicode/rep.h"
27 #include "unicode/locid.h"
29 int32_t getInt(UnicodeString str
)
36 str
.extract(0, len
, buffer
, "");
41 //---------------------------------------------
43 //---------------------------------------------
46 TransliteratorAPITest::runIndexedTest(int32_t index
, UBool exec
,
47 const char* &name
, char* /*par*/) {
49 TESTCASE(0,TestgetInverse
);
50 TESTCASE(1,TestgetID
);
51 TESTCASE(2,TestGetDisplayName
);
52 TESTCASE(3,TestTransliterate1
);
53 TESTCASE(4,TestTransliterate2
);
54 TESTCASE(5,TestTransliterate3
);
55 TESTCASE(6,TestSimpleKeyboardTransliterator
);
56 TESTCASE(7,TestKeyboardTransliterator1
);
57 TESTCASE(8,TestKeyboardTransliterator2
);
58 TESTCASE(9,TestKeyboardTransliterator3
);
59 TESTCASE(10,TestGetAdoptFilter
);
60 TESTCASE(11,TestClone
);
61 TESTCASE(12,TestNullTransliterator
);
62 TESTCASE(13,TestRegisterUnregister
);
63 default: name
= ""; break;
68 void TransliteratorAPITest::TestgetID() {
69 UnicodeString trans
="Latin-Greek";
71 UParseError parseError
;
72 UErrorCode status
= U_ZERO_ERROR
;
73 Transliterator
* t
= Transliterator::createInstance(trans
, UTRANS_FORWARD
, parseError
, status
);
74 if(t
==0 || U_FAILURE(status
)){
75 errln("FAIL: construction of Latin-Greek");
80 errln("FAIL: getID returned " + ID
+ " instead of Latin-Greek");
84 for (i
=0; i
<Transliterator::countAvailableIDs(); i
++){
85 status
= U_ZERO_ERROR
;
86 ID
= (UnicodeString
) Transliterator::getAvailableID(i
);
87 t
= Transliterator::createInstance(ID
, UTRANS_FORWARD
, parseError
, status
);
93 errln("FAIL: getID() returned " + t
->getID() + " instead of " + ID
);
96 ID
=(UnicodeString
)Transliterator::getAvailableID(i
);
97 if(ID
!= (UnicodeString
)Transliterator::getAvailableID(0)){
98 errln("FAIL: calling getAvailableID(index > coundAvailableIDs) should make index=0\n");
101 Transliterator
* t1
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
102 Transliterator
* t2
=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD
, parseError
, status
);
103 if(t1
==0 || t2
== 0){
104 errln("FAIL: construction");
107 Transliterator
* t3
=t1
->clone();
108 Transliterator
* t4
=t2
->clone();
110 if(t1
->getID() != t3
->getID() || t2
->getID() != t4
->getID() ||
111 t1
->getID() == t4
->getID() || t2
->getID() == t3
->getID() ||
112 t1
->getID()== t4
->getID() )
113 errln("FAIL: getID or clone failed");
116 Transliterator
* t5
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
118 errln("FAIL: construction");
119 if(t1
->getID() != t5
->getID() || t5
->getID() != t3
->getID() || t1
->getID() != t3
->getID())
120 errln("FAIL: getID or clone failed");
130 void TransliteratorAPITest::TestgetInverse() {
131 UErrorCode status
= U_ZERO_ERROR
;
132 UParseError parseError
;
133 Transliterator
* t1
= Transliterator::createInstance("Katakana-Latin", UTRANS_FORWARD
, parseError
, status
);
134 Transliterator
* invt1
= Transliterator::createInstance("Latin-Katakana", UTRANS_FORWARD
, parseError
, status
);
135 Transliterator
* t2
= Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
136 Transliterator
* invt2
= Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD
, parseError
, status
);
137 if(t1
== 0 || invt1
== 0 || t2
== 0 || invt2
== 0) {
138 errln("FAIL: in instantiation");
142 Transliterator
* inverse1
=t1
->createInverse(status
);
143 Transliterator
* inverse2
=t2
->createInverse(status
);
144 if(inverse1
->getID() != invt1
->getID() || inverse2
->getID() != invt2
->getID()
145 || inverse1
->getID() == invt2
->getID() || inverse2
->getID() == invt1
->getID() )
146 errln("FAIL: getInverse() ");
148 UnicodeString TransID
[]={
149 "Halfwidth-Fullwidth",
150 "Fullwidth-Halfwidth",
153 //"Arabic-Latin", // removed in 2.0
157 //"Hebrew-Latin", // removed in 2.0
166 for(uint32_t i
=0; i
<sizeof(TransID
)/sizeof(TransID
[0]); i
=i
+2){
167 Transliterator
*trans1
=Transliterator::createInstance(TransID
[i
], UTRANS_FORWARD
, parseError
, status
);
169 errln("FAIL: in instantiation for" + TransID
[i
]);
172 Transliterator
*inver1
=trans1
->createInverse(status
);
173 if(inver1
->getID() != TransID
[i
+1] )
174 errln("FAIL :getInverse() for " + TransID
[i
] + " returned " + inver1
->getID() + " instead of " + TransID
[i
+1]);
187 void TransliteratorAPITest::TestClone(){
188 Transliterator
*t1
, *t2
, *t3
, *t4
;
189 UErrorCode status
= U_ZERO_ERROR
;
190 UParseError parseError
;
191 t1
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
192 t2
=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD
, parseError
, status
);
193 if(t1
== 0 || t2
== 0){
194 errln("FAIL: construction");
200 if(t1
->getID() != t3
->getID() || t2
->getID() != t4
->getID() )
201 errln("FAIL: clone or getID failed");
202 if(t1
->getID()==t4
->getID() || t2
->getID()==t3
->getID() || t1
->getID()==t4
->getID())
203 errln("FAIL: clone or getID failed");
212 void TransliteratorAPITest::TestGetDisplayName() {
213 UnicodeString dispNames
[]= {
215 //"CurlyQuotes-StraightQuotes" ,"CurlyQuotes to StraightQuotes",
216 "Any-Hex" ,"Any to Hex Escape",
217 "Halfwidth-Fullwidth" ,"Halfwidth to Fullwidth" ,
218 //"Latin-Arabic" ,"Latin to Arabic" ,
219 "Latin-Devanagari" ,"Latin to Devanagari" ,
220 "Greek-Latin" ,"Greek to Latin" ,
221 //"Arabic-Latin" ,"Arabic to Latin" ,
222 "Hex-Any" ,"Hex Escape to Any",
223 "Cyrillic-Latin" ,"Cyrillic to Latin" ,
224 "Latin-Greek" ,"Latin to Greek" ,
225 "Latin-Katakana" ,"Latin to Katakana" ,
226 //"Latin-Hebrew" ,"Latin to Hebrew" ,
227 "Katakana-Latin" ,"Katakana to Latin"
229 UnicodeString name
="";
231 UnicodeString message
;
232 UErrorCode status
= U_ZERO_ERROR
;
233 UParseError parseError
;
235 #if UCONFIG_NO_FORMATTING
236 logln("Skipping, UCONFIG_NO_FORMATTING is set\n");
240 for (uint32_t i
=0; i
<sizeof(dispNames
)/sizeof(dispNames
[0]); i
=i
+2 ) {
241 t
= Transliterator::createInstance(dispNames
[i
+0], UTRANS_FORWARD
, parseError
, status
);
243 errln("FAIL: construction: " + dispNames
[i
+0]);
244 status
= U_ZERO_ERROR
;
247 t
->getDisplayName(t
->getID(), name
);
248 message
="Display name for ID:" + t
->getID();
249 // doTest(message, name, dispNames[i+1]); //!!! This will obviously fail for any locale other than english and its children!!!
251 t
->getDisplayName(t
->getID(), Locale::getUS(), name
);
253 message
.append("Display name for on english locale ID:");
254 message
.append(t
->getID());
255 // message="Display name for on english locale ID:" + t->getID();
256 doTest(message
, name
, dispNames
[i
+1]);
265 void TransliteratorAPITest::TestTransliterate1(){
267 UnicodeString Data
[]={
268 //ID, input string, transliterated string
269 "Any-Hex", "hello", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", "") ,
270 "Hex-Any", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), "hello" ,
271 "Latin-Devanagari",CharsToUnicodeString("bha\\u0304rata"), CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924") ,
272 "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") ,
274 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), UnicodeString("bh\\u0101rata"),
275 // "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042") ,
276 // "Expanded-Contracted", CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042"), CharsToUnicodeString("\\u00C0\\u00C1\\u0042") ,
277 //"Latin-Arabic", "aap", CharsToUnicodeString("\\u0627\\u06A4") ,
278 //"Arabic-Latin", CharsToUnicodeString("\\u0627\\u06A4"), "aap"
281 UnicodeString gotResult
;
283 UnicodeString message
;
285 logln("Testing transliterate");
286 UErrorCode status
= U_ZERO_ERROR
;
287 UParseError parseError
;
289 for(uint32_t i
=0;i
<sizeof(Data
)/sizeof(Data
[0]); i
=i
+3){
290 t
=Transliterator::createInstance(Data
[i
+0], UTRANS_FORWARD
, parseError
, status
);
292 errln("FAIL: construction: " + Data
[i
+0] + " Error: " + u_errorName(status
));
293 errln("PreContext: " + prettify(parseError
.preContext
) + " PostContext: " + prettify( parseError
.postContext
) );
294 status
= U_ZERO_ERROR
;
297 gotResult
= Data
[i
+1];
298 t
->transliterate(gotResult
);
299 message
=t
->getID() + "->transliterate(UnicodeString, UnicodeString) for\n\t Source:" + prettify(Data
[i
+1]);
300 doTest(message
, gotResult
, Data
[i
+2]);
304 t
->transliterate(temp
);
306 message
.append(t
->getID());
307 message
.append("->transliterate(Replaceable) for \n\tSource:");
308 message
.append(Data
[i
][1]);
309 doTest(message
, temp
, Data
[i
+2]);
315 void TransliteratorAPITest::TestTransliterate2(){
316 //testing tranliterate(String text, int start, int limit, StringBuffer result)
317 UnicodeString Data2
[]={
318 //ID, input string, start, limit, transliterated string
319 "Any-Hex", "hello! How are you?", "0", "5", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F! How are you?", "") ,
320 "Any-Hex", "hello! How are you?", "7", "12", UnicodeString("\\u0048\\u006F\\u0077\\u0020\\u0061", ""), UnicodeString("hello! \\u0048\\u006F\\u0077\\u0020\\u0061re you?", ""),
321 "Hex-Any", CharsToUnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F\\u0021\\u0020"), "0", "5", "hello", "hello! " ,
322 // "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), "1", "2", CharsToUnicodeString("\\u0041\\u0301"), CharsToUnicodeString("\\u00C0\\u0041\\u0301\\u0042") ,
323 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "0", "1", "bha", CharsToUnicodeString("bha\\u093E\\u0930\\u0924") ,
324 "Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "1", "2", "\\u0314\\u0101", CharsToUnicodeString("\\u092D\\u0314\\u0101\\u0930\\u0924")
327 logln("\n Testing transliterate(String, int, int, StringBuffer)");
329 UnicodeString gotResBuf
;
331 int32_t start
, limit
;
332 UErrorCode status
= U_ZERO_ERROR
;
333 UParseError parseError
;
335 for(uint32_t i
=0; i
<sizeof(Data2
)/sizeof(Data2
[0]); i
=i
+6){
336 t
=Transliterator::createInstance(Data2
[i
+0], UTRANS_FORWARD
, parseError
, status
);
338 errln("FAIL: construction: " + prettify(Data2
[i
+0]));
341 start
=getInt(Data2
[i
+2]);
342 limit
=getInt(Data2
[i
+3]);
343 Data2
[i
+1].extractBetween(start
, limit
, gotResBuf
);
344 t
->transliterate(gotResBuf
);
345 // errln("FAIL: calling transliterate on " + t->getID());
346 doTest(t
->getID() + ".transliterate(UnicodeString, int32_t, int32_t, UnicodeString):(" + start
+ "," + limit
+ ") for \n\t source: " + prettify(Data2
[i
+1]), gotResBuf
, Data2
[i
+4]);
349 t
->transliterate(temp
, start
, limit
);
350 doTest(t
->getID() + ".transliterate(Replaceable, int32_t, int32_t, ):(" + start
+ "," + limit
+ ") for \n\t source: " + prettify(Data2
[i
+1]), temp
, Data2
[i
+5]);
351 status
= U_ZERO_ERROR
;
356 status
= U_ZERO_ERROR
;
357 logln("\n Try calling transliterate with illegal start and limit values");
358 t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
359 if(U_FAILURE(status
)) {
360 errln("Error creating transliterator %s", u_errorName(status
));
364 gotResBuf
= temp
= "try start greater than limit";
365 t
->transliterate(gotResBuf
, 10, 5);
366 if(gotResBuf
== temp
)
367 logln("OK: start greater than limit value handled correctly");
369 errln("FAIL: start greater than limit value returned" + gotResBuf
);
374 void TransliteratorAPITest::TestTransliterate3(){
375 UnicodeString rs
="This is the replaceable String";
376 UnicodeString Data
[] = {
377 "0", "0", "This is the replaceable String",
378 "2", "3", UnicodeString("Th\\u0069s is the replaceable String", ""),
379 "21", "23", UnicodeString("Th\\u0069s is the repl\\u0061\\u0063eable String", ""),
380 "14", "17", UnicodeString("Th\\u0069s is t\\u0068\\u0065\\u0020repl\\u0061\\u0063eable String", ""),
383 UnicodeString message
;
384 UParseError parseError
;
385 UErrorCode status
= U_ZERO_ERROR
;
386 Transliterator
*t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
387 if(U_FAILURE(status
)) {
388 errln("Error creating transliterator %s", u_errorName(status
));
394 errln("FAIL : construction");
395 for(uint32_t i
=0; i
<sizeof(Data
)/sizeof(Data
[0]); i
=i
+3){
396 start
=getInt(Data
[i
+0]);
397 limit
=getInt(Data
[i
+1]);
398 t
->transliterate(rs
, start
, limit
);
399 message
=t
->getID() + ".transliterate(ReplaceableString, start, limit):("+start
+","+limit
+"):";
400 doTest(message
, rs
, Data
[i
+2]);
405 void TransliteratorAPITest::TestSimpleKeyboardTransliterator(){
406 logln("simple call to transliterate");
407 UErrorCode status
=U_ZERO_ERROR
;
408 UParseError parseError
;
409 Transliterator
* t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
411 errln((UnicodeString
)"FAIL: can't create Any-Hex, " +
412 (UnicodeString
)u_errorName(status
) +
413 (parseError
.preContext
[0] ?
414 ((UnicodeString
)" at " + parseError
.preContext
+
415 (parseError
.postContext
[0] ?
416 ((UnicodeString
)" | " + parseError
.postContext
) : (UnicodeString
)"")) : (UnicodeString
)""));
419 UTransPosition index
={19,20,20,20};
420 UnicodeString rs
= "Transliterate this-''";
421 UnicodeString insertion
="abc";
422 UnicodeString expected
=UnicodeString("Transliterate this-'\\u0061\\u0062\\u0063'", "");
423 t
->transliterate(rs
, index
, insertion
, status
);
424 if(U_FAILURE(status
))
425 errln("FAIL: " + t
->getID()+ ".translitere(Replaceable, int[], UnicodeString, UErrorCode)-->" + (UnicodeString
)u_errorName(status
));
426 t
->finishTransliteration(rs
, index
);
427 UnicodeString message
="transliterate";
428 doTest(message
, rs
, expected
);
430 logln("try calling transliterate with invalid index values");
431 UTransPosition index1
[]={
432 //START, LIMIT, CURSOR
433 {10, 10, 12, 10}, //invalid since CURSOR>LIMIT valid:-START <= CURSOR <= LIMIT
434 {17, 16, 17, 17}, //invalid since START>LIMIT valid:-0<=START<=LIMIT
435 {-1, 16, 14, 16}, //invalid since START<0
436 {3, 50, 2, 50} //invalid since LIMIT>text.length()
438 for(uint32_t i
=0; i
<sizeof(index1
)/sizeof(index1
[0]); i
++){
440 t
->transliterate(rs
, index1
[i
], insertion
, status
);
441 if(status
== U_ILLEGAL_ARGUMENT_ERROR
)
442 logln("OK: invalid index values handled correctly");
444 errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString
)u_errorName(status
));
449 void TransliteratorAPITest::TestKeyboardTransliterator1(){
450 UnicodeString Data
[]={
452 "a", UnicodeString("\\u0061", "") ,
453 "bbb", UnicodeString("\\u0061\\u0062\\u0062\\u0062", "") ,
454 "ca", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061", "") ,
455 " ", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
456 "", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
458 "a", UnicodeString("\\u0061", "") ,
459 "b", UnicodeString("\\u0061\\u0062", "") ,
460 "z", UnicodeString("\\u0061\\u0062\\u007A", "") ,
461 "", UnicodeString("\\u0061\\u0062\\u007A", "")
464 UParseError parseError
;
465 UErrorCode status
= U_ZERO_ERROR
;
466 Transliterator
* t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
467 if(U_FAILURE(status
)) {
468 errln("Error creating transliterator %s", u_errorName(status
));
472 //keyboardAux(t, Data);
473 UTransPosition index
={0, 0, 0, 0};
476 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
477 for (i
=0; i
<10; i
=i
+2) {
479 if (Data
[i
+0] != "") {
480 log
= s
+ " + " + Data
[i
+0] + " -> ";
481 t
->transliterate(s
, index
, Data
[i
+0], status
);
482 if(U_FAILURE(status
)){
483 errln("FAIL: " + t
->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString
)u_errorName(status
));
488 t
->finishTransliteration(s
, index
);
490 // Show the start index '{' and the cursor '|'
491 displayOutput(s
, Data
[i
+1], log
, index
);
497 index
.contextStart
= index
.contextLimit
= index
.start
= index
.limit
= 0;
498 logln("Testing transliterate(Replaceable, int32_t, UChar, UErrorCode)");
499 for(i
=10; i
<sizeof(Data
)/sizeof(Data
[0]); i
=i
+2){
501 if (Data
[i
+0] != "") {
502 log
= s
+ " + " + Data
[i
+0] + " -> ";
503 UChar c
=Data
[i
+0].charAt(0);
504 t
->transliterate(s
, index
, c
, status
);
505 if(U_FAILURE(status
))
506 errln("FAIL: " + t
->getID()+ ".transliterate(Replaceable, int32_t[], UChar, UErrorCode)-->" + (UnicodeString
)u_errorName(status
));
510 t
->finishTransliteration(s
, index
);
512 // Show the start index '{' and the cursor '|'
513 displayOutput(s
, Data
[i
+1], log
, index
);
519 void TransliteratorAPITest::TestKeyboardTransliterator2(){
520 UnicodeString Data
[]={
521 //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
523 "abc", UnicodeString("Initial String: add-\\u0061\\u0062\\u0063-", ""), "19", "20", "20",
524 "a", UnicodeString("In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "2", "3", "2" ,
525 "b", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
526 "", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
527 //data for Latin-Devanagiri
528 CharsToUnicodeString("a\\u0304"), CharsToUnicodeString("Hindi -\\u0906-"), "6", "7", "6",
529 CharsToUnicodeString("ma\\u0304"), CharsToUnicodeString("Hindi -\\u0906\\u092E\\u093E-"), "7", "8", "7",
530 CharsToUnicodeString("ra\\u0304"), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2",
531 CharsToUnicodeString(""), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2"
532 //data for contracted-Expanded
533 // CharsToUnicodeString("\\u00C1"), CharsToUnicodeString("Ad\\u0041\\u0301d here:"), "1", "2", "1" ,
534 // CharsToUnicodeString("\\u00C0"), CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
535 // "", CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
539 UnicodeString dataStr
;
540 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
541 UErrorCode status
= U_ZERO_ERROR
;
542 UParseError parseError
;
543 rs
="Initial String: add--";
544 t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
546 errln("FAIL : construction");
548 keyboardAux(t
, Data
, rs
, 0, 20);
553 t
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
555 errln("FAIL : construction");
557 keyboardAux(t
, Data
, rs
, 20, 40);
561 // t=Transliterator::createInstance("Contracted-Expanded");
562 // keyboardAux(t, Data, rs, 35, 55);
568 void TransliteratorAPITest::TestKeyboardTransliterator3(){
569 UnicodeString s
="This is the main string";
570 UnicodeString Data
[] = {
571 "0", "0", "0", "This is the main string",
572 "1", "3", "2", UnicodeString("Th\\u0069s is the main string", ""),
573 "20", "21", "20", UnicodeString("Th\\u0069s is the mai\\u006E string", "")
576 UErrorCode status
=U_ZERO_ERROR
;
577 UParseError parseError
;
578 UTransPosition index
={0, 0, 0, 0};
579 logln("Testing transliterate(Replaceable, int32_t, UErrorCode)");
580 Transliterator
*t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
581 if(U_FAILURE(status
)) {
582 errln("Error creating transliterator %s", u_errorName(status
));
587 errln("FAIL : construction");
588 for(uint32_t i
=0; i
<sizeof(Data
)/sizeof(Data
[0]); i
=i
+4){
590 index
.contextStart
=getInt(Data
[i
+0]);
591 index
.contextLimit
=index
.limit
=getInt(Data
[i
+1]);
592 index
.start
=getInt(Data
[i
+2]);
593 t
->transliterate(s
, index
, status
);
594 if(U_FAILURE(status
)){
595 errln("FAIL: " + t
->getID()+ ".transliterate(Replaceable, int32_t[], UErrorCode)-->" + (UnicodeString
)u_errorName(status
));
598 t
->finishTransliteration(s
, index
);
600 // Show the start index '{' and the cursor '|'
601 displayOutput(s
, Data
[i
+3], log
, index
);
606 void TransliteratorAPITest::TestNullTransliterator(){
607 UnicodeString
s("Transliterate using null transliterator");
608 NullTransliterator
*nullTrans
=new NullTransliterator();
611 int32_t limit
=s
.length();
612 UnicodeString replaceable
=s
;
613 transLimit
=nullTrans
->transliterate(replaceable
, start
, limit
);
614 if(transLimit
!= limit
){
615 errln("ERROR: NullTransliterator->transliterate() failed");
617 doTest((UnicodeString
)"nulTrans->transliterate", replaceable
, s
);
618 replaceable
.remove();
619 replaceable
.append(s
);
620 UTransPosition index
;
621 index
.contextStart
=start
;
622 index
.contextLimit
= limit
;
625 nullTrans
->handleTransliterate(replaceable
, index
, TRUE
);
626 if(index
.start
!= limit
){
627 errln("ERROR: NullTransliterator->handleTransliterate() failed");
629 doTest((UnicodeString
)"NullTransliterator->handleTransliterate", replaceable
, s
);
634 void TransliteratorAPITest::TestRegisterUnregister(){
636 UErrorCode status
=U_ZERO_ERROR
;
637 UParseError parseError
;
638 /* Make sure it doesn't exist */
639 if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD
, parseError
, status
) != NULL
) {
640 errln("FAIL: TestA-TestB already registered\n");
644 if (Transliterator::createInstance("TestA-TestB",
645 (UTransDirection)UTRANS_REVERSE) != NULL) {
646 errln("FAIL: TestA-TestB inverse already registered\n");
650 status
=U_ZERO_ERROR
;
653 Transliterator
*t
= new RuleBasedTransliterator("TestA-TestB",
657 Transliterator::registerInstance(t
);
659 /* Now check again -- should exist now*/
660 Transliterator
*s
= Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD
, parseError
, status
);
662 errln("FAIL: TestA-TestB not registered\n");
668 s = Transliterator::createInstance("TestA-TestB",
669 (UTransDirection)UTRANS_REVERSE);
671 errln("FAIL: TestA-TestB inverse not registered\n");
677 /*unregister the instance*/
678 Transliterator::unregister("TestA-TestB");
679 /* now Make sure it doesn't exist */
680 if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD
, parseError
, status
) != NULL
) {
681 errln("FAIL: TestA-TestB isn't unregistered\n");
688 int gTestFilter1ClassID
= 0;
689 int gTestFilter2ClassID
= 0;
690 int gTestFilter3ClassID
= 0;
693 * Used by TestFiltering().
695 class TestFilter1
: public UnicodeFilter
{
696 UClassID
getDynamicClassID()const { return &gTestFilter1ClassID
; }
697 virtual UnicodeFunctor
* clone() const {
698 return new TestFilter1(*this);
700 virtual UBool
contains(UChar32 c
) const {
701 if(c
==0x63 || c
==0x61 || c
==0x43 || c
==0x41)
707 virtual UnicodeString
& toPattern(UnicodeString
& result
,
708 UBool
/*escapeUnprintable*/) const {
711 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
714 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
716 class TestFilter2
: public UnicodeFilter
{
717 UClassID
getDynamicClassID()const { return &gTestFilter2ClassID
; }
718 virtual UnicodeFunctor
* clone() const {
719 return new TestFilter2(*this);
721 virtual UBool
contains(UChar32 c
) const {
722 if(c
==0x65 || c
==0x6c)
728 virtual UnicodeString
& toPattern(UnicodeString
& result
,
729 UBool
/*escapeUnprintable*/) const {
732 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
735 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
737 class TestFilter3
: public UnicodeFilter
{
738 UClassID
getDynamicClassID()const { return &gTestFilter3ClassID
; }
739 virtual UnicodeFunctor
* clone() const {
740 return new TestFilter3(*this);
742 virtual UBool
contains(UChar32 c
) const {
743 if(c
==0x6f || c
==0x77)
749 virtual UnicodeString
& toPattern(UnicodeString
& result
,
750 UBool
/*escapeUnprintable*/) const {
753 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
756 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
760 void TransliteratorAPITest::TestGetAdoptFilter(){
761 UErrorCode status
= U_ZERO_ERROR
;
762 UParseError parseError
;
763 Transliterator
*t
=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD
, parseError
, status
);
764 if(U_FAILURE(status
)) {
765 errln("Error creating transliterator %s", u_errorName(status
));
770 errln("FAIL : construction");
771 const UnicodeFilter
*u
=t
->getFilter();
773 errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
776 UnicodeString got
, temp
, message
;
777 UnicodeString data
="ABCabcbbCBa";
779 t
->transliterate(temp
);
780 t
->adoptFilter(new TestFilter1
);
783 t
->transliterate(got
);
784 UnicodeString exp
=UnicodeString("A\\u0042Ca\\u0062c\\u0062\\u0062C\\u0042a", "");
785 message
="transliteration after adoptFilter(a,A,c,C) ";
786 doTest(message
, got
, exp
);
788 logln("Testing round trip");
789 t
->adoptFilter((UnicodeFilter
*)u
);
790 if(t
->getFilter() == NULL
)
791 logln("OK: adoptFilter and getFilter round trip worked");
793 errln("FAIL: adoptFilter or getFilter round trip failed");
796 t
->transliterate(got
);
797 exp
=UnicodeString("\\u0041\\u0042\\u0043\\u0061\\u0062\\u0063\\u0062\\u0062\\u0043\\u0042\\u0061", "");
798 message
="transliteration after adopting null filter";
799 doTest(message
, got
, exp
);
800 message
="adoptFilter round trip";
801 doTest("adoptFilter round trip", got
, temp
);
803 t
->adoptFilter(new TestFilter2
);
805 exp
=UnicodeString("\\u0068eell\\u006Fe", "");
807 t
->transliterate(got
);
808 message
="transliteration using (e,l) filter";
809 doTest("transliteration using (e,l) filter", got
, exp
);
812 exp
=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
814 t
->transliterate(got
);
815 doTest(message
, got
, exp
);
817 t
->adoptFilter(new TestFilter3
);
819 exp
=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
821 t
->transliterate(got
);
822 message
="transliteration using (o,w) filter";
823 doTest("transliteration using (o,w) filter", got
, exp
);
826 exp
=UnicodeString("ow\\u006C", "");
828 t
->transliterate(got
);
829 doTest("transliteration using (o,w) filter", got
, exp
);
837 void TransliteratorAPITest::keyboardAux(Transliterator
*t
, UnicodeString DATA
[], UnicodeString
& s
, int32_t begin
, int32_t end
) {
838 UTransPosition index
={0, 0, 0, 0};
839 UErrorCode status
=U_ZERO_ERROR
;
840 for (int32_t i
=begin
; i
<end
; i
=i
+5) {
842 if (DATA
[i
+0] != "") {
843 log
= s
+ " + " + DATA
[i
] + " -> ";
844 index
.contextStart
=getInt(DATA
[i
+2]);
845 index
.contextLimit
=index
.limit
=getInt(DATA
[i
+3]);
846 index
.start
=getInt(DATA
[i
+4]);
847 t
->transliterate(s
, index
, DATA
[i
+0], status
);
848 if(U_FAILURE(status
)){
849 errln("FAIL: " + t
->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString
)u_errorName(status
));
853 t
->finishTransliteration(s
, index
);
855 // Show the start index '{' and the cursor '|'
856 displayOutput(s
, DATA
[i
+1], log
, index
);
861 void TransliteratorAPITest::displayOutput(const UnicodeString
& got
, const UnicodeString
& expected
, UnicodeString
& log
, UTransPosition
& index
){
862 // Show the start index '{' and the cursor '|'
863 UnicodeString a
, b
, c
, d
, e
;
864 got
.extractBetween(0, index
.contextStart
, a
);
865 got
.extractBetween(index
.contextStart
, index
.start
, b
);
866 got
.extractBetween(index
.start
, index
.limit
, c
);
867 got
.extractBetween(index
.limit
, index
.contextLimit
, d
);
868 got
.extractBetween(index
.contextLimit
, got
.length(), e
);
870 append((UChar
)0x7b/*{*/).
872 append((UChar
)0x7c/*|*/).
876 append((UChar
)0x7d/*}*/).
879 logln("OK:" + prettify(log
));
881 errln("FAIL: " + prettify(log
) + ", expected " + prettify(expected
));
885 /*Internal Functions used*/
886 void TransliteratorAPITest::doTest(const UnicodeString
& message
, const UnicodeString
& result
, const UnicodeString
& expected
){
887 if (prettify(result
) == prettify(expected
))
888 logln((UnicodeString
)"Ok: " + prettify(message
) + " passed \"" + prettify(expected
) + "\"");
890 errln((UnicodeString
)"FAIL:" + message
+ " failed Got-->" + prettify(result
)+ ", Expected--> " + prettify(expected
) );
893 #endif /* #if !UCONFIG_NO_TRANSLITERATION */