1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uniset.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "hash.h"
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "patternprops.h"
1427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "normalizer2impl.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uparse.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucdtest.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof(array[0]))
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char *ignorePropNames[]={
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "FC_NFKC",
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "NFD_QC",
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "NFC_QC",
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "NFKD_QC",
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "NFKC_QC",
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Expands_On_NFD",
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Expands_On_NFC",
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Expands_On_NFKD",
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Expands_On_NFKC",
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "NFKC_CF"
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeTest::UnicodeTest()
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    unknownPropertyNames=new U_NAMESPACE_QUALIFIER Hashtable(errorCode);
3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(errorCode)) {
3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        delete unknownPropertyNames;
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unknownPropertyNames=NULL;
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Ignore some property names altogether.
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(int32_t i=0; i<LENGTHOF(ignorePropNames); ++i) {
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unknownPropertyNames->puti(UnicodeString(ignorePropNames[i], -1, US_INV), 1, errorCode);
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeTest::~UnicodeTest()
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete unknownPropertyNames;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UnicodeTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(exec) {
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        logln("TestSuite UnicodeTest: ");
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO_BEGIN;
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO(TestAdditionalProperties);
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO(TestBinaryValues);
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO(TestConsistency);
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO(TestPatternProperties);
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE_AUTO_END;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// private data used by the tests
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// test DerivedCoreProperties.txt -------------------------------------------
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copied from genprops.c
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetTokenIndex(const char *const tokens[], int32_t countTokens, const char *s) {
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *t, *z;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s=u_skipWhitespace(s);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<countTokens; ++i) {
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t=tokens[i];
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(t!=NULL) {
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j=0;; ++j) {
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(t[j]!=0) {
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(s[j]!=t[j]) {
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z=u_skipWhitespace(s+j);
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(*z==';' || *z==0) {
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        return i;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -1;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoderivedPropsNames[]={
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Math",
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Alphabetic",
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Lowercase",
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Uppercase",
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ID_Start",
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ID_Continue",
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "XID_Start",
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "XID_Continue",
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Default_Ignorable_Code_Point",
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Full_Composition_Exclusion",
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Grapheme_Extend",
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "Grapheme_Link", /* Unicode 5 moves this property here from PropList.txt */
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Grapheme_Base",
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Cased",
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Case_Ignorable",
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_Lowercased",
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_Uppercased",
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_Titlecased",
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_Casefolded",
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_Casemapped",
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    "Changes_When_NFKC_Casefolded"
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UProperty
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoderivedPropsIndex[]={
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_MATH,
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_ALPHABETIC,
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_LOWERCASE,
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_UPPERCASE,
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_ID_START,
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_ID_CONTINUE,
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_XID_START,
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_XID_CONTINUE,
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_DEFAULT_IGNORABLE_CODE_POINT,
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_FULL_COMPOSITION_EXCLUSION,
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_GRAPHEME_EXTEND,
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCHAR_GRAPHEME_LINK,
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_GRAPHEME_BASE,
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CASED,
14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CASE_IGNORABLE,
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_LOWERCASED,
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_UPPERCASED,
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_TITLECASED,
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_CASEFOLDED,
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_CASEMAPPED,
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t numErrors[LENGTHOF(derivedPropsIndex)]={ 0 };
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoenum { MAX_ERRORS=50 };
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void U_CALLCONV
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoderivedPropsLineFn(void *context,
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   char *fields[][2], int32_t /* fieldCount */,
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UErrorCode *pErrorCode)
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeTest *me=(UnicodeTest *)context;
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t start, end;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        me->errln("UnicodeTest: syntax error in DerivedCoreProperties.txt or DerivedNormalizationProps.txt field 0 at %s\n", fields[0][0]);
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* parse derived binary property name, ignore unknown names */
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    i=getTokenIndex(derivedPropsNames, LENGTHOF(derivedPropsNames), fields[1][0]);
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(i<0) {
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UnicodeString propName(fields[1][0], (int32_t)(fields[1][1]-fields[1][0]));
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        propName.trim();
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(me->unknownPropertyNames->find(propName)==NULL) {
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            UErrorCode errorCode=U_ZERO_ERROR;
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            me->unknownPropertyNames->puti(propName, 1, errorCode);
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            me->errln("UnicodeTest warning: unknown property name '%s' in DerivedCoreProperties.txt or DerivedNormalizationProps.txt\n", fields[1][0]);
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    me->derivedProps[i].add(start, end);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UnicodeTest::TestAdditionalProperties() {
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_NORMALIZATION
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // test DerivedCoreProperties.txt and DerivedNormalizationProps.txt
18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(LENGTHOF(derivedProps)<LENGTHOF(derivedPropsNames)) {
18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("error: UnicodeTest::derivedProps[] too short, need at least %d UnicodeSets\n",
19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              LENGTHOF(derivedPropsNames));
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(LENGTHOF(derivedPropsIndex)!=LENGTHOF(derivedPropsNames)) {
19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("error in ucdtest.cpp: LENGTHOF(derivedPropsIndex)!=LENGTHOF(derivedPropsNames)\n");
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char newPath[256];
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char backupPath[256];
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *fields[2][2];
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Look inside ICU_DATA first */
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(newPath, pathToDataDirectory());
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(newPath, "unidata" U_FILE_SEP_STRING "DerivedCoreProperties.txt");
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // As a fallback, try to guess where the source data was located
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // at the time ICU was built, and look there.
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   ifdef U_TOPSRCDIR
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(backupPath, U_TOPSRCDIR  U_FILE_SEP_STRING "data");
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   else
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(backupPath, loadTestData(errorCode));
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(backupPath, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data");
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   endif
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(backupPath, U_FILE_SEP_STRING);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(backupPath, "unidata" U_FILE_SEP_STRING "DerivedCoreProperties.txt");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char *path=newPath;
21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    u_parseDelimitedFile(newPath, ';', fields, 2, derivedPropsLineFn, this, &errorCode);
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode==U_FILE_ACCESS_ERROR) {
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        path=backupPath;
22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_parseDelimitedFile(backupPath, ';', fields, 2, derivedPropsLineFn, this, &errorCode);
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("error parsing DerivedCoreProperties.txt: %s\n", u_errorName(errorCode));
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char *basename=path+strlen(path)-strlen("DerivedCoreProperties.txt");
23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    strcpy(basename, "DerivedNormalizationProps.txt");
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    u_parseDelimitedFile(path, ';', fields, 2, derivedPropsLineFn, this, &errorCode);
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(errorCode)) {
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("error parsing DerivedNormalizationProps.txt: %s\n", u_errorName(errorCode));
23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // now we have all derived core properties in the UnicodeSets
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // run them all through the API
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t rangeCount, range;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t i;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 start, end;
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test all TRUE properties
24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(i=0; i<LENGTHOF(derivedPropsNames); ++i) {
24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        rangeCount=derivedProps[i].getRangeCount();
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for(range=0; range<rangeCount && numErrors[i]<MAX_ERRORS; ++range) {
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            start=derivedProps[i].getRangeStart(range);
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            end=derivedProps[i].getRangeEnd(range);
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(; start<=end; ++start) {
25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if(!u_hasBinaryProperty(start, derivedPropsIndex[i])) {
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    dataerrln("UnicodeTest error: u_hasBinaryProperty(U+%04lx, %s)==FALSE is wrong", start, derivedPropsNames[i]);
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    if(++numErrors[i]>=MAX_ERRORS) {
25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                      dataerrln("Too many errors, moving to the next test");
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // invert all properties
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(i=0; i<LENGTHOF(derivedPropsNames); ++i) {
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        derivedProps[i].complement();
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test all FALSE properties
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(i=0; i<LENGTHOF(derivedPropsNames); ++i) {
26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        rangeCount=derivedProps[i].getRangeCount();
27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for(range=0; range<rangeCount && numErrors[i]<MAX_ERRORS; ++range) {
27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            start=derivedProps[i].getRangeStart(range);
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            end=derivedProps[i].getRangeEnd(range);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(; start<=end; ++start) {
27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if(u_hasBinaryProperty(start, derivedPropsIndex[i])) {
27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    errln("UnicodeTest error: u_hasBinaryProperty(U+%04lx, %s)==TRUE is wrong\n", start, derivedPropsNames[i]);
27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    if(++numErrors[i]>=MAX_ERRORS) {
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      errln("Too many errors, moving to the next test");
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      break;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
28450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_NORMALIZATION */
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid UnicodeTest::TestBinaryValues() {
288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*
289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     * Unicode 5.1 explicitly defines binary property value aliases.
290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     * Verify that they are all recognized.
291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     */
292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeSet alpha(UNICODE_STRING_SIMPLE("[:Alphabetic:]"), errorCode);
294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("UnicodeSet([:Alphabetic:]) failed - %s", u_errorName(errorCode));
296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const char *const falseValues[]={ "N", "No", "F", "False" };
300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const char *const trueValues[]={ "Y", "Yes", "T", "True" };
301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t i;
302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for(i=0; i<LENGTHOF(falseValues); ++i) {
303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString pattern=UNICODE_STRING_SIMPLE("[:Alphabetic=:]");
304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        pattern.insert(pattern.length()-2, UnicodeString(falseValues[i], -1, US_INV));
305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeSet set(pattern, errorCode);
307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("UnicodeSet([:Alphabetic=%s:]) failed - %s\n", falseValues[i], u_errorName(errorCode));
309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            continue;
310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        set.complement();
312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(set!=alpha) {
313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("UnicodeSet([:Alphabetic=%s:]).complement()!=UnicodeSet([:Alphabetic:])\n", falseValues[i]);
314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for(i=0; i<LENGTHOF(trueValues); ++i) {
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString pattern=UNICODE_STRING_SIMPLE("[:Alphabetic=:]");
318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        pattern.insert(pattern.length()-2, UnicodeString(trueValues[i], -1, US_INV));
319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeSet set(pattern, errorCode);
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("UnicodeSet([:Alphabetic=%s:]) failed - %s\n", trueValues[i], u_errorName(errorCode));
323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            continue;
324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(set!=alpha) {
326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("UnicodeSet([:Alphabetic=%s:])!=UnicodeSet([:Alphabetic:])\n", trueValues[i]);
327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
33027f654740f2a26ad62a5c155af9199af9e69b889claireho
33127f654740f2a26ad62a5c155af9199af9e69b889clairehovoid UnicodeTest::TestConsistency() {
33227f654740f2a26ad62a5c155af9199af9e69b889claireho#if !UCONFIG_NO_NORMALIZATION
33327f654740f2a26ad62a5c155af9199af9e69b889claireho    /*
33427f654740f2a26ad62a5c155af9199af9e69b889claireho     * Test for an example that getCanonStartSet() delivers
33527f654740f2a26ad62a5c155af9199af9e69b889claireho     * all characters that compose from the input one,
33627f654740f2a26ad62a5c155af9199af9e69b889claireho     * even in multiple steps.
33727f654740f2a26ad62a5c155af9199af9e69b889claireho     * For example, the set for "I" (0049) should contain both
33827f654740f2a26ad62a5c155af9199af9e69b889claireho     * I-diaeresis (00CF) and I-diaeresis-acute (1E2E).
33927f654740f2a26ad62a5c155af9199af9e69b889claireho     * In general, the set for the middle such character should be a subset
34027f654740f2a26ad62a5c155af9199af9e69b889claireho     * of the set for the first.
34127f654740f2a26ad62a5c155af9199af9e69b889claireho     */
34227f654740f2a26ad62a5c155af9199af9e69b889claireho    IcuTestErrorCode errorCode(*this, "TestConsistency");
34327f654740f2a26ad62a5c155af9199af9e69b889claireho    const Normalizer2 *nfd=Normalizer2::getInstance(NULL, "nfc", UNORM2_DECOMPOSE, errorCode);
34427f654740f2a26ad62a5c155af9199af9e69b889claireho    const Normalizer2Impl *nfcImpl=Normalizer2Factory::getNFCImpl(errorCode);
345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(!nfcImpl->ensureCanonIterData(errorCode) || errorCode.isFailure()) {
34627f654740f2a26ad62a5c155af9199af9e69b889claireho        dataerrln("Normalizer2::getInstance(NFD) or Normalizer2Factory::getNFCImpl() failed - %s\n",
34727f654740f2a26ad62a5c155af9199af9e69b889claireho                  errorCode.errorName());
34827f654740f2a26ad62a5c155af9199af9e69b889claireho        errorCode.reset();
34927f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
35027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
35127f654740f2a26ad62a5c155af9199af9e69b889claireho
35227f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeSet set1, set2;
35327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (nfcImpl->getCanonStartSet(0x49, set1)) {
35427f654740f2a26ad62a5c155af9199af9e69b889claireho        /* enumerate all characters that are plausible to be latin letters */
35527f654740f2a26ad62a5c155af9199af9e69b889claireho        for(UChar start=0xa0; start<0x2000; ++start) {
35627f654740f2a26ad62a5c155af9199af9e69b889claireho            UnicodeString decomp=nfd->normalize(UnicodeString(start), errorCode);
35727f654740f2a26ad62a5c155af9199af9e69b889claireho            if(decomp.length()>1 && decomp[0]==0x49) {
35827f654740f2a26ad62a5c155af9199af9e69b889claireho                set2.add(start);
35927f654740f2a26ad62a5c155af9199af9e69b889claireho            }
36027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
36127f654740f2a26ad62a5c155af9199af9e69b889claireho
36227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (set1!=set2) {
36327f654740f2a26ad62a5c155af9199af9e69b889claireho            errln("[canon start set of 0049] != [all c with canon decomp with 0049]");
36427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
36527f654740f2a26ad62a5c155af9199af9e69b889claireho        // This was available in cucdtst.c but the test had to move to intltest
36627f654740f2a26ad62a5c155af9199af9e69b889claireho        // because the new internal normalization functions are in C++.
36727f654740f2a26ad62a5c155af9199af9e69b889claireho        //compareUSets(set1, set2,
36827f654740f2a26ad62a5c155af9199af9e69b889claireho        //             "[canon start set of 0049]", "[all c with canon decomp with 0049]",
36927f654740f2a26ad62a5c155af9199af9e69b889claireho        //             TRUE);
37027f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
37127f654740f2a26ad62a5c155af9199af9e69b889claireho        errln("NFC.getCanonStartSet() returned FALSE");
37227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
37327f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
37427f654740f2a26ad62a5c155af9199af9e69b889claireho}
375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Test various implementations of Pattern_Syntax & Pattern_White_Space.
378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UnicodeTest::TestPatternProperties() {
380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    IcuTestErrorCode errorCode(*this, "TestPatternProperties()");
381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet syn_pp;
382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet syn_prop(UNICODE_STRING_SIMPLE("[:Pattern_Syntax:]"), errorCode);
383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet syn_list(
384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "[!-/\\:-@\\[-\\^`\\{-~"
385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u00A1-\\u00A7\\u00A9\\u00AB\\u00AC\\u00AE\\u00B0\\u00B1\\u00B6\\u00BB\\u00BF\\u00D7\\u00F7"
386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u2010-\\u2027\\u2030-\\u203E\\u2041-\\u2053\\u2055-\\u205E\\u2190-\\u245F\\u2500-\\u2775"
387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u2794-\\u2BFF\\u2E00-\\u2E7F\\u3001-\\u3003\\u3008-\\u3020\\u3030\\uFD3E\\uFD3F\\uFE45\\uFE46]", errorCode);
388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet ws_pp;
389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet ws_prop(UNICODE_STRING_SIMPLE("[:Pattern_White_Space:]"), errorCode);
390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet ws_list(UNICODE_STRING_SIMPLE("[\\u0009-\\u000D\\ \\u0085\\u200E\\u200F\\u2028\\u2029]"), errorCode);
391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet syn_ws_pp;
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet syn_ws_prop(syn_prop);
393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    syn_ws_prop.addAll(ws_prop);
394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for(UChar32 c=0; c<=0xffff; ++c) {
395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(PatternProps::isSyntax(c)) {
396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            syn_pp.add(c);
397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(PatternProps::isWhiteSpace(c)) {
399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ws_pp.add(c);
400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(PatternProps::isSyntaxOrWhiteSpace(c)) {
402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            syn_ws_pp.add(c);
403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    compareUSets(syn_pp, syn_prop,
406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "PatternProps.isSyntax()", "[:Pattern_Syntax:]", TRUE);
407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    compareUSets(syn_pp, syn_list,
408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "PatternProps.isSyntax()", "[Pattern_Syntax ranges]", TRUE);
409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    compareUSets(ws_pp, ws_prop,
410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "PatternProps.isWhiteSpace()", "[:Pattern_White_Space:]", TRUE);
411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    compareUSets(ws_pp, ws_list,
412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "PatternProps.isWhiteSpace()", "[Pattern_White_Space ranges]", TRUE);
413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    compareUSets(syn_ws_pp, syn_ws_prop,
414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "PatternProps.isSyntaxOrWhiteSpace()",
415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 "[[:Pattern_Syntax:][:Pattern_White_Space:]]", TRUE);
416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// So far only minimal port of Java & cucdtst.c compareUSets().
419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeTest::compareUSets(const UnicodeSet &a, const UnicodeSet &b,
421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                          const char *a_name, const char *b_name,
422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                          UBool diffIsError) {
423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool same= a==b;
424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(!same && diffIsError) {
425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Sets are different: %s vs. %s\n", a_name, b_name);
426b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return same;
428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
429