1
/********************************************************************
3
* Copyright (c) 2001, International Business Machines Corporation and
4
* others. All Rights Reserved.
5
********************************************************************/
6
/************************************************************************
7
* Date Name Description
8
* 1/03/2000 Madhu Creation.
9
************************************************************************/
13
#include "unicode/utypes.h"
14
#include "unicode/translit.h"
15
#include "unicode/rbt.h"
16
#include "unicode/unifilt.h"
17
#include "unicode/cpdtrans.h"
18
#include "unicode/nultrans.h"
22
#include "unicode/rep.h"
23
#include "unicode/locid.h"
25
int32_t getInt(UnicodeString str)
32
str.extract(0, len, buffer, "");
37
//---------------------------------------------
39
//---------------------------------------------
42
TransliteratorAPITest::runIndexedTest(int32_t index, UBool exec,
43
const char* &name, char* /*par*/) {
45
TESTCASE(0,TestgetInverse);
46
TESTCASE(1,TestgetID);
47
TESTCASE(2,TestGetDisplayName);
48
TESTCASE(3,TestTransliterate1);
49
TESTCASE(4,TestTransliterate2);
50
TESTCASE(5,TestTransliterate3);
51
TESTCASE(6,TestSimpleKeyboardTransliterator);
52
TESTCASE(7,TestKeyboardTransliterator1);
53
TESTCASE(8,TestKeyboardTransliterator2);
54
TESTCASE(9,TestKeyboardTransliterator3);
55
TESTCASE(10,TestGetAdoptFilter);
56
TESTCASE(11,TestClone);
57
TESTCASE(12,TestNullTransliterator);
58
TESTCASE(13,TestRegisterUnregister);
59
default: name = ""; break;
64
void TransliteratorAPITest::TestgetID() {
65
UnicodeString trans="Latin-Greek";
67
UParseError parseError;
68
UErrorCode status = U_ZERO_ERROR;
69
Transliterator* t= Transliterator::createInstance(trans, UTRANS_FORWARD, parseError, status);
70
if(t==0 || U_FAILURE(status)){
71
errln("FAIL: construction of Latin-Greek");
76
errln("FAIL: getID returned " + ID + " instead of Latin-Greek");
80
for (i=0; i<Transliterator::countAvailableIDs(); i++){
81
status = U_ZERO_ERROR;
82
ID = (UnicodeString) Transliterator::getAvailableID(i);
83
t = Transliterator::createInstance(ID, UTRANS_FORWARD, parseError, status);
89
errln("FAIL: getID() returned " + t->getID() + " instead of " + ID);
92
ID=(UnicodeString)Transliterator::getAvailableID(i);
93
if(ID != (UnicodeString)Transliterator::getAvailableID(0)){
94
errln("FAIL: calling getAvailableID(index > coundAvailableIDs) should make index=0\n");
97
Transliterator* t1=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
98
Transliterator* t2=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD, parseError, status);
99
if(t1 ==0 || t2 == 0){
100
errln("FAIL: construction");
103
Transliterator* t3=t1->clone();
104
Transliterator* t4=t2->clone();
106
if(t1->getID() != t3->getID() || t2->getID() != t4->getID() ||
107
t1->getID() == t4->getID() || t2->getID() == t3->getID() ||
108
t1->getID()== t4->getID() )
109
errln("FAIL: getID or clone failed");
112
Transliterator* t5=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
114
errln("FAIL: construction");
115
if(t1->getID() != t5->getID() || t5->getID() != t3->getID() || t1->getID() != t3->getID())
116
errln("FAIL: getID or clone failed");
126
void TransliteratorAPITest::TestgetInverse() {
127
UErrorCode status = U_ZERO_ERROR;
128
UParseError parseError;
129
Transliterator* t1 = Transliterator::createInstance("Katakana-Latin", UTRANS_FORWARD, parseError, status);
130
Transliterator* invt1 = Transliterator::createInstance("Latin-Katakana", UTRANS_FORWARD, parseError, status);
131
Transliterator* t2 = Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
132
Transliterator* invt2 = Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD, parseError, status);
133
if(t1 == 0 || invt1 == 0 || t2 == 0 || invt2 == 0) {
134
errln("FAIL: in instantiation");
138
Transliterator* inverse1=t1->createInverse(status);
139
Transliterator* inverse2=t2->createInverse(status);
140
if(inverse1->getID() != invt1->getID() || inverse2->getID() != invt2->getID()
141
|| inverse1->getID() == invt2->getID() || inverse2->getID() == invt1->getID() )
142
errln("FAIL: getInverse() ");
144
UnicodeString TransID[]={
145
"Halfwidth-Fullwidth",
146
"Fullwidth-Halfwidth",
149
//"Arabic-Latin", // removed in 2.0
153
//"Hebrew-Latin", // removed in 2.0
162
for(uint32_t i=0; i<sizeof(TransID)/sizeof(TransID[0]); i=i+2){
163
Transliterator *trans1=Transliterator::createInstance(TransID[i], UTRANS_FORWARD, parseError, status);
165
errln("FAIL: in instantiation for" + TransID[i]);
168
Transliterator *inver1=trans1->createInverse(status);
169
if(inver1->getID() != TransID[i+1] )
170
errln("FAIL :getInverse() for " + TransID[i] + " returned " + inver1->getID() + " instead of " + TransID[i+1]);
183
void TransliteratorAPITest::TestClone(){
184
Transliterator *t1, *t2, *t3, *t4;
185
UErrorCode status = U_ZERO_ERROR;
186
UParseError parseError;
187
t1=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
188
t2=Transliterator::createInstance("Latin-Greek", UTRANS_FORWARD, parseError, status);
189
if(t1 == 0 || t2 == 0){
190
errln("FAIL: construction");
196
if(t1->getID() != t3->getID() || t2->getID() != t4->getID() )
197
errln("FAIL: clone or getID failed");
198
if(t1->getID()==t4->getID() || t2->getID()==t3->getID() || t1->getID()==t4->getID())
199
errln("FAIL: clone or getID failed");
208
void TransliteratorAPITest::TestGetDisplayName() {
209
UnicodeString dispNames[]= {
211
//"CurlyQuotes-StraightQuotes" ,"CurlyQuotes to StraightQuotes",
212
"Any-Hex" ,"Any to Hex Escape",
213
"Halfwidth-Fullwidth" ,"Halfwidth to Fullwidth" ,
214
//"Latin-Arabic" ,"Latin to Arabic" ,
215
"Latin-Devanagari" ,"Latin to Devanagari" ,
216
"Greek-Latin" ,"Greek to Latin" ,
217
//"Arabic-Latin" ,"Arabic to Latin" ,
218
"Hex-Any" ,"Hex Escape to Any",
219
"Cyrillic-Latin" ,"Cyrillic to Latin" ,
220
"Latin-Greek" ,"Latin to Greek" ,
221
"Latin-Katakana" ,"Latin to Katakana" ,
222
//"Latin-Hebrew" ,"Latin to Hebrew" ,
223
"Katakana-Latin" ,"Katakana to Latin"
225
UnicodeString name="";
227
UnicodeString message;
228
UErrorCode status = U_ZERO_ERROR;
229
UParseError parseError;
230
for (uint32_t i=0; i<sizeof(dispNames)/sizeof(dispNames[0]); i=i+2 ) {
231
t = Transliterator::createInstance(dispNames[i+0], UTRANS_FORWARD, parseError, status);
233
errln("FAIL: construction: " + dispNames[i+0]);
234
status = U_ZERO_ERROR;
237
t->getDisplayName(t->getID(), name);
238
message="Display name for ID:" + t->getID();
239
// doTest(message, name, dispNames[i+1]); //!!! This will obviously fail for any locale other than english and its children!!!
241
t->getDisplayName(t->getID(), Locale::US, name);
243
message.append("Display name for on english locale ID:");
244
message.append(t->getID());
245
// message="Display name for on english locale ID:" + t->getID();
246
doTest(message, name, dispNames[i+1]);
255
void TransliteratorAPITest::TestTransliterate1(){
257
UnicodeString Data[]={
258
//ID, input string, transliterated string
259
"Any-Hex", "hello", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", "") ,
260
"Hex-Any", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), "hello" ,
261
"Latin-Devanagari",CharsToUnicodeString("bha\\u0304rata"), CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924") ,
262
"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") ,
264
"Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), UnicodeString("bh\\u0101rata"),
265
// "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042") ,
266
// "Expanded-Contracted", CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042"), CharsToUnicodeString("\\u00C0\\u00C1\\u0042") ,
267
//"Latin-Arabic", "aap", CharsToUnicodeString("\\u0627\\u06A4") ,
268
//"Arabic-Latin", CharsToUnicodeString("\\u0627\\u06A4"), "aap"
271
UnicodeString gotResult;
273
UnicodeString message;
275
logln("Testing transliterate");
276
UErrorCode status = U_ZERO_ERROR;
277
UParseError parseError;
279
for(uint32_t i=0;i<sizeof(Data)/sizeof(Data[0]); i=i+3){
280
t=Transliterator::createInstance(Data[i+0], UTRANS_FORWARD, parseError, status);
282
errln("FAIL: construction: " + Data[i+0] + " Error: " + u_errorName(status));
283
errln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) );
284
status = U_ZERO_ERROR;
287
gotResult = Data[i+1];
288
t->transliterate(gotResult);
289
message=t->getID() + "->transliterate(UnicodeString, UnicodeString) for\n\t Source:" + prettify(Data[i+1]);
290
doTest(message, gotResult, Data[i+2]);
294
t->transliterate(temp);
296
message.append(t->getID());
297
message.append("->transliterate(Replaceable) for \n\tSource:");
298
message.append(Data[i][1]);
299
doTest(message, temp, Data[i+2]);
305
void TransliteratorAPITest::TestTransliterate2(){
306
//testing tranliterate(String text, int start, int limit, StringBuffer result)
307
UnicodeString Data2[]={
308
//ID, input string, start, limit, transliterated string
309
"Any-Hex", "hello! How are you?", "0", "5", UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F", ""), UnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F! How are you?", "") ,
310
"Any-Hex", "hello! How are you?", "7", "12", UnicodeString("\\u0048\\u006F\\u0077\\u0020\\u0061", ""), UnicodeString("hello! \\u0048\\u006F\\u0077\\u0020\\u0061re you?", ""),
311
"Hex-Any", CharsToUnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F\\u0021\\u0020"), "0", "5", "hello", "hello! " ,
312
// "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"), "1", "2", CharsToUnicodeString("\\u0041\\u0301"), CharsToUnicodeString("\\u00C0\\u0041\\u0301\\u0042") ,
313
"Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "0", "1", "bha", CharsToUnicodeString("bha\\u093E\\u0930\\u0924") ,
314
"Devanagari-Latin", CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "1", "2", "\\u0314\\u0101", CharsToUnicodeString("\\u092D\\u0314\\u0101\\u0930\\u0924")
317
logln("\n Testing transliterate(String, int, int, StringBuffer)");
319
UnicodeString gotResBuf;
321
int32_t start, limit;
322
UErrorCode status = U_ZERO_ERROR;
323
UParseError parseError;
325
for(uint32_t i=0; i<sizeof(Data2)/sizeof(Data2[0]); i=i+6){
326
t=Transliterator::createInstance(Data2[i+0], UTRANS_FORWARD, parseError, status);
328
errln("FAIL: construction: " + prettify(Data2[i+0]));
331
start=getInt(Data2[i+2]);
332
limit=getInt(Data2[i+3]);
333
Data2[i+1].extractBetween(start, limit, gotResBuf);
334
t->transliterate(gotResBuf);
335
// errln("FAIL: calling transliterate on " + t->getID());
336
doTest(t->getID() + ".transliterate(UnicodeString, int32_t, int32_t, UnicodeString):(" + start + "," + limit + ") for \n\t source: " + prettify(Data2[i+1]), gotResBuf, Data2[i+4]);
339
t->transliterate(temp, start, limit);
340
doTest(t->getID() + ".transliterate(Replaceable, int32_t, int32_t, ):(" + start + "," + limit + ") for \n\t source: " + prettify(Data2[i+1]), temp, Data2[i+5]);
341
status = U_ZERO_ERROR;
346
status = U_ZERO_ERROR;
347
logln("\n Try calling transliterate with illegal start and limit values");
348
t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
349
gotResBuf = temp = "try start greater than limit";
350
t->transliterate(gotResBuf, 10, 5);
351
if(gotResBuf == temp)
352
logln("OK: start greater than limit value handled correctly");
354
errln("FAIL: start greater than limit value returned" + gotResBuf);
359
void TransliteratorAPITest::TestTransliterate3(){
360
UnicodeString rs="This is the replaceable String";
361
UnicodeString Data[] = {
362
"0", "0", "This is the replaceable String",
363
"2", "3", UnicodeString("Th\\u0069s is the replaceable String", ""),
364
"21", "23", UnicodeString("Th\\u0069s is the repl\\u0061\\u0063eable String", ""),
365
"14", "17", UnicodeString("Th\\u0069s is t\\u0068\\u0065\\u0020repl\\u0061\\u0063eable String", ""),
368
UnicodeString message;
369
UParseError parseError;
370
UErrorCode status = U_ZERO_ERROR;
371
Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
373
errln("FAIL : construction");
374
for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+3){
375
start=getInt(Data[i+0]);
376
limit=getInt(Data[i+1]);
377
t->transliterate(rs, start, limit);
378
message=t->getID() + ".transliterate(ReplaceableString, start, limit):("+start+","+limit+"):";
379
doTest(message, rs, Data[i+2]);
384
void TransliteratorAPITest::TestSimpleKeyboardTransliterator(){
385
logln("simple call to transliterate");
386
UErrorCode status=U_ZERO_ERROR;
387
UParseError parseError;
388
Transliterator* t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
390
errln((UnicodeString)"FAIL: can't create Any-Hex, " +
391
(UnicodeString)u_errorName(status) +
392
(parseError.preContext[0] ?
393
((UnicodeString)" at " + parseError.preContext +
394
(parseError.postContext[0] ?
395
((UnicodeString)" | " + parseError.postContext) : (UnicodeString)"")) : (UnicodeString)""));
398
UTransPosition index={19,20,20,20};
399
UnicodeString rs= "Transliterate this-''";
400
UnicodeString insertion="abc";
401
UnicodeString expected=UnicodeString("Transliterate this-'\\u0061\\u0062\\u0063'", "");
402
t->transliterate(rs, index, insertion, status);
403
if(U_FAILURE(status))
404
errln("FAIL: " + t->getID()+ ".translitere(Replaceable, int[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
405
t->finishTransliteration(rs, index);
406
UnicodeString message="transliterate";
407
doTest(message, rs, expected);
409
logln("try calling transliterate with invalid index values");
410
UTransPosition index1[]={
411
//START, LIMIT, CURSOR
412
{10, 10, 12, 10}, //invalid since CURSOR>LIMIT valid:-START <= CURSOR <= LIMIT
413
{17, 16, 17, 17}, //invalid since START>LIMIT valid:-0<=START<=LIMIT
414
{-1, 16, 14, 16}, //invalid since START<0
415
{3, 50, 2, 50} //invalid since LIMIT>text.length()
417
for(uint32_t i=0; i<sizeof(index1)/sizeof(index1[0]); i++){
419
t->transliterate(rs, index1[i], insertion, status);
420
if(status == U_ILLEGAL_ARGUMENT_ERROR)
421
logln("OK: invalid index values handled correctly");
423
errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString)u_errorName(status));
428
void TransliteratorAPITest::TestKeyboardTransliterator1(){
429
UnicodeString Data[]={
431
"a", UnicodeString("\\u0061", "") ,
432
"bbb", UnicodeString("\\u0061\\u0062\\u0062\\u0062", "") ,
433
"ca", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061", "") ,
434
" ", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
435
"", UnicodeString("\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020", "") ,
437
"a", UnicodeString("\\u0061", "") ,
438
"b", UnicodeString("\\u0061\\u0062", "") ,
439
"z", UnicodeString("\\u0061\\u0062\\u007A", "") ,
440
"", UnicodeString("\\u0061\\u0062\\u007A", "")
443
UParseError parseError;
444
UErrorCode status = U_ZERO_ERROR;
445
Transliterator* t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
446
//keyboardAux(t, Data);
447
UTransPosition index={0, 0, 0, 0};
450
logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
451
for (i=0; i<10; i=i+2) {
453
if (Data[i+0] != "") {
454
log = s + " + " + Data[i+0] + " -> ";
455
t->transliterate(s, index, Data[i+0], status);
456
if(U_FAILURE(status)){
457
errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
462
t->finishTransliteration(s, index);
464
// Show the start index '{' and the cursor '|'
465
displayOutput(s, Data[i+1], log, index);
471
index.contextStart = index.contextLimit = index.start = index.limit = 0;
472
logln("Testing transliterate(Replaceable, int32_t, UChar, UErrorCode)");
473
for(i=10; i<sizeof(Data)/sizeof(Data[0]); i=i+2){
475
if (Data[i+0] != "") {
476
log = s + " + " + Data[i+0] + " -> ";
477
UChar c=Data[i+0].charAt(0);
478
t->transliterate(s, index, c, status);
479
if(U_FAILURE(status))
480
errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UChar, UErrorCode)-->" + (UnicodeString)u_errorName(status));
484
t->finishTransliteration(s, index);
486
// Show the start index '{' and the cursor '|'
487
displayOutput(s, Data[i+1], log, index);
493
void TransliteratorAPITest::TestKeyboardTransliterator2(){
494
UnicodeString Data[]={
495
//insertion, buffer, index[START], index[LIMIT], index[CURSOR]
497
"abc", UnicodeString("Initial String: add-\\u0061\\u0062\\u0063-", ""), "19", "20", "20",
498
"a", UnicodeString("In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "2", "3", "2" ,
499
"b", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
500
"", UnicodeString("\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", ""), "0", "0", "0" ,
501
//data for Latin-Devanagiri
502
CharsToUnicodeString("a\\u0304"), CharsToUnicodeString("Hindi -\\u0906-"), "6", "7", "6",
503
CharsToUnicodeString("ma\\u0304"), CharsToUnicodeString("Hindi -\\u0906\\u092E\\u093E-"), "7", "8", "7",
504
CharsToUnicodeString("ra\\u0304"), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2",
505
CharsToUnicodeString(""), CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),"1", "2", "2"
506
//data for contracted-Expanded
507
// CharsToUnicodeString("\\u00C1"), CharsToUnicodeString("Ad\\u0041\\u0301d here:"), "1", "2", "1" ,
508
// CharsToUnicodeString("\\u00C0"), CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
509
// "", CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
513
UnicodeString dataStr;
514
logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
515
UErrorCode status = U_ZERO_ERROR;
516
UParseError parseError;
517
rs="Initial String: add--";
518
t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
520
errln("FAIL : construction");
522
keyboardAux(t, Data, rs, 0, 20);
527
t=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
529
errln("FAIL : construction");
531
keyboardAux(t, Data, rs, 20, 40);
535
// t=Transliterator::createInstance("Contracted-Expanded");
536
// keyboardAux(t, Data, rs, 35, 55);
542
void TransliteratorAPITest::TestKeyboardTransliterator3(){
543
UnicodeString s="This is the main string";
544
UnicodeString Data[] = {
545
"0", "0", "0", "This is the main string",
546
"1", "3", "2", UnicodeString("Th\\u0069s is the main string", ""),
547
"20", "21", "20", UnicodeString("Th\\u0069s is the mai\\u006E string", "")
550
UErrorCode status=U_ZERO_ERROR;
551
UParseError parseError;
552
UTransPosition index={0, 0, 0, 0};
553
logln("Testing transliterate(Replaceable, int32_t, UErrorCode)");
554
Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
556
errln("FAIL : construction");
557
for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+4){
559
index.contextStart=getInt(Data[i+0]);
560
index.contextLimit=index.limit=getInt(Data[i+1]);
561
index.start=getInt(Data[i+2]);
562
t->transliterate(s, index, status);
563
if(U_FAILURE(status)){
564
errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UErrorCode)-->" + (UnicodeString)u_errorName(status));
567
t->finishTransliteration(s, index);
569
// Show the start index '{' and the cursor '|'
570
displayOutput(s, Data[i+3], log, index);
575
void TransliteratorAPITest::TestNullTransliterator(){
576
UnicodeString s("Transliterate using null transliterator");
577
NullTransliterator *nullTrans=new NullTransliterator();
580
int32_t limit=s.length();
581
UnicodeString replaceable=s;
582
transLimit=nullTrans->transliterate(replaceable, start, limit);
583
if(transLimit != limit){
584
errln("ERROR: NullTransliterator->transliterate() failed");
586
doTest((UnicodeString)"nulTrans->transliterate", replaceable, s);
587
replaceable.remove();
588
replaceable.append(s);
589
UTransPosition index;
590
index.contextStart =start;
591
index.contextLimit = limit;
594
nullTrans->handleTransliterate(replaceable, index, TRUE);
595
if(index.start != limit){
596
errln("ERROR: NullTransliterator->handleTransliterate() failed");
598
doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s);
603
void TransliteratorAPITest::TestRegisterUnregister(){
605
UErrorCode status=U_ZERO_ERROR;
606
UParseError parseError;
607
/* Make sure it doesn't exist */
608
if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status) != NULL) {
609
errln("FAIL: TestA-TestB already registered\n");
613
if (Transliterator::createInstance("TestA-TestB",
614
(UTransDirection)UTRANS_REVERSE) != NULL) {
615
errln("FAIL: TestA-TestB inverse already registered\n");
619
status =U_ZERO_ERROR;
622
Transliterator *t = new RuleBasedTransliterator("TestA-TestB",
626
Transliterator::registerInstance(t);
628
/* Now check again -- should exist now*/
629
Transliterator *s = Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status);
631
errln("FAIL: TestA-TestB not registered\n");
637
s = Transliterator::createInstance("TestA-TestB",
638
(UTransDirection)UTRANS_REVERSE);
640
errln("FAIL: TestA-TestB inverse not registered\n");
646
/*unregister the instance*/
647
Transliterator::unregister("TestA-TestB");
648
/* now Make sure it doesn't exist */
649
if (Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status) != NULL) {
650
errln("FAIL: TestA-TestB isn't unregistered\n");
659
* Used by TestFiltering().
661
class TestFilter1 : public UnicodeFilter {
662
virtual UnicodeFunctor* clone() const {
663
return new TestFilter1(*this);
665
virtual UBool contains(UChar32 c) const {
666
if(c==0x63 || c==0x61 || c==0x43 || c==0x41)
672
class TestFilter2 : public UnicodeFilter {
673
virtual UnicodeFunctor* clone() const {
674
return new TestFilter2(*this);
676
virtual UBool contains(UChar32 c) const {
677
if(c==0x65 || c==0x6c)
683
class TestFilter3 : public UnicodeFilter {
684
virtual UnicodeFunctor* clone() const {
685
return new TestFilter3(*this);
687
virtual UBool contains(UChar32 c) const {
688
if(c==0x6f || c==0x77)
696
void TransliteratorAPITest::TestGetAdoptFilter(){
697
UErrorCode status = U_ZERO_ERROR;
698
UParseError parseError;
699
Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
701
errln("FAIL : construction");
702
const UnicodeFilter *u=t->getFilter();
704
errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
707
UnicodeString got, temp, message;
708
UnicodeString data="ABCabcbbCBa";
710
t->transliterate(temp);
711
t->adoptFilter(new TestFilter1);
714
t->transliterate(got);
715
UnicodeString exp=UnicodeString("A\\u0042Ca\\u0062c\\u0062\\u0062C\\u0042a", "");
716
message="transliteration after adoptFilter(a,A,c,C) ";
717
doTest(message, got, exp);
719
logln("Testing round trip");
720
t->adoptFilter((UnicodeFilter*)u);
721
if(t->getFilter() == NULL)
722
logln("OK: adoptFilter and getFilter round trip worked");
724
errln("FAIL: adoptFilter or getFilter round trip failed");
727
t->transliterate(got);
728
exp=UnicodeString("\\u0041\\u0042\\u0043\\u0061\\u0062\\u0063\\u0062\\u0062\\u0043\\u0042\\u0061", "");
729
message="transliteration after adopting null filter";
730
doTest(message, got, exp);
731
message="adoptFilter round trip";
732
doTest("adoptFilter round trip", got, temp);
734
t->adoptFilter(new TestFilter2);
736
exp=UnicodeString("\\u0068eell\\u006Fe", "");
738
t->transliterate(got);
739
message="transliteration using (e,l) filter";
740
doTest("transliteration using (e,l) filter", got, exp);
743
exp=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
745
t->transliterate(got);
746
doTest(message, got, exp);
748
t->adoptFilter(new TestFilter3);
750
exp=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
752
t->transliterate(got);
753
message="transliteration using (o,w) filter";
754
doTest("transliteration using (o,w) filter", got, exp);
757
exp=UnicodeString("ow\\u006C", "");
759
t->transliterate(got);
760
doTest("transliteration using (o,w) filter", got, exp);
768
void TransliteratorAPITest::keyboardAux(Transliterator *t, UnicodeString DATA[], UnicodeString& s, int32_t begin, int32_t end) {
769
UTransPosition index={0, 0, 0, 0};
770
UErrorCode status=U_ZERO_ERROR;
771
for (int32_t i=begin; i<end; i=i+5) {
773
if (DATA[i+0] != "") {
774
log = s + " + " + DATA[i] + " -> ";
775
index.contextStart=getInt(DATA[i+2]);
776
index.contextLimit=index.limit=getInt(DATA[i+3]);
777
index.start=getInt(DATA[i+4]);
778
t->transliterate(s, index, DATA[i+0], status);
779
if(U_FAILURE(status)){
780
errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
784
t->finishTransliteration(s, index);
786
// Show the start index '{' and the cursor '|'
787
displayOutput(s, DATA[i+1], log, index);
792
void TransliteratorAPITest::displayOutput(const UnicodeString& got, const UnicodeString& expected, UnicodeString& log, UTransPosition& index){
793
// Show the start index '{' and the cursor '|'
794
UnicodeString a, b, c, d, e;
795
got.extractBetween(0, index.contextStart, a);
796
got.extractBetween(index.contextStart, index.start, b);
797
got.extractBetween(index.start, index.limit, c);
798
got.extractBetween(index.limit, index.contextLimit, d);
799
got.extractBetween(index.contextLimit, got.length(), e);
801
append((UChar)0x7b/*{*/).
803
append((UChar)0x7c/*|*/).
807
append((UChar)0x7d/*}*/).
810
logln("OK:" + prettify(log));
812
errln("FAIL: " + prettify(log) + ", expected " + prettify(expected));
816
/*Internal Functions used*/
817
void TransliteratorAPITest::doTest(const UnicodeString& message, const UnicodeString& result, const UnicodeString& expected){
818
if (prettify(result) == prettify(expected))
819
logln((UnicodeString)"Ok: " + prettify(message) + " passed \"" + prettify(expected) + "\"");
821
errln((UnicodeString)"FAIL:" + message + " failed Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) );