16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*******************************************************************************
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File CUCDTST.C
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*        Name                     Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*     Madhu Katragadda            Ported for C API, added tests for string functions
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <math.h>
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unorm2.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uparse.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucase.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ubidi_props.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uprops.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uset_imp.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "usc_impl.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udatamem.h" /* for testing ucase_openBinary() */
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cucdapi.h"
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prototypes --------------------------------------------------------------- */
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUpperLower(void);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestLetterNumber(void);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMisc(void);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPOSIX(void);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestControlPrint(void);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestIdentifier(void);
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUnicodeData(void);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodeUnit(void);
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodePoint(void);
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCharLength(void);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCharNames(void);
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMirroring(void);
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUScriptRunAPI(void);
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAdditionalProperties(void);
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNumericProperties(void);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPropertyNames(void);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPropertyValues(void);
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestConsistency(void);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUCase(void);
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUBiDiProps(void);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCaseFolding(void);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* internal methods used */
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t MakeProp(char* str);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t MakeDir(char* str);
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* helpers ------------------------------------------------------------------ */
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgparseUCDFile(const char *filename,
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             char *fields[][2], int32_t fieldCount,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UParseLineFn *lineFn, void *context,
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UErrorCode *pErrorCode) {
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char path[256];
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char backupPath[256];
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Look inside ICU_DATA first */
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcpy(path, u_getDataDirectory());
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(path, ".." U_FILE_SEP_STRING "unidata" U_FILE_SEP_STRING);
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(path, filename);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* As a fallback, try to guess where the source data was located
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    at the time ICU was built, and look there.
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcpy(backupPath, ctest_dataSrcDir());
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(backupPath, U_FILE_SEP_STRING);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(backupPath, "unidata" U_FILE_SEP_STRING);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(backupPath, filename);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_parseDelimitedFile(path, ';', fields, fieldCount, lineFn, context, pErrorCode);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(*pErrorCode==U_FILE_ACCESS_ERROR) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_ZERO_ERROR;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_parseDelimitedFile(backupPath, ';', fields, fieldCount, lineFn, context, pErrorCode);
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(*pErrorCode, "error parsing %s: %s\n", filename, u_errorName(*pErrorCode));
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test data ---------------------------------------------------------------- */
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar  LAST_CHAR_CODE_IN_FILE = 0xFFFD;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char tagStrings[] = "MnMcMeNdNlNoZsZlZpCcCfCsCoCnLuLlLtLmLoPcPdPsPePoSmScSkSoPiPf";
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t tagValues[] =
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Mn */ U_NON_SPACING_MARK,
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Mc */ U_COMBINING_SPACING_MARK,
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Me */ U_ENCLOSING_MARK,
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Nd */ U_DECIMAL_DIGIT_NUMBER,
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Nl */ U_LETTER_NUMBER,
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* No */ U_OTHER_NUMBER,
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Zs */ U_SPACE_SEPARATOR,
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Zl */ U_LINE_SEPARATOR,
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Zp */ U_PARAGRAPH_SEPARATOR,
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Cc */ U_CONTROL_CHAR,
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Cf */ U_FORMAT_CHAR,
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Cs */ U_SURROGATE,
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Co */ U_PRIVATE_USE_CHAR,
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Cn */ U_UNASSIGNED,
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Lu */ U_UPPERCASE_LETTER,
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Ll */ U_LOWERCASE_LETTER,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Lt */ U_TITLECASE_LETTER,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Lm */ U_MODIFIER_LETTER,
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Lo */ U_OTHER_LETTER,
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Pc */ U_CONNECTOR_PUNCTUATION,
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Pd */ U_DASH_PUNCTUATION,
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Ps */ U_START_PUNCTUATION,
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Pe */ U_END_PUNCTUATION,
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Po */ U_OTHER_PUNCTUATION,
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Sm */ U_MATH_SYMBOL,
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Sc */ U_CURRENCY_SYMBOL,
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Sk */ U_MODIFIER_SYMBOL,
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* So */ U_OTHER_SYMBOL,
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Pi */ U_INITIAL_PUNCTUATION,
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Pf */ U_FINAL_PUNCTUATION
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char dirStrings[][5] = {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "L",
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "R",
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "EN",
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ES",
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ET",
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "AN",
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "CS",
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "B",
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "S",
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "WS",
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ON",
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "LRE",
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "LRO",
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "AL",
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "RLE",
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "RLO",
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "PDF",
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "NSM",
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "BN",
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* new in Unicode 6.3/ICU 52 */
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "FSI",
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "LRI",
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "RLI",
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "PDI"
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUnicodeTest(TestNode** root);
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUnicodeTest(TestNode** root)
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCodeUnit, "tsutil/cucdtst/TestCodeUnit");
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCodePoint, "tsutil/cucdtst/TestCodePoint");
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCharLength, "tsutil/cucdtst/TestCharLength");
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBinaryValues, "tsutil/cucdtst/TestBinaryValues");
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUnicodeData, "tsutil/cucdtst/TestUnicodeData");
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestAdditionalProperties, "tsutil/cucdtst/TestAdditionalProperties");
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestNumericProperties, "tsutil/cucdtst/TestNumericProperties");
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUpperLower, "tsutil/cucdtst/TestUpperLower");
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestLetterNumber, "tsutil/cucdtst/TestLetterNumber");
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestMisc, "tsutil/cucdtst/TestMisc");
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPOSIX, "tsutil/cucdtst/TestPOSIX");
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestControlPrint, "tsutil/cucdtst/TestControlPrint");
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestIdentifier, "tsutil/cucdtst/TestIdentifier");
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCharNames, "tsutil/cucdtst/TestCharNames");
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestMirroring, "tsutil/cucdtst/TestMirroring");
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUScriptCodeAPI, "tsutil/cucdtst/TestUScriptCodeAPI");
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestHasScript, "tsutil/cucdtst/TestHasScript");
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetScriptExtensions, "tsutil/cucdtst/TestGetScriptExtensions");
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestScriptMetadataAPI, "tsutil/cucdtst/TestScriptMetadataAPI");
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUScriptRunAPI, "tsutil/cucdtst/TestUScriptRunAPI");
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPropertyNames, "tsutil/cucdtst/TestPropertyNames");
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPropertyValues, "tsutil/cucdtst/TestPropertyValues");
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestConsistency, "tsutil/cucdtst/TestConsistency");
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUCase, "tsutil/cucdtst/TestUCase");
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUBiDiProps, "tsutil/cucdtst/TestUBiDiProps");
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCaseFolding, "tsutil/cucdtst/TestCaseFolding");
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*==================================================== */
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test u_toupper() and u_tolower()                    */
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*==================================================== */
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUpperLower()
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar upper[] = {0x41, 0x42, 0x00b2, 0x01c4, 0x01c6, 0x01c9, 0x01c8, 0x01c9, 0x000c, 0x0000};
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar lower[] = {0x61, 0x62, 0x00b2, 0x01c6, 0x01c6, 0x01c9, 0x01c9, 0x01c9, 0x000c, 0x0000};
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(upperTest, "abcdefg123hij.?:klmno", 21);
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(lowerTest, "ABCDEFG123HIJ.?:KLMNO", 21);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(upperTest, "abcdefg123hij.?:klmno", 21);
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(lowerTest, "ABCDEFG123HIJ.?:KLMNO", 21);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgChecks LetterLike Symbols which were previously a source of confusion
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org[Bertrand A. D. 02/04/98]
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0x2100;i<0x2138;i++)
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Unicode 5.0 adds lowercase U+214E (TURNED SMALL F) to U+2132 (TURNED CAPITAL F) */
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i!=0x2126 && i!=0x212a && i!=0x212b && i!=0x2132)
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (i != (int)u_tolower(i)) /* itself */
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Failed case conversion with itself: U+%04x\n", i);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (i != (int)u_toupper(i))
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Failed case conversion with itself: U+%04x\n", i);
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i < u_strlen(upper); i++){
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u_tolower(upper[i]) != lower[i]){
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAILED u_tolower() for %lx Expected %lx Got %lx\n", upper[i], lower[i], u_tolower(upper[i]));
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("testing upper lower\n");
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < 21; i++) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_isalpha(upperTest[i]) && !u_islower(upperTest[i]))
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isLowerCase test at  %c\n", upperTest[i]);
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (u_isalpha(lowerTest[i]) && !u_isupper(lowerTest[i]))
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         {
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isUpperCase test at %c\n", lowerTest[i]);
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (upperTest[i] != u_tolower(lowerTest[i]))
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed case conversion from %c  To %c :\n", lowerTest[i], upperTest[i]);
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (lowerTest[i] != u_toupper(upperTest[i]))
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         {
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed case conversion : %c To %c \n", upperTest[i], lowerTest[i]);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (upperTest[i] != u_tolower(upperTest[i]))
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed case conversion with itself: %c\n", upperTest[i]);
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (lowerTest[i] != u_toupper(lowerTest[i]))
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed case conversion with itself: %c\n", lowerTest[i]);
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("done testing upper lower\n");
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("testing u_istitle\n");
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar expected[] = {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F88,
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F89,
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8A,
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8B,
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8C,
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8D,
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8E,
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8F,
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F88,
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F89,
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8A,
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8B,
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8C,
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8D,
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8E,
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F8F,
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F98,
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F99,
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9A,
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9B,
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9C,
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9D,
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9E,
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9F,
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F98,
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F99,
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9A,
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9B,
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9C,
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9D,
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9E,
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1F9F,
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FA8,
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FA9,
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAA,
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAB,
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAC,
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAD,
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAE,
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAF,
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FA8,
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FA9,
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAA,
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAB,
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAC,
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAD,
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAE,
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FAF,
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FBC,
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FBC,
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FCC,
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FCC,
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FFC,
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0x1FFC,
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        };
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t num = sizeof(expected)/sizeof(expected[0]);
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<num; i++){
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!u_istitle(expected[i])){
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_istitle failed for 0x%4X. Expected TRUE, got FALSE\n",expected[i]);
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* compare two sets and verify that their difference or intersection is empty */
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgshowADiffB(const USet *a, const USet *b,
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           const char *a_name, const char *b_name,
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           UBool expect, UBool diffIsError) {
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *aa;
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, start, end, length;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * expect:
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * TRUE  -> a-b should be empty, that is, b should contain all of a
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * FALSE -> a&b should be empty, that is, a should contain none of b (and vice versa)
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(expect ? uset_containsAll(b, a) : uset_containsNone(a, b)) {
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* clone a to aa because a is const */
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    aa=uset_open(1, 0);
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(aa==NULL) {
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* unusual problem - out of memory? */
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_addAll(aa, a);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* compute the set in question */
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(expect) {
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* a-b */
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_removeAll(aa, b);
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* a&b */
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_retainAll(aa, b);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* aa is not empty because of the initial tests above; show its contents */
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=0;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;) {
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=uset_getItem(aa, i, &start, &end, NULL, 0, &errorCode);
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) {
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break; /* done */
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error comparing %s with %s at difference item %d: %s\n",
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                a_name, b_name, i, u_errorName(errorCode));
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length!=0) {
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break; /* done with code points, got a string or -1 */
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(diffIsError) {
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(expect) {
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: %s contains U+%04x..U+%04x but %s does not\n", a_name, start, end, b_name);
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: %s and %s both contain U+%04x..U+%04x but should not intersect\n", a_name, b_name, start, end);
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(expect) {
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("info: %s contains U+%04x..U+%04x but %s does not\n", a_name, start, end, b_name);
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("info: %s and %s both contain U+%04x..U+%04x but should not intersect\n", a_name, b_name, start, end);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++i;
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(aa);
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgshowAMinusB(const USet *a, const USet *b,
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char *a_name, const char *b_name,
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UBool diffIsError) {
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return showADiffB(a, b, a_name, b_name, TRUE, diffIsError);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgshowAIntersectB(const USet *a, const USet *b,
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char *a_name, const char *b_name,
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool diffIsError) {
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return showADiffB(a, b, a_name, b_name, FALSE, diffIsError);
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcompareUSets(const USet *a, const USet *b,
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const char *a_name, const char *b_name,
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UBool diffIsError) {
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Use an arithmetic & not a logical && so that both branches
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * are always taken and all differences are shown.
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAMinusB(a, b, a_name, b_name, diffIsError) &
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAMinusB(b, a, b_name, a_name, diffIsError);
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test isLetter(u_isapha()) and isDigit(u_isdigit()) */
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestLetterNumber()
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar i = 0x0000;
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing for isalpha\n");
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0x0041; i < 0x005B; i++) {
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!u_isalpha(i))
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isLetter test at  %.4X\n", i);
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0x0660; i < 0x066A; i++) {
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_isalpha(i))
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isLetter test with numbers at %.4X\n", i);
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing for isdigit\n");
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0x0660; i < 0x066A; i++) {
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!u_isdigit(i))
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("Failed isNumber test at %.4X\n", i);
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing for isalnum\n");
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0x0041; i < 0x005B; i++) {
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!u_isalnum(i))
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isAlNum test at  %.4X\n", i);
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0x0660; i < 0x066A; i++) {
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!u_isalnum(i))
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Failed isAlNum test at  %.4X\n", i);
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * The following checks work only starting from Unicode 4.0.
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Check the version number here.
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static UVersionInfo u401={ 4, 0, 1, 0 };
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UVersionInfo version;
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getUnicodeVersion(version);
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(version[0]<4 || 0==memcmp(version, u401, 4)) {
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Sanity check:
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Verify that exactly the digit characters have decimal digit values.
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * This assumption is used in the implementation of u_digit()
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * (which checks nt=de)
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * compared with the parallel java.lang.Character.digit()
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * (which checks Nd).
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * This was not true in Unicode 3.2 and earlier.
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Unicode 4.0 fixed discrepancies.
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Unicode 4.0.1 re-introduced problems in this area due to an
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * unintentionally incomplete last-minute change.
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_STRING_DECL(digitsPattern, "[:Nd:]", 6);
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_STRING_DECL(decimalValuesPattern, "[:Numeric_Type=Decimal:]", 24);
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        USet *digits, *decimalValues;
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode errorCode;
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_STRING_INIT(digitsPattern, "[:Nd:]", 6);
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_STRING_INIT(decimalValuesPattern, "[:Numeric_Type=Decimal:]", 24);
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        digits=uset_openPattern(digitsPattern, 6, &errorCode);
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        decimalValues=uset_openPattern(decimalValuesPattern, 24, &errorCode);
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(errorCode)) {
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            compareUSets(digits, decimalValues, "[:Nd:]", "[:Numeric_Type=Decimal:]", TRUE);
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(digits);
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(decimalValues);
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testSampleCharProps(UBool propFn(UChar32), const char *propName,
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                const UChar32 *sampleChars, int32_t sampleCharsLength,
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                UBool expected) {
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < sampleCharsLength; ++i) {
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool result = propFn(sampleChars[i]);
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (result != expected) {
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: character property function %s(U+%04x)=%d is wrong\n",
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    propName, sampleChars[i], result);
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Tests for isDefined(u_isdefined)(, isBaseForm(u_isbase()), isSpaceChar(u_isspace()), isWhiteSpace(), u_CharDigitValue() */
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMisc()
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleSpaces[] = {0x0020, 0x00a0, 0x2000, 0x2001, 0x2005};
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleNonSpaces[] = {0x61, 0x62, 0x63, 0x64, 0x74};
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleUndefined[] = {0xfff1, 0xfff7, 0xfa6e};
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleDefined[] = {0x523E, 0x4f88, 0xfffd};
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleBase[] = {0x0061, 0x0031, 0x03d2};
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleNonBase[] = {0x002B, 0x0020, 0x203B};
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    static const UChar sampleChars[] = {0x000a, 0x0045, 0x4e00, 0xDC00, 0xFFE8, 0xFFF0};*/
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleDigits[]= {0x0030, 0x0662, 0x0F23, 0x0ED5};
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleNonDigits[] = {0x0010, 0x0041, 0x0122, 0x68FE};
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleWhiteSpaces[] = {0x2008, 0x2009, 0x200a, 0x001c, 0x000c};
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 sampleNonWhiteSpaces[] = {0x61, 0x62, 0x3c, 0x28, 0x3f, 0x85, 0x2007, 0xffef};
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t sampleDigitValues[] = {0, 2, 3, 5};
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t mask;
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char icuVersion[U_MAX_VERSION_STRING_LENGTH];
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo realVersion;
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(icuVersion, 0, U_MAX_VERSION_STRING_LENGTH);
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isspace, "u_isspace", sampleSpaces, LENGTHOF(sampleSpaces), TRUE);
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isspace, "u_isspace", sampleNonSpaces, LENGTHOF(sampleNonSpaces), FALSE);
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaSpaceChar, "u_isJavaSpaceChar",
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleSpaces, LENGTHOF(sampleSpaces), TRUE);
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaSpaceChar, "u_isJavaSpaceChar",
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonSpaces, LENGTHOF(sampleNonSpaces), FALSE);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isWhitespace, "u_isWhitespace",
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleWhiteSpaces, LENGTHOF(sampleWhiteSpaces), TRUE);
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isWhitespace, "u_isWhitespace",
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonWhiteSpaces, LENGTHOF(sampleNonWhiteSpaces), FALSE);
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isdefined, "u_isdefined",
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleDefined, LENGTHOF(sampleDefined), TRUE);
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isdefined, "u_isdefined",
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleUndefined, LENGTHOF(sampleUndefined), FALSE);
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isbase, "u_isbase", sampleBase, LENGTHOF(sampleBase), TRUE);
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isbase, "u_isbase", sampleNonBase, LENGTHOF(sampleNonBase), FALSE);
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isdigit, "u_isdigit", sampleDigits, LENGTHOF(sampleDigits), TRUE);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isdigit, "u_isdigit", sampleNonDigits, LENGTHOF(sampleNonDigits), FALSE);
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < LENGTHOF(sampleDigits); i++) {
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_charDigitValue(sampleDigits[i]) != sampleDigitValues[i]) {
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_charDigitValue(U+04x)=%d != %d\n",
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    sampleDigits[i], u_charDigitValue(sampleDigits[i]), sampleDigitValues[i]);
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Tests the ICU version #*/
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getVersion(realVersion);
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(realVersion, icuVersion);
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strncmp(icuVersion, U_ICU_VERSION, uprv_min((int32_t)strlen(icuVersion), (int32_t)strlen(U_ICU_VERSION))) != 0)
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ICU version test failed. Header says=%s, got=%s \n", U_ICU_VERSION, icuVersion);
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ICU_VERSION)
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test only happens where we have configure.in with VERSION - sanity check. */
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(U_ICU_VERSION, ICU_VERSION))
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ICU version mismatch: Header says %s, build environment says %s.\n",  U_ICU_VERSION, ICU_VERSION);
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test U_GC_... */
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0x41)!=U_GC_LU_MASK ||
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0x662)!=U_GC_ND_MASK ||
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0xa0)!=U_GC_ZS_MASK ||
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0x28)!=U_GC_PS_MASK ||
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0x2044)!=U_GC_SM_MASK ||
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_GET_GC_MASK(0xe0063)!=U_GC_CF_MASK
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: U_GET_GC_MASK does not work properly\n");
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=0;
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_CN_MASK)|U_GC_CN_MASK;
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_LU_MASK)|U_GC_LU_MASK;
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_LL_MASK)|U_GC_LL_MASK;
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_LT_MASK)|U_GC_LT_MASK;
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_LM_MASK)|U_GC_LM_MASK;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_LO_MASK)|U_GC_LO_MASK;
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_MN_MASK)|U_GC_MN_MASK;
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_ME_MASK)|U_GC_ME_MASK;
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_MC_MASK)|U_GC_MC_MASK;
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_ND_MASK)|U_GC_ND_MASK;
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_NL_MASK)|U_GC_NL_MASK;
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_NO_MASK)|U_GC_NO_MASK;
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_ZS_MASK)|U_GC_ZS_MASK;
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_ZL_MASK)|U_GC_ZL_MASK;
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_ZP_MASK)|U_GC_ZP_MASK;
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_CC_MASK)|U_GC_CC_MASK;
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_CF_MASK)|U_GC_CF_MASK;
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_CO_MASK)|U_GC_CO_MASK;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_CS_MASK)|U_GC_CS_MASK;
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PD_MASK)|U_GC_PD_MASK;
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PS_MASK)|U_GC_PS_MASK;
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PE_MASK)|U_GC_PE_MASK;
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PC_MASK)|U_GC_PC_MASK;
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PO_MASK)|U_GC_PO_MASK;
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_SM_MASK)|U_GC_SM_MASK;
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_SC_MASK)|U_GC_SC_MASK;
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_SK_MASK)|U_GC_SK_MASK;
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_SO_MASK)|U_GC_SO_MASK;
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PI_MASK)|U_GC_PI_MASK;
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_PF_MASK)|U_GC_PF_MASK;
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(mask!=(U_CHAR_CATEGORY_COUNT<32 ? U_MASK(U_CHAR_CATEGORY_COUNT)-1: 0xffffffff)) {
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: problems with U_GC_XX_MASK constants\n");
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=0;
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_C_MASK)|U_GC_C_MASK;
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_L_MASK)|U_GC_L_MASK;
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_M_MASK)|U_GC_M_MASK;
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_N_MASK)|U_GC_N_MASK;
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_Z_MASK)|U_GC_Z_MASK;
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_P_MASK)|U_GC_P_MASK;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=(mask&~U_GC_S_MASK)|U_GC_S_MASK;
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(mask!=(U_CHAR_CATEGORY_COUNT<32 ? U_MASK(U_CHAR_CATEGORY_COUNT)-1: 0xffffffff)) {
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: problems with U_GC_Y_MASK constants\n");
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar32 digit[10]={ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039 };
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<10; i++){
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(digit[i]!=u_forDigit(i,10)){
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_forDigit failed for %i. Expected: 0x%4X Got: 0x%4X\n",i,digit[i],u_forDigit(i,10));
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test u_digit() */
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const struct {
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar32 c;
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int8_t radix, value;
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } data[]={
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* base 16 */
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0031, 16, 1 },
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0038, 16, 8 },
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0043, 16, 12 },
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0066, 16, 15 },
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x00e4, 16, -1 },
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0662, 16, 2 },
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x06f5, 16, 5 },
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff13, 16, 3 },
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff41, 16, 10 },
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* base 8 */
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0031, 8, 1 },
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0038, 8, -1 },
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0043, 8, -1 },
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0066, 8, -1 },
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x00e4, 8, -1 },
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0662, 8, 2 },
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x06f5, 8, 5 },
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff13, 8, 3 },
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff41, 8, -1 },
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* base 36 */
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x5a, 36, 35 },
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x7a, 36, 35 },
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff3a, 36, 35 },
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff5a, 36, 35 },
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* wrong radix values */
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x0031, 1, -1 },
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff3a, 37, -1 }
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        };
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<LENGTHOF(data); ++i) {
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u_digit(data[i].c, data[i].radix)!=data[i].value) {
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_digit(U+%04x, %d)=%d expected %d\n",
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        data[i].c,
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        data[i].radix,
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        u_digit(data[i].c, data[i].radix),
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        data[i].value);
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test C/POSIX-style functions --------------------------------------------- */
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* bit flags */
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISAL     1
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISLO     2
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISUP     4
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISDI     8
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISXD  0x10
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISAN  0x20
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISPU  0x40
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISGR  0x80
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISPR 0x100
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISSP 0x200
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISBL 0x400
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ISCN 0x800
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* C/POSIX-style functions, in the same order as the bit flags */
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef UBool U_EXPORT2 IsPOSIXClass(UChar32 c);
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IsPOSIXClass *fn;
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *name;
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} posixClasses[]={
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isalpha, "isalpha" },
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_islower, "islower" },
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isupper, "isupper" },
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isdigit, "isdigit" },
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isxdigit, "isxdigit" },
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isalnum, "isalnum" },
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_ispunct, "ispunct" },
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isgraph, "isgraph" },
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isprint, "isprint" },
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isspace, "isspace" },
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_isblank, "isblank" },
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { u_iscntrl, "iscntrl" }
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t posixResults;
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} posixData[]={
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0008,                                                        ISCN },    /* backspace */
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0009,                                              ISSP|ISBL|ISCN },    /* TAB */
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x000a,                                              ISSP|     ISCN },    /* LF */
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x000c,                                              ISSP|     ISCN },    /* FF */
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x000d,                                              ISSP|     ISCN },    /* CR */
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0020,                                         ISPR|ISSP|ISBL      },    /* space */
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0021,                               ISPU|ISGR|ISPR                },    /* ! */
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0033,                ISDI|ISXD|ISAN|     ISGR|ISPR                },    /* 3 */
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0040,                               ISPU|ISGR|ISPR                },    /* @ */
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0041, ISAL|     ISUP|     ISXD|ISAN|     ISGR|ISPR                },    /* A */
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x007a, ISAL|ISLO|               ISAN|     ISGR|ISPR                },    /* z */
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x007b,                               ISPU|ISGR|ISPR                },    /* { */
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0085,                                              ISSP|     ISCN },    /* NEL */
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x00a0,                                         ISPR|ISSP|ISBL      },    /* NBSP */
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x00a4,                                    ISGR|ISPR                },    /* currency sign */
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x00e4, ISAL|ISLO|               ISAN|     ISGR|ISPR                },    /* a-umlaut */
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0300,                                    ISGR|ISPR                },    /* combining grave */
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0600,                                                        ISCN },    /* arabic number sign */
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0627, ISAL|                    ISAN|     ISGR|ISPR                },    /* alef */
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x0663,                ISDI|ISXD|ISAN|     ISGR|ISPR                },    /* arabic 3 */
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x2002,                                         ISPR|ISSP|ISBL      },    /* en space */
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x2007,                                         ISPR|ISSP|ISBL      },    /* figure space */
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x2009,                                         ISPR|ISSP|ISBL      },    /* thin space */
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x200b,                                                        ISCN },    /* ZWSP */
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*{ 0x200b,                                         ISPR|ISSP           },*/    /* ZWSP */ /* ZWSP became a control char in 4.0.1*/
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x200e,                                                        ISCN },    /* LRM */
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x2028,                                         ISPR|ISSP|     ISCN },    /* LS */
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x2029,                                         ISPR|ISSP|     ISCN },    /* PS */
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x20ac,                                    ISGR|ISPR                },    /* Euro */
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0xff15,                ISDI|ISXD|ISAN|     ISGR|ISPR                },    /* fullwidth 5 */
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0xff25, ISAL|     ISUP|     ISXD|ISAN|     ISGR|ISPR                },    /* fullwidth E */
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0xff35, ISAL|     ISUP|          ISAN|     ISGR|ISPR                },    /* fullwidth U */
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0xff45, ISAL|ISLO|          ISXD|ISAN|     ISGR|ISPR                },    /* fullwidth e */
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0xff55, ISAL|ISLO|               ISAN|     ISGR|ISPR                }     /* fullwidth u */
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestPOSIX() {
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t mask;
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t cl, i;
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool expect;
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mask=1;
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(cl=0; cl<12; ++cl) {
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<LENGTHOF(posixData); ++i) {
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expect=(UBool)((posixData[i].posixResults&mask)!=0);
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(posixClasses[cl].fn(posixData[i].c)!=expect) {
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_%s(U+%04x)=%s is wrong\n",
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    posixClasses[cl].name, posixData[i].c, expect ? "FALSE" : "TRUE");
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        mask<<=1;
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Tests for isControl(u_iscntrl()) and isPrintable(u_isprint()) */
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestControlPrint()
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleControl[] = {0x1b, 0x97, 0x82, 0x2028, 0x2029, 0x200c, 0x202b};
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonControl[] = {0x61, 0x0031, 0x00e2};
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 samplePrintable[] = {0x0042, 0x005f, 0x2014};
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonPrintable[] = {0x200c, 0x009f, 0x001b};
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_iscntrl, "u_iscntrl", sampleControl, LENGTHOF(sampleControl), TRUE);
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_iscntrl, "u_iscntrl", sampleNonControl, LENGTHOF(sampleNonControl), FALSE);
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isprint, "u_isprint",
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        samplePrintable, LENGTHOF(samplePrintable), TRUE);
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isprint, "u_isprint",
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonPrintable, LENGTHOF(sampleNonPrintable), FALSE);
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test all ISO 8 controls */
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(c=0; c<=0x9f; ++c) {
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c==0x20) {
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* skip ASCII graphic characters and continue with DEL */
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=0x7f;
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!u_iscntrl(c)) {
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_iscntrl(ISO 8 control U+%04x)=FALSE\n", c);
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!u_isISOControl(c)) {
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_isISOControl(ISO 8 control U+%04x)=FALSE\n", c);
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u_isprint(c)) {
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_isprint(ISO 8 control U+%04x)=TRUE\n", c);
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test all Latin-1 graphic characters */
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(c=0x20; c<=0xff; ++c) {
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c==0x7f) {
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=0xa0;
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(c==0xad) {
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Unicode 4 changes 00AD Soft Hyphen to Cf (and it is in fact not printable) */
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++c;
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!u_isprint(c)) {
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_isprint(Latin-1 graphic character U+%04x)=FALSE\n", c);
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* u_isJavaIDStart, u_isJavaIDPart, u_isIDStart(), u_isIDPart(), u_isIDIgnorable()*/
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestIdentifier()
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleJavaIDStart[] = {0x0071, 0x00e4, 0x005f};
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonJavaIDStart[] = {0x0020, 0x2030, 0x0082};
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleJavaIDPart[] = {0x005f, 0x0032, 0x0045};
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonJavaIDPart[] = {0x2030, 0x2020, 0x0020};
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleUnicodeIDStart[] = {0x0250, 0x00e2, 0x0061};
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonUnicodeIDStart[] = {0x2000, 0x000a, 0x2019};
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleUnicodeIDPart[] = {0x005f, 0x0032, 0x0045};
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonUnicodeIDPart[] = {0x2030, 0x00a3, 0x0020};
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleIDIgnore[] = {0x0006, 0x0010, 0x206b, 0x85};
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 sampleNonIDIgnore[] = {0x0075, 0x00a3, 0x0061};
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaIDStart, "u_isJavaIDStart",
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleJavaIDStart, LENGTHOF(sampleJavaIDStart), TRUE);
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaIDStart, "u_isJavaIDStart",
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonJavaIDStart, LENGTHOF(sampleNonJavaIDStart), FALSE);
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart",
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleJavaIDPart, LENGTHOF(sampleJavaIDPart), TRUE);
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart",
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonJavaIDPart, LENGTHOF(sampleNonJavaIDPart), FALSE);
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* IDPart should imply IDStart */
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart",
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleJavaIDStart, LENGTHOF(sampleJavaIDStart), TRUE);
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDStart, "u_isIDStart",
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleUnicodeIDStart, LENGTHOF(sampleUnicodeIDStart), TRUE);
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDStart, "u_isIDStart",
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonUnicodeIDStart, LENGTHOF(sampleNonUnicodeIDStart), FALSE);
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDPart, "u_isIDPart",
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleUnicodeIDPart, LENGTHOF(sampleUnicodeIDPart), TRUE);
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDPart, "u_isIDPart",
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonUnicodeIDPart, LENGTHOF(sampleNonUnicodeIDPart), FALSE);
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* IDPart should imply IDStart */
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDPart, "u_isIDPart",
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleUnicodeIDStart, LENGTHOF(sampleUnicodeIDStart), TRUE);
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDIgnorable, "u_isIDIgnorable",
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleIDIgnore, LENGTHOF(sampleIDIgnore), TRUE);
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testSampleCharProps(u_isIDIgnorable, "u_isIDIgnorable",
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sampleNonIDIgnore, LENGTHOF(sampleNonIDIgnore), FALSE);
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* for each line of UnicodeData.txt, check some of the properties */
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UnicodeDataContext {
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UCONFIG_NO_NORMALIZATION
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const void *dummy;
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UNormalizer2 *nfc;
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UNormalizer2 *nfkc;
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UnicodeDataContext;
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ### TODO
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This test fails incorrectly if the First or Last code point of a repetitive area
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is overridden, which is allowed and is encouraged for the PUAs.
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Currently, this means that both area First/Last and override lines are
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * tested against the properties from the API,
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and the area boundary will not match and cause an error.
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This function should detect area boundaries and skip them for the test of individual
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * code points' properties.
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Then it should check that the areas contain all the same properties except where overridden.
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For this, it would have had to set a flag for which code points were listed explicitly.
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgunicodeDataLineFn(void *context,
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  char *fields[][2], int32_t fieldCount,
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UErrorCode *pErrorCode)
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[100];
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *d;
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *end;
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t value;
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t type;
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dt;
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dm[32], s[32];
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dmLength, length;
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UNormalizer2 *nfc, *nfkc;
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the character code, field 0 */
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c=strtoul(fields[0][0], &end, 16);
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(end<=fields[0][0] || end!=fields[0][1]) {
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: syntax error in field 0 at %s\n", fields[0][0]);
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint32_t)c>=UCHAR_MAX_VALUE + 1) {
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in UnicodeData.txt: code point %lu out of range\n", c);
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get general category, field 2 */
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *fields[2][1]=0;
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    type = (int8_t)tagValues[MakeProp(fields[2][0])];
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_charType(c)!=type) {
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_charType(U+%04lx)==%u instead of %u\n", c, u_charType(c), type);
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint32_t)u_getIntPropertyValue(c, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(type)) {
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: (uint32_t)u_getIntPropertyValue(U+%04lx, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(u_charType())\n", c);
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get canonical combining class, field 3 */
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    value=strtoul(fields[3][0], &end, 10);
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(end<=fields[3][0] || end!=fields[3][1]) {
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: syntax error in field 3 at code 0x%lx\n", c);
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(value>255) {
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in UnicodeData.txt: combining class %lu out of range\n", value);
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(value!=u_getCombiningClass(c) || value!=(uint32_t)u_getIntPropertyValue(c, UCHAR_CANONICAL_COMBINING_CLASS)) {
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getCombiningClass(U+%04lx)==%hu instead of %lu\n", c, u_getCombiningClass(c), value);
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    nfkc=((UnicodeDataContext *)context)->nfkc;
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(value!=unorm2_getCombiningClass(nfkc, c)) {
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: unorm2_getCombiningClass(nfkc, U+%04lx)==%hu instead of %lu\n", c, unorm2_getCombiningClass(nfkc, c), value);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get BiDi category, field 4 */
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *fields[4][1]=0;
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=MakeDir(fields[4][0]);
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(i!=u_charDirection(c) || i!=u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)) {
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_charDirection(U+%04lx)==%u instead of %u (%s)\n", c, u_charDirection(c), MakeDir(fields[4][0]), fields[4][0]);
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get Decomposition_Type & Decomposition_Mapping, field 5 */
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d=NULL;
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fields[5][0]==fields[5][1]) {
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no decomposition, except UnicodeData.txt omits Hangul syllable decompositions */
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c==0xac00 || c==0xd7a3) {
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dt=U_DT_CANONICAL;
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dt=U_DT_NONE;
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d=fields[5][0];
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *fields[5][1]=0;
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dt=UCHAR_INVALID_CODE;
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(*d=='<') {
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            end=strchr(++d, '>');
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(end!=NULL) {
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *end=0;
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dt=u_getPropertyValueEnum(UCHAR_DECOMPOSITION_TYPE, d);
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                d=u_skipWhitespace(end+1);
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dt=U_DT_CANONICAL;
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dt>U_DT_NONE) {
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c==0xac00) {
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[0]=0x1100;
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[1]=0x1161;
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[2]=0;
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dmLength=2;
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(c==0xd7a3) {
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[0]=0xd788;
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[1]=0x11c2;
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dm[2]=0;
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dmLength=2;
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dmLength=u_parseString(d, dm, 32, NULL, pErrorCode);
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dmLength=-1;
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dt<0 || U_FAILURE(*pErrorCode)) {
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in UnicodeData.txt: syntax error in U+%04lX decomposition field\n", (long)c);
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=u_getIntPropertyValue(c, UCHAR_DECOMPOSITION_TYPE);
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(i!=dt) {
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyValue(U+%04lx, UCHAR_DECOMPOSITION_TYPE)==%d instead of %d\n", c, i, dt);
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Expect Decomposition_Mapping=nfkc.getRawDecomposition(c). */
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=unorm2_getRawDecomposition(nfkc, c, s, 32, pErrorCode);
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode) || length!=dmLength || (length>0 && 0!=u_strcmp(s, dm))) {
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: unorm2_getRawDecomposition(nfkc, U+%04lx)==%d instead of %d "
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "or the Decomposition_Mapping is different (%s)\n",
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                c, length, dmLength, u_errorName(*pErrorCode));
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* For canonical decompositions only, expect Decomposition_Mapping=nfc.getRawDecomposition(c). */
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dt!=U_DT_CANONICAL) {
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dmLength=-1;
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    nfc=((UnicodeDataContext *)context)->nfc;
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=unorm2_getRawDecomposition(nfc, c, s, 32, pErrorCode);
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode) || length!=dmLength || (length>0 && 0!=u_strcmp(s, dm))) {
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: unorm2_getRawDecomposition(nfc, U+%04lx)==%d instead of %d "
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "or the Decomposition_Mapping is different (%s)\n",
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                c, length, dmLength, u_errorName(*pErrorCode));
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* recompose */
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dt==U_DT_CANONICAL && !u_hasBinaryProperty(c, UCHAR_FULL_COMPOSITION_EXCLUSION)) {
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 a, b, composite;
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        i=0;
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(dm, i, dmLength, a);
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(dm, i, dmLength, b);
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* i==dmLength */
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        composite=unorm2_composePair(nfc, a, b);
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(composite!=c) {
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: nfc U+%04lX decomposes to U+%04lX+U+%04lX but does not compose back (instead U+%04lX)\n",
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)c, (long)a, (long)b, (long)composite);
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Note: NFKC has fewer round-trip mappings than NFC,
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * so we can't just test unorm2_composePair(nfkc, a, b) here without further data.
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get ISO Comment, field 11 */
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *fields[11][1]=0;
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=u_getISOComment(c, buffer, sizeof(buffer), pErrorCode);
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode) || 0!=strcmp(fields[11][0], buffer)) {
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(*pErrorCode, "error: u_getISOComment(U+%04lx) wrong (%s): \"%s\" should be \"%s\"\n",
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c, u_errorName(*pErrorCode),
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_FAILURE(*pErrorCode) ? buffer : "[error]",
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fields[11][0]);
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get uppercase mapping, field 12 */
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fields[12][0]!=fields[12][1]) {
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value=strtoul(fields[12][0], &end, 16);
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(end!=fields[12][1]) {
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: syntax error in field 12 at code 0x%lx\n", c);
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((UChar32)value!=u_toupper(c)) {
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_toupper(U+%04lx)==U+%04lx instead of U+%04lx\n", c, u_toupper(c), value);
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no case mapping: the API must map the code point to itself */
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c!=u_toupper(c)) {
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: U+%04lx does not have an uppercase mapping but u_toupper()==U+%04lx\n", c, u_toupper(c));
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get lowercase mapping, field 13 */
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fields[13][0]!=fields[13][1]) {
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value=strtoul(fields[13][0], &end, 16);
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(end!=fields[13][1]) {
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: syntax error in field 13 at code 0x%lx\n", c);
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((UChar32)value!=u_tolower(c)) {
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_tolower(U+%04lx)==U+%04lx instead of U+%04lx\n", c, u_tolower(c), value);
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no case mapping: the API must map the code point to itself */
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c!=u_tolower(c)) {
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: U+%04lx does not have a lowercase mapping but u_tolower()==U+%04lx\n", c, u_tolower(c));
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get titlecase mapping, field 14 */
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fields[14][0]!=fields[14][1]) {
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value=strtoul(fields[14][0], &end, 16);
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(end!=fields[14][1]) {
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: syntax error in field 14 at code 0x%lx\n", c);
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((UChar32)value!=u_totitle(c)) {
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_totitle(U+%04lx)==U+%04lx instead of U+%04lx\n", c, u_totitle(c), value);
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no case mapping: the API must map the code point to itself */
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c!=u_totitle(c)) {
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: U+%04lx does not have a titlecase mapping but u_totitle()==U+%04lx\n", c, u_totitle(c));
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenumTypeRange(const void *context, UChar32 start, UChar32 limit, UCharCategory type) {
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 test[][2]={
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x41, U_UPPERCASE_LETTER},
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x308, U_NON_SPACING_MARK},
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xfffe, U_GENERAL_OTHER_TYPES},
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xe0041, U_FORMAT_CHAR},
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xeffff, U_UNASSIGNED}
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, count;
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(0!=strcmp((const char *)context, "a1")) {
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_enumCharTypes() passes on an incorrect context pointer\n");
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=LENGTHOF(test);
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<count; ++i) {
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(start<=test[i][0] && test[i][0]<limit) {
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(type!=(UCharCategory)test[i][1]) {
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: u_enumCharTypes() has range [U+%04lx, U+%04lx[ with %ld instead of U+%04lx with %ld\n",
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        start, limit, (long)type, test[i][0], test[i][1]);
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* stop at the range that includes the last test code point (increases code coverage for enumeration) */
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return i==(count-1) ? FALSE : TRUE;
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(start>test[count-1][0]) {
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_enumCharTypes() has range [U+%04lx, U+%04lx[ with %ld after it should have stopped\n",
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                start, limit, (long)type);
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenumDefaultsRange(const void *context, UChar32 start, UChar32 limit, UCharCategory type) {
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* default Bidi classes for unassigned code points, from the DerivedBidiClass.txt header */
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t defaultBidi[][2]={ /* { limit, class } */
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0590, U_LEFT_TO_RIGHT },
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0600, U_RIGHT_TO_LEFT },
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x07C0, U_RIGHT_TO_LEFT_ARABIC },
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x08A0, U_RIGHT_TO_LEFT },
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0900, U_RIGHT_TO_LEFT_ARABIC },  /* Unicode 6.1 changes U+08A0..U+08FF from R to AL */
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20A0, U_LEFT_TO_RIGHT },
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20D0, U_EUROPEAN_NUMBER_TERMINATOR },  /* Unicode 6.3 changes the currency symbols block U+20A0..U+20CF to default to ET not L */
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFB1D, U_LEFT_TO_RIGHT },
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFB50, U_RIGHT_TO_LEFT },
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFE00, U_RIGHT_TO_LEFT_ARABIC },
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFE70, U_LEFT_TO_RIGHT },
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFF00, U_RIGHT_TO_LEFT_ARABIC },
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10800, U_LEFT_TO_RIGHT },
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11000, U_RIGHT_TO_LEFT },
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1E800, U_LEFT_TO_RIGHT },  /* new default-R range in Unicode 5.2: U+1E800 - U+1EFFF */
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1EE00, U_RIGHT_TO_LEFT },
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1EF00, U_RIGHT_TO_LEFT_ARABIC },  /* Unicode 6.1 changes U+1EE00..U+1EEFF from R to AL */
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1F000, U_RIGHT_TO_LEFT },
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x110000, U_LEFT_TO_RIGHT }
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCharDirection shouldBeDir;
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * LineBreak.txt specifies:
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   #  - Assigned characters that are not listed explicitly are given the value
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   #    "AL".
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   #  - Unassigned characters are given the value "XX".
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * PUA characters are listed explicitly with "XX".
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Verify that no assigned character has "XX".
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(type!=U_UNASSIGNED && type!=U_PRIVATE_USE_CHAR) {
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c=start;
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while(c<limit) {
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(0==u_getIntPropertyValue(c, UCHAR_LINE_BREAK)) {
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error UCHAR_LINE_BREAK(assigned U+%04lx)=XX\n", c);
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++c;
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Verify default Bidi classes.
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For recent Unicode versions, see UCD.html.
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For older Unicode versions:
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See table 3-7 "Bidirectional Character Types" in UAX #9.
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * http://www.unicode.org/reports/tr9/
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See also DerivedBidiClass.txt for Cn code points!
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Unicode 4.0.1/Public Review Issue #28 (http://www.unicode.org/review/resolved-pri.html)
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * changed some default values.
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * In particular, non-characters and unassigned Default Ignorable Code Points
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * change from L to BN.
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCD.html version 4.0.1 does not yet reflect these changes.
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(type==U_UNASSIGNED || type==U_PRIVATE_USE_CHAR) {
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* enumerate the intersections of defaultBidi ranges with [start..limit[ */
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c=start;
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<LENGTHOF(defaultBidi) && c<limit; ++i) {
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if((int32_t)c<defaultBidi[i][0]) {
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                while(c<limit && (int32_t)c<defaultBidi[i][0]) {
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(U_IS_UNICODE_NONCHAR(c) || u_hasBinaryProperty(c, UCHAR_DEFAULT_IGNORABLE_CODE_POINT)) {
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        shouldBeDir=U_BOUNDARY_NEUTRAL;
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        shouldBeDir=(UCharDirection)defaultBidi[i][1];
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if( u_charDirection(c)!=shouldBeDir ||
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        u_getIntPropertyValue(c, UCHAR_BIDI_CLASS)!=shouldBeDir
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ) {
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("error: u_charDirection(unassigned/PUA U+%04lx)=%s should be %s\n",
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            c, dirStrings[u_charDirection(c)], dirStrings[shouldBeDir]);
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ++c;
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* tests for several properties */
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUnicodeData()
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo expectVersionArray;
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo versionArray;
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *fields[15][2];
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t type;
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeDataContext context;
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(expectVersionArray, U_UNICODE_VERSION);
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getUnicodeVersion(versionArray);
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(memcmp(versionArray, expectVersionArray, U_MAX_VERSION_LENGTH) != 0)
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Testing u_getUnicodeVersion() - expected " U_UNICODE_VERSION " got %d.%d.%d.%d\n",
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        versionArray[0], versionArray[1], versionArray[2], versionArray[3]);
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ICU_UNICODE_VERSION)
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test only happens where we have configure.in with UNICODE_VERSION - sanity check. */
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(U_UNICODE_VERSION, ICU_UNICODE_VERSION))
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         log_err("Testing configure.in's ICU_UNICODE_VERSION - expected " U_UNICODE_VERSION " got " ICU_UNICODE_VERSION "\n");
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ublock_getCode((UChar)0x0041) != UBLOCK_BASIC_LATIN || u_getIntPropertyValue(0x41, UCHAR_BLOCK)!=(int32_t)UBLOCK_BASIC_LATIN) {
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ublock_getCode(U+0041) property failed! Expected : %i Got: %i \n", UBLOCK_BASIC_LATIN,ublock_getCode((UChar)0x0041));
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    context.nfc=unorm2_getNFCInstance(&errorCode);
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    context.nfkc=unorm2_getNFKCInstance(&errorCode);
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error: unable to open an NFC or NFKC UNormalizer2 - %s\n", u_errorName(errorCode));
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    parseUCDFile("UnicodeData.txt", fields, 15, unicodeDataLineFn, &context, &errorCode);
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return; /* if we couldn't parse UnicodeData.txt, we should return */
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* sanity check on repeated properties */
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(c=0xfffe; c<=0x10ffff;) {
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        type=u_charType(c);
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((uint32_t)u_getIntPropertyValue(c, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(type)) {
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: (uint32_t)u_getIntPropertyValue(U+%04lx, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(u_charType())\n", c);
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(type!=U_UNASSIGNED) {
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_charType(U+%04lx)!=U_UNASSIGNED (returns %d)\n", c, u_charType(c));
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((c&0xffff)==0xfffe) {
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++c;
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c+=0xffff;
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test that PUA is not "unassigned" */
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(c=0xe000; c<=0x10fffd;) {
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        type=u_charType(c);
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((uint32_t)u_getIntPropertyValue(c, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(type)) {
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: (uint32_t)u_getIntPropertyValue(U+%04lx, UCHAR_GENERAL_CATEGORY_MASK)!=U_MASK(u_charType())\n", c);
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(type==U_UNASSIGNED) {
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_charType(U+%04lx)==U_UNASSIGNED\n", c);
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(type!=U_PRIVATE_USE_CHAR) {
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("PUA override: u_charType(U+%04lx)=%d\n", c, type);
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c==0xf8ff) {
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=0xf0000;
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(c==0xffffd) {
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=0x100000;
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++c;
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test u_enumCharTypes() */
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_enumCharTypes(enumTypeRange, "a1");
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check default properties */
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_enumCharTypes(enumDefaultsRange, NULL);
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodeUnit(){
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar codeunit[]={0x0000,0xe065,0x20ac,0xd7ff,0xd800,0xd841,0xd905,0xdbff,0xdc00,0xdc02,0xddee,0xdfff,0};
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<(int32_t)(sizeof(codeunit)/sizeof(codeunit[0])); i++){
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar c=codeunit[i];
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i<4){
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!(UTF_IS_SINGLE(c)) || (UTF_IS_LEAD(c)) || (UTF_IS_TRAIL(c)) ||(UTF_IS_SURROGATE(c))){
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: U+%04x is a single", c);
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i >= 4 && i< 8){
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!(UTF_IS_LEAD(c)) || UTF_IS_SINGLE(c) || UTF_IS_TRAIL(c) || !(UTF_IS_SURROGATE(c))){
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: U+%04x is a first surrogate", c);
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i >= 8 && i< 12){
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!(UTF_IS_TRAIL(c)) || UTF_IS_SINGLE(c) || UTF_IS_LEAD(c) || !(UTF_IS_SURROGATE(c))){
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: U+%04x is a second surrogate", c);
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodePoint(){
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar32 codePoint[]={
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*surrogate, notvalid(codepoint), not a UnicodeChar, not Error */
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd800,
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdbff,
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdc00,
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdfff,
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdc04,
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd821,
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*not a surrogate, valid, isUnicodeChar , not Error*/
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20ac,
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd7ff,
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe000,
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe123,
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0061,
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe065,
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20402,
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x24506,
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x23456,
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20402,
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x10402,
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x23456,
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*not a surrogate, not valid, isUnicodeChar, isError */
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0015,
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x009f,
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*not a surrogate, not valid, not isUnicodeChar, isError */
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xffff,
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffe,
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<(int32_t)(sizeof(codePoint)/sizeof(codePoint[0])); i++){
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c=codePoint[i];
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i<6){
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_SURROGATE(c) || !U_IS_SURROGATE(c) || !U16_IS_SURROGATE(c)){
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isSurrogate() failed for U+%04x\n", c);
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_VALID(c)){
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isValid() failed for U+%04x\n", c);
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_UNICODE_CHAR(c) || U_IS_UNICODE_CHAR(c)){
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isUnicodeChar() failed for U+%04x\n", c);
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_ERROR(c)){
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isError() failed for U+%04x\n", c);
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(i >=6 && i<18){
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_SURROGATE(c) || U_IS_SURROGATE(c) || U16_IS_SURROGATE(c)){
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isSurrogate() failed for U+%04x\n", c);
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_VALID(c)){
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isValid() failed for U+%04x\n", c);
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_UNICODE_CHAR(c) || !U_IS_UNICODE_CHAR(c)){
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isUnicodeChar() failed for U+%04x\n", c);
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_ERROR(c)){
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isError() failed for U+%04x\n", c);
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(i >=18 && i<20){
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_SURROGATE(c) || U_IS_SURROGATE(c) || U16_IS_SURROGATE(c)){
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isSurrogate() failed for U+%04x\n", c);
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_VALID(c)){
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isValid() failed for U+%04x\n", c);
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_UNICODE_CHAR(c) || !U_IS_UNICODE_CHAR(c)){
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isUnicodeChar() failed for U+%04x\n", c);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_ERROR(c)){
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isError() failed for U+%04x\n", c);
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if(i >=18 && i<(int32_t)(sizeof(codePoint)/sizeof(codePoint[0]))){
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_SURROGATE(c) || U_IS_SURROGATE(c) || U16_IS_SURROGATE(c)){
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isSurrogate() failed for U+%04x\n", c);
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_VALID(c)){
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isValid() failed for U+%04x\n", c);
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(UTF_IS_UNICODE_CHAR(c) || U_IS_UNICODE_CHAR(c)){
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isUnicodeChar() failed for U+%04x\n", c);
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!UTF_IS_ERROR(c)){
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: isError() failed for U+%04x\n", c);
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        !U_IS_BMP(0) || !U_IS_BMP(0x61) || !U_IS_BMP(0x20ac) ||
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        !U_IS_BMP(0xd9da) || !U_IS_BMP(0xdfed) || !U_IS_BMP(0xffff) ||
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_IS_BMP(U_SENTINEL) || U_IS_BMP(0x10000) || U_IS_BMP(0x50005) ||
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_IS_BMP(0x10ffff) || U_IS_BMP(0x110000) || U_IS_BMP(0x7fffffff)
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error with U_IS_BMP()\n");
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_IS_SUPPLEMENTARY(0) || U_IS_SUPPLEMENTARY(0x61) || U_IS_SUPPLEMENTARY(0x20ac) ||
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_IS_SUPPLEMENTARY(0xd9da) || U_IS_SUPPLEMENTARY(0xdfed) || U_IS_SUPPLEMENTARY(0xffff) ||
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_IS_SUPPLEMENTARY(U_SENTINEL) || !U_IS_SUPPLEMENTARY(0x10000) || !U_IS_SUPPLEMENTARY(0x50005) ||
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        !U_IS_SUPPLEMENTARY(0x10ffff) || U_IS_SUPPLEMENTARY(0x110000) || U_IS_SUPPLEMENTARY(0x7fffffff)
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error with U_IS_SUPPLEMENTARY()\n");
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCharLength()
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t codepoint[]={
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 0x0061,
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 0xe065,
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 0x20ac,
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2, 0x20402,
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2, 0x23456,
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2, 0x24506,
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2, 0x20402,
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2, 0x10402,
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 0xd7ff,
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 0xe000
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool multiple;
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<(int32_t)(sizeof(codepoint)/sizeof(codepoint[0])); i=(int16_t)(i+2)){
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c=codepoint[i+1];
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(UTF_CHAR_LENGTH(c) != codepoint[i] || U16_LENGTH(c) != codepoint[i]){
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("The no: of code units for U+%04x:- Expected: %d Got: %d\n", c, codepoint[i], U16_LENGTH(c));
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        multiple=(UBool)(codepoint[i] == 1 ? FALSE : TRUE);
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(UTF_NEED_MULTIPLE_UCHAR(c) != multiple){
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ERROR: Unicode::needMultipleUChar() failed for U+%04x\n", c);
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*internal functions ----*/
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t MakeProp(char* str)
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t result = 0;
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char* matchPosition =0;
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    matchPosition = strstr(tagStrings, str);
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (matchPosition == 0)
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("unrecognized type letter ");
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err(str);
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = (int32_t)((matchPosition - tagStrings) / 2);
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t MakeDir(char* str)
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos = 0;
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (pos = 0; pos < U_CHAR_DIRECTION_COUNT; pos++) {
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(str, dirStrings[pos]) == 0) {
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return pos;
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return -1;
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test u_charName() -------------------------------------------------------- */
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t code;
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *name, *oldName, *extName, *alias;
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} names[]={
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x0061, "LATIN SMALL LETTER A", "", "LATIN SMALL LETTER A"},
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x01a2, "LATIN CAPITAL LETTER OI", "",
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             "LATIN CAPITAL LETTER OI",
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             "LATIN CAPITAL LETTER GHA"},
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x0284, "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", "",
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK" },
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x0fd0, "TIBETAN MARK BSKA- SHOG GI MGO RGYAN", "",
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             "TIBETAN MARK BSKA- SHOG GI MGO RGYAN",
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             "TIBETAN MARK BKA- SHOG GI MGO RGYAN"},
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x3401, "CJK UNIFIED IDEOGRAPH-3401", "", "CJK UNIFIED IDEOGRAPH-3401" },
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x7fed, "CJK UNIFIED IDEOGRAPH-7FED", "", "CJK UNIFIED IDEOGRAPH-7FED" },
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xac00, "HANGUL SYLLABLE GA", "", "HANGUL SYLLABLE GA" },
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xd7a3, "HANGUL SYLLABLE HIH", "", "HANGUL SYLLABLE HIH" },
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xd800, "", "", "<lead surrogate-D800>" },
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xdc00, "", "", "<trail surrogate-DC00>" },
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xff08, "FULLWIDTH LEFT PARENTHESIS", "", "FULLWIDTH LEFT PARENTHESIS" },
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xffe5, "FULLWIDTH YEN SIGN", "", "FULLWIDTH YEN SIGN" },
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0xffff, "", "", "<noncharacter-FFFF>" },
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x1d0c5, "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS", "",
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS",
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS"},
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x23456, "CJK UNIFIED IDEOGRAPH-23456", "", "CJK UNIFIED IDEOGRAPH-23456" }
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenumCharNamesFn(void *context,
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UChar32 code, UCharNameChoice nameChoice,
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char *name, int32_t length) {
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t *pCount=(int32_t *)context;
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expected;
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length<=0 || length!=(int32_t)strlen(name)) {
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* should not be called with an empty string or invalid length */
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_enumCharName(0x%lx)=%s but length=%ld\n", name, length);
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++*pCount;
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(code==(UChar32)names[i].code) {
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            switch (nameChoice) {
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                case U_EXTENDED_CHAR_NAME:
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(0!=strcmp(name, names[i].extName)) {
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_enumCharName(0x%lx - Extended)=%s instead of %s\n", code, name, names[i].extName);
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                case U_UNICODE_CHAR_NAME:
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(0!=strcmp(name, names[i].name)) {
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_enumCharName(0x%lx)=%s instead of %s\n", code, name, names[i].name);
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                case U_UNICODE_10_CHAR_NAME:
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    expected=names[i].oldName;
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(expected[0]==0 || 0!=strcmp(name, expected)) {
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_enumCharName(0x%lx - 1.0)=%s instead of %s\n", code, name, expected);
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                case U_CHAR_NAME_ALIAS:
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    expected=names[i].alias;
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(expected==NULL || expected[0]==0 || 0!=strcmp(name, expected)) {
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_enumCharName(0x%lx - alias)=%s instead of %s\n", code, name, expected);
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                case U_CHAR_NAME_CHOICE_COUNT:
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct enumExtCharNamesContext {
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t length;
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t last;
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenumExtCharNamesFn(void *context,
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UChar32 code, UCharNameChoice nameChoice,
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char *name, int32_t length) {
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct enumExtCharNamesContext *ecncp = (struct enumExtCharNamesContext *) context;
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ecncp->last != (int32_t) code - 1) {
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ecncp->last < 0) {
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_enumCharName(0x%lx - Ext) after u_enumCharName(0x%lx - Ext) instead of u_enumCharName(0x%lx - Ext)\n", code, ecncp->last, ecncp->last + 1);
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_enumCharName(0x%lx - Ext) instead of u_enumCharName(0x0 - Ext)\n", code);
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ecncp->last = (int32_t) code;
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!*name) {
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_enumCharName(0x%lx - Ext) should not be an empty string\n", code);
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return enumCharNamesFn(&ecncp->length, code, nameChoice, name, length);
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This can be made more efficient by moving it into putil.c and having
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * it directly access the ebcdic translation tables.
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TODO: If we get this method in putil.c, then delete it from here.
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_charToUChar(char c) {
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uc;
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charsToUChars(&c, &uc, 1);
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return uc;
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestCharNames() {
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static char name[80];
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct enumExtCharNamesContext extContext;
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expected;
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing uprv_getMaxCharNameLength()\n");
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=uprv_getMaxCharNameLength();
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length==0) {
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no names data available */
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length<83) { /* Unicode 3.2 max char name length */
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("uprv_getMaxCharNameLength()=%d is too short");
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* ### TODO same tests for max ISO comment length as for max name length */
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing u_charName()\n");
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<(int32_t)(sizeof(names)/sizeof(names[0])); ++i) {
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* modern Unicode character name */
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=u_charName(names[i].code, U_UNICODE_CHAR_NAME, name, sizeof(name), &errorCode);
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx) error %s\n", names[i].code, u_errorName(errorCode));
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length<0 || 0!=strcmp(name, names[i].name) || length!=(uint16_t)strlen(name)) {
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx) gets: %s (length %ld) instead of: %s\n", names[i].code, name, length, names[i].name);
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* find the modern name */
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (*names[i].name) {
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=u_charFromName(U_UNICODE_CHAR_NAME, names[i].name, &errorCode);
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode)) {
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s) error %s\n", names[i].name, u_errorName(errorCode));
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(c!=(UChar32)names[i].code) {
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s) gets 0x%lx instead of 0x%lx\n", names[i].name, c, names[i].code);
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Unicode 1.0 character name */
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=u_charName(names[i].code, U_UNICODE_10_CHAR_NAME, name, sizeof(name), &errorCode);
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx - 1.0) error %s\n", names[i].code, u_errorName(errorCode));
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length<0 || (length>0 && 0!=strcmp(name, names[i].oldName)) || length!=(uint16_t)strlen(name)) {
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx - 1.0) gets %s length %ld instead of nothing or %s\n", names[i].code, name, length, names[i].oldName);
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* find the Unicode 1.0 name if it is stored (length>0 means that we could read it) */
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(names[i].oldName[0]!=0 /* && length>0 */) {
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=u_charFromName(U_UNICODE_10_CHAR_NAME, names[i].oldName, &errorCode);
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode)) {
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s - 1.0) error %s\n", names[i].oldName, u_errorName(errorCode));
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(c!=(UChar32)names[i].code) {
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s - 1.0) gets 0x%lx instead of 0x%lx\n", names[i].oldName, c, names[i].code);
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Unicode character name alias */
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=u_charName(names[i].code, U_CHAR_NAME_ALIAS, name, sizeof(name), &errorCode);
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx - alias) error %s\n", names[i].code, u_errorName(errorCode));
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected=names[i].alias;
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(expected==NULL) {
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expected="";
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length<0 || (length>0 && 0!=strcmp(name, expected)) || length!=(uint16_t)strlen(name)) {
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName(0x%lx - alias) gets %s length %ld instead of nothing or %s\n",
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    names[i].code, name, length, expected);
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* find the Unicode character name alias if it is stored (length>0 means that we could read it) */
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(expected[0]!=0 /* && length>0 */) {
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c=u_charFromName(U_CHAR_NAME_ALIAS, expected, &errorCode);
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode)) {
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s - alias) error %s\n",
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        expected, u_errorName(errorCode));
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(c!=(UChar32)names[i].code) {
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charFromName(%s - alias) gets 0x%lx instead of 0x%lx\n",
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        expected, c, names[i].code);
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test u_enumCharNames() */
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=0;
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_enumCharNames(UCHAR_MIN_VALUE, UCHAR_MAX_VALUE + 1, enumCharNamesFn, &length, U_UNICODE_CHAR_NAME, &errorCode);
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length<94140) {
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_enumCharNames(%ld..%lx) error %s names count=%ld\n", UCHAR_MIN_VALUE, UCHAR_MAX_VALUE, u_errorName(errorCode), length);
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    extContext.length = 0;
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    extContext.last = -1;
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_enumCharNames(UCHAR_MIN_VALUE, UCHAR_MAX_VALUE + 1, enumExtCharNamesFn, &extContext, U_EXTENDED_CHAR_NAME, &errorCode);
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || extContext.length<UCHAR_MAX_VALUE + 1) {
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_enumCharNames(%ld..0x%lx - Extended) error %s names count=%ld\n", UCHAR_MIN_VALUE, UCHAR_MAX_VALUE + 1, u_errorName(errorCode), extContext.length);
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test that u_charFromName() uppercases the input name, i.e., works with mixed-case names (new in 2.0) */
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(0x61!=u_charFromName(U_UNICODE_CHAR_NAME, "LATin smALl letTER A", &errorCode)) {
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_charFromName(U_UNICODE_CHAR_NAME, \"LATin smALl letTER A\") did not find U+0061 (%s)\n", u_errorName(errorCode));
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test getCharNameCharacters */
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!getTestOption(QUICK_OPTION)) {
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        enum { BUFSIZE = 256 };
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode ec = U_ZERO_ERROR;
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char buf[BUFSIZE];
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t maxLength;
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 cp;
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar pat[BUFSIZE], dumbPat[BUFSIZE];
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t l1, l2;
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool map[256];
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool ok;
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        USet* set = uset_open(1, 0); /* empty set */
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        USet* dumb = uset_open(1, 0); /* empty set */
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * uprv_getCharNameCharacters() will likely return more lowercase
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * letters than actual character names contain because
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * it includes all the characters in lowercased names of
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * general categories, for the full possible set of extended names.
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            USetAdder sa={
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                NULL,
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_add,
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_addRange,
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_addString,
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                NULL /* don't need remove() */
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            };
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sa.set=set;
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_getCharNameCharacters(&sa);
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* build set the dumb (but sure-fire) way */
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0; i<256; ++i) {
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            map[i] = FALSE;
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        maxLength=0;
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (cp=0; cp<0x110000; ++cp) {
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t len = u_charName(cp, U_EXTENDED_CHAR_NAME,
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     buf, BUFSIZE, &ec);
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(ec)) {
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: u_charName failed when it shouldn't\n");
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_close(set);
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_close(dumb);
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(len>maxLength) {
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                maxLength=len;
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (i=0; i<len; ++i) {
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!map[(uint8_t) buf[i]]) {
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uset_add(dumb, (UChar32)u_charToUChar(buf[i]));
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    map[(uint8_t) buf[i]] = TRUE;
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* test for leading/trailing whitespace */
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(buf[0]==' ' || buf[0]=='\t' || buf[len-1]==' ' || buf[len-1]=='\t') {
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_charName(U+%04x) returns a name with leading or trailing whitespace\n", cp);
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(map[(uint8_t)'\t']) {
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_charName() returned a name with a TAB for some code point\n", cp);
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=uprv_getMaxCharNameLength();
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length!=maxLength) {
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uprv_getMaxCharNameLength()=%d differs from the maximum length %d of all extended names\n",
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    length, maxLength);
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* compare the sets.  Where is my uset_equals?!! */
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ok=TRUE;
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<256; ++i) {
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uset_contains(set, i)!=uset_contains(dumb, i)) {
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(0x61<=i && i<=0x7a /* a-z */ && uset_contains(set, i) && !uset_contains(dumb, i)) {
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* ignore lowercase a-z that are in set but not in dumb */
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ok=TRUE;
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ok=FALSE;
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        l1 = uset_toPattern(set, pat, BUFSIZE, TRUE, &ec);
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        l2 = uset_toPattern(dumb, dumbPat, BUFSIZE, TRUE, &ec);
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(ec)) {
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: uset_toPattern failed when it shouldn't\n");
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_close(set);
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_close(dumb);
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (l1 >= BUFSIZE) {
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            l1 = BUFSIZE-1;
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pat[l1] = 0;
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (l2 >= BUFSIZE) {
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            l2 = BUFSIZE-1;
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dumbPat[l2] = 0;
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!ok) {
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: uprv_getCharNameCharacters() returned %s, expected %s (too many lowercase a-z are ok)\n",
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    aescstrdup(pat, l1), aescstrdup(dumbPat, l2));
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(getTestOption(VERBOSITY_OPTION)) {
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("Ok: uprv_getCharNameCharacters() returned %s\n", aescstrdup(pat, l1));
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(set);
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(dumb);
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* ### TODO: test error cases and other interesting things */
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test u_isMirrored() and u_charMirror() ----------------------------------- */
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestMirroring() {
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *set;
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 start, end, c2, c3;
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(mirroredPattern, "[:Bidi_Mirrored:]", 17);
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(mirroredPattern, "[:Bidi_Mirrored:]", 17);
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing u_isMirrored()\n");
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(u_isMirrored(0x28) && u_isMirrored(0xbb) && u_isMirrored(0x2045) && u_isMirrored(0x232a) &&
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         !u_isMirrored(0x27) && !u_isMirrored(0x61) && !u_isMirrored(0x284) && !u_isMirrored(0x3400)
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        )
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_isMirrored() does not work correctly\n");
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing u_charMirror()\n");
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(u_charMirror(0x3c)==0x3e && u_charMirror(0x5d)==0x5b && u_charMirror(0x208d)==0x208e && u_charMirror(0x3017)==0x3016 &&
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         u_charMirror(0xbb)==0xab && u_charMirror(0x2215)==0x29F5 && u_charMirror(0x29F5)==0x2215 && /* large delta between the code points */
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         u_charMirror(0x2e)==0x2e && u_charMirror(0x6f3)==0x6f3 && u_charMirror(0x301c)==0x301c && u_charMirror(0xa4ab)==0xa4ab &&
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         /* see Unicode Corrigendum #6 at http://www.unicode.org/versions/corrigendum6.html */
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         u_charMirror(0x2018)==0x2018 && u_charMirror(0x201b)==0x201b && u_charMirror(0x301d)==0x301d
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         )
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_charMirror() does not work correctly\n");
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* verify that Bidi_Mirroring_Glyph roundtrips */
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set=uset_openPattern(mirroredPattern, 17, &errorCode);
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("uset_openPattern(mirroredPattern, 17, &errorCode) failed!\n");
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; 0==uset_getItem(set, i, &start, &end, NULL, 0, &errorCode); ++i) {
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            do {
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                c2=u_charMirror(start);
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                c3=u_charMirror(c2);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(c3!=start) {
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("u_charMirror() does not roundtrip: U+%04lx->U+%04lx->U+%04lx\n", (long)start, (long)c2, (long)c3);
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                c3=u_getBidiPairedBracket(start);
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(u_getIntPropertyValue(start, UCHAR_BIDI_PAIRED_BRACKET_TYPE)==U_BPT_NONE) {
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(c3!=start) {
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_getBidiPairedBracket(U+%04lx) != self for bpt(c)==None\n",
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                (long)start);
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(c3!=c2) {
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("u_getBidiPairedBracket(U+%04lx) != U+%04lx = bmg(c)'\n",
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                (long)start, (long)c2);
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } while(++start<=end);
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set);
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct RunTestData
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *runText;
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UScriptCode runCode;
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct RunTestData RunTestData;
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCheckScriptRuns(UScriptRun *scriptRun, int32_t *runStarts, const RunTestData *testData, int32_t nRuns,
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char *prefix)
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t run, runStart, runLimit;
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UScriptCode runCode;
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* iterate over all the runs */
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    run = 0;
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (uscript_nextRun(scriptRun, &runStart, &runLimit, &runCode)) {
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (runStart != runStarts[run]) {
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("%s: incorrect start offset for run %d: expected %d, got %d\n",
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                prefix, run, runStarts[run], runStart);
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (runLimit != runStarts[run + 1]) {
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("%s: incorrect limit offset for run %d: expected %d, got %d\n",
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                prefix, run, runStarts[run + 1], runLimit);
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (runCode != testData[run].runCode) {
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("%s: incorrect script for run %d: expected \"%s\", got \"%s\"\n",
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                prefix, run, uscript_getName(testData[run].runCode), uscript_getName(runCode));
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        run += 1;
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* stop when we've seen all the runs we expect to see */
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (run >= nRuns) {
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Complain if we didn't see then number of runs we expected */
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (run != nRuns) {
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%s: incorrect number of runs: expected %d, got %d\n", prefix, run, nRuns);
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestUScriptRunAPI()
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const RunTestData testData1[] = {
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u0020\\u0946\\u0939\\u093F\\u0928\\u094D\\u0926\\u0940\\u0020", USCRIPT_DEVANAGARI},
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064A\\u0629\\u0020", USCRIPT_ARABIC},
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u0420\\u0443\\u0441\\u0441\\u043A\\u0438\\u0439\\u0020", USCRIPT_CYRILLIC},
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"English (", USCRIPT_LATIN},
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u0E44\\u0E17\\u0E22", USCRIPT_THAI},
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {") ", USCRIPT_LATIN},
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u6F22\\u5B75", USCRIPT_HAN},
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u3068\\u3072\\u3089\\u304C\\u306A\\u3068", USCRIPT_HIRAGANA},
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\u30AB\\u30BF\\u30AB\\u30CA", USCRIPT_KATAKANA},
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"\\U00010400\\U00010401\\U00010402\\U00010403", USCRIPT_DESERET}
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const RunTestData testData2[] = {
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       {"((((((((((abc))))))))))", USCRIPT_LATIN}
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const RunTestData *testData;
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int32_t nRuns;
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } testDataEntries[] = {
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {testData1, LENGTHOF(testData1)},
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {testData2, LENGTHOF(testData2)}
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t nTestEntries = LENGTHOF(testDataEntries);
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t testEntry;
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (testEntry = 0; testEntry < nTestEntries; testEntry += 1) {
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar testString[1024];
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t runStarts[256];
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t nTestRuns = testDataEntries[testEntry].nRuns;
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const RunTestData *testData = testDataEntries[testEntry].testData;
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t run, stringLimit;
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UScriptRun *scriptRun = NULL;
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode err;
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Fill in the test string and the runStarts array.
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        stringLimit = 0;
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (run = 0; run < nTestRuns; run += 1) {
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            runStarts[run] = stringLimit;
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            stringLimit += u_unescape(testData[run].runText, &testString[stringLimit], 1024 - stringLimit);
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /*stringLimit -= 1;*/
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The limit of the last run */
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        runStarts[nTestRuns] = stringLimit;
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Make sure that calling uscript_OpenRun with a NULL text pointer
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and a non-zero text length returns the correct error.
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scriptRun = uscript_openRun(NULL, stringLimit, &err);
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_openRun(NULL, stringLimit, &err) returned %s instead of U_ILLEGAL_ARGUMENT_ERROR.\n", u_errorName(err));
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (scriptRun != NULL) {
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_openRun(NULL, stringLimit, &err) returned a non-NULL result.\n");
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uscript_closeRun(scriptRun);
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Make sure that calling uscript_OpenRun with a non-NULL text pointer
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and a zero text length returns the correct error.
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scriptRun = uscript_openRun(testString, 0, &err);
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_openRun(testString, 0, &err) returned %s instead of U_ILLEGAL_ARGUMENT_ERROR.\n", u_errorName(err));
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (scriptRun != NULL) {
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_openRun(testString, 0, &err) returned a non-NULL result.\n");
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uscript_closeRun(scriptRun);
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Make sure that calling uscript_openRun with a NULL text pointer
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and a zero text length doesn't return an error.
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scriptRun = uscript_openRun(NULL, 0, &err);
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(err)) {
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Got error %s from uscript_openRun(NULL, 0, &err)\n", u_errorName(err));
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Make sure that the empty iterator doesn't find any runs */
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (uscript_nextRun(scriptRun, NULL, NULL, NULL)) {
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_nextRun(...) returned TRUE for an empty iterator.\n");
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Make sure that calling uscript_setRunText with a NULL text pointer
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and a non-zero text length returns the correct error.
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_setRunText(scriptRun, NULL, stringLimit, &err);
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_setRunText(scriptRun, NULL, stringLimit, &err) returned %s instead of U_ILLEGAL_ARGUMENT_ERROR.\n", u_errorName(err));
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Make sure that calling uscript_OpenRun with a non-NULL text pointer
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and a zero text length returns the correct error.
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_setRunText(scriptRun, testString, 0, &err);
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("uscript_setRunText(scriptRun, testString, 0, &err) returned %s instead of U_ILLEGAL_ARGUMENT_ERROR.\n", u_errorName(err));
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Now call uscript_setRunText on the empty iterator
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * and make sure that it works.
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_setRunText(scriptRun, testString, stringLimit, &err);
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(err)) {
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Got error %s from uscript_setRunText(...)\n", u_errorName(err));
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            CheckScriptRuns(scriptRun, runStarts, testData, nTestRuns, "uscript_setRunText");
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_closeRun(scriptRun);
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Now open an interator over the testString
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * using uscript_openRun and make sure that it works
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scriptRun = uscript_openRun(testString, stringLimit, &err);
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(err)) {
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Got error %s from uscript_openRun(...)\n", u_errorName(err));
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            CheckScriptRuns(scriptRun, runStarts, testData, nTestRuns, "uscript_openRun");
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Now reset the iterator, and make sure
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * that it still works.
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_resetRun(scriptRun);
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CheckScriptRuns(scriptRun, runStarts, testData, nTestRuns, "uscript_resetRun");
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Close the iterator */
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uscript_closeRun(scriptRun);
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test additional, non-core properties */
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestAdditionalProperties() {
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test data for u_charAge() */
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UVersionInfo version;
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } charAges[]={
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x41,    { 1, 1, 0, 0 }},
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xffff,  { 1, 1, 0, 0 }},
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x20ab,  { 2, 0, 0, 0 }},
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x2fffe, { 2, 0, 0, 0 }},
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x20ac,  { 2, 1, 0, 0 }},
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xfb1d,  { 3, 0, 0, 0 }},
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x3f4,   { 3, 1, 0, 0 }},
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x10300, { 3, 1, 0, 0 }},
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0x220,   { 3, 2, 0, 0 }},
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xff60,  { 3, 2, 0, 0 }}
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test data for u_hasBinaryProperty() */
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    props[][3]={ /* code point, property, value */
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0627, UCHAR_ALPHABETIC, TRUE },
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1034a, UCHAR_ALPHABETIC, TRUE },
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2028, UCHAR_ALPHABETIC, FALSE },
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0066, UCHAR_ASCII_HEX_DIGIT, TRUE },
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0067, UCHAR_ASCII_HEX_DIGIT, FALSE },
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x202c, UCHAR_BIDI_CONTROL, TRUE },
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x202f, UCHAR_BIDI_CONTROL, FALSE },
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x003c, UCHAR_BIDI_MIRRORED, TRUE },
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x003d, UCHAR_BIDI_MIRRORED, FALSE },
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* see Unicode Corrigendum #6 at http://www.unicode.org/versions/corrigendum6.html */
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2018, UCHAR_BIDI_MIRRORED, FALSE },
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x201d, UCHAR_BIDI_MIRRORED, FALSE },
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x201f, UCHAR_BIDI_MIRRORED, FALSE },
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x301e, UCHAR_BIDI_MIRRORED, FALSE },
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x058a, UCHAR_DASH, TRUE },
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x007e, UCHAR_DASH, FALSE },
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0c4d, UCHAR_DIACRITIC, TRUE },
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3000, UCHAR_DIACRITIC, FALSE },
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0e46, UCHAR_EXTENDER, TRUE },
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0020, UCHAR_EXTENDER, FALSE },
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfb1d, UCHAR_FULL_COMPOSITION_EXCLUSION, TRUE },
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d15f, UCHAR_FULL_COMPOSITION_EXCLUSION, TRUE },
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfb1e, UCHAR_FULL_COMPOSITION_EXCLUSION, FALSE },
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x110a, UCHAR_NFD_INERT, TRUE },      /* Jamo L */
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0308, UCHAR_NFD_INERT, FALSE },
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1164, UCHAR_NFKD_INERT, TRUE },     /* Jamo V */
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d79d, UCHAR_NFKD_INERT, FALSE },   /* math compat version of xi */
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0021, UCHAR_NFC_INERT, TRUE },      /* ! */
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0061, UCHAR_NFC_INERT, FALSE },     /* a */
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00e4, UCHAR_NFC_INERT, FALSE },     /* a-umlaut */
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0102, UCHAR_NFC_INERT, FALSE },     /* a-breve */
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1c, UCHAR_NFC_INERT, FALSE },     /* Hangul LV */
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1d, UCHAR_NFC_INERT, TRUE },      /* Hangul LVT */
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d79d, UCHAR_NFKC_INERT, FALSE },   /* math compat version of xi */
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2a6d6, UCHAR_NFKC_INERT, TRUE },    /* Han, last of CJK ext. B */
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00e4, UCHAR_SEGMENT_STARTER, TRUE },
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0308, UCHAR_SEGMENT_STARTER, FALSE },
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x110a, UCHAR_SEGMENT_STARTER, TRUE }, /* Jamo L */
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1164, UCHAR_SEGMENT_STARTER, FALSE },/* Jamo V */
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1c, UCHAR_SEGMENT_STARTER, TRUE }, /* Hangul LV */
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1d, UCHAR_SEGMENT_STARTER, TRUE }, /* Hangul LVT */
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0044, UCHAR_HEX_DIGIT, TRUE },
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff46, UCHAR_HEX_DIGIT, TRUE },
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0047, UCHAR_HEX_DIGIT, FALSE },
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x30fb, UCHAR_HYPHEN, TRUE },
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfe58, UCHAR_HYPHEN, FALSE },
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2172, UCHAR_ID_CONTINUE, TRUE },
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0307, UCHAR_ID_CONTINUE, TRUE },
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x005c, UCHAR_ID_CONTINUE, FALSE },
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2172, UCHAR_ID_START, TRUE },
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x007a, UCHAR_ID_START, TRUE },
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0039, UCHAR_ID_START, FALSE },
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4db5, UCHAR_IDEOGRAPHIC, TRUE },
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2f999, UCHAR_IDEOGRAPHIC, TRUE },
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2f99, UCHAR_IDEOGRAPHIC, FALSE },
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x200c, UCHAR_JOIN_CONTROL, TRUE },
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2029, UCHAR_JOIN_CONTROL, FALSE },
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d7bc, UCHAR_LOWERCASE, TRUE },
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0345, UCHAR_LOWERCASE, TRUE },
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0030, UCHAR_LOWERCASE, FALSE },
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d7a9, UCHAR_MATH, TRUE },
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2135, UCHAR_MATH, TRUE },
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0062, UCHAR_MATH, FALSE },
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfde1, UCHAR_NONCHARACTER_CODE_POINT, TRUE },
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10ffff, UCHAR_NONCHARACTER_CODE_POINT, TRUE },
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10fffd, UCHAR_NONCHARACTER_CODE_POINT, FALSE },
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0022, UCHAR_QUOTATION_MARK, TRUE },
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff62, UCHAR_QUOTATION_MARK, TRUE },
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd840, UCHAR_QUOTATION_MARK, FALSE },
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x061f, UCHAR_TERMINAL_PUNCTUATION, TRUE },
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe003f, UCHAR_TERMINAL_PUNCTUATION, FALSE },
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d44a, UCHAR_UPPERCASE, TRUE },
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2162, UCHAR_UPPERCASE, TRUE },
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0345, UCHAR_UPPERCASE, FALSE },
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0020, UCHAR_WHITE_SPACE, TRUE },
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x202f, UCHAR_WHITE_SPACE, TRUE },
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3001, UCHAR_WHITE_SPACE, FALSE },
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0711, UCHAR_XID_CONTINUE, TRUE },
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d1aa, UCHAR_XID_CONTINUE, TRUE },
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x007c, UCHAR_XID_CONTINUE, FALSE },
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x16ee, UCHAR_XID_START, TRUE },
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x23456, UCHAR_XID_START, TRUE },
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d1aa, UCHAR_XID_START, FALSE },
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Version break:
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * The following properties are only supported starting with the
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Unicode version indicated in the second field.
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x320, 0 },
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x180c, UCHAR_DEFAULT_IGNORABLE_CODE_POINT, TRUE },
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfe02, UCHAR_DEFAULT_IGNORABLE_CODE_POINT, TRUE },
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1801, UCHAR_DEFAULT_IGNORABLE_CODE_POINT, FALSE },
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0149, UCHAR_DEPRECATED, TRUE },         /* changed in Unicode 5.2 */
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0341, UCHAR_DEPRECATED, FALSE },        /* changed in Unicode 5.2 */
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0041, UCHAR_DEPRECATED, TRUE },        /* changed from Unicode 5 to 5.1 */
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0100, UCHAR_DEPRECATED, FALSE },
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00a0, UCHAR_GRAPHEME_BASE, TRUE },
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0a4d, UCHAR_GRAPHEME_BASE, FALSE },
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff9d, UCHAR_GRAPHEME_BASE, TRUE },
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff9f, UCHAR_GRAPHEME_BASE, FALSE },     /* changed from Unicode 3.2 to 4 and again from 5 to 5.1 */
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0300, UCHAR_GRAPHEME_EXTEND, TRUE },
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff9d, UCHAR_GRAPHEME_EXTEND, FALSE },
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff9f, UCHAR_GRAPHEME_EXTEND, TRUE },    /* changed from Unicode 3.2 to 4 and again from 5 to 5.1 */
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0603, UCHAR_GRAPHEME_EXTEND, FALSE },
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0a4d, UCHAR_GRAPHEME_LINK, TRUE },
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff9f, UCHAR_GRAPHEME_LINK, FALSE },
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2ff7, UCHAR_IDS_BINARY_OPERATOR, TRUE },
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2ff3, UCHAR_IDS_BINARY_OPERATOR, FALSE },
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2ff3, UCHAR_IDS_TRINARY_OPERATOR, TRUE },
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2f03, UCHAR_IDS_TRINARY_OPERATOR, FALSE },
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0ec1, UCHAR_LOGICAL_ORDER_EXCEPTION, TRUE },
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xdcba, UCHAR_LOGICAL_ORDER_EXCEPTION, FALSE },
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2e9b, UCHAR_RADICAL, TRUE },
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4e00, UCHAR_RADICAL, FALSE },
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x012f, UCHAR_SOFT_DOTTED, TRUE },
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0049, UCHAR_SOFT_DOTTED, FALSE },
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfa11, UCHAR_UNIFIED_IDEOGRAPH, TRUE },
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfa12, UCHAR_UNIFIED_IDEOGRAPH, FALSE },
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x401, 0 }, /* version break for Unicode 4.0.1 */
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x002e, UCHAR_S_TERM, TRUE },
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0061, UCHAR_S_TERM, FALSE },
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x180c, UCHAR_VARIATION_SELECTOR, TRUE },
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfe03, UCHAR_VARIATION_SELECTOR, TRUE },
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe01ef, UCHAR_VARIATION_SELECTOR, TRUE },
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0200, UCHAR_VARIATION_SELECTOR, FALSE },
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* enum/integer type properties */
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* UCHAR_BIDI_CLASS tested for assigned characters in TestUnicodeData() */
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test default Bidi classes for unassigned code points */
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0590, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x05cf, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x05ed, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x07f2, UCHAR_BIDI_CLASS, U_DIR_NON_SPACING_MARK }, /* Nko, new in Unicode 5.0 */
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x07fe, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT }, /* unassigned R */
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x089f, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfb37, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfb42, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10806, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10909, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10fe4, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0605, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x061c, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x063f, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x070e, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0775, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfbc2, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfd90, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfefe, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x02AF, UCHAR_BLOCK, UBLOCK_IPA_EXTENSIONS },
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0C4E, UCHAR_BLOCK, UBLOCK_TELUGU },
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x155A, UCHAR_BLOCK, UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS },
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1717, UCHAR_BLOCK, UBLOCK_TAGALOG },
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1900, UCHAR_BLOCK, UBLOCK_LIMBU },
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1AFF, UCHAR_BLOCK, UBLOCK_NO_BLOCK },
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3040, UCHAR_BLOCK, UBLOCK_HIRAGANA },
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1D0FF, UCHAR_BLOCK, UBLOCK_BYZANTINE_MUSICAL_SYMBOLS },
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x50000, UCHAR_BLOCK, UBLOCK_NO_BLOCK },
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xEFFFF, UCHAR_BLOCK, UBLOCK_NO_BLOCK },
24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10D0FF, UCHAR_BLOCK, UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B },
24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* UCHAR_CANONICAL_COMBINING_CLASS tested for assigned characters in TestUnicodeData() */
24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7d7, UCHAR_CANONICAL_COMBINING_CLASS, 0 },
24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00A0, UCHAR_DECOMPOSITION_TYPE, U_DT_NOBREAK },
24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00A8, UCHAR_DECOMPOSITION_TYPE, U_DT_COMPAT },
24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00bf, UCHAR_DECOMPOSITION_TYPE, U_DT_NONE },
24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00c0, UCHAR_DECOMPOSITION_TYPE, U_DT_CANONICAL },
24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1E9B, UCHAR_DECOMPOSITION_TYPE, U_DT_CANONICAL },
24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xBCDE, UCHAR_DECOMPOSITION_TYPE, U_DT_CANONICAL },
24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFB5D, UCHAR_DECOMPOSITION_TYPE, U_DT_MEDIAL },
24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1D736, UCHAR_DECOMPOSITION_TYPE, U_DT_FONT },
24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0033, UCHAR_DECOMPOSITION_TYPE, U_DT_NONE },
24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0009, UCHAR_EAST_ASIAN_WIDTH, U_EA_NEUTRAL },
24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0020, UCHAR_EAST_ASIAN_WIDTH, U_EA_NARROW },
24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00B1, UCHAR_EAST_ASIAN_WIDTH, U_EA_AMBIGUOUS },
24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20A9, UCHAR_EAST_ASIAN_WIDTH, U_EA_HALFWIDTH },
24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2FFB, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3000, UCHAR_EAST_ASIAN_WIDTH, U_EA_FULLWIDTH },
24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x35bb, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x58bd, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xD7A3, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xEEEE, UCHAR_EAST_ASIAN_WIDTH, U_EA_AMBIGUOUS },
24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1D198, UCHAR_EAST_ASIAN_WIDTH, U_EA_NEUTRAL },
24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20000, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2F8C7, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE },
24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3a5bd, UCHAR_EAST_ASIAN_WIDTH, U_EA_WIDE }, /* plane 3 got default W values in Unicode 4 */
24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x5a5bd, UCHAR_EAST_ASIAN_WIDTH, U_EA_NEUTRAL },
24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFEEEE, UCHAR_EAST_ASIAN_WIDTH, U_EA_AMBIGUOUS },
24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10EEEE, UCHAR_EAST_ASIAN_WIDTH, U_EA_AMBIGUOUS },
24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* UCHAR_GENERAL_CATEGORY tested for assigned characters in TestUnicodeData() */
24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7c7, UCHAR_GENERAL_CATEGORY, 0 },
24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7d7, UCHAR_GENERAL_CATEGORY, U_OTHER_LETTER },     /* changed in Unicode 5.2 */
24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0444, UCHAR_JOINING_GROUP, U_JG_NO_JOINING_GROUP },
24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0639, UCHAR_JOINING_GROUP, U_JG_AIN },
24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x072A, UCHAR_JOINING_GROUP, U_JG_DALATH_RISH },
24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0647, UCHAR_JOINING_GROUP, U_JG_HEH },
24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x06C1, UCHAR_JOINING_GROUP, U_JG_HEH_GOAL },
24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x200C, UCHAR_JOINING_TYPE, U_JT_NON_JOINING },
24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x200D, UCHAR_JOINING_TYPE, U_JT_JOIN_CAUSING },
24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0639, UCHAR_JOINING_TYPE, U_JT_DUAL_JOINING },
24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0640, UCHAR_JOINING_TYPE, U_JT_JOIN_CAUSING },
24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x06C3, UCHAR_JOINING_TYPE, U_JT_RIGHT_JOINING },
24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0300, UCHAR_JOINING_TYPE, U_JT_TRANSPARENT },
24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x070F, UCHAR_JOINING_TYPE, U_JT_TRANSPARENT },
24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0033, UCHAR_JOINING_TYPE, U_JT_TRANSPARENT },
24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* TestUnicodeData() verifies that no assigned character has "XX" (unknown) */
25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe7e7, UCHAR_LINE_BREAK, U_LB_UNKNOWN },
25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10fffd, UCHAR_LINE_BREAK, U_LB_UNKNOWN },
25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0028, UCHAR_LINE_BREAK, U_LB_OPEN_PUNCTUATION },
25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x232A, UCHAR_LINE_BREAK, U_LB_CLOSE_PUNCTUATION },
25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3401, UCHAR_LINE_BREAK, U_LB_IDEOGRAPHIC },
25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4e02, UCHAR_LINE_BREAK, U_LB_IDEOGRAPHIC },
25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20004, UCHAR_LINE_BREAK, U_LB_IDEOGRAPHIC },
25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xf905, UCHAR_LINE_BREAK, U_LB_IDEOGRAPHIC },
25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xdb7e, UCHAR_LINE_BREAK, U_LB_SURROGATE },
25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xdbfd, UCHAR_LINE_BREAK, U_LB_SURROGATE },
25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xdffc, UCHAR_LINE_BREAK, U_LB_SURROGATE },
25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2762, UCHAR_LINE_BREAK, U_LB_EXCLAMATION },
25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x002F, UCHAR_LINE_BREAK, U_LB_BREAK_SYMBOLS },
25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1D49C, UCHAR_LINE_BREAK, U_LB_ALPHABETIC },
25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1731, UCHAR_LINE_BREAK, U_LB_ALPHABETIC },
25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* UCHAR_NUMERIC_TYPE tested in TestNumericProperties() */
25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* UCHAR_SCRIPT tested in TestUScriptCodeAPI() */
25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10ff, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1100, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },
25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1111, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },
25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1159, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },
25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x115a, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },     /* changed in Unicode 5.2 */
25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x115e, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },     /* changed in Unicode 5.2 */
25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x115f, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },
25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa95f, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa960, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },     /* changed in Unicode 5.2 */
25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa97c, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LEADING_JAMO },     /* changed in Unicode 5.2 */
25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa97d, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1160, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },
25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1161, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },
25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1172, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },
25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11a2, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },
25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11a3, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },       /* changed in Unicode 5.2 */
25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11a7, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },       /* changed in Unicode 5.2 */
25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7af, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7b0, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },       /* changed in Unicode 5.2 */
25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7c6, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_VOWEL_JAMO },       /* changed in Unicode 5.2 */
25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7c7, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11a8, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },
25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11b8, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },
25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11c8, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },
25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11f9, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },
25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11fa, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },    /* changed in Unicode 5.2 */
25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11ff, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },    /* changed in Unicode 5.2 */
25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1200, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7ca, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7cb, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },    /* changed in Unicode 5.2 */
25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7fb, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_TRAILING_JAMO },    /* changed in Unicode 5.2 */
25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7fc, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac00, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LV_SYLLABLE },
25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1c, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LV_SYLLABLE },
25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xc5ec, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LV_SYLLABLE },
25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd788, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LV_SYLLABLE },
25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac01, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LVT_SYLLABLE },
25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1b, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LVT_SYLLABLE },
25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac1d, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LVT_SYLLABLE },
25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xc5ee, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LVT_SYLLABLE },
25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7a3, UCHAR_HANGUL_SYLLABLE_TYPE, U_HST_LVT_SYLLABLE },
25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xd7a4, UCHAR_HANGUL_SYLLABLE_TYPE, 0 },
25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x410, 0 }, /* version break for Unicode 4.1 */
25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00d7, UCHAR_PATTERN_SYNTAX, TRUE },
25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfe45, UCHAR_PATTERN_SYNTAX, TRUE },
25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0061, UCHAR_PATTERN_SYNTAX, FALSE },
25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0020, UCHAR_PATTERN_WHITE_SPACE, TRUE },
25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0085, UCHAR_PATTERN_WHITE_SPACE, TRUE },
25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x200f, UCHAR_PATTERN_WHITE_SPACE, TRUE },
25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00a0, UCHAR_PATTERN_WHITE_SPACE, FALSE },
25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3000, UCHAR_PATTERN_WHITE_SPACE, FALSE },
25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1d200, UCHAR_BLOCK, UBLOCK_ANCIENT_GREEK_MUSICAL_NOTATION },
25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2c8e,  UCHAR_BLOCK, UBLOCK_COPTIC },
25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfe17,  UCHAR_BLOCK, UBLOCK_VERTICAL_FORMS },
25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1a00,  UCHAR_SCRIPT, USCRIPT_BUGINESE },
25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2cea,  UCHAR_SCRIPT, USCRIPT_COPTIC },
25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa82b,  UCHAR_SCRIPT, USCRIPT_SYLOTI_NAGRI },
25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x103d0, UCHAR_SCRIPT, USCRIPT_OLD_PERSIAN },
25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xcc28, UCHAR_LINE_BREAK, U_LB_H2 },
25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xcc29, UCHAR_LINE_BREAK, U_LB_H3 },
25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xac03, UCHAR_LINE_BREAK, U_LB_H3 },
25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x115f, UCHAR_LINE_BREAK, U_LB_JL },
25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11aa, UCHAR_LINE_BREAK, U_LB_JT },
25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x11a1, UCHAR_LINE_BREAK, U_LB_JV },
25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xb2c9, UCHAR_GRAPHEME_CLUSTER_BREAK, U_GCB_LVT },
26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x036f, UCHAR_GRAPHEME_CLUSTER_BREAK, U_GCB_EXTEND },
26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0000, UCHAR_GRAPHEME_CLUSTER_BREAK, U_GCB_CONTROL },
26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1160, UCHAR_GRAPHEME_CLUSTER_BREAK, U_GCB_V },
26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x05f4, UCHAR_WORD_BREAK, U_WB_MIDLETTER },
26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4ef0, UCHAR_WORD_BREAK, U_WB_OTHER },
26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x19d9, UCHAR_WORD_BREAK, U_WB_NUMERIC },
26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2044, UCHAR_WORD_BREAK, U_WB_MIDNUM },
26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfffd, UCHAR_SENTENCE_BREAK, U_SB_OTHER },
26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1ffc, UCHAR_SENTENCE_BREAK, U_SB_UPPER },
26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xff63, UCHAR_SENTENCE_BREAK, U_SB_CLOSE },
26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2028, UCHAR_SENTENCE_BREAK, U_SB_SEP },
26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x520, 0 }, /* version break for Unicode 5.2 */
26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* unassigned code points in new default Bidi R blocks */
26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1ede4, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1efe4, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT },
26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test some script codes >127 */
26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa6e6,  UCHAR_SCRIPT, USCRIPT_BAMUM },
26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa4d0,  UCHAR_SCRIPT, USCRIPT_LISU },
26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10a7f,  UCHAR_SCRIPT, USCRIPT_OLD_SOUTH_ARABIAN },
26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x600, 0 }, /* version break for Unicode 6.0 */
26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* value changed in Unicode 6.0 */
26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x06C3, UCHAR_JOINING_GROUP, U_JG_TEH_MARBUTA_GOAL },
26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x610, 0 }, /* version break for Unicode 6.1 */
26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* unassigned code points in new/changed default Bidi AL blocks */
26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x08ba, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1eee4, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC },
26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, 0x630, 0 }, /* version break for Unicode 6.3 */
26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* unassigned code points in the currency symbols block now default to ET */
26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20C0, UCHAR_BIDI_CLASS, U_EUROPEAN_NUMBER_TERMINATOR },
26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x20CF, UCHAR_BIDI_CLASS, U_EUROPEAN_NUMBER_TERMINATOR },
26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* new property in Unicode 6.3 */
26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0027, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_NONE },
26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0028, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_OPEN },
26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0029, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_CLOSE },
26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFF5C, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_NONE },
26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFF5B, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_OPEN },
26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xFF5D, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_CLOSE },
26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* undefined UProperty values */
26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x61, 0x4a7, 0 },
26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x234bc, 0x15ed, 0 }
26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo version;
26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, result, uVersion;
26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UProperty which;
26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* what is our Unicode version? */
26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getUnicodeVersion(version);
26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uVersion=((int32_t)version[0]<<8)|(version[1]<<4)|version[2]; /* major/minor/update version numbers */
26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charAge(0x20, version);
26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(version[0]==0) {
26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* no additional properties available */
26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("TestAdditionalProperties: no additional properties available, not tested\n");
26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test u_charAge() */
26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<sizeof(charAges)/sizeof(charAges[0]); ++i) {
26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_charAge(charAges[i].c, version);
26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(0!=memcmp(version, charAges[i].version, sizeof(UVersionInfo))) {
26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_charAge(U+%04lx)={ %u, %u, %u, %u } instead of { %u, %u, %u, %u }\n",
26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                charAges[i].c,
26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                version[0], version[1], version[2], version[3],
26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                charAges[i].version[0], charAges[i].version[1], charAges[i].version[2], charAges[i].version[3]);
26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMinValue(UCHAR_DASH)!=0 ||
26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getIntPropertyMinValue(UCHAR_BIDI_CLASS)!=0 ||
26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getIntPropertyMinValue(UCHAR_BLOCK)!=0 ||   /* j2478 */
26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getIntPropertyMinValue(UCHAR_SCRIPT)!=0 || /*JB#2410*/
26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getIntPropertyMinValue(0x2345)!=0
26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMinValue() wrong\n");
26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_DASH)!=1) {
26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_DASH) wrong\n");
26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_ID_CONTINUE)!=1) {
26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_ID_CONTINUE) wrong\n");
26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue((UProperty)(UCHAR_BINARY_LIMIT-1))!=1) {
26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_BINARY_LIMIT-1) wrong\n");
26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS)!=(int32_t)U_CHAR_DIRECTION_COUNT-1 ) {
27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS) wrong\n");
27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_BLOCK)!=(int32_t)UBLOCK_COUNT-1 ) {
27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_BLOCK) wrong\n");
27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_LINE_BREAK)!=(int32_t)U_LB_COUNT-1) {
27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_LINE_BREAK) wrong\n");
27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_SCRIPT)!=(int32_t)USCRIPT_CODE_LIMIT-1) {
27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_SCRIPT) wrong\n");
27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_NUMERIC_TYPE)!=(int32_t)U_NT_COUNT-1) {
27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_NUMERIC_TYPE) wrong\n");
27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY)!=(int32_t)U_CHAR_CATEGORY_COUNT-1) {
27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY) wrong\n");
27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_HANGUL_SYLLABLE_TYPE)!=(int32_t)U_HST_COUNT-1) {
27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_HANGUL_SYLLABLE_TYPE) wrong\n");
27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_GRAPHEME_CLUSTER_BREAK)!=(int32_t)U_GCB_COUNT-1) {
27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_GRAPHEME_CLUSTER_BREAK) wrong\n");
27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_SENTENCE_BREAK)!=(int32_t)U_SB_COUNT-1) {
27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_SENTENCE_BREAK) wrong\n");
27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_WORD_BREAK)!=(int32_t)U_WB_COUNT-1) {
27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_WORD_BREAK) wrong\n");
27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_getIntPropertyMaxValue(UCHAR_BIDI_PAIRED_BRACKET_TYPE)!=(int32_t)U_BPT_COUNT-1) {
27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_BIDI_PAIRED_BRACKET_TYPE) wrong\n");
27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*JB#2410*/
27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(0x2345)!=-1) {
27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(0x2345) wrong\n");
27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_DECOMPOSITION_TYPE) != (int32_t) (U_DT_COUNT - 1)) {
27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_DECOMPOSITION_TYPE) wrong\n");
27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_JOINING_GROUP) !=  (int32_t) (U_JG_COUNT -1)) {
27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_JOINING_GROUP) wrong\n");
27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_JOINING_TYPE) != (int32_t) (U_JT_COUNT -1)) {
27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_JOINING_TYPE) wrong\n");
27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMaxValue(UCHAR_EAST_ASIAN_WIDTH) != (int32_t) (U_EA_COUNT -1)) {
27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMaxValue(UCHAR_EAST_ASIAN_WIDTH) wrong\n");
27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test u_hasBinaryProperty() and u_getIntPropertyValue() */
27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<sizeof(props)/sizeof(props[0]); ++i) {
27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *whichName;
27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(props[i][0]<0) {
27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Unicode version break */
27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uVersion<props[i][1]) {
27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break; /* do not test properties that are not yet supported */
27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue; /* skip this row */
27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c=(UChar32)props[i][0];
27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=(UProperty)props[i][1];
27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        whichName=u_getPropertyName(which, U_LONG_PROPERTY_NAME);
27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(which<UCHAR_INT_START) {
27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            result=u_hasBinaryProperty(c, which);
27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(result!=props[i][2]) {
27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_data_err("error: u_hasBinaryProperty(U+%04lx, %s)=%d is wrong (props[%d]) - (Are you missing data?)\n",
27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        c, whichName, result, i);
27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=u_getIntPropertyValue(c, which);
27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result!=props[i][2]) {
27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("error: u_getIntPropertyValue(U+%04lx, %s)=%d is wrong, should be %d (props[%d]) - (Are you missing data?)\n",
27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    c, whichName, result, props[i][2], i);
27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test separate functions, too */
27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch((UProperty)props[i][1]) {
27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UCHAR_ALPHABETIC:
27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u_isUAlphabetic((UChar32)props[i][0])!=(UBool)props[i][2]) {
27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: u_isUAlphabetic(U+%04lx)=%d is wrong (props[%d])\n",
27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        props[i][0], result, i);
27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UCHAR_LOWERCASE:
27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u_isULowercase((UChar32)props[i][0])!=(UBool)props[i][2]) {
27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: u_isULowercase(U+%04lx)=%d is wrong (props[%d])\n",
27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        props[i][0], result, i);
27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UCHAR_UPPERCASE:
27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u_isUUppercase((UChar32)props[i][0])!=(UBool)props[i][2]) {
27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: u_isUUppercase(U+%04lx)=%d is wrong (props[%d])\n",
27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        props[i][0], result, i);
27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UCHAR_WHITE_SPACE:
28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u_isUWhiteSpace((UChar32)props[i][0])!=(UBool)props[i][2]) {
28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error: u_isUWhiteSpace(U+%04lx)=%d is wrong (props[%d])\n",
28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        props[i][0], result, i);
28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestNumericProperties(void) {
28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* see UnicodeData.txt, DerivedNumericValues.txt */
28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t type;
28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double numValue;
28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } values[]={
28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0F33, U_NT_NUMERIC, -1./2. },
28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0C66, U_NT_DECIMAL, 0 },
28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x96f6, U_NT_NUMERIC, 0 },
28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xa833, U_NT_NUMERIC, 1./16. },
28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2152, U_NT_NUMERIC, 1./10. },
28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2151, U_NT_NUMERIC, 1./9. },
28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1245f, U_NT_NUMERIC, 1./8. },
28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2150, U_NT_NUMERIC, 1./7. },
28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2159, U_NT_NUMERIC, 1./6. },
28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x09f6, U_NT_NUMERIC, 3./16. },
28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2155, U_NT_NUMERIC, 1./5. },
28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00BD, U_NT_NUMERIC, 1./2. },
28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0031, U_NT_DECIMAL, 1. },
28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4e00, U_NT_NUMERIC, 1. },
28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x58f1, U_NT_NUMERIC, 1. },
28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10320, U_NT_NUMERIC, 1. },
28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0F2B, U_NT_NUMERIC, 3./2. },
28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x00B2, U_NT_DIGIT, 2. },
28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x5f10, U_NT_NUMERIC, 2. },
28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1813, U_NT_DECIMAL, 3. },
28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x5f0e, U_NT_NUMERIC, 3. },
28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2173, U_NT_NUMERIC, 4. },
28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x8086, U_NT_NUMERIC, 4. },
28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x278E, U_NT_DIGIT, 5. },
28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1D7F2, U_NT_DECIMAL, 6. },
28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x247A, U_NT_DIGIT, 7. },
28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x7396, U_NT_NUMERIC, 9. },
28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1372, U_NT_NUMERIC, 10. },
28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x216B, U_NT_NUMERIC, 12. },
28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x16EE, U_NT_NUMERIC, 17. },
28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x249A, U_NT_NUMERIC, 19. },
28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x303A, U_NT_NUMERIC, 30. },
28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x5345, U_NT_NUMERIC, 30. },
28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x32B2, U_NT_NUMERIC, 37. },
28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x1375, U_NT_NUMERIC, 40. },
28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10323, U_NT_NUMERIC, 50. },
28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x0BF1, U_NT_NUMERIC, 100. },
28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x964c, U_NT_NUMERIC, 100. },
28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x217E, U_NT_NUMERIC, 500. },
28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2180, U_NT_NUMERIC, 1000. },
28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4edf, U_NT_NUMERIC, 1000. },
28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x2181, U_NT_NUMERIC, 5000. },
28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x137C, U_NT_NUMERIC, 10000. },
28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4e07, U_NT_NUMERIC, 10000. },
28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x12432, U_NT_NUMERIC, 216000. },
28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x12433, U_NT_NUMERIC, 432000. },
28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x4ebf, U_NT_NUMERIC, 100000000. },
28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x5146, U_NT_NUMERIC, 1000000000000. },
28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { -1, U_NT_NONE, U_NO_NUMERIC_VALUE },
28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x61, U_NT_NONE, U_NO_NUMERIC_VALUE },
28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x3000, U_NT_NONE, U_NO_NUMERIC_VALUE },
28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xfffe, U_NT_NONE, U_NO_NUMERIC_VALUE },
28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10301, U_NT_NONE, U_NO_NUMERIC_VALUE },
28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0xe0033, U_NT_NONE, U_NO_NUMERIC_VALUE },
28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x10ffff, U_NT_NONE, U_NO_NUMERIC_VALUE },
28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { 0x110000, U_NT_NONE, U_NO_NUMERIC_VALUE }
28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double nv;
28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c;
28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, type;
28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(values); ++i) {
28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c=values[i].c;
28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        type=u_getIntPropertyValue(c, UCHAR_NUMERIC_TYPE);
28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        nv=u_getNumericValue(c);
28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(type!=values[i].type) {
28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("UCHAR_NUMERIC_TYPE(U+%04lx)=%d should be %d\n", c, type, values[i].type);
28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(0.000001 <= fabs(nv - values[i].numValue)) {
28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_getNumericValue(U+%04lx)=%g should be %g\n", c, nv, values[i].numValue);
28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test the property names and property value names API.
28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestPropertyNames(void) {
29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t p, v, choice=0, rev;
29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool atLeastSomething = FALSE;
29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (p=0; ; ++p) {
29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UProperty propEnum = (UProperty)p;
29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool sawProp = FALSE;
29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(p > 10 && !atLeastSomething) {
29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_data_err("Never got anything after 10 tries.\nYour data is probably fried. Quitting this test\n", p, choice);
29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (choice=0; ; ++choice) {
29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char* name = u_getPropertyName(propEnum, (UPropertyNameChoice)choice);
29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (name) {
29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!sawProp)
29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("prop 0x%04x+%2d:", p&~0xfff, p&0xfff);
29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("%d=\"%s\"", choice, name);
29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sawProp = TRUE;
29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                atLeastSomething = TRUE;
29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* test reverse mapping */
29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                rev = u_getPropertyEnum(name);
29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (rev != p) {
29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Property round-trip failure: %d -> %s -> %d\n",
29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            p, name, rev);
29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!name && choice>0) break;
29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (sawProp) {
29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* looks like a valid property; check the values */
29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char* pname = u_getPropertyName(propEnum, U_LONG_PROPERTY_NAME);
29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t max = 0;
29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (p == UCHAR_CANONICAL_COMBINING_CLASS) {
29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                max = 255;
29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p == UCHAR_GENERAL_CATEGORY_MASK) {
29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* it's far too slow to iterate all the way up to
29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   the real max, U_GC_P_MASK */
29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                max = U_GC_NL_MASK;
29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p == UCHAR_BLOCK) {
29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* UBlockCodes, unlike other values, start at 1 */
29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                max = 1;
29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("\n");
29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (v=-1; ; ++v) {
29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool sawValue = FALSE;
29486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (choice=0; ; ++choice) {
29496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const char* vname = u_getPropertyValueName(propEnum, v, (UPropertyNameChoice)choice);
29506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (vname) {
29516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (!sawValue) log_verbose(" %s, value %d:", pname, v);
29526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_verbose("%d=\"%s\"", choice, vname);
29536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sawValue = TRUE;
29546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        /* test reverse mapping */
29566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        rev = u_getPropertyValueEnum(propEnum, vname);
29576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (rev != v) {
29586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("Value round-trip failure (%s): %d -> %s -> %d\n",
29596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    pname, v, vname, rev);
29606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
29616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
29626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (!vname && choice>0) break;
29636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
29646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (sawValue) {
29656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("\n");
29666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
29676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!sawValue && v>=max) break;
29686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
29696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
29706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!sawProp) {
29716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (p>=UCHAR_STRING_LIMIT) {
29726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
29736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p>=UCHAR_DOUBLE_LIMIT) {
29746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                p = UCHAR_STRING_START - 1;
29756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p>=UCHAR_MASK_LIMIT) {
29766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                p = UCHAR_DOUBLE_START - 1;
29776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p>=UCHAR_INT_LIMIT) {
29786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                p = UCHAR_MASK_START - 1;
29796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (p>=UCHAR_BINARY_LIMIT) {
29806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                p = UCHAR_INT_START - 1;
29816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
29826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
29836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
29876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test the property values API.  See JB#2410.
29886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
29896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
29906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestPropertyValues(void) {
29916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, p, min, max;
29926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec;
29936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Min should be 0 for everything. */
29956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Until JB#2478 is fixed, the one exception is UCHAR_BLOCK. */
29966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (p=UCHAR_INT_START; p<UCHAR_INT_LIMIT; ++p) {
29976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UProperty propEnum = (UProperty)p;
29986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        min = u_getIntPropertyMinValue(propEnum);
29996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (min != 0) {
30006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (p == UCHAR_BLOCK) {
30016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* This is okay...for now.  See JB#2487.
30026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   TODO Update this for JB#2487. */
30036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
30046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char* name;
30056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                name = u_getPropertyName(propEnum, U_LONG_PROPERTY_NAME);
30066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (name == NULL)
30076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    name = "<ERROR>";
30086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: u_getIntPropertyMinValue(%s) = %d, exp. 0\n",
30096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        name, min);
30106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
30116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
30126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( u_getIntPropertyMinValue(UCHAR_GENERAL_CATEGORY_MASK)!=0 ||
30156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY_MASK)!=-1) {
30166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_getIntPropertyMin/MaxValue(UCHAR_GENERAL_CATEGORY_MASK) is wrong\n");
30176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Max should be -1 for invalid properties. */
30206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    max = u_getIntPropertyMaxValue(UCHAR_INVALID_CODE);
30216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (max != -1) {
30226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: u_getIntPropertyMaxValue(-1) = %d, exp. -1\n",
30236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                max);
30246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Script should return USCRIPT_INVALID_CODE for an invalid code point. */
30276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<2; ++i) {
30286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t script;
30296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* desc;
30306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
30316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch (i) {
30326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0:
30336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            script = uscript_getScript(-1, &ec);
30346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            desc = "uscript_getScript(-1)";
30356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
30366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1:
30376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            script = u_getIntPropertyValue(-1, UCHAR_SCRIPT);
30386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            desc = "u_getIntPropertyValue(-1, UCHAR_SCRIPT)";
30396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
30406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
30416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Internal test error. Too many scripts\n");
30426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
30436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
30446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* We don't explicitly test ec.  It should be U_FAILURE but it
30456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           isn't documented as such. */
30466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (script != (int32_t)USCRIPT_INVALID_CODE) {
30476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: %s = %d, exp. 0\n",
30486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    desc, script);
30496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
30506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
30526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* various tests for consistency of UCD data and API behavior */
30546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
30556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestConsistency() {
30566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[300];
30576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *set1, *set2, *set3, *set4;
30586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
30596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 start, end;
30616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, length;
30626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(hyphenPattern, "[:Hyphen:]", 10);
30646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(dashPattern, "[:Dash:]", 8);
30656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(lowerPattern, "[:Lowercase:]", 13);
30666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(formatPattern, "[:Cf:]", 6);
30676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(alphaPattern, "[:Alphabetic:]", 14);
30686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(mathBlocksPattern,
30706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "[[:block=Mathematical Operators:][:block=Miscellaneous Mathematical Symbols-A:][:block=Miscellaneous Mathematical Symbols-B:][:block=Supplemental Mathematical Operators:][:block=Mathematical Alphanumeric Symbols:]]",
30716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1+32+46+46+45+43+1+1); /* +1 for NUL */
30726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(mathPattern, "[:Math:]", 8);
30736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(unassignedPattern, "[:Cn:]", 6);
30746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(unknownPattern, "[:sc=Unknown:]", 14);
30756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(reservedPattern, "[[:Cn:][:Co:][:Cs:]]", 20);
30766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(hyphenPattern, "[:Hyphen:]", 10);
30786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(dashPattern, "[:Dash:]", 8);
30796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(lowerPattern, "[:Lowercase:]", 13);
30806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(formatPattern, "[:Cf:]", 6);
30816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(alphaPattern, "[:Alphabetic:]", 14);
30826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(mathBlocksPattern,
30846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "[[:block=Mathematical Operators:][:block=Miscellaneous Mathematical Symbols-A:][:block=Miscellaneous Mathematical Symbols-B:][:block=Supplemental Mathematical Operators:][:block=Mathematical Alphanumeric Symbols:]]",
30856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1+32+46+46+45+43+1+1); /* +1 for NUL */
30866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(mathPattern, "[:Math:]", 8);
30876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(unassignedPattern, "[:Cn:]", 6);
30886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(unknownPattern, "[:sc=Unknown:]", 14);
30896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(reservedPattern, "[[:Cn:][:Co:][:Cs:]]", 20);
30906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
30926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * It used to be that UCD.html and its precursors said
30936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * "Those dashes used to mark connections between pieces of words,
30946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  plus the Katakana middle dot."
30956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
30966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Unicode 4 changed 00AD Soft Hyphen to Cf and removed it from Dash
30976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * but not from Hyphen.
30986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UTC 94 (2003mar) decided to leave it that way and to change UCD.html.
30996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Therefore, do not show errors when testing the Hyphen property.
31006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
31016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Starting with Unicode 4, inconsistencies with [:Hyphen:] are\n"
31026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "known to the UTC and not considered errors.\n");
31036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set1=uset_openPattern(hyphenPattern, 10, &errorCode);
31066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set2=uset_openPattern(dashPattern, 8, &errorCode);
31076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
31086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* remove the Katakana middle dot(s) from set1 */
31096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_remove(set1, 0x30fb);
31106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_remove(set1, 0xff65); /* halfwidth variant */
31116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAMinusB(set1, set2, "[:Hyphen:]", "[:Dash:]", FALSE);
31126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
31136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error opening [:Hyphen:] or [:Dash:] - %s (Are you missing data?)\n", u_errorName(errorCode));
31146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check that Cf is neither Hyphen nor Dash nor Alphabetic */
31176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set3=uset_openPattern(formatPattern, 6, &errorCode);
31186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set4=uset_openPattern(alphaPattern, 14, &errorCode);
31196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
31206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAIntersectB(set3, set1, "[:Cf:]", "[:Hyphen:]", FALSE);
31216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAIntersectB(set3, set2, "[:Cf:]", "[:Dash:]", TRUE);
31226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        showAIntersectB(set3, set4, "[:Cf:]", "[:Alphabetic:]", TRUE);
31236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
31246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error opening [:Cf:] or [:Alpbabetic:] - %s (Are you missing data?)\n", u_errorName(errorCode));
31256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set1);
31286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set2);
31296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set3);
31306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set4);
31316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
31336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Check that each lowercase character has "small" in its name
31346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and not "capital".
31356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * There are some such characters, some of which seem odd.
31366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Use the verbose flag to see these notices.
31376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
31386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set1=uset_openPattern(lowerPattern, 13, &errorCode);
31406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
31416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0;; ++i) {
31426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            length=uset_getItem(set1, i, &start, &end, NULL, 0, &errorCode);
31436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) {
31446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break; /* done */
31456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
31466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode)) {
31476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error iterating over [:Lowercase:] at item %d: %s\n",
31486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        i, u_errorName(errorCode));
31496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
31506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
31516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(length!=0) {
31526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break; /* done with code points, got a string or -1 */
31536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
31546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            while(start<=end) {
31566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length=u_charName(start, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &errorCode);
31576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(errorCode)) {
31586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("error getting the name of U+%04x - %s\n", start, u_errorName(errorCode));
31596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errorCode=U_ZERO_ERROR;
31606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
31616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if( (strstr(buffer, "SMALL")==NULL || strstr(buffer, "CAPITAL")!=NULL) &&
31626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    strstr(buffer, "SMALL CAPITAL")==NULL
31636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ) {
31646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("info: [:Lowercase:] contains U+%04x whose name does not suggest lowercase: %s\n", start, buffer);
31656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
31666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ++start;
31676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
31686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
31696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
31706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error opening [:Lowercase:] - %s (Are you missing data?)\n", u_errorName(errorCode));
31716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set1);
31736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* verify that all assigned characters in Math blocks are exactly Math characters */
31756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set1=uset_openPattern(mathBlocksPattern, -1, &errorCode);
31776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set2=uset_openPattern(mathPattern, 8, &errorCode);
31786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set3=uset_openPattern(unassignedPattern, 6, &errorCode);
31796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
31806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_retainAll(set2, set1); /* [math blocks]&[:Math:] */
31816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_complement(set3);      /* assigned characters */
31826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_retainAll(set1, set3); /* [math blocks]&[assigned] */
31836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareUSets(set1, set2,
31846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     "[assigned Math block chars]", "[math blocks]&[:Math:]",
31856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     TRUE);
31866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
31876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error opening [math blocks] or [:Math:] or [:Cn:] - %s (Are you missing data?)\n", u_errorName(errorCode));
31886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set1);
31906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set2);
31916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set3);
31926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* new in Unicode 5.0: exactly all unassigned+PUA+surrogate code points have script=Unknown */
31946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set1=uset_openPattern(unknownPattern, 14, &errorCode);
31966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    set2=uset_openPattern(reservedPattern, 20, &errorCode);
31976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
31986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareUSets(set1, set2,
31996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     "[:sc=Unknown:]", "[[:Cn:][:Co:][:Cs:]]",
32006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     TRUE);
32016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
32026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error opening [:sc=Unknown:] or [[:Cn:][:Co:][:Cs:]] - %s (Are you missing data?)\n", u_errorName(errorCode));
32036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set1);
32056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(set2);
32066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
32076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
32096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Starting with ICU4C 3.4, the core Unicode properties files
32106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (uprops.icu, ucase.icu, ubidi.icu, unorm.icu)
32116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are hardcoded in the common DLL and therefore not included
32126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in the data package any more.
32136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test requiring these files are disabled so that
32146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * we need not jump through hoops (like adding snapshots of these files
32156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to testdata).
32166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See Jitterbug 4497.
32176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
32186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HARDCODED_DATA_4497 1
32196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* API coverage for ucase.c */
32216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUCase() {
32226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !HARDCODED_DATA_4497
32236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDataMemory *pData;
32246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCaseProps *csp;
32256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UCaseProps *ccsp;
32266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
32276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* coverage for ucase_openBinary() */
32296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pData=udata_open(NULL, UCASE_DATA_TYPE, UCASE_DATA_NAME, &errorCode);
32316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
32326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("unable to open " UCASE_DATA_NAME "." UCASE_DATA_TYPE ": %s\n",
32336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(errorCode));
32346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
32356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    csp=ucase_openBinary((const uint8_t *)pData->pHeader, -1, &errorCode);
32386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
32396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucase_openBinary() fails for the contents of " UCASE_DATA_NAME "." UCASE_DATA_TYPE ": %s\n",
32406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(errorCode));
32416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udata_close(pData);
32426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
32436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(UCASE_LOWER!=ucase_getType(csp, 0xdf)) { /* verify islower(sharp s) */
32466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucase_openBinary() does not seem to return working UCaseProps\n");
32476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucase_close(csp);
32506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udata_close(pData);
32516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* coverage for ucase_getDummy() */
32536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ccsp=ucase_getDummy(&errorCode);
32556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucase_tolower(ccsp, 0x41)!=0x41) {
32566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucase_tolower(dummy, A)!=A\n");
32576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
32596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
32606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* API coverage for ubidi_props.c */
32626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUBiDiProps() {
32636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !HARDCODED_DATA_4497
32646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDataMemory *pData;
32656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiProps *bdp;
32666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiProps *cbdp;
32676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
32686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* coverage for ubidi_openBinary() */
32706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pData=udata_open(NULL, UBIDI_DATA_TYPE, UBIDI_DATA_NAME, &errorCode);
32726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
32736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("unable to open " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE ": %s\n",
32746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(errorCode));
32756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
32766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bdp=ubidi_openBinary((const uint8_t *)pData->pHeader, -1, &errorCode);
32796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
32806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_openBinary() fails for the contents of " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE ": %s\n",
32816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(errorCode));
32826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udata_close(pData);
32836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
32846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(0x2215!=ubidi_getMirror(bdp, 0x29F5)) { /* verify some data */
32876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_openBinary() does not seem to return working UBiDiProps\n");
32886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_closeProps(bdp);
32916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udata_close(pData);
32926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* coverage for ubidi_getDummy() */
32946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cbdp=ubidi_getDummy(&errorCode);
32966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ubidi_getClass(cbdp, 0x20)!=0) {
32976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getClass(dummy, space)!=0\n");
32986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
33006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test case folding, compare return values with CaseFolding.txt ------------ */
33036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* bit set for which case foldings for a character have been tested already */
33056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum {
33066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CF_SIMPLE=1,
33076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CF_FULL=2,
33086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CF_TURKIC=4,
33096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CF_ALL=7
33106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
33116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
33136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestFold(UChar32 c, int which,
33146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         UChar32 simple, UChar32 turkic,
33156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *full, int32_t fullLength,
33166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *turkicFull, int32_t turkicFullLength) {
33176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar s[2], t[32];
33186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c2;
33196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length, length2;
33206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
33226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=0;
33246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U16_APPEND_UNSAFE(s, length, c);
33256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((which&CF_SIMPLE)!=0 && (c2=u_foldCase(c, 0))!=simple) {
33276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_foldCase(U+%04lx, default)=U+%04lx != U+%04lx\n", (long)c, (long)c2, (long)simple);
33286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((which&CF_FULL)!=0) {
33306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length2=u_strFoldCase(t, LENGTHOF(t), s, length, 0, &errorCode);
33316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length2!=fullLength || 0!=u_memcmp(t, full, fullLength)) {
33326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFoldCase(U+%04lx, default) does not fold properly\n", (long)c);
33336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
33346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((which&CF_TURKIC)!=0) {
33366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((c2=u_foldCase(c, U_FOLD_CASE_EXCLUDE_SPECIAL_I))!=turkic) {
33376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_foldCase(U+%04lx, turkic)=U+%04lx != U+%04lx\n", (long)c, (long)c2, (long)simple);
33386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
33396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length2=u_strFoldCase(t, LENGTHOF(t), s, length, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode);
33416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length2!=turkicFullLength || 0!=u_memcmp(t, turkicFull, length2)) {
33426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFoldCase(U+%04lx, turkic) does not fold properly\n", (long)c);
33436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
33446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test that c case-folds to itself */
33486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
33496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestFoldToSelf(UChar32 c, int which) {
33506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar s[2];
33516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
33526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=0;
33546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U16_APPEND_UNSAFE(s, length, c);
33556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testFold(c, which, c, c, s, length, s, length);
33566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct CaseFoldingData {
33596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *notSeen;
33606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 prev, prevSimple;
33616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar prevFull[32];
33626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t prevFullLength;
33636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int which;
33646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
33656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct CaseFoldingData CaseFoldingData;
33666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV
33686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcaseFoldingLineFn(void *context,
33696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  char *fields[][2], int32_t fieldCount,
33706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UErrorCode *pErrorCode) {
33716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CaseFoldingData *pData=(CaseFoldingData *)context;
33726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *end;
33736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar full[32];
33746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 c, prev, simple;
33756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count;
33766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int which;
33776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char status;
33786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get code point */
33806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *s=u_skipWhitespace(fields[0][0]);
33816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(0==strncmp(s, "0000..10FFFF", 12)) {
33826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
33836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Ignore the line
33846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * # @missing: 0000..10FFFF; C; <code point>
33856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * because maps-to-self is already our default, and this line breaks this parser.
33866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
33876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
33886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c=(UChar32)strtoul(s, &end, 16);
33906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    end=(char *)u_skipWhitespace(end);
33916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(end<=fields[0][0] || end!=fields[0][1]) {
33926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("syntax error in CaseFolding.txt field 0 at %s\n", fields[0][0]);
33936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_PARSE_ERROR;
33946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
33956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the status of this mapping */
33986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=*u_skipWhitespace(fields[1][0]);
33996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status!='C' && status!='S' && status!='F' && status!='T') {
34006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("unrecognized status field in CaseFolding.txt at %s\n", fields[0][0]);
34016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_PARSE_ERROR;
34026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
34036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the mapping */
34066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=u_parseString(fields[2][0], full, 32, (uint32_t *)&simple, pErrorCode);
34076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
34086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error parsing CaseFolding.txt mapping at %s\n", fields[0][0]);
34096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
34106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* there is a simple mapping only if there is exactly one code point (count is in UChars) */
34136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count==0 || count>2 || (count==2 && U16_IS_SINGLE(full[1]))) {
34146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        simple=c;
34156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(c!=(prev=pData->prev)) {
34186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
34196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Test remaining mappings for the previous code point.
34206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * If a turkic folding was not mentioned, then it should fold the same
34216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * as the regular simple case folding.
34226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
34236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar prevString[2];
34246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length;
34256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=0;
34276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_APPEND_UNSAFE(prevString, length, prev);
34286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testFold(prev, (~pData->which)&CF_ALL,
34296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 prev, pData->prevSimple,
34306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 prevString, length,
34316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 pData->prevFull, pData->prevFullLength);
34326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prev=pData->prevSimple=c;
34336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=0;
34346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_APPEND_UNSAFE(pData->prevFull, length, c);
34356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prevFullLength=length;
34366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->which=0;
34376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
34406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Turn the status into a bit set of case foldings to test.
34416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Remember non-Turkic case foldings as defaults for Turkic mode.
34426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
34436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(status) {
34446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 'C':
34456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=CF_SIMPLE|CF_FULL;
34466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prevSimple=simple;
34476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_memcpy(pData->prevFull, full, count);
34486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prevFullLength=count;
34496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
34506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 'S':
34516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=CF_SIMPLE;
34526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prevSimple=simple;
34536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
34546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 'F':
34556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=CF_FULL;
34566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_memcpy(pData->prevFull, full, count);
34576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pData->prevFullLength=count;
34586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
34596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 'T':
34606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=CF_TURKIC;
34616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
34626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
34636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        which=0;
34646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break; /* won't happen because of test above */
34656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testFold(c, which, simple, simple, full, count, full, count);
34686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* remember which case foldings of c have been tested */
34706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pData->which|=which;
34716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* remove c from the set of ones not mentioned in CaseFolding.txt */
34736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_remove(pData->notSeen, c);
34746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
34756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
34776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestCaseFolding() {
34786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CaseFoldingData data={ NULL };
34796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *fields[3][2];
34806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
34816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static char *lastLine= (char *)"10FFFF; C; 10FFFF;";
34836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
34856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test BMP & plane 1 - nothing interesting above */
34866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    data.notSeen=uset_open(0, 0x1ffff);
34876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    data.prevFullLength=1; /* length of full case folding of U+0000 */
34886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    parseUCDFile("CaseFolding.txt", fields, 3, caseFoldingLineFn, &data, &errorCode);
34906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(errorCode)) {
34916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i, start, end;
34926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* add a pseudo-last line to finish testing of the actual last one */
34946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[0][0]=lastLine;
34956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[0][1]=lastLine+6;
34966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[1][0]=lastLine+7;
34976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[1][1]=lastLine+9;
34986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[2][0]=lastLine+10;
34996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[2][1]=lastLine+17;
35006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        caseFoldingLineFn(&data, fields, 3, &errorCode);
35016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* verify that all code points that are not mentioned in CaseFolding.txt fold to themselves */
35036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0;
35046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0==uset_getItem(data.notSeen, i, &start, &end, NULL, 0, &errorCode) &&
35056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_SUCCESS(errorCode);
35066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++i
35076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
35086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            do {
35096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                testFoldToSelf(start, CF_ALL);
35106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } while(++start<=end);
35116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
35126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
35136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(data.notSeen);
35156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3516