]> git.saurik.com Git - apple/icu.git/blame - icuSources/test/intltest/transapi.cpp
ICU-3.13.tar.gz
[apple/icu.git] / icuSources / test / intltest / transapi.cpp
CommitLineData
b75a7d8f
A
1/********************************************************************
2 * COPYRIGHT:
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************************************************************************/
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
29int32_t getInt(UnicodeString str)
30{
31 char buffer[20];
32 int len=str.length();
33 if(len>=20) {
34 len=19;
35 }
36 str.extract(0, len, buffer, "");
37 buffer[len]=0;
38 return atoi(buffer);
39}
40
41//---------------------------------------------
42// runIndexedTest
43//---------------------------------------------
44
45void
46TransliteratorAPITest::runIndexedTest(int32_t index, UBool exec,
47 const char* &name, char* /*par*/) {
48 switch (index) {
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;
64 }
65}
66
67
68void TransliteratorAPITest::TestgetID() {
69 UnicodeString trans="Latin-Greek";
70 UnicodeString ID;
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");
76 return;
77 }else{
78 ID= t->getID();
79 if(ID != trans)
80 errln("FAIL: getID returned " + ID + " instead of Latin-Greek");
81 delete t;
82 }
83 int i;
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);
88 if(t == 0){
89 errln("FAIL: " + ID);
90 continue;
91 }
92 if(ID != t->getID())
93 errln("FAIL: getID() returned " + t->getID() + " instead of " + ID);
94 delete t;
95 }
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");
99 }
100
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");
105 return;
106 }
107 Transliterator* t3=t1->clone();
108 Transliterator* t4=t2->clone();
109
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");
114
115
116 Transliterator* t5=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
117 if(t5 == 0)
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");
121
122
123 delete t1;
124 delete t2;
125 delete t3;
126 delete t4;
127 delete t5;
128}
129
130void 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");
139 return;
140 }
141
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() ");
147
148 UnicodeString TransID[]={
149 "Halfwidth-Fullwidth",
150 "Fullwidth-Halfwidth",
151 "Greek-Latin" ,
152 "Latin-Greek",
153 //"Arabic-Latin", // removed in 2.0
154 //"Latin-Arabic",
155 "Katakana-Latin",
156 "Latin-Katakana",
157 //"Hebrew-Latin", // removed in 2.0
158 //"Latin-Hebrew",
159 "Cyrillic-Latin",
160 "Latin-Cyrillic",
161 "Devanagari-Latin",
162 "Latin-Devanagari",
163 "Any-Hex",
164 "Hex-Any"
165 };
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);
168 if(t1 == 0){
169 errln("FAIL: in instantiation for" + TransID[i]);
170 continue;
171 }
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]);
175 delete inver1;
176 delete trans1;
177 }
178 delete t1;
179 delete t2;
180 delete invt1;
181 delete invt2;
182 delete inverse1;
183 delete inverse2;
184
185}
186
187void 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");
195 return;
196 }
197 t3=t1->clone();
198 t4=t2->clone();
199
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");
204
205 delete t1;
206 delete t2;
207 delete t3;
208 delete t4;
209
210}
211
212void TransliteratorAPITest::TestGetDisplayName() {
213 UnicodeString dispNames[]= {
214 //ID, displayName
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"
228 };
229 UnicodeString name="";
230 Transliterator* t;
231 UnicodeString message;
232 UErrorCode status = U_ZERO_ERROR;
233 UParseError parseError;
234
235#if UCONFIG_NO_FORMATTING
236 logln("Skipping, UCONFIG_NO_FORMATTING is set\n");
237 return;
238#else
239
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);
242 if(t==0){
243 errln("FAIL: construction: " + dispNames[i+0]);
244 status = U_ZERO_ERROR;
245 continue;
246 }
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!!!
250 name="";
251 t->getDisplayName(t->getID(), Locale::getUS(), name);
252 message.remove();
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]);
257 name="";
258
259 delete t;
260 }
261#endif
262
263}
264
265void TransliteratorAPITest::TestTransliterate1(){
266
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") ,
273
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"
279 };
280
281 UnicodeString gotResult;
282 UnicodeString temp;
283 UnicodeString message;
284 Transliterator* t;
285 logln("Testing transliterate");
286 UErrorCode status = U_ZERO_ERROR;
287 UParseError parseError;
288
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);
291 if(t==0){
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;
295 continue;
296 }
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]);
301
302 //doubt here
303 temp=Data[i+1];
304 t->transliterate(temp);
305 message.remove();
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]);
310
311 delete t;
312 }
313}
314
315void 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")
325
326 };
327 logln("\n Testing transliterate(String, int, int, StringBuffer)");
328 Transliterator* t;
329 UnicodeString gotResBuf;
330 UnicodeString temp;
331 int32_t start, limit;
332 UErrorCode status = U_ZERO_ERROR;
333 UParseError parseError;
334
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);
337 if(t==0){
338 errln("FAIL: construction: " + prettify(Data2[i+0]));
339 continue;
340 }
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]);
347
348 temp=Data2[i+1];
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;
352 delete t;
353 t = NULL;
354 }
355
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));
361 delete t;
362 return;
363 }
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");
368 else
369 errln("FAIL: start greater than limit value returned" + gotResBuf);
370
371 delete t;
372
373}
374void 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", ""),
381 };
382 int start, limit;
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));
389 delete t;
390 return;
391 }
392
393 if(t == 0)
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]);
401 }
402 delete t;
403}
404
405void 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);
410 if(t == 0) {
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)""));
417 return;
418 }
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);
429
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()
437 };
438 for(uint32_t i=0; i<sizeof(index1)/sizeof(index1[0]); i++){
439 status=U_ZERO_ERROR;
440 t->transliterate(rs, index1[i], insertion, status);
441 if(status == U_ILLEGAL_ARGUMENT_ERROR)
442 logln("OK: invalid index values handled correctly");
443 else
444 errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString)u_errorName(status));
445 }
446
447 delete t;
448}
449void TransliteratorAPITest::TestKeyboardTransliterator1(){
450 UnicodeString Data[]={
451 //insertion, buffer
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", "") ,
457
458 "a", UnicodeString("\\u0061", "") ,
459 "b", UnicodeString("\\u0061\\u0062", "") ,
460 "z", UnicodeString("\\u0061\\u0062\\u007A", "") ,
461 "", UnicodeString("\\u0061\\u0062\\u007A", "")
462
463 };
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));
469 delete t;
470 return;
471 }
472 //keyboardAux(t, Data);
473 UTransPosition index={0, 0, 0, 0};
474 UnicodeString s;
475 uint32_t i;
476 logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
477 for (i=0; i<10; i=i+2) {
478 UnicodeString log;
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));
484 continue;
485 }
486 }else {
487 log = s + " => ";
488 t->finishTransliteration(s, index);
489 }
490 // Show the start index '{' and the cursor '|'
491 displayOutput(s, Data[i+1], log, index);
492
493 }
494
495 s="";
496 status=U_ZERO_ERROR;
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){
500 UnicodeString log;
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));
507 continue;
508 }else {
509 log = s + " => ";
510 t->finishTransliteration(s, index);
511 }
512 // Show the start index '{' and the cursor '|'
513 displayOutput(s, Data[i+1], log, index);
514 }
515
516 delete t;
517}
518
519void TransliteratorAPITest::TestKeyboardTransliterator2(){
520 UnicodeString Data[]={
521 //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
522 //data for Any-Hex
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",
536 };
537 Transliterator *t;
538 UnicodeString rs;
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);
545 if(t == 0)
546 errln("FAIL : construction");
547 else {
548 keyboardAux(t, Data, rs, 0, 20);
549 delete t;
550 }
551
552 rs="Hindi --";
553 t=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
554 if(t == 0)
555 errln("FAIL : construction");
556 else
557 keyboardAux(t, Data, rs, 20, 40);
558
559
560 // rs="Add here:";
561 // t=Transliterator::createInstance("Contracted-Expanded");
562 // keyboardAux(t, Data, rs, 35, 55);
563
564
565 delete t;
566}
567
568void 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", "")
574 };
575
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));
583 delete t;
584 return;
585 }
586 if(t == 0)
587 errln("FAIL : construction");
588 for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+4){
589 UnicodeString log;
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));
596 continue;
597 }
598 t->finishTransliteration(s, index);
599 log = s + " => ";
600 // Show the start index '{' and the cursor '|'
601 displayOutput(s, Data[i+3], log, index);
602 }
603
604 delete t;
605}
606void TransliteratorAPITest::TestNullTransliterator(){
607 UnicodeString s("Transliterate using null transliterator");
608 NullTransliterator *nullTrans=new NullTransliterator();
609 int32_t transLimit;
610 int32_t start=0;
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");
616 }
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;
623 index.start = 0;
624 index.limit = limit;
625 nullTrans->handleTransliterate(replaceable, index, TRUE);
626 if(index.start != limit){
627 errln("ERROR: NullTransliterator->handleTransliterate() failed");
628 }
629 doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s);
630 delete nullTrans;
631
632
633}
634void TransliteratorAPITest::TestRegisterUnregister(){
635
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");
641 return;
642 }
643 /* Check inverse too
644 if (Transliterator::createInstance("TestA-TestB",
645 (UTransDirection)UTRANS_REVERSE) != NULL) {
646 errln("FAIL: TestA-TestB inverse already registered\n");
647 return;
648 }
649 */
650 status =U_ZERO_ERROR;
651
652 /* Create it */
653 Transliterator *t = new RuleBasedTransliterator("TestA-TestB",
654 "a<>b",
655 status);
656 /* Register it */
657 Transliterator::registerInstance(t);
658
659 /* Now check again -- should exist now*/
660 Transliterator *s = Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status);
661 if (s == NULL) {
662 errln("FAIL: TestA-TestB not registered\n");
663 return;
664 }
665 delete s;
666
667 /* Check inverse too
668 s = Transliterator::createInstance("TestA-TestB",
669 (UTransDirection)UTRANS_REVERSE);
670 if (s == NULL) {
671 errln("FAIL: TestA-TestB inverse not registered\n");
672 return;
673 }
674 delete s;
675 */
676
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");
682 return;
683 }
684
685}
686
687
688int gTestFilter1ClassID = 0;
689int gTestFilter2ClassID = 0;
690int gTestFilter3ClassID = 0;
691
692/**
693 * Used by TestFiltering().
694 */
695class TestFilter1 : public UnicodeFilter {
696 UClassID getDynamicClassID()const { return &gTestFilter1ClassID; }
697 virtual UnicodeFunctor* clone() const {
698 return new TestFilter1(*this);
699 }
700 virtual UBool contains(UChar32 c) const {
701 if(c==0x63 || c==0x61 || c==0x43 || c==0x41)
702 return FALSE;
703 else
704 return TRUE;
705 }
706 // Stubs
707 virtual UnicodeString& toPattern(UnicodeString& result,
708 UBool /*escapeUnprintable*/) const {
709 return result;
710 }
711 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
712 return FALSE;
713 }
714 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
715};
716class TestFilter2 : public UnicodeFilter {
717 UClassID getDynamicClassID()const { return &gTestFilter2ClassID; }
718 virtual UnicodeFunctor* clone() const {
719 return new TestFilter2(*this);
720 }
721 virtual UBool contains(UChar32 c) const {
722 if(c==0x65 || c==0x6c)
723 return FALSE;
724 else
725 return TRUE;
726 }
727 // Stubs
728 virtual UnicodeString& toPattern(UnicodeString& result,
729 UBool /*escapeUnprintable*/) const {
730 return result;
731 }
732 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
733 return FALSE;
734 }
735 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
736};
737class TestFilter3 : public UnicodeFilter {
738 UClassID getDynamicClassID()const { return &gTestFilter3ClassID; }
739 virtual UnicodeFunctor* clone() const {
740 return new TestFilter3(*this);
741 }
742 virtual UBool contains(UChar32 c) const {
743 if(c==0x6f || c==0x77)
744 return FALSE;
745 else
746 return TRUE;
747 }
748 // Stubs
749 virtual UnicodeString& toPattern(UnicodeString& result,
750 UBool /*escapeUnprintable*/) const {
751 return result;
752 }
753 virtual UBool matchesIndexValue(uint8_t /*v*/) const {
754 return FALSE;
755 }
756 virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {}
757};
758
759
760void 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));
766 delete t;
767 return;
768 }
769 if(t == 0)
770 errln("FAIL : construction");
771 const UnicodeFilter *u=t->getFilter();
772 if(u != NULL){
773 errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
774 }
775
776 UnicodeString got, temp, message;
777 UnicodeString data="ABCabcbbCBa";
778 temp = data;
779 t->transliterate(temp);
780 t->adoptFilter(new TestFilter1);
781
782 got = data;
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);
787
788 logln("Testing round trip");
789 t->adoptFilter((UnicodeFilter*)u);
790 if(t->getFilter() == NULL)
791 logln("OK: adoptFilter and getFilter round trip worked");
792 else
793 errln("FAIL: adoptFilter or getFilter round trip failed");
794
795 got = data;
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);
802
803 t->adoptFilter(new TestFilter2);
804 data="heelloe";
805 exp=UnicodeString("\\u0068eell\\u006Fe", "");
806 got = data;
807 t->transliterate(got);
808 message="transliteration using (e,l) filter";
809 doTest("transliteration using (e,l) filter", got, exp);
810
811 data="are well";
812 exp=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
813 got = data;
814 t->transliterate(got);
815 doTest(message, got, exp);
816
817 t->adoptFilter(new TestFilter3);
818 data="ho, wow!";
819 exp=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
820 got = data;
821 t->transliterate(got);
822 message="transliteration using (o,w) filter";
823 doTest("transliteration using (o,w) filter", got, exp);
824
825 data="owl";
826 exp=UnicodeString("ow\\u006C", "");
827 got = data;
828 t->transliterate(got);
829 doTest("transliteration using (o,w) filter", got, exp);
830
831 delete t;
832
833}
834
835
836
837void 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) {
841 UnicodeString log;
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));
850 continue;
851 }
852 log = s + " => ";
853 t->finishTransliteration(s, index);
854 }
855 // Show the start index '{' and the cursor '|'
856 displayOutput(s, DATA[i+1], log, index);
857
858 }
859}
860
861void 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);
869 log.append(a).
870 append((UChar)0x7b/*{*/).
871 append(b).
872 append((UChar)0x7c/*|*/).
873 append(c).
874 append((UChar)0x7c).
875 append(d).
876 append((UChar)0x7d/*}*/).
877 append(e);
878 if (got == expected)
879 logln("OK:" + prettify(log));
880 else
881 errln("FAIL: " + prettify(log) + ", expected " + prettify(expected));
882}
883
884
885/*Internal Functions used*/
886void 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) + "\"");
889 else
890 errln((UnicodeString)"FAIL:" + message + " failed Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) );
891}
892
893#endif /* #if !UCONFIG_NO_TRANSLITERATION */