1 /************************************************************************
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 ************************************************************************/
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"
28 #include "unicode/uniset.h"
30 int32_t getInt(UnicodeString str
)
37 str
.extract(0, len
, buffer
, "");
42 //---------------------------------------------
44 //---------------------------------------------
47 TransliteratorAPITest::runIndexedTest(int32_t index
, UBool exec
,
48 const char* &name
, char* /*par*/) {
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;
70 void TransliteratorAPITest::TestgetID() {
71 UnicodeString trans
="Latin-Greek";
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");
82 errln("FAIL: getID returned " + ID
+ " instead of Latin-Greek");
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){
92 t
= Transliterator::createInstance(ID
, UTRANS_FORWARD
, parseError
, status
);
98 errln("FAIL: getID() returned " + t
->getID() + " instead of " + ID
);
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");
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");
112 Transliterator
* t3
=t1
->clone();
113 Transliterator
* t4
=t2
->clone();
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");
121 Transliterator
* t5
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
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");
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");
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() ");
153 UnicodeString TransID
[]={
154 "Halfwidth-Fullwidth",
155 "Fullwidth-Halfwidth",
158 //"Arabic-Latin", // removed in 2.0
162 //"Hebrew-Latin", // removed in 2.0
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
);
174 errln("FAIL: in instantiation for" + TransID
[i
]);
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]);
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");
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");
217 void TransliteratorAPITest::TestGetDisplayName() {
218 UnicodeString dispNames
[]= {
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"
234 UnicodeString name
="";
236 UnicodeString message
;
237 UErrorCode status
= U_ZERO_ERROR
;
238 UParseError parseError
;
240 #if UCONFIG_NO_FORMATTING
241 logln("Skipping, UCONFIG_NO_FORMATTING is set\n");
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
);
248 errln("FAIL: construction: " + dispNames
[i
+0]);
249 status
= U_ZERO_ERROR
;
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!!!
256 t
->getDisplayName(t
->getID(), Locale::getUS(), name
);
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]);
270 void TransliteratorAPITest::TestTransliterate1(){
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") ,
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"
286 UnicodeString gotResult
;
288 UnicodeString message
;
290 logln("Testing transliterate");
291 UErrorCode status
= U_ZERO_ERROR
;
292 UParseError parseError
;
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
);
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
;
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]);
309 t
->transliterate(temp
);
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]);
316 callEverything(t
, __LINE__
);
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")
333 logln("\n Testing transliterate(String, int, int, StringBuffer)");
335 UnicodeString gotResBuf
;
337 int32_t start
, limit
;
338 UErrorCode status
= U_ZERO_ERROR
;
339 UParseError parseError
;
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
);
344 errln("FAIL: construction: " + prettify(Data2
[i
+0]));
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]);
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__
);
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
));
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");
376 errln("FAIL: start greater than limit value returned" + gotResBuf
);
379 callEverything(t
, __LINE__
);
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", ""),
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
));
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]);
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
);
420 UnicodeString context
;
422 if (parseError
.preContext
[0]) {
423 context
+= (UnicodeString
)" at " + parseError
.preContext
;
425 if (parseError
.postContext
[0]) {
426 context
+= (UnicodeString
)" | " + parseError
.postContext
;
428 errln((UnicodeString
)"FAIL: can't create Any-Hex, " +
429 (UnicodeString
)u_errorName(status
) + context
);
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
);
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()
451 for(uint32_t i
=0; i
<sizeof(index1
)/sizeof(index1
[0]); i
++){
453 t
->transliterate(rs
, index1
[i
], insertion
, status
);
454 if(status
== U_ILLEGAL_ARGUMENT_ERROR
)
455 logln("OK: invalid index values handled correctly");
457 errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString
)u_errorName(status
));
462 void TransliteratorAPITest::TestKeyboardTransliterator1(){
463 UnicodeString Data
[]={
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", "") ,
471 "a", UnicodeString("\\u0061", "") ,
472 "b", UnicodeString("\\u0061\\u0062", "") ,
473 "z", UnicodeString("\\u0061\\u0062\\u007A", "") ,
474 "", UnicodeString("\\u0061\\u0062\\u007A", "")
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
));
485 //keyboardAux(t, Data);
486 UTransPosition index
={0, 0, 0, 0};
489 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
490 for (i
=0; i
<10; i
=i
+2) {
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
));
501 t
->finishTransliteration(s
, index
);
503 // Show the start index '{' and the cursor '|'
504 displayOutput(s
, Data
[i
+1], log
, index
);
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){
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
));
523 t
->finishTransliteration(s
, index
);
525 // Show the start index '{' and the cursor '|'
526 displayOutput(s
, Data
[i
+1], log
, index
);
532 void TransliteratorAPITest::TestKeyboardTransliterator2(){
533 UnicodeString Data
[]={
534 //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
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",
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
);
559 errln("FAIL : construction");
561 keyboardAux(t
, Data
, rs
, 0, 20);
566 t
=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD
, parseError
, status
);
568 errln("FAIL : construction");
570 keyboardAux(t
, Data
, rs
, 20, 40);
574 // t=Transliterator::createInstance("Contracted-Expanded");
575 // keyboardAux(t, Data, rs, 35, 55);
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", "")
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
));
600 errln("FAIL : construction");
601 for(uint32_t i
=0; i
<sizeof(Data
)/sizeof(Data
[0]); i
=i
+4){
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
));
611 t
->finishTransliteration(s
, index
);
613 // Show the start index '{' and the cursor '|'
614 displayOutput(s
, Data
[i
+3], log
, index
);
619 void TransliteratorAPITest::TestNullTransliterator(){
620 UnicodeString
s("Transliterate using null transliterator");
621 NullTransliterator
*nullTrans
=new NullTransliterator();
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");
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
;
638 nullTrans
->handleTransliterate(replaceable
, index
, TRUE
);
639 if(index
.start
!= limit
){
640 errln("ERROR: NullTransliterator->handleTransliterate() failed");
642 doTest((UnicodeString
)"NullTransliterator->handleTransliterate", replaceable
, s
);
643 callEverything(nullTrans
, __LINE__
);
648 void TransliteratorAPITest::TestRegisterUnregister(){
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");
658 if (Transliterator::createInstance("TestA-TestB",
659 (UTransDirection)UTRANS_REVERSE) != NULL) {
660 errln("FAIL: TestA-TestB inverse already registered\n");
664 status
=U_ZERO_ERROR
;
667 Transliterator
*t
= new RuleBasedTransliterator("TestA-TestB",
671 Transliterator::registerInstance(t
);
673 /* Now check again -- should exist now*/
674 Transliterator
*s
= Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD
, parseError
, status
);
676 errln("FAIL: TestA-TestB not registered\n");
679 callEverything(s
, __LINE__
);
680 callEverything(t
, __LINE__
);
684 s = Transliterator::createInstance("TestA-TestB",
685 (UTransDirection)UTRANS_REVERSE);
687 errln("FAIL: TestA-TestB inverse not registered\n");
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");
704 int gTestFilter1ClassID
= 0;
705 int gTestFilter2ClassID
= 0;
706 int gTestFilter3ClassID
= 0;
709 * Used by TestFiltering().
711 class TestFilter1
: public UnicodeFilter
{
712 UClassID
getDynamicClassID()const { return &gTestFilter1ClassID
; }
713 virtual UnicodeFunctor
* clone() const {
714 return new TestFilter1(*this);
716 virtual UBool
contains(UChar32 c
) const {
717 if(c
==0x63 || c
==0x61 || c
==0x43 || c
==0x41)
723 virtual UnicodeString
& toPattern(UnicodeString
& result
,
724 UBool
/*escapeUnprintable*/) const {
727 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
730 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
732 class TestFilter2
: public UnicodeFilter
{
733 UClassID
getDynamicClassID()const { return &gTestFilter2ClassID
; }
734 virtual UnicodeFunctor
* clone() const {
735 return new TestFilter2(*this);
737 virtual UBool
contains(UChar32 c
) const {
738 if(c
==0x65 || c
==0x6c)
744 virtual UnicodeString
& toPattern(UnicodeString
& result
,
745 UBool
/*escapeUnprintable*/) const {
748 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
751 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
753 class TestFilter3
: public UnicodeFilter
{
754 UClassID
getDynamicClassID()const { return &gTestFilter3ClassID
; }
755 virtual UnicodeFunctor
* clone() const {
756 return new TestFilter3(*this);
758 virtual UBool
contains(UChar32 c
) const {
759 if(c
==0x6f || c
==0x77)
765 virtual UnicodeString
& toPattern(UnicodeString
& result
,
766 UBool
/*escapeUnprintable*/) const {
769 virtual UBool
matchesIndexValue(uint8_t /*v*/) const {
772 virtual void addMatchSetTo(UnicodeSet
& /*toUnionTo*/) const {}
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
));
786 errln("FAIL : construction");
787 const UnicodeFilter
*u
=t
->getFilter();
789 errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
792 UnicodeString got
, temp
, message
;
793 UnicodeString data
="ABCabcbbCBa";
795 t
->transliterate(temp
);
796 t
->adoptFilter(new TestFilter1
);
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
);
804 logln("Testing round trip");
805 t
->adoptFilter((UnicodeFilter
*)u
);
806 if(t
->getFilter() == NULL
)
807 logln("OK: adoptFilter and getFilter round trip worked");
809 errln("FAIL: adoptFilter or getFilter round trip failed");
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
);
819 t
->adoptFilter(new TestFilter2
);
820 callEverything(t
, __LINE__
);
822 exp
=UnicodeString("\\u0068eell\\u006Fe", "");
824 t
->transliterate(got
);
825 message
="transliteration using (e,l) filter";
826 doTest("transliteration using (e,l) filter", got
, exp
);
829 exp
=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
831 t
->transliterate(got
);
832 doTest(message
, got
, exp
);
834 t
->adoptFilter(new TestFilter3
);
836 exp
=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
838 t
->transliterate(got
);
839 message
="transliteration using (o,w) filter";
840 doTest("transliteration using (o,w) filter", got
, exp
);
843 exp
=UnicodeString("ow\\u006C", "");
845 t
->transliterate(got
);
846 doTest("transliteration using (o,w) filter", got
, exp
);
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) {
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
));
870 t
->finishTransliteration(s
, index
);
872 // Show the start index '{' and the cursor '|'
873 displayOutput(s
, DATA
[i
+1], log
, index
);
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
);
887 append((UChar
)0x7b/*{*/).
889 append((UChar
)0x7c/*|*/).
893 append((UChar
)0x7d/*}*/).
896 logln("OK:" + prettify(log
));
898 errln("FAIL: " + prettify(log
) + ", expected " + prettify(expected
));
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
) + "\"");
907 errln((UnicodeString
)"FAIL:" + message
+ " failed Got-->" + prettify(result
)+ ", Expected--> " + prettify(expected
) );
912 // callEverything call all of the const (non-destructive) methods on a
913 // transliterator, just to verify that they don't fail in some
916 #define CEASSERT(a) {if (!(a)) { \
917 errln("FAIL at line %d from line %d: %s", __LINE__, line, #a); return; }}
919 void TransliteratorAPITest::callEverything(const Transliterator
*tr
, int line
) {
920 Transliterator
*clonedTR
= tr
->clone();
921 CEASSERT(clonedTR
!= NULL
);
923 int32_t maxcl
= tr
->getMaximumContextLength();
924 CEASSERT(clonedTR
->getMaximumContextLength() == maxcl
);
927 UnicodeString clonedId
;
929 clonedId
= clonedTR
->getID();
930 CEASSERT(id
== clonedId
);
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
);
938 CEASSERT(filter
!= clonedFilter
);
942 UnicodeString clonedRules
;
943 rules
= tr
->toRules(rules
, FALSE
);
944 clonedRules
= clonedTR
->toRules(clonedRules
, FALSE
);
945 CEASSERT(rules
== clonedRules
);
947 UnicodeSet sourceSet
;
948 UnicodeSet clonedSourceSet
;
949 tr
->getSourceSet(sourceSet
);
950 clonedTR
->getSourceSet(clonedSourceSet
);
951 CEASSERT(clonedSourceSet
== sourceSet
);
953 UnicodeSet targetSet
;
954 UnicodeSet clonedTargetSet
;
955 tr
->getTargetSet(targetSet
);
956 clonedTR
->getTargetSet(clonedTargetSet
);
957 CEASSERT(targetSet
== clonedTargetSet
);
959 UClassID classID
= tr
->getDynamicClassID();
960 CEASSERT(classID
== clonedTR
->getDynamicClassID());
961 CEASSERT(classID
!= 0);
966 static const int MyUnicodeFunctorTestClassID
= 0;
967 class MyUnicodeFunctorTestClass
: public UnicodeFunctor
{
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
*) {}
975 void TransliteratorAPITest::TestUnicodeFunctor() {
976 MyUnicodeFunctorTestClass myClass
;
977 if (myClass
.toMatcher() != NULL
) {
978 errln("FAIL: UnicodeFunctor::toMatcher did not return NULL");
980 if (myClass
.toReplacer() != NULL
) {
981 errln("FAIL: UnicodeFunctor::toReplacer did not return NULL");
986 #endif /* #if !UCONFIG_NO_TRANSLITERATION */