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