1/********************************************************************
2 * Copyright (c) 1997-2010, International Business Machines
3 * Corporation and others. All Rights Reserved.
4 ********************************************************************/
5
6#include <string.h>
7#include "unicode/utypes.h"
8#include "unicode/uscript.h"
9#include "unicode/uchar.h"
10#include "cintltst.h"
11#include "cucdapi.h"
12
13#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof(array[0]))
14
15void TestUScriptCodeAPI(){
16    int i =0;
17    int numErrors =0;
18    {
19        const char* testNames[]={
20        /* test locale */
21        "en", "en_US", "sr", "ta" , "te_IN",
22        "hi", "he", "ar",
23        /* test abbr */
24        "Hani", "Hang","Hebr","Hira",
25        "Knda","Kana","Khmr","Lao",
26        "Latn",/*"Latf","Latg",*/
27        "Mlym", "Mong",
28
29        /* test names */
30        "CYRILLIC","DESERET","DEVANAGARI","ETHIOPIC","GEORGIAN",
31        "GOTHIC",  "GREEK",  "GUJARATI", "COMMON", "INHERITED",
32        /* test lower case names */
33        "malayalam", "mongolian", "myanmar", "ogham", "old-italic",
34        "oriya",     "runic",     "sinhala", "syriac","tamil",
35        "telugu",    "thaana",    "thai",    "tibetan",
36        /* test the bounds*/
37        "tagb", "arabic",
38        /* test bogus */
39        "asfdasd", "5464", "12235",
40        /* test the last index */
41        "zyyy", "YI",
42        '\0'
43        };
44        UScriptCode expected[] ={
45            /* locales should return */
46            USCRIPT_LATIN, USCRIPT_LATIN, USCRIPT_CYRILLIC, USCRIPT_TAMIL, USCRIPT_TELUGU,
47            USCRIPT_DEVANAGARI, USCRIPT_HEBREW, USCRIPT_ARABIC,
48            /* abbr should return */
49            USCRIPT_HAN, USCRIPT_HANGUL, USCRIPT_HEBREW, USCRIPT_HIRAGANA,
50            USCRIPT_KANNADA, USCRIPT_KATAKANA, USCRIPT_KHMER, USCRIPT_LAO,
51            USCRIPT_LATIN,/* USCRIPT_LATIN, USCRIPT_LATIN,*/
52            USCRIPT_MALAYALAM, USCRIPT_MONGOLIAN,
53            /* names should return */
54            USCRIPT_CYRILLIC, USCRIPT_DESERET, USCRIPT_DEVANAGARI, USCRIPT_ETHIOPIC, USCRIPT_GEORGIAN,
55            USCRIPT_GOTHIC, USCRIPT_GREEK, USCRIPT_GUJARATI, USCRIPT_COMMON, USCRIPT_INHERITED,
56            /* lower case names should return */
57            USCRIPT_MALAYALAM, USCRIPT_MONGOLIAN, USCRIPT_MYANMAR, USCRIPT_OGHAM, USCRIPT_OLD_ITALIC,
58            USCRIPT_ORIYA, USCRIPT_RUNIC, USCRIPT_SINHALA, USCRIPT_SYRIAC, USCRIPT_TAMIL,
59            USCRIPT_TELUGU, USCRIPT_THAANA, USCRIPT_THAI, USCRIPT_TIBETAN,
60            /* bounds */
61            USCRIPT_TAGBANWA, USCRIPT_ARABIC,
62            /* bogus names should return invalid code */
63            USCRIPT_INVALID_CODE, USCRIPT_INVALID_CODE, USCRIPT_INVALID_CODE,
64            USCRIPT_COMMON, USCRIPT_YI,
65        };
66
67        UErrorCode err = U_ZERO_ERROR;
68
69        const int32_t capacity = 10;
70
71        for( ; testNames[i]!='\0'; i++){
72            UScriptCode script[10]={USCRIPT_INVALID_CODE};
73            uscript_getCode(testNames[i],script,capacity, &err);
74            if( script[0] != expected[i]){
75                   log_data_err("Error getting script code Got: %i  Expected: %i for name %s (Error code does not propagate if data is not present. Are you missing data?)\n",
76                       script[0],expected[i],testNames[i]);
77                   numErrors++;
78            }
79        }
80        if(numErrors >0 ){
81            log_data_err("Errors uchar_getScriptCode() : %i \n",numErrors);
82        }
83    }
84
85    {
86        UErrorCode err = U_ZERO_ERROR;
87        int32_t capacity=0;
88        int32_t j;
89        UScriptCode jaCode[]={USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN };
90        UScriptCode script[10]={USCRIPT_INVALID_CODE};
91        int32_t num = uscript_getCode("ja",script,capacity, &err);
92        /* preflight */
93        if(err==U_BUFFER_OVERFLOW_ERROR){
94            err = U_ZERO_ERROR;
95            capacity = 10;
96            num = uscript_getCode("ja",script,capacity, &err);
97            if(num!=(sizeof(jaCode)/sizeof(UScriptCode))){
98                log_err("Errors uscript_getScriptCode() for Japanese locale: num=%d, expected %d \n",
99                        num, (sizeof(jaCode)/sizeof(UScriptCode)));
100            }
101            for(j=0;j<sizeof(jaCode)/sizeof(UScriptCode);j++) {
102                if(script[j]!=jaCode[j]) {
103                    log_err("Japanese locale: code #%d was %d (%s) but expected %d (%s)\n", j,
104                            script[j], uscript_getName(script[j]),
105                            jaCode[j], uscript_getName(jaCode[j]));
106
107                }
108            }
109        }else{
110            log_data_err("Errors in uscript_getScriptCode() expected error : %s got: %s \n",
111                "U_BUFFER_OVERFLOW_ERROR",
112                 u_errorName(err));
113        }
114
115    }
116
117    {
118        UScriptCode testAbbr[]={
119            /* names should return */
120            USCRIPT_CYRILLIC, USCRIPT_DESERET, USCRIPT_DEVANAGARI, USCRIPT_ETHIOPIC, USCRIPT_GEORGIAN,
121            USCRIPT_GOTHIC, USCRIPT_GREEK, USCRIPT_GUJARATI,
122        };
123
124        const char* expectedNames[]={
125
126            /* test names */
127            "Cyrillic","Deseret","Devanagari","Ethiopic","Georgian",
128            "Gothic",  "Greek",  "Gujarati",
129             '\0'
130        };
131        i=0;
132        while(i<sizeof(testAbbr)/sizeof(UScriptCode)){
133            const char* name = uscript_getName(testAbbr[i]);
134             if(name == NULL) {
135               log_data_err("Couldn't get script name\n");
136               return;
137             }
138            numErrors=0;
139            if(strcmp(expectedNames[i],name)!=0){
140                log_err("Error getting abbreviations Got: %s Expected: %s\n",name,expectedNames[i]);
141                numErrors++;
142            }
143            if(numErrors > 0){
144                if(numErrors >0 ){
145                    log_err("Errors uchar_getScriptAbbr() : %i \n",numErrors);
146                }
147            }
148            i++;
149        }
150
151    }
152
153    {
154        UScriptCode testAbbr[]={
155            /* abbr should return */
156            USCRIPT_HAN, USCRIPT_HANGUL, USCRIPT_HEBREW, USCRIPT_HIRAGANA,
157            USCRIPT_KANNADA, USCRIPT_KATAKANA, USCRIPT_KHMER, USCRIPT_LAO,
158            USCRIPT_LATIN,
159            USCRIPT_MALAYALAM, USCRIPT_MONGOLIAN,
160        };
161
162        const char* expectedAbbr[]={
163              /* test abbr */
164            "Hani", "Hang","Hebr","Hira",
165            "Knda","Kana","Khmr","Laoo",
166            "Latn",
167            "Mlym", "Mong",
168             '\0'
169        };
170        i=0;
171        while(i<sizeof(testAbbr)/sizeof(UScriptCode)){
172            const char* name = uscript_getShortName(testAbbr[i]);
173            numErrors=0;
174            if(strcmp(expectedAbbr[i],name)!=0){
175                log_err("Error getting abbreviations Got: %s Expected: %s\n",name,expectedAbbr[i]);
176                numErrors++;
177            }
178            if(numErrors > 0){
179                if(numErrors >0 ){
180                    log_err("Errors uchar_getScriptAbbr() : %i \n",numErrors);
181                }
182            }
183            i++;
184        }
185
186    }
187    /* now test uscript_getScript() API */
188    {
189        uint32_t codepoints[] = {
190                0x0000FF9D, /* USCRIPT_KATAKANA*/
191                0x0000FFBE, /* USCRIPT_HANGUL*/
192                0x0000FFC7, /* USCRIPT_HANGUL*/
193                0x0000FFCF, /* USCRIPT_HANGUL*/
194                0x0000FFD7, /* USCRIPT_HANGUL*/
195                0x0000FFDC, /* USCRIPT_HANGUL*/
196                0x00010300, /* USCRIPT_OLD_ITALIC*/
197                0x00010330, /* USCRIPT_GOTHIC*/
198                0x0001034A, /* USCRIPT_GOTHIC*/
199                0x00010400, /* USCRIPT_DESERET*/
200                0x00010428, /* USCRIPT_DESERET*/
201                0x0001D167, /* USCRIPT_INHERITED*/
202                0x0001D17B, /* USCRIPT_INHERITED*/
203                0x0001D185, /* USCRIPT_INHERITED*/
204                0x0001D1AA, /* USCRIPT_INHERITED*/
205                0x00020000, /* USCRIPT_HAN*/
206                0x00000D02, /* USCRIPT_MALAYALAM*/
207                0x00000D00, /* USCRIPT_UNKNOWN (new Zzzz value in Unicode 5.0) */
208                0x00000000, /* USCRIPT_COMMON*/
209                0x0001D169, /* USCRIPT_INHERITED*/
210                0x0001D182, /* USCRIPT_INHERITED*/
211                0x0001D18B, /* USCRIPT_INHERITED*/
212                0x0001D1AD, /* USCRIPT_INHERITED*/
213        };
214
215        UScriptCode expected[] = {
216                USCRIPT_KATAKANA ,
217                USCRIPT_HANGUL ,
218                USCRIPT_HANGUL ,
219                USCRIPT_HANGUL ,
220                USCRIPT_HANGUL ,
221                USCRIPT_HANGUL ,
222                USCRIPT_OLD_ITALIC,
223                USCRIPT_GOTHIC ,
224                USCRIPT_GOTHIC ,
225                USCRIPT_DESERET ,
226                USCRIPT_DESERET ,
227                USCRIPT_INHERITED,
228                USCRIPT_INHERITED,
229                USCRIPT_INHERITED,
230                USCRIPT_INHERITED,
231                USCRIPT_HAN ,
232                USCRIPT_MALAYALAM,
233                USCRIPT_UNKNOWN,
234                USCRIPT_COMMON,
235                USCRIPT_INHERITED ,
236                USCRIPT_INHERITED ,
237                USCRIPT_INHERITED ,
238                USCRIPT_INHERITED ,
239        };
240        UScriptCode code = USCRIPT_INVALID_CODE;
241        UErrorCode status = U_ZERO_ERROR;
242        UBool passed = TRUE;
243
244        for(i=0; i<LENGTHOF(codepoints); ++i){
245            code = uscript_getScript(codepoints[i],&status);
246            if(U_SUCCESS(status)){
247                if( code != expected[i] ||
248                    code != (UScriptCode)u_getIntPropertyValue(codepoints[i], UCHAR_SCRIPT)
249                ) {
250                    log_err("uscript_getScript for codepoint \\U%08X failed\n",codepoints[i]);
251                    passed = FALSE;
252                }
253            }else{
254                log_err("uscript_getScript for codepoint \\U%08X failed. Error: %s\n",
255                         codepoints[i],u_errorName(status));
256                break;
257            }
258        }
259
260        if(passed==FALSE){
261           log_err("uscript_getScript failed.\n");
262        }
263    }
264    {
265        UScriptCode code= USCRIPT_INVALID_CODE;
266        UErrorCode  status = U_ZERO_ERROR;
267        code = uscript_getScript(0x001D169,&status);
268        if(code != USCRIPT_INHERITED){
269            log_err("\\U001D169 is not contained in USCRIPT_INHERITED");
270        }
271    }
272    {
273        UScriptCode code= USCRIPT_INVALID_CODE;
274        UErrorCode  status = U_ZERO_ERROR;
275        int32_t err = 0;
276
277        for(i = 0; i<=0x10ffff; i++){
278            code =  uscript_getScript(i,&status);
279            if(code == USCRIPT_INVALID_CODE){
280                err++;
281                log_err("uscript_getScript for codepoint \\U%08X failed.\n", i);
282            }
283        }
284        if(err>0){
285            log_err("uscript_getScript failed for %d codepoints\n", err);
286        }
287    }
288    {
289        for(i=0; (UScriptCode)i< USCRIPT_CODE_LIMIT; i++){
290            const char* name = uscript_getName((UScriptCode)i);
291            if(name==NULL || strcmp(name,"")==0){
292                log_err("uscript_getName failed for code %i: name is NULL or \"\"\n",i);
293            }
294        }
295    }
296
297    {
298        /*
299         * These script codes were originally added to ICU pre-3.6, so that ICU would
300         * have all ISO 15924 script codes. ICU was then based on Unicode 4.1.
301         * These script codes were added with only short names because we don't
302         * want to invent long names ourselves.
303         * Unicode 5 and later encode some of these scripts and give them long names.
304         * Whenever this happens, the long script names here need to be updated.
305         */
306        static const char* expectedLong[] = {
307            "Balinese", "Batak", "Blis", "Brahmi", "Cham", "Cirt", "Cyrs", "Egyd", "Egyh", "Egyptian_Hieroglyphs",
308            "Geok", "Hans", "Hant", "Hmng", "Hung", "Inds", "Javanese", "Kayah_Li", "Latf", "Latg",
309            "Lepcha", "Lina", "Mandaic", "Maya", "Mero", "Nko", "Old_Turkic", "Perm", "Phags_Pa", "Phoenician",
310            "Plrd", "Roro", "Sara", "Syre", "Syrj", "Syrn", "Teng", "Vai", "Visp", "Cuneiform",
311            "Zxxx", "Unknown",
312            "Carian", "Jpan", "Tai_Tham", "Lycian", "Lydian", "Ol_Chiki", "Rejang", "Saurashtra", "Sgnw", "Sundanese",
313            "Moon", "Meetei_Mayek",
314            /* new in ICU 4.0 */
315            "Imperial_Aramaic", "Avestan", "Cakm", "Kore",
316            "Kaithi", "Mani", "Inscriptional_Pahlavi", "Phlp", "Phlv", "Inscriptional_Parthian", "Samaritan", "Tai_Viet",
317            "Zmth", "Zsym",
318            /* new in ICU 4.4 */
319            "Bamum", "Lisu", "Nkgb", "Old_South_Arabian",
320            /* new in ICU 4.6 */
321            "Bass", "Dupl", "Elba", "Gran", "Kpel", "Loma", "Mend", "Merc",
322            "Narb", "Nbat", "Palm", "Sind", "Wara",
323        };
324        static const char* expectedShort[] = {
325            "Bali", "Batk", "Blis", "Brah", "Cham", "Cirt", "Cyrs", "Egyd", "Egyh", "Egyp",
326            "Geok", "Hans", "Hant", "Hmng", "Hung", "Inds", "Java", "Kali", "Latf", "Latg",
327            "Lepc", "Lina", "Mand", "Maya", "Mero", "Nkoo", "Orkh", "Perm", "Phag", "Phnx",
328            "Plrd", "Roro", "Sara", "Syre", "Syrj", "Syrn", "Teng", "Vaii", "Visp", "Xsux",
329            "Zxxx", "Zzzz",
330            "Cari", "Jpan", "Lana", "Lyci", "Lydi", "Olck", "Rjng", "Saur", "Sgnw", "Sund",
331            "Moon", "Mtei",
332            /* new in ICU 4.0 */
333            "Armi", "Avst", "Cakm", "Kore",
334            "Kthi", "Mani", "Phli", "Phlp", "Phlv", "Prti", "Samr", "Tavt",
335            "Zmth", "Zsym",
336            /* new in ICU 4.4 */
337            "Bamu", "Lisu", "Nkgb", "Sarb",
338            /* new in ICU 4.6 */
339            "Bass", "Dupl", "Elba", "Gran", "Kpel", "Loma", "Mend", "Merc",
340            "Narb", "Nbat", "Palm", "Sind", "Wara",
341        };
342        int32_t j = 0;
343        if(LENGTHOF(expectedLong)!=(USCRIPT_CODE_LIMIT-USCRIPT_BALINESE)) {
344            log_err("need to add new script codes in cucdapi.c!\n");
345            return;
346        }
347        for(i=USCRIPT_BALINESE; (UScriptCode)i<USCRIPT_CODE_LIMIT; i++, j++){
348            const char* name = uscript_getName((UScriptCode)i);
349            if(name==NULL || strcmp(name,expectedLong[j])!=0){
350                log_err("uscript_getName failed for code %i: %s!=%s\n", i, name, expectedLong[j]);
351            }
352            name = uscript_getShortName((UScriptCode)i);
353            if(name==NULL || strcmp(name,expectedShort[j])!=0){
354                log_err("uscript_getShortName failed for code %i: %s!=%s\n", i, name, expectedShort[j]);
355            }
356        }
357        for(i=0; i<LENGTHOF(expectedLong); i++){
358            UScriptCode fillIn[5] = {USCRIPT_INVALID_CODE};
359            UErrorCode status = U_ZERO_ERROR;
360            int32_t len = 0;
361            len = uscript_getCode(expectedShort[i], fillIn, LENGTHOF(fillIn), &status);
362            if(U_FAILURE(status)){
363                log_err("uscript_getCode failed for script name %s. Error: %s\n",expectedShort[i], u_errorName(status));
364            }
365            if(len>1){
366                log_err("uscript_getCode did not return expected number of codes for script %s. EXPECTED: 1 GOT: %i\n", expectedShort[i], len);
367            }
368            if(fillIn[0]!= (UScriptCode)(USCRIPT_BALINESE+i)){
369                log_err("uscript_getCode did not return expected code for script %s. EXPECTED: %i GOT: %i\n", expectedShort[i], (USCRIPT_BALINESE+i), fillIn[0] );
370            }
371        }
372    }
373
374    {
375        /* test characters which have Script_Extensions */
376        UErrorCode errorCode=U_ZERO_ERROR;
377        if(!(
378                USCRIPT_COMMON==uscript_getScript(0x0640, &errorCode) &&
379                USCRIPT_INHERITED==uscript_getScript(0x0650, &errorCode) &&
380                USCRIPT_ARABIC==uscript_getScript(0xfdf2, &errorCode)) ||
381            U_FAILURE(errorCode)
382        ) {
383            log_err("uscript_getScript(character with Script_Extensions) failed\n");
384        }
385    }
386}
387
388void TestHasScript() {
389    if(!(
390        !uscript_hasScript(0x063f, USCRIPT_COMMON) &&
391        uscript_hasScript(0x063f, USCRIPT_ARABIC) &&  /* main Script value */
392        !uscript_hasScript(0x063f, USCRIPT_SYRIAC) &&
393        !uscript_hasScript(0x063f, USCRIPT_THAANA))
394    ) {
395        log_err("uscript_hasScript(U+063F, ...) is wrong\n");
396    }
397    if(!(
398        uscript_hasScript(0x0640, USCRIPT_COMMON) &&  /* main Script value */
399        uscript_hasScript(0x0640, USCRIPT_ARABIC) &&
400        uscript_hasScript(0x0640, USCRIPT_SYRIAC) &&
401        !uscript_hasScript(0x0640, USCRIPT_THAANA))
402    ) {
403        log_err("uscript_hasScript(U+0640, ...) is wrong\n");
404    }
405    if(!(
406        uscript_hasScript(0x0650, USCRIPT_INHERITED) &&  /* main Script value */
407        uscript_hasScript(0x0650, USCRIPT_ARABIC) &&
408        uscript_hasScript(0x0650, USCRIPT_SYRIAC) &&
409        !uscript_hasScript(0x0650, USCRIPT_THAANA))
410    ) {
411        log_err("uscript_hasScript(U+0650, ...) is wrong\n");
412    }
413    if(!(
414        uscript_hasScript(0x0660, USCRIPT_COMMON) &&  /* main Script value */
415        uscript_hasScript(0x0660, USCRIPT_ARABIC) &&
416        !uscript_hasScript(0x0660, USCRIPT_SYRIAC) &&
417        uscript_hasScript(0x0660, USCRIPT_THAANA))
418    ) {
419        log_err("uscript_hasScript(U+0660, ...) is wrong\n");
420    }
421    if(!(
422        !uscript_hasScript(0xfdf2, USCRIPT_COMMON) &&
423        uscript_hasScript(0xfdf2, USCRIPT_ARABIC) &&  /* main Script value */
424        !uscript_hasScript(0xfdf2, USCRIPT_SYRIAC) &&
425        uscript_hasScript(0xfdf2, USCRIPT_THAANA))
426    ) {
427        log_err("uscript_hasScript(U+FDF2, ...) is wrong\n");
428    }
429}
430
431void TestGetScriptExtensions() {
432    UScriptCode scripts[20];
433    int32_t length;
434    UErrorCode errorCode;
435
436    /* errors and overflows */
437    errorCode=U_PARSE_ERROR;
438    length=uscript_getScriptExtensions(0x0640, scripts, LENGTHOF(scripts), &errorCode);
439    if(errorCode!=U_PARSE_ERROR) {
440        log_err("uscript_getScriptExtensions(U_PARSE_ERROR) did not preserve the UErrorCode - %s\n",
441              u_errorName(errorCode));
442    }
443    errorCode=U_ZERO_ERROR;
444    length=uscript_getScriptExtensions(0x0640, NULL, LENGTHOF(scripts), &errorCode);
445    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
446        log_err("uscript_getScriptExtensions(NULL) did not set U_ILLEGAL_ARGUMENT_ERROR - %s\n",
447              u_errorName(errorCode));
448    }
449    errorCode=U_ZERO_ERROR;
450    length=uscript_getScriptExtensions(0x0640, scripts, -1, &errorCode);
451    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
452        log_err("uscript_getScriptExtensions(capacity<0) did not set U_ILLEGAL_ARGUMENT_ERROR - %s\n",
453              u_errorName(errorCode));
454    }
455    errorCode=U_ZERO_ERROR;
456    length=uscript_getScriptExtensions(0x0640, scripts, 0, &errorCode);
457    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=2) {
458        log_err("uscript_getScriptExtensions(capacity=0: pure preflighting)=%d != 2 - %s\n",
459              (int)length, u_errorName(errorCode));
460    }
461    errorCode=U_ZERO_ERROR;
462    length=uscript_getScriptExtensions(0x0640, scripts, 1, &errorCode);
463    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=2) {
464        log_err("uscript_getScriptExtensions(capacity=1: preflighting)=%d != 2 - %s\n",
465              (int)length, u_errorName(errorCode));
466    }
467
468    /* normal usage */
469    errorCode=U_ZERO_ERROR;
470    length=uscript_getScriptExtensions(0x063f, scripts, 0, &errorCode);
471    if(U_FAILURE(errorCode) || length!=0) {
472        log_err("uscript_getScriptExtensions(U+063F, capacity=0)=%d != 0 - %s\n",
473              (int)length, u_errorName(errorCode));
474    }
475    length=uscript_getScriptExtensions(0x0640, scripts, LENGTHOF(scripts), &errorCode);
476    if(U_FAILURE(errorCode) || length!=2 || scripts[0]!=USCRIPT_ARABIC || scripts[1]!=USCRIPT_SYRIAC) {
477        log_err("uscript_getScriptExtensions(U+0640)=%d failed - %s\n",
478              (int)length, u_errorName(errorCode));
479    }
480    length=uscript_getScriptExtensions(0xfdf2, scripts, LENGTHOF(scripts), &errorCode);
481    if(U_FAILURE(errorCode) || length!=2 || scripts[0]!=USCRIPT_ARABIC || scripts[1]!=USCRIPT_THAANA) {
482        log_err("uscript_getScriptExtensions(U+FDF2)=%d failed - %s\n",
483              (int)length, u_errorName(errorCode));
484    }
485    length=uscript_getScriptExtensions(0xff65, scripts, LENGTHOF(scripts), &errorCode);
486    if(U_FAILURE(errorCode) || length!=6 || scripts[0]!=USCRIPT_BOPOMOFO || scripts[5]!=USCRIPT_YI) {
487        log_err("uscript_getScriptExtensions(U+FF65)=%d failed - %s\n",
488              (int)length, u_errorName(errorCode));
489    }
490}
491
492void TestBinaryValues() {
493    /*
494     * Unicode 5.1 explicitly defines binary property value aliases.
495     * Verify that they are all recognized.
496     */
497    static const char *const falseValues[]={ "N", "No", "F", "False" };
498    static const char *const trueValues[]={ "Y", "Yes", "T", "True" };
499    int32_t i;
500    for(i=0; i<LENGTHOF(falseValues); ++i) {
501        if(FALSE!=u_getPropertyValueEnum(UCHAR_ALPHABETIC, falseValues[i])) {
502            log_data_err("u_getPropertyValueEnum(UCHAR_ALPHABETIC, \"%s\")!=FALSE (Are you missing data?)\n", falseValues[i]);
503        }
504    }
505    for(i=0; i<LENGTHOF(trueValues); ++i) {
506        if(TRUE!=u_getPropertyValueEnum(UCHAR_ALPHABETIC, trueValues[i])) {
507            log_data_err("u_getPropertyValueEnum(UCHAR_ALPHABETIC, \"%s\")!=TRUE (Are you missing data?)\n", trueValues[i]);
508        }
509    }
510}
511