~ubuntu-branches/ubuntu/gutsy/icu/gutsy-updates

« back to all changes in this revision

Viewing changes to source/test/intltest/transapi.cpp

  • Committer: Package Import Robot
  • Author(s): Jay Berkenbilt
  • Date: 2005-11-19 11:29:31 UTC
  • mfrom: (1.1.2)
  • Revision ID: package-import@ubuntu.com-20051119112931-vcizkrp10tli4enw
Tags: 3.4-3
Explicitly build with g++ 3.4.  The current ICU fails its test suite
with 4.0 but not with 3.4.  Future versions should work properly with
4.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/********************************************************************
2
 
 * COPYRIGHT: 
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
 
************************************************************************/
10
 
 
11
 
#include "ittrans.h"
12
 
#include "transapi.h"
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"
19
 
#include <string.h>
20
 
#include <stdio.h>
21
 
#include <stdlib.h>
22
 
#include "unicode/rep.h"
23
 
#include "unicode/locid.h"
24
 
 
25
 
int32_t getInt(UnicodeString str)
26
 
{
27
 
    char buffer[20];
28
 
    int len=str.length();
29
 
    if(len>=20) {
30
 
        len=19;
31
 
    }
32
 
    str.extract(0, len, buffer, "");
33
 
    buffer[len]=0;
34
 
    return atoi(buffer);
35
 
}
36
 
 
37
 
//---------------------------------------------
38
 
// runIndexedTest
39
 
//---------------------------------------------
40
 
 
41
 
void
42
 
TransliteratorAPITest::runIndexedTest(int32_t index, UBool exec,
43
 
                                      const char* &name, char* /*par*/) {
44
 
    switch (index) {
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;
60
 
    }
61
 
}
62
 
 
63
 
 
64
 
void TransliteratorAPITest::TestgetID() {
65
 
    UnicodeString trans="Latin-Greek";
66
 
    UnicodeString ID;
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");
72
 
        return;
73
 
    }else{
74
 
        ID= t->getID();
75
 
        if(ID != trans)
76
 
            errln("FAIL: getID returned " + ID + " instead of Latin-Greek");
77
 
        delete t;
78
 
    }
79
 
    int i;
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);
84
 
        if(t == 0){
85
 
            errln("FAIL: " + ID);
86
 
            continue;
87
 
        }
88
 
        if(ID != t->getID())
89
 
            errln("FAIL: getID() returned " + t->getID() + " instead of " + ID);
90
 
        delete t;
91
 
    }
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");
95
 
    }
96
 
 
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");
101
 
        return;
102
 
    }
103
 
    Transliterator* t3=t1->clone();
104
 
    Transliterator* t4=t2->clone();
105
 
 
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");
110
 
 
111
 
 
112
 
    Transliterator* t5=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
113
 
    if(t5 == 0)
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");
117
 
 
118
 
 
119
 
    delete t1;
120
 
    delete t2;
121
 
    delete t3;
122
 
    delete t4;
123
 
    delete t5;
124
 
}
125
 
 
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");
135
 
         return;
136
 
     }
137
 
 
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() ");
143
 
 
144
 
     UnicodeString TransID[]={
145
 
       "Halfwidth-Fullwidth",
146
 
       "Fullwidth-Halfwidth",
147
 
       "Greek-Latin" ,
148
 
       "Latin-Greek", 
149
 
       //"Arabic-Latin", // removed in 2.0
150
 
       //"Latin-Arabic",
151
 
       "Katakana-Latin",
152
 
       "Latin-Katakana",
153
 
       //"Hebrew-Latin", // removed in 2.0
154
 
       //"Latin-Hebrew",
155
 
       "Cyrillic-Latin", 
156
 
       "Latin-Cyrillic", 
157
 
       "Devanagari-Latin", 
158
 
       "Latin-Devanagari", 
159
 
       "Any-Hex",
160
 
       "Hex-Any"
161
 
     };
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);
164
 
         if(t1 == 0){
165
 
           errln("FAIL: in instantiation for" + TransID[i]);
166
 
           continue;
167
 
         }
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]);
171
 
         delete inver1;
172
 
         delete trans1;
173
 
     }
174
 
     delete t1;
175
 
     delete t2;
176
 
     delete invt1;
177
 
     delete invt2;
178
 
     delete inverse1;
179
 
     delete inverse2;
180
 
 
181
 
}
182
 
 
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");
191
 
        return;
192
 
    }
193
 
    t3=t1->clone();
194
 
    t4=t2->clone();
195
 
 
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");
200
 
     
201
 
    delete t1;
202
 
    delete t2;
203
 
    delete t3;
204
 
    delete t4;
205
 
 
206
 
}
207
 
 
208
 
void TransliteratorAPITest::TestGetDisplayName() {
209
 
    UnicodeString dispNames[]= { 
210
 
         //ID, displayName
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"        
224
 
      };
225
 
    UnicodeString name="";
226
 
    Transliterator* t;
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);
232
 
        if(t==0){
233
 
             errln("FAIL: construction: " + dispNames[i+0]);
234
 
             status = U_ZERO_ERROR;
235
 
             continue;
236
 
        }
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!!!
240
 
        name=""; 
241
 
        t->getDisplayName(t->getID(), Locale::US, name);
242
 
        message.remove();
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]);
247
 
        name="";
248
 
 
249
 
        delete t;
250
 
    }
251
 
 
252
 
 
253
 
}
254
 
 
255
 
void TransliteratorAPITest::TestTransliterate1(){
256
 
 
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") ,
263
 
 
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" 
269
 
    };
270
 
 
271
 
    UnicodeString gotResult;
272
 
    UnicodeString temp;
273
 
    UnicodeString message;
274
 
    Transliterator* t;
275
 
    logln("Testing transliterate");
276
 
    UErrorCode status = U_ZERO_ERROR;
277
 
    UParseError parseError;
278
 
 
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);
281
 
        if(t==0){
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;
285
 
            continue;
286
 
        }
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]);
291
 
 
292
 
        //doubt here
293
 
        temp=Data[i+1];
294
 
        t->transliterate(temp);
295
 
        message.remove();
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]);
300
 
 
301
 
        delete t;
302
 
    }
303
 
}
304
 
 
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")  
315
 
 
316
 
    };
317
 
    logln("\n   Testing transliterate(String, int, int, StringBuffer)");
318
 
    Transliterator* t;
319
 
    UnicodeString gotResBuf;
320
 
    UnicodeString temp;
321
 
    int32_t start, limit;
322
 
    UErrorCode status = U_ZERO_ERROR;
323
 
    UParseError parseError;
324
 
 
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);
327
 
        if(t==0){
328
 
            errln("FAIL: construction: " + prettify(Data2[i+0]));
329
 
            continue;
330
 
        }
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]);
337
 
 
338
 
        temp=Data2[i+1];
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;
342
 
        delete t;
343
 
        t = NULL;
344
 
    }
345
 
 
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");
353
 
    else
354
 
        errln("FAIL: start greater than limit value returned" + gotResBuf);
355
 
 
356
 
    delete t;
357
 
 
358
 
}
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", ""),
366
 
    };
367
 
    int start, limit;
368
 
    UnicodeString message;
369
 
    UParseError parseError;
370
 
    UErrorCode status = U_ZERO_ERROR;
371
 
    Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
372
 
    if(t == 0)
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]); 
380
 
    }
381
 
    delete t;
382
 
}
383
 
 
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);
389
 
    if(t == 0) {
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)""));
396
 
        return;
397
 
    }
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);
408
 
 
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()
416
 
    };
417
 
    for(uint32_t i=0; i<sizeof(index1)/sizeof(index1[0]); i++){
418
 
        status=U_ZERO_ERROR;
419
 
        t->transliterate(rs, index1[i], insertion, status);
420
 
        if(status == U_ILLEGAL_ARGUMENT_ERROR)
421
 
            logln("OK: invalid index values handled correctly");
422
 
        else
423
 
            errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString)u_errorName(status));
424
 
    }
425
 
 
426
 
    delete t;
427
 
}
428
 
void TransliteratorAPITest::TestKeyboardTransliterator1(){
429
 
    UnicodeString Data[]={
430
 
        //insertion, buffer
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", "")   ,
436
 
 
437
 
        "a",   UnicodeString("\\u0061", "")                                           ,
438
 
        "b",   UnicodeString("\\u0061\\u0062", "")                                    ,
439
 
        "z",   UnicodeString("\\u0061\\u0062\\u007A", "")                             ,
440
 
        "",    UnicodeString("\\u0061\\u0062\\u007A", "")                              
441
 
 
442
 
    };
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};
448
 
    UnicodeString s;
449
 
    uint32_t i;
450
 
    logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
451
 
    for (i=0; i<10; i=i+2) {
452
 
       UnicodeString log;
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));
458
 
           continue;
459
 
           }
460
 
       }else {
461
 
           log = s + " => ";
462
 
           t->finishTransliteration(s, index);
463
 
       }
464
 
       // Show the start index '{' and the cursor '|'
465
 
       displayOutput(s, Data[i+1], log, index);
466
 
           
467
 
    }
468
 
    
469
 
    s="";
470
 
    status=U_ZERO_ERROR;
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){
474
 
        UnicodeString log;
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));
481
 
               continue;
482
 
         }else {
483
 
           log = s + " => ";
484
 
           t->finishTransliteration(s, index);
485
 
         }
486
 
        // Show the start index '{' and the cursor '|'
487
 
        displayOutput(s, Data[i+1], log, index); 
488
 
    }
489
 
 
490
 
    delete t;
491
 
}
492
 
 
493
 
void TransliteratorAPITest::TestKeyboardTransliterator2(){
494
 
    UnicodeString Data[]={
495
 
        //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
496
 
        //data for Any-Hex
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",
510
 
    };
511
 
    Transliterator *t;
512
 
    UnicodeString rs;
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);
519
 
    if(t == 0)
520
 
        errln("FAIL : construction");
521
 
    else {
522
 
        keyboardAux(t, Data, rs, 0, 20);
523
 
        delete t;
524
 
    }
525
 
 
526
 
    rs="Hindi --";
527
 
    t=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status);
528
 
    if(t == 0)
529
 
        errln("FAIL : construction");
530
 
    else
531
 
        keyboardAux(t, Data, rs, 20, 40);
532
 
 
533
 
 
534
 
  //  rs="Add here:";
535
 
 //   t=Transliterator::createInstance("Contracted-Expanded");
536
 
 //   keyboardAux(t, Data, rs, 35, 55);
537
 
 
538
 
 
539
 
    delete t;
540
 
}
541
 
 
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", "")
548
 
    };
549
 
 
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);
555
 
    if(t == 0)
556
 
        errln("FAIL : construction");
557
 
    for(uint32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+4){
558
 
        UnicodeString log;
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));
565
 
           continue;
566
 
        }
567
 
        t->finishTransliteration(s, index);
568
 
        log = s + " => ";
569
 
        // Show the start index '{' and the cursor '|'
570
 
        displayOutput(s, Data[i+3], log, index); 
571
 
    }
572
 
 
573
 
    delete t;
574
 
}
575
 
void TransliteratorAPITest::TestNullTransliterator(){
576
 
    UnicodeString s("Transliterate using null transliterator");
577
 
    NullTransliterator *nullTrans=new NullTransliterator();
578
 
    int32_t transLimit;
579
 
    int32_t start=0;
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");
585
 
    }
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;
592
 
    index.start = 0;
593
 
    index.limit = limit;
594
 
    nullTrans->handleTransliterate(replaceable, index, TRUE);
595
 
    if(index.start != limit){
596
 
        errln("ERROR: NullTransliterator->handleTransliterate() failed");
597
 
    }
598
 
    doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s);
599
 
    delete nullTrans;
600
 
 
601
 
    
602
 
}
603
 
void TransliteratorAPITest::TestRegisterUnregister(){
604
 
   
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");
610
 
      return;
611
 
   }
612
 
   /* Check inverse too 
613
 
   if (Transliterator::createInstance("TestA-TestB",
614
 
                                      (UTransDirection)UTRANS_REVERSE) != NULL) {
615
 
      errln("FAIL: TestA-TestB inverse already registered\n");
616
 
      return;
617
 
   }
618
 
   */
619
 
   status =U_ZERO_ERROR;
620
 
 
621
 
   /* Create it */
622
 
   Transliterator *t = new RuleBasedTransliterator("TestA-TestB",
623
 
                                                   "a<>b",
624
 
                                                   status);
625
 
   /* Register it */
626
 
   Transliterator::registerInstance(t);
627
 
 
628
 
   /* Now check again -- should exist now*/
629
 
   Transliterator *s = Transliterator::createInstance("TestA-TestB", UTRANS_FORWARD, parseError, status);
630
 
   if (s == NULL) {
631
 
      errln("FAIL: TestA-TestB not registered\n");
632
 
      return;
633
 
   }
634
 
   delete s;
635
 
   
636
 
   /* Check inverse too
637
 
   s = Transliterator::createInstance("TestA-TestB",
638
 
                                      (UTransDirection)UTRANS_REVERSE);
639
 
   if (s == NULL) {
640
 
      errln("FAIL: TestA-TestB inverse not registered\n");
641
 
      return;
642
 
   }
643
 
   delete s;
644
 
   */
645
 
   
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");
651
 
      return;
652
 
   }
653
 
 
654
 
}
655
 
 
656
 
 
657
 
 
658
 
/**
659
 
 * Used by TestFiltering().
660
 
 */
661
 
class TestFilter1 : public UnicodeFilter {
662
 
    virtual UnicodeFunctor* clone() const {
663
 
        return new TestFilter1(*this);
664
 
    }
665
 
    virtual UBool contains(UChar32 c) const {
666
 
       if(c==0x63 || c==0x61 || c==0x43 || c==0x41)
667
 
          return FALSE;
668
 
       else
669
 
          return TRUE;
670
 
    }
671
 
};
672
 
class TestFilter2 : public UnicodeFilter {
673
 
    virtual UnicodeFunctor* clone() const {
674
 
        return new TestFilter2(*this);
675
 
    }
676
 
    virtual UBool contains(UChar32 c) const {
677
 
        if(c==0x65 || c==0x6c)
678
 
           return FALSE;
679
 
        else
680
 
           return TRUE;
681
 
    }
682
 
};
683
 
class TestFilter3 : public UnicodeFilter {
684
 
    virtual UnicodeFunctor* clone() const {
685
 
        return new TestFilter3(*this);
686
 
    }
687
 
    virtual UBool contains(UChar32 c) const {
688
 
        if(c==0x6f || c==0x77)
689
 
           return FALSE;
690
 
        else
691
 
           return TRUE;
692
 
    }
693
 
};
694
 
 
695
 
 
696
 
void TransliteratorAPITest::TestGetAdoptFilter(){
697
 
    UErrorCode status = U_ZERO_ERROR;
698
 
    UParseError parseError;
699
 
    Transliterator *t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status);
700
 
    if(t == 0)
701
 
        errln("FAIL : construction");
702
 
    const UnicodeFilter *u=t->getFilter();
703
 
    if(u != NULL){
704
 
      errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
705
 
    }
706
 
          
707
 
    UnicodeString got, temp, message;
708
 
    UnicodeString data="ABCabcbbCBa";
709
 
    temp = data;
710
 
    t->transliterate(temp);
711
 
    t->adoptFilter(new TestFilter1);
712
 
 
713
 
    got = data;
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);
718
 
         
719
 
    logln("Testing round trip");
720
 
    t->adoptFilter((UnicodeFilter*)u);
721
 
    if(t->getFilter() == NULL)
722
 
       logln("OK: adoptFilter and getFilter round trip worked");
723
 
    else
724
 
       errln("FAIL: adoptFilter or getFilter round trip failed");  
725
 
 
726
 
    got = data;
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);
733
 
 
734
 
    t->adoptFilter(new TestFilter2);
735
 
    data="heelloe";
736
 
    exp=UnicodeString("\\u0068eell\\u006Fe", "");
737
 
    got = data;
738
 
    t->transliterate(got);
739
 
    message="transliteration using (e,l) filter";
740
 
    doTest("transliteration using (e,l) filter", got, exp);
741
 
 
742
 
    data="are well";
743
 
    exp=UnicodeString("\\u0061\\u0072e\\u0020\\u0077ell", "");
744
 
    got = data;
745
 
    t->transliterate(got);
746
 
    doTest(message, got, exp);
747
 
 
748
 
    t->adoptFilter(new TestFilter3);
749
 
    data="ho, wow!";
750
 
    exp=UnicodeString("\\u0068o\\u002C\\u0020wow\\u0021", "");
751
 
    got = data;
752
 
    t->transliterate(got);
753
 
    message="transliteration using (o,w) filter";
754
 
    doTest("transliteration using (o,w) filter", got, exp);
755
 
 
756
 
    data="owl";
757
 
    exp=UnicodeString("ow\\u006C", "");
758
 
    got = data;
759
 
    t->transliterate(got);
760
 
    doTest("transliteration using (o,w) filter", got, exp);
761
 
 
762
 
    delete t;
763
 
 
764
 
}
765
 
 
766
 
 
767
 
 
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) {
772
 
        UnicodeString log;
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));
781
 
             continue;
782
 
             }
783
 
           log = s + " => ";
784
 
           t->finishTransliteration(s, index);
785
 
        }
786
 
         // Show the start index '{' and the cursor '|'
787
 
      displayOutput(s, DATA[i+1], log, index);
788
 
        
789
 
    }
790
 
}
791
 
 
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);
800
 
    log.append(a).
801
 
        append((UChar)0x7b/*{*/).
802
 
        append(b).
803
 
        append((UChar)0x7c/*|*/).
804
 
        append(c).
805
 
        append((UChar)0x7c).
806
 
        append(d).
807
 
        append((UChar)0x7d/*}*/).
808
 
        append(e);
809
 
    if (got == expected) 
810
 
        logln("OK:" + prettify(log));
811
 
    else 
812
 
        errln("FAIL: " + prettify(log)  + ", expected " + prettify(expected));
813
 
}
814
 
 
815
 
 
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) + "\"");
820
 
    else 
821
 
        errln((UnicodeString)"FAIL:" + message + " failed  Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) );
822
 
}
823
 
 
824
 
 
825
 
 
826