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#include "cintltst.h"
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucurr.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uset.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udat.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ulocdata.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "locmap.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgreturns a new UnicodeSet that is a flattened form of the original
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeSet.
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic USet*
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcreateFlattenSet(USet *origSet, UErrorCode *status) {
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *newSet = NULL;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t origItemCount = 0;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx, graphmeSize;
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 start, end;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar graphme[64];
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("createFlattenSet called with %s\n", u_errorName(*status));
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newSet = uset_open(1, 0);
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    origItemCount = uset_getItemCount(origSet);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (idx = 0; idx < origItemCount; idx++) {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        graphmeSize = uset_getItem(origSet, idx,
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &start, &end,
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            graphme, (int32_t)(sizeof(graphme)/sizeof(graphme[0])),
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(*status)) {
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ERROR: uset_getItem returned %s\n", u_errorName(*status));
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *status = U_ZERO_ERROR;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (graphmeSize) {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_addAllCodePoints(newSet, graphme, graphmeSize);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_addRange(newSet, start, end);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_closeOver(newSet,USET_CASE_INSENSITIVE);
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return newSet;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgisCurrencyPreEuro(const char* currencyKey){
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( strcmp(currencyKey, "PTE") == 0 ||
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "ESP") == 0 ||
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "LUF") == 0 ||
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "GRD") == 0 ||
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "BEF") == 0 ||
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "ITL") == 0 ||
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcmp(currencyKey, "EEK") == 0){
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return TRUE;
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestKeyInRootRecursive(UResourceBundle *root, const char *rootName,
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       UResourceBundle *currentBundle, const char *locale) {
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *subRootBundle = NULL, *subBundle = NULL, *arr = NULL;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_resetIterator(root);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_resetIterator(currentBundle);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (ures_hasNext(currentBundle)) {
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *subBundleKey = NULL;
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *currentBundleKey = NULL;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode = U_ZERO_ERROR;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currentBundleKey = ures_getKey(currentBundle);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (void)currentBundleKey;    /* Suppress set but not used warning. */
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subBundle = ures_getNextResource(currentBundle, NULL, &errorCode);
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(errorCode)) {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Can't open a resource for lnocale %s. Error: %s\n", locale, u_errorName(errorCode));
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subBundleKey = ures_getKey(subBundle);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subRootBundle = ures_getByKey(root, subBundleKey, NULL, &errorCode);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(errorCode)) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Can't open a resource with key \"%s\" in \"%s\" from %s for locale \"%s\"\n",
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    subBundleKey,
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getKey(currentBundle),
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    rootName,
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    locale);
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(subBundle);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ures_getType(subRootBundle) != ures_getType(subBundle)) {
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("key \"%s\" in \"%s\" has a different type from root for locale \"%s\"\n"
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\troot=%d, locale=%d\n",
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    subBundleKey,
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getKey(currentBundle),
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    locale,
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getType(subRootBundle),
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getType(subBundle));
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(subBundle);
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getType(subBundle) == URES_INT_VECTOR) {
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t minSize;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t subBundleSize;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t idx;
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UBool sameArray = TRUE;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const int32_t *subRootBundleArr = ures_getIntVector(subRootBundle, &minSize, &errorCode);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const int32_t *subBundleArr = ures_getIntVector(subBundle, &subBundleSize, &errorCode);
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (minSize > subBundleSize) {
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                minSize = subBundleSize;
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Arrays are different size with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (idx = 0; idx < minSize && sameArray; idx++) {
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (subRootBundleArr[idx] != subBundleArr[idx]) {
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    sameArray = FALSE;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (strcmp(subBundleKey, "DateTimeElements") == 0
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    && (subBundleArr[idx] < 1 || 7 < subBundleArr[idx]))
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                {
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Value out of range with key \"%s\" at index %d in \"%s\" for locale \"%s\"\n",
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            subBundleKey,
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            idx,
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(currentBundle),
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            locale);
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Special exception es_US and DateTimeElements */
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (sameArray
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                && !(strcmp(locale, "es_US") == 0 && strcmp(subBundleKey, "DateTimeElements") == 0))
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Integer vectors are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getType(subBundle) == URES_ARRAY) {
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UResourceBundle *subSubBundle = ures_getByIndex(subBundle, 0, NULL, &errorCode);
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UResourceBundle *subSubRootBundle = ures_getByIndex(subRootBundle, 0, NULL, &errorCode);
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_SUCCESS(errorCode)
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                && (ures_getType(subSubBundle) == URES_ARRAY || ures_getType(subSubRootBundle) == URES_ARRAY))
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Here is one of the recursive parts */
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale);
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else {
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t minSize = ures_getSize(subRootBundle);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t idx;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool sameArray = TRUE;
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (minSize > ures_getSize(subBundle)) {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    minSize = ures_getSize(subBundle);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ((subBundleKey == NULL
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    || (subBundleKey != NULL &&  strcmp(subBundleKey, "LocaleScript") != 0 && !isCurrencyPreEuro(subBundleKey)))
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    && ures_getSize(subRootBundle) != ures_getSize(subBundle))
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Different size array with key \"%s\" in \"%s\" from root for locale \"%s\"\n"
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "\troot array size=%d, locale array size=%d\n",
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            subBundleKey,
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(currentBundle),
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            locale,
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getSize(subRootBundle),
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getSize(subBundle));
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /*
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(isCurrencyPreEuro(subBundleKey) && ures_getSize(subBundle)!=3){
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Different size array with key \"%s\" in \"%s\" for locale \"%s\" the expected size is 3 got size=%d\n",
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            subBundleKey,
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(currentBundle),
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            locale,
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getSize(subBundle));
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                */
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (idx = 0; idx < minSize; idx++) {
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    int32_t rootStrLen, localeStrLen;
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const UChar *rootStr = ures_getStringByIndex(subRootBundle,idx,&rootStrLen,&errorCode);
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const UChar *localeStr = ures_getStringByIndex(subBundle,idx,&localeStrLen,&errorCode);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (rootStr && localeStr && U_SUCCESS(errorCode)) {
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (u_strcmp(rootStr, localeStr) != 0) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            sameArray = FALSE;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else {
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if ( rootStrLen > 1 && rootStr[0] == 0x41 && rootStr[1] >= 0x30 && rootStr[1] <= 0x39 ) {
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           /* A2 or A4 in the root string indicates that the resource can optionally be an array instead of a */
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           /* string.  Attempt to read it as an array. */
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          errorCode = U_ZERO_ERROR;
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          arr = ures_getByIndex(subBundle,idx,NULL,&errorCode);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          if (U_FAILURE(errorCode)) {
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      subBundleKey,
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      ures_getKey(currentBundle),
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      idx,
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      locale);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              continue;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          }
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          if (ures_getType(arr) != URES_ARRAY || ures_getSize(arr) != (int32_t)rootStr[1] - 0x30) {
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              log_err("Got something other than a string or array of size %d for key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      rootStr[1] - 0x30,
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      subBundleKey,
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      ures_getKey(currentBundle),
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      idx,
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      locale);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              ures_close(arr);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              continue;
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          }
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          localeStr = ures_getStringByIndex(arr,0,&localeStrLen,&errorCode);
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          ures_close(arr);
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          if (U_FAILURE(errorCode)) {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              log_err("Got something other than a string or array for key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      subBundleKey,
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      ures_getKey(currentBundle),
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      idx,
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      locale);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              continue;
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          }
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        } else {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                subBundleKey,
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                ures_getKey(currentBundle),
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                idx,
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            continue;
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (localeStr[0] == (UChar)0x20) {
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("key \"%s\" at index %d in \"%s\" starts with a space in locale \"%s\"\n",
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                subBundleKey,
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                idx,
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                ures_getKey(currentBundle),
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else if ((localeStr[localeStrLen - 1] == (UChar)0x20) && (strcmp(subBundleKey,"separator") != 0)) {
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("key \"%s\" at index %d in \"%s\" ends with a space in locale \"%s\"\n",
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                subBundleKey,
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                idx,
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                ures_getKey(currentBundle),
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else if (subBundleKey != NULL
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        && strcmp(subBundleKey, "DateTimePatterns") == 0)
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    {
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t quoted = 0;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        const UChar *localeStrItr = localeStr;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        while (*localeStrItr) {
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if (*localeStrItr == (UChar)0x27 /* ' */) {
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                quoted++;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            else if ((quoted % 2) == 0) {
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* Search for unquoted characters */
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                if (4 <= idx && idx <= 7
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    && (*localeStrItr == (UChar)0x6B /* k */
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x48 /* H */
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x6D /* m */
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x73 /* s */
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x53 /* S */
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x61 /* a */
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x68 /* h */
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x7A /* z */))
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    log_err("key \"%s\" at index %d has time pattern chars in date for locale \"%s\"\n",
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            subBundleKey,
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            idx,
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            locale);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                }
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                else if (0 <= idx && idx <= 3
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    && (*localeStrItr == (UChar)0x47 /* G */
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x79 /* y */
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x4D /* M */
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x64 /* d */
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x45 /* E */
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x44 /* D */
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x46 /* F */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x77 /* w */
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    || *localeStrItr == (UChar)0x57 /* W */))
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                {
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    log_err("key \"%s\" at index %d has date pattern chars in time for locale \"%s\"\n",
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            subBundleKey,
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            idx,
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            locale);
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                }
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            localeStrItr++;
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else if (idx == 4 && subBundleKey != NULL
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        && strcmp(subBundleKey, "NumberElements") == 0
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        && u_charDigitValue(localeStr[0]) != 0)
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    {
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("key \"%s\" at index %d has a non-zero based number for locale \"%s\"\n",
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                subBundleKey,
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                idx,
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (void)sameArray;    /* Suppress set but not used warning. */
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*                if (sameArray && strcmp(rootName, "root") == 0) {
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Arrays are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            subBundleKey,
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(currentBundle),
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            locale);
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }*/
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(subSubBundle);
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(subSubRootBundle);
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getType(subBundle) == URES_STRING) {
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t len = 0;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UChar *string = ures_getString(subBundle, &len, &errorCode);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(errorCode) || string == NULL) {
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Can't open a string with key \"%s\" in \"%s\" for locale \"%s\"\n",
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (string[0] == (UChar)0x20) {
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("key \"%s\" in \"%s\" starts with a space in locale \"%s\"\n",
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* localeDisplayPattern/separator can end with a space */
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (string[len - 1] == (UChar)0x20 && (strcmp(subBundleKey,"separator"))) {
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("key \"%s\" in \"%s\" ends with a space in locale \"%s\"\n",
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if (strcmp(subBundleKey, "localPatternChars") == 0) {
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Note: We no longer import localPatternChars data starting
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 * ICU 3.8.  So it never comes into this else if block. (ticket#5597)
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 */
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Check well-formedness of localPatternChars.  First, the
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 * length must match the number of fields defined by
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 * DateFormat.  Second, each character in the string must
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 * be in the set [A-Za-z].  Finally, each character must be
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 * unique.
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 */
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t i,j;
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (len != UDAT_FIELD_COUNT) {
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("key \"%s\" has the wrong number of characters in locale \"%s\"\n",
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            subBundleKey,
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            locale);
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Check char validity. */
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (i=0; i<len; ++i) {
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (!((string[i] >= 65/*'A'*/ && string[i] <= 90/*'Z'*/) ||
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          (string[i] >= 97/*'a'*/ && string[i] <= 122/*'z'*/))) {
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("key \"%s\" has illegal character '%c' in locale \"%s\"\n",
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                subBundleKey,
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                (char) string[i],
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* Do O(n^2) check for duplicate chars. */
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    for (j=0; j<i; ++j) {
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (string[j] == string[i]) {
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("key \"%s\" has duplicate character '%c' in locale \"%s\"\n",
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    subBundleKey,
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    (char) string[i],
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    locale);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* No fallback was done. Check for duplicate data */
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The ures_* API does not do fallback of sub-resource bundles,
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               So we can't do this now. */
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else if (strcmp(locale, "root") != 0 && errorCode == U_ZERO_ERROR) {
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UChar *rootString = ures_getString(subRootBundle, &len, &errorCode);
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(errorCode) || rootString == NULL) {
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Can't open a string with key \"%s\" in \"%s\" in root\n",
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(subRootBundle),
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            ures_getKey(currentBundle));
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (u_strcmp(string, rootString) == 0) {
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (strcmp(locale, "de_CH") != 0 && strcmp(subBundleKey, "Countries") != 0 &&
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strcmp(subBundleKey, "Version") != 0) {
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("Found duplicate data with key \"%s\" in \"%s\" in locale \"%s\"\n",
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                ures_getKey(subRootBundle),
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                ures_getKey(currentBundle),
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                locale);
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else {
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        /* Ignore for now. */
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        /* Can be fixed if fallback through de locale was done. */
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_verbose("Skipping key %s in %s\n", subBundleKey, locale);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getType(subBundle) == URES_TABLE) {
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strcmp(subBundleKey, "availableFormats")!=0) {
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Here is one of the recursive parts */
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale);
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else {
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("Skipping key %s in %s\n", subBundleKey, locale);
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getType(subBundle) == URES_BINARY || ures_getType(subBundle) == URES_INT) {
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Can't do anything to check it */
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* We'll assume it's all correct */
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strcmp(subBundleKey, "MeasurementSystem") != 0) {
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("Skipping key \"%s\" in \"%s\" for locale \"%s\"\n",
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        subBundleKey,
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ures_getKey(currentBundle),
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale);
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Testing for MeasurementSystem is done in VerifyTranslation */
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Type %d for key \"%s\" in \"%s\" is unknown for locale \"%s\"\n",
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getType(subBundle),
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    subBundleKey,
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ures_getKey(currentBundle),
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    locale);
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_close(subRootBundle);
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_close(subBundle);
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestLCID(UResourceBundle *currentBundle,
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const char *localeName)
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t expectedLCID;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char lcidStringC[64] = {0};
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len;
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedLCID = uloc_getLCID(localeName);
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (expectedLCID == 0) {
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("INFO:    %-5s does not have any LCID mapping\n",
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            localeName);
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len = uprv_convertToPosix(expectedLCID, lcidStringC, sizeof(lcidStringC)/sizeof(lcidStringC[0]) - 1, &status);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR:   %.4x does not have a POSIX mapping due to %s\n",
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expectedLCID, u_errorName(status));
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    lcidStringC[len] = 0;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(localeName, lcidStringC) != 0) {
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char langName[1024];
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char langLCID[1024];
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uloc_getLanguage(localeName, langName, sizeof(langName), &status);
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uloc_getLanguage(lcidStringC, langLCID, sizeof(langLCID), &status);
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(langName, langLCID) == 0) {
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("WARNING: %-5s resolves to %s (0x%.4x)\n",
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                localeName, lcidStringC, expectedLCID);
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ERROR:   %-5s has 0x%.4x and the number resolves wrongfully to %s\n",
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                localeName, expectedLCID, lcidStringC);
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestLocaleStructure(void) {
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // This test checks the locale structure against a key file located
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // at source/test/testdata/structLocale.txt. When adding new data to
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // a loale file such as en.txt, the structLocale.txt file must be changed
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // too to include the the template of the new data. Otherwise this test
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // will fail!
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *root, *currentLocale;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t locCount = uloc_countAvailable();
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t locIndex;
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *currLoc, *resolvedLoc;
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* TODO: Compare against parent's data too. This code can't handle fallbacks that some tools do already. */
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    char locName[ULOC_FULLNAME_CAPACITY];
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *locNamePtr;
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (locIndex = 0; locIndex < locCount; locIndex++) {
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcpy(locName, uloc_getAvailable(locIndex));
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        locNamePtr = strrchr(locName, '_');
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (locNamePtr) {
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *locNamePtr = 0;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            strcpy(locName, "root");
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        root = ures_openDirect(NULL, locName, &errorCode);
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Can't open %s\n", locName);
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (locCount <= 1) {
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("At least root needs to be installed\n");
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    root = ures_openDirect(loadTestData(&errorCode), "structLocale", &errorCode);
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Can't open structLocale\n");
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (locIndex = 0; locIndex < locCount; locIndex++) {
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currLoc = uloc_getAvailable(locIndex);
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currentLocale = ures_open(NULL, currLoc, &errorCode);
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode != U_ZERO_ERROR) {
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(errorCode)) {
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* It's installed, but there is no data.
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   It's installed for the g18n white paper [grhoten] */
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: Locale %-5s not installed, and it should be, err %s\n",
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uloc_getAvailable(locIndex), u_errorName(errorCode));
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("%%%%%%% Unexpected error %d in %s %%%%%%%",
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(errorCode),
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uloc_getAvailable(locIndex));
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(currentLocale);
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_getStringByKey(currentLocale, "Version", NULL, &errorCode);
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode != U_ZERO_ERROR) {
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("No version information is available for locale %s, and it should be!\n",
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                currLoc);
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (ures_getStringByKey(currentLocale, "Version", NULL, &errorCode)[0] == (UChar)(0x78)) {
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("WARNING: The locale %s is experimental! It shouldn't be listed as an installed locale.\n",
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                currLoc);
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resolvedLoc = ures_getLocaleByType(currentLocale, ULOC_ACTUAL_LOCALE, &errorCode);
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(resolvedLoc, currLoc) != 0) {
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* All locales have at least a Version resource.
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               If it's absolutely empty, then the previous test will fail too.*/
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Locale resolves to different locale. Is %s an alias of %s?\n",
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                currLoc, resolvedLoc);
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TestKeyInRootRecursive(root, "root", currentLocale, currLoc);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testLCID(currentLocale, currLoc);
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_close(currentLocale);
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(root);
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcompareArrays(const char *keyName,
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UResourceBundle *fromArray, const char *fromLocale,
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UResourceBundle *toArray, const char *toLocale,
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start, int32_t end)
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fromSize = ures_getSize(fromArray);
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t toSize = ures_getSize(fromArray);
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx;
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fromSize > toSize) {
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fromSize = toSize;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Arrays are different size from \"%s\" to \"%s\"\n",
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fromLocale,
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                toLocale);
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (idx = start; idx <= end; idx++) {
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *fromBundleStr = ures_getStringByIndex(fromArray, idx, NULL, &errorCode);
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *toBundleStr = ures_getStringByIndex(toArray, idx, NULL, &errorCode);
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fromBundleStr && toBundleStr && u_strcmp(fromBundleStr, toBundleStr) != 0)
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Difference for %s at index %d from %s= \"%s\" to %s= \"%s\"\n",
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    keyName,
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    idx,
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fromLocale,
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    austrdup(fromBundleStr),
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    toLocale,
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    austrdup(toBundleStr));
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcompareConsistentCountryInfo(const char *fromLocale, const char *toLocale) {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *fromArray, *toArray;
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *fromLocaleBund = ures_open(NULL, fromLocale, &errorCode);
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *toLocaleBund = ures_open(NULL, toLocale, &errorCode);
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *toCalendar, *fromCalendar, *toGregorian, *fromGregorian;
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Can't open resource bundle %s or %s - %s\n", fromLocale, toLocale, u_errorName(errorCode));
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromCalendar = ures_getByKey(fromLocaleBund, "calendar", NULL, &errorCode);
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromGregorian = ures_getByKeyWithFallback(fromCalendar, "gregorian", NULL, &errorCode);
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toCalendar = ures_getByKey(toLocaleBund, "calendar", NULL, &errorCode);
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toGregorian = ures_getByKeyWithFallback(toCalendar, "gregorian", NULL, &errorCode);
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromArray = ures_getByKey(fromLocaleBund, "CurrencyElements", NULL, &errorCode);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toArray = ures_getByKey(toLocaleBund, "CurrencyElements", NULL, &errorCode);
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(fromLocale, "en_CA") != 0)
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The first one is probably localized. */
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareArrays("CurrencyElements", fromArray, fromLocale, toArray, toLocale, 1, 2);
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromArray);
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toArray);
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromArray = ures_getByKey(fromLocaleBund, "NumberPatterns", NULL, &errorCode);
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toArray = ures_getByKey(toLocaleBund, "NumberPatterns", NULL, &errorCode);
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(fromLocale, "en_CA") != 0)
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareArrays("NumberPatterns", fromArray, fromLocale, toArray, toLocale, 0, 3);
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromArray);
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toArray);
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Difficult to test properly */
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromArray = ures_getByKey(fromLocaleBund, "DateTimePatterns", NULL, &errorCode);
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toArray = ures_getByKey(toLocaleBund, "DateTimePatterns", NULL, &errorCode);
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareArrays("DateTimePatterns", fromArray, fromLocale, toArray, toLocale);
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromArray);
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toArray);*/
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fromArray = ures_getByKey(fromLocaleBund, "NumberElements", NULL, &errorCode);
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toArray = ures_getByKey(toLocaleBund, "NumberElements", NULL, &errorCode);
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(fromLocale, "en_CA") != 0)
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 0, 3);
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Index 4 is a script based 0 */
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 5, 10);
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromArray);
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toArray);
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromCalendar);
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toCalendar);
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromGregorian);
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toGregorian);
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(fromLocaleBund);
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(toLocaleBund);
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestConsistentCountryInfo(void) {
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    UResourceBundle *fromLocale, *toLocale;*/
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t locCount = uloc_countAvailable();
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fromLocIndex, toLocIndex;
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fromCountryLen, toCountryLen;
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char fromCountry[ULOC_FULLNAME_CAPACITY], toCountry[ULOC_FULLNAME_CAPACITY];
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fromVariantLen, toVariantLen;
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char fromVariant[ULOC_FULLNAME_CAPACITY], toVariant[ULOC_FULLNAME_CAPACITY];
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (fromLocIndex = 0; fromLocIndex < locCount; fromLocIndex++) {
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *fromLocale = uloc_getAvailable(fromLocIndex);
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fromCountryLen = uloc_getCountry(fromLocale, fromCountry, ULOC_FULLNAME_CAPACITY, &errorCode);
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fromCountryLen <= 0) {
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Ignore countryless locales */
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fromVariantLen = uloc_getVariant(fromLocale, fromVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fromVariantLen > 0) {
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Most variants are ignorable like PREEURO, or collation variants. */
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Start comparing only after the current index.
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           Previous loop should have already compared fromLocIndex.
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        */
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (toLocIndex = fromLocIndex + 1; toLocIndex < locCount; toLocIndex++) {
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char *toLocale = uloc_getAvailable(toLocIndex);
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            toCountryLen = uloc_getCountry(toLocale, toCountry, ULOC_FULLNAME_CAPACITY, &errorCode);
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode)) {
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Unknown failure fromLocale=%s toLocale=%s errorCode=%s\n",
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fromLocale, toLocale, u_errorName(errorCode));
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (toCountryLen <= 0) {
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Ignore countryless locales */
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            toVariantLen = uloc_getVariant(toLocale, toVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (toVariantLen > 0) {
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Most variants are ignorable like PREEURO, or collation variants. */
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* They're a variant for a reason. */
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strcmp(fromCountry, toCountry) == 0) {
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("comparing fromLocale=%s toLocale=%s\n",
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fromLocale, toLocale);
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                compareConsistentCountryInfo(fromLocale, toLocale);
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfindStringSetMismatch(const char *currLoc, const UChar *string, int32_t langSize,
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      USet * mergedExemplarSet,
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UBool ignoreNumbers, UChar* badCharPtr) {
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *exemplarSet;
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t strIdx;
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (mergedExemplarSet == NULL) {
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    exemplarSet = createFlattenSet(mergedExemplarSet, &errorCode);
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%s: error createFlattenSet returned %s\n", currLoc, u_errorName(errorCode));
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (strIdx = 0; strIdx < langSize; strIdx++) {
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!uset_contains(exemplarSet, string[strIdx])
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            && string[strIdx] != 0x0020 && string[strIdx] != 0x00A0 && string[strIdx] != 0x002e && string[strIdx] != 0x002c && string[strIdx] != 0x002d && string[strIdx] != 0x0027 && string[strIdx] != 0x005B && string[strIdx] != 0x005D && string[strIdx] != 0x2019 && string[strIdx] != 0x0f0b
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            && string[strIdx] != 0x200C && string[strIdx] != 0x200D) {
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!ignoreNumbers || (ignoreNumbers && (string[strIdx] < 0x30 || string[strIdx] > 0x39))) {
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_close(exemplarSet);
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (badCharPtr) {
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    *badCharPtr = string[strIdx];
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return strIdx;
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(exemplarSet);
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (badCharPtr) {
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *badCharPtr = 0;
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return -1;
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* include non-invariant chars */
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgmyUCharsToChars(const UChar* us, char* cs, int32_t len){
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i=0;
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(; i< len; i++){
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(us[i] < 0x7f){
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cs[i] = (char)us[i];
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return -1;
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return i;
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfindSetMatch( UScriptCode *scriptCodes, int32_t scriptsLen,
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              USet *exemplarSet,
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const char  *locale){
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *scripts[10]= {0};
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char pattern[256] = { '[', ':', 0x000 };
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t patternLen;
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uPattern[256] = {0};
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* create the sets with script codes */
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i<scriptsLen; i++){
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(pattern, uscript_getShortName(scriptCodes[i]));
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(pattern, ":]");
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        patternLen = (int32_t)strlen(pattern);
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_charsToUChars(pattern, uPattern, patternLen);
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scripts[i] = uset_openPattern(uPattern, patternLen, &status);
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)){
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Could not create set for pattern %s. Error: %s\n", pattern, u_errorName(status));
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pattern[2] = 0;
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(locale, "uk") == 0 || strcmp(locale, "uk_UA") == 0) {
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Special addition. Add the modifying apostrophe, which isn't in Cyrillic. */
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_add(scripts[0], 0x2bc);
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(status)){
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool existsInScript = FALSE;
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* iterate over the exemplarSet and ascertain if all
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * UChars in exemplarSet belong to the scripts returned
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * by getScript
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t count = uset_getItemCount(exemplarSet);
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for( i=0; i < count; i++){
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar32 start = 0;
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar32 end = 0;
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar *str = NULL;
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t strCapacity = 0;
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            strCapacity = uset_getItem(exemplarSet, i, &start, &end, str, strCapacity, &status);
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)){
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t j;
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(strCapacity == 0){
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* ok the item is a range */
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     for( j = 0; j < scriptsLen; j++){
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if(uset_containsRange(scripts[j], start, end) == TRUE){
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            existsInScript = TRUE;
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(existsInScript == FALSE){
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        for( j = 0; j < scriptsLen; j++){
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UChar toPattern[500]={'\0'};
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            char pat[500]={'\0'};
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t len = uset_toPattern(scripts[j], toPattern, 500, TRUE, &status);
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            len = myUCharsToChars(toPattern, pat, len);
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("uset_indexOf(\\u%04X)=%i uset_indexOf(\\u%04X)=%i\n", start, uset_indexOf(scripts[0], start), end, uset_indexOf(scripts[0], end));
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if(len!=-1){
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                log_err("Pattern: %s\n",pat);
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("ExemplarCharacters and LocaleScript containment test failed for locale %s. \n", locale);
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }else{
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    strCapacity++; /* increment for NUL termination */
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* allocate the str and call the api again */
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    str = (UChar*) malloc(U_SIZEOF_UCHAR * strCapacity);
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    strCapacity =  uset_getItem(exemplarSet, i, &start, &end, str, strCapacity, &status);
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* iterate over the scripts and figure out if the string contained is actually
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     * in the script set
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     */
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    for( j = 0; j < scriptsLen; j++){
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if(uset_containsString(scripts[j],str, strCapacity) == TRUE){
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            existsInScript = TRUE;
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(existsInScript == FALSE){
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("ExemplarCharacters and LocaleScript containment test failed for locale %s. \n", locale);
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* close the sets */
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i<scriptsLen; i++){
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(scripts[i]);
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void VerifyTranslation(void) {
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *root, *currentLocale;
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t locCount = uloc_countAvailable();
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t locIndex;
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *currLoc;
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UScriptCode scripts[USCRIPT_CODE_LIMIT];
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numScripts;
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx;
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t end;
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *resArray;
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (locCount <= 1) {
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("At least root needs to be installed\n");
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    root = ures_openDirect(NULL, "root", &errorCode);
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Can't open root\n");
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (locIndex = 0; locIndex < locCount; locIndex++) {
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        USet * mergedExemplarSet = NULL;
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currLoc = uloc_getAvailable(locIndex);
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currentLocale = ures_open(NULL, currLoc, &errorCode);
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode != U_ZERO_ERROR) {
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(errorCode)) {
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* It's installed, but there is no data.
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   It's installed for the g18n white paper [grhoten] */
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ERROR: Locale %-5s not installed, and it should be!\n",
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uloc_getAvailable(locIndex));
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("%%%%%%% Unexpected error %d in %s %%%%%%%",
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(errorCode),
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uloc_getAvailable(locIndex));
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(currentLocale);
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UErrorCode exemplarStatus = U_ZERO_ERROR;
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ULocaleData * uld = ulocdata_open(currLoc, &exemplarStatus);
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_SUCCESS(exemplarStatus)) {
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                USet * exemplarSet = ulocdata_getExemplarSet(uld, NULL, USET_ADD_CASE_MAPPINGS, ULOCDATA_ES_STANDARD, &exemplarStatus);
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_SUCCESS(exemplarStatus)) {
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    mergedExemplarSet = uset_cloneAsThawed(exemplarSet);
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    uset_close(exemplarSet);
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    exemplarSet = ulocdata_getExemplarSet(uld, NULL, USET_ADD_CASE_MAPPINGS, ULOCDATA_ES_AUXILIARY, &exemplarStatus);
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_SUCCESS(exemplarStatus)) {
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        uset_addAll(mergedExemplarSet, exemplarSet);
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        uset_close(exemplarSet);
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    exemplarStatus = U_ZERO_ERROR;
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    exemplarSet = ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_PUNCTUATION, &exemplarStatus);
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_SUCCESS(exemplarStatus)) {
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        uset_addAll(mergedExemplarSet, exemplarSet);
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        uset_close(exemplarSet);
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("error ulocdata_getExemplarSet (main) for locale %s returned %s\n", currLoc, u_errorName(errorCode));
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ulocdata_close(uld);
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error ulocdata_open for locale %s returned %s\n", currLoc, u_errorName(errorCode));
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (mergedExemplarSet == NULL /*|| (getTestOption(QUICK_OPTION) && uset_size() > 2048)*/) {
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("skipping test for %s\n", currLoc);
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //else if (uprv_strncmp(currLoc,"bem",3) == 0 || uprv_strncmp(currLoc,"mgo",3) == 0 || uprv_strncmp(currLoc,"nl",2) == 0) {
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //    log_verbose("skipping test for %s, some month and country names known to use aux exemplars\n", currLoc);
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //}
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar langBuffer[128];
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t langSize;
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t strIdx;
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar badChar;
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            langSize = uloc_getDisplayLanguage(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode);
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(errorCode)) {
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error uloc_getDisplayLanguage returned %s\n", u_errorName(errorCode));
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else {
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                strIdx = findStringSetMismatch(currLoc, langBuffer, langSize, mergedExemplarSet, FALSE, &badChar);
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (strIdx >= 0) {
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("getDisplayLanguage(%s) at index %d returned characters not in the exemplar characters: %04X.\n",
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        currLoc, strIdx, badChar);
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            langSize = uloc_getDisplayCountry(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode);
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(errorCode)) {
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error uloc_getDisplayCountry returned %s\n", u_errorName(errorCode));
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UResourceBundle* cal = ures_getByKey(currentLocale, "calendar", NULL, &errorCode);
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UResourceBundle* greg = ures_getByKeyWithFallback(cal, "gregorian", NULL, &errorCode);
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UResourceBundle* names = ures_getByKeyWithFallback(greg,  "dayNames", NULL, &errorCode);
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UResourceBundle* format = ures_getByKeyWithFallback(names,  "format", NULL, &errorCode);
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                resArray = ures_getByKeyWithFallback(format,  "wide", NULL, &errorCode);
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(errorCode)) {
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("error ures_getByKey returned %s\n", u_errorName(errorCode));
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (getTestOption(QUICK_OPTION)) {
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    end = 1;
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else {
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    end = ures_getSize(resArray);
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (idx = 0; idx < end; idx++) {
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(errorCode)) {
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode));
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        continue;
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (uprv_strstr(currLoc, "uz_Arab") != currLoc || !log_knownIssue("10405", "skipping exemplar check: %s", currLoc)) { /* TODO: FIX or REMOVE this test! */
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, mergedExemplarSet, TRUE, &badChar);
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (strIdx >= 0) {
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("getDayNames(%s, %d) at index %d returned characters not in the exemplar characters: %04X.\n",
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                currLoc, idx, strIdx, badChar);
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(resArray);
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(format);
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(names);
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                names = ures_getByKeyWithFallback(greg, "monthNames", NULL, &errorCode);
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                format = ures_getByKeyWithFallback(names,"format", NULL, &errorCode);
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                resArray = ures_getByKeyWithFallback(format, "wide", NULL, &errorCode);
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(errorCode)) {
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("error ures_getByKey returned %s\n", u_errorName(errorCode));
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (getTestOption(QUICK_OPTION)) {
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    end = 1;
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else {
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    end = ures_getSize(resArray);
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (idx = 0; idx < end; idx++) {
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(errorCode)) {
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode));
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        continue;
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (uprv_strstr(currLoc, "uz_Arab") != currLoc || !log_knownIssue("10405", "skipping exemplar check: %s", currLoc)) { /* TODO: FIX or REMOVE this test! */
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, mergedExemplarSet, TRUE, &badChar);
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (strIdx >= 0) {
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("getMonthNames(%s, %d) at index %d returned characters not in the exemplar characters: %04X.\n",
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                currLoc, idx, strIdx, badChar);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(resArray);
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(format);
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(names);
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(greg);
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_close(cal);
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode = U_ZERO_ERROR;
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numScripts = uscript_getCode(currLoc, scripts, sizeof(scripts)/sizeof(scripts[0]), &errorCode);
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (numScripts == 0) {
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("uscript_getCode(%s) doesn't work.\n", currLoc);
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }else if(scripts[0] == USCRIPT_COMMON){
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("uscript_getCode(%s) returned USCRIPT_COMMON.\n", currLoc);
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* test that the scripts are a superset of exemplar characters. */
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           {
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ULocaleData *uld = ulocdata_open(currLoc,&errorCode);
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                USet *exemplarSet =  ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &errorCode);
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* test if exemplar characters are part of script code */
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                findSetMatch(scripts, numScripts, exemplarSet, currLoc);
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_close(exemplarSet);
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ulocdata_close(uld);
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           /* test that the paperSize API works */
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           {
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t height=0, width=0;
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               ulocdata_getPaperSize(currLoc, &height, &width, &errorCode);
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               if(U_FAILURE(errorCode)){
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   log_err("ulocdata_getPaperSize failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode));
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               }
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               if(strstr(currLoc, "_US")!=NULL && height != 279 && width != 216 ){
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   log_err("ulocdata_getPaperSize did not return expected data for locale %s \n", currLoc);
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               }
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           }
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* test that the MeasurementSystem API works */
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           {
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               char fullLoc[ULOC_FULLNAME_CAPACITY];
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UMeasurementSystem measurementSystem;
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t height = 0, width = 0;
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               uloc_addLikelySubtags(currLoc, fullLoc, ULOC_FULLNAME_CAPACITY, &errorCode);
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               errorCode = U_ZERO_ERROR;
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               measurementSystem = ulocdata_getMeasurementSystem(currLoc, &errorCode);
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               if (U_FAILURE(errorCode)) {
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   log_err("ulocdata_getMeasurementSystem failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode));
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               } else {
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   if ( strstr(fullLoc, "_US")!=NULL || strstr(fullLoc, "_MM")!=NULL || strstr(fullLoc, "_LR")!=NULL ) {
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       if(measurementSystem != UMS_US){
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc);
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       }
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   } else if (measurementSystem != UMS_SI) {
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc);
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   }
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               }
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               errorCode = U_ZERO_ERROR;
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               ulocdata_getPaperSize(currLoc, &height, &width, &errorCode);
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               if (U_FAILURE(errorCode)) {
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   log_err("ulocdata_getPaperSize failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode));
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               } else {
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   if ( strstr(fullLoc, "_US")!=NULL || strstr(fullLoc, "_BZ")!=NULL || strstr(fullLoc, "_CA")!=NULL || strstr(fullLoc, "_CL")!=NULL ||
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strstr(fullLoc, "_CO")!=NULL || strstr(fullLoc, "_CR")!=NULL || strstr(fullLoc, "_GT")!=NULL || strstr(fullLoc, "_MX")!=NULL ||
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strstr(fullLoc, "_NI")!=NULL || strstr(fullLoc, "_PA")!=NULL || strstr(fullLoc, "_PH")!=NULL || strstr(fullLoc, "_PR")!=NULL ||
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        strstr(fullLoc, "_SV")!=NULL || strstr(fullLoc, "_VE")!=NULL ) {
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       if (height != 279 || width != 216) {
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("ulocdata_getPaperSize did not return expected data for locale %s \n", currLoc);
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       }
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   } else if (height != 297 || width != 210) {
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       log_err("ulocdata_getPaperSize did not return expected data for locale %s \n", currLoc);
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   }
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               }
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           }
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (mergedExemplarSet != NULL) {
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_close(mergedExemplarSet);
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_close(currentLocale);
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(root);
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* adjust this limit as appropriate */
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_SCRIPTS_PER_LOCALE 8
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestExemplarSet(void){
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, j, k, m, n;
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t equalCount = 0;
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration* avail;
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet* exemplarSets[2];
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet* unassignedSet;
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UScriptCode code[MAX_SCRIPTS_PER_LOCALE];
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet* codeSets[MAX_SCRIPTS_PER_LOCALE];
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t codeLen;
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char cbuf[32]; /* 9 should be enough */
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar ubuf[64]; /* adjust as needed */
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool existsInScript;
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t itemCount;
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t strLen;
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 start, end;
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    unassignedSet = NULL;
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    exemplarSets[0] = NULL;
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    exemplarSets[1] = NULL;
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<MAX_SCRIPTS_PER_LOCALE; ++i) {
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        codeSets[i] = NULL;
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    avail = ures_openAvailableLocales(NULL, &ec);
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccess("ures_openAvailableLocales", &ec)) goto END;
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    n = uenum_count(avail, &ec);
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccess("uenum_count", &ec)) goto END;
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(ubuf, "[:unassigned:]");
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    unassignedSet = uset_openPattern(ubuf, -1, &ec);
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccess("uset_openPattern", &ec)) goto END;
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<n; i++){
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* locale = uenum_next(avail, NULL, &ec);
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertSuccess("uenum_next", &ec)) goto END;
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%s\n", locale);
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (k=0; k<2; ++k) {
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uint32_t option = (k==0) ? 0 : USET_CASE_INSENSITIVE;
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ULocaleData *uld = ulocdata_open(locale,&ec);
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            USet* exemplarSet = ulocdata_getExemplarSet(uld,NULL, option, ULOCDATA_ES_STANDARD, &ec);
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uset_close(exemplarSets[k]);
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ulocdata_close(uld);
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            exemplarSets[k] = exemplarSet;
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!assertSuccess("ulocaledata_getExemplarSet", &ec)) goto END;
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (uset_containsSome(exemplarSet, unassignedSet)) {
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ExemplarSet contains unassigned characters for locale : %s\n", locale);
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            codeLen = uscript_getCode(locale, code, 8, &ec);
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!assertSuccess("uscript_getCode", &ec)) goto END;
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (j=0; j<MAX_SCRIPTS_PER_LOCALE; ++j) {
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uset_close(codeSets[j]);
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                codeSets[j] = NULL;
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (j=0; j<codeLen; ++j) {
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_strcpy(cbuf, "[:");
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(code[j]==-1){
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("USCRIPT_INVALID_CODE returned for locale: %s\n", locale);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_strcat(cbuf, uscript_getShortName(code[j]));
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_strcat(cbuf, ":]");
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_uastrcpy(ubuf, cbuf);
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                codeSets[j] = uset_openPattern(ubuf, -1, &ec);
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!assertSuccess("uset_openPattern", &ec)) goto END;
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            existsInScript = FALSE;
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            itemCount = uset_getItemCount(exemplarSet);
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (m=0; m<itemCount && !existsInScript; ++m) {
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                strLen = uset_getItem(exemplarSet, m, &start, &end, ubuf,
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      sizeof(ubuf)/sizeof(ubuf[0]), &ec);
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* failure here might mean str[] needs to be larger */
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!assertSuccess("uset_getItem", &ec)) goto END;
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (strLen == 0) {
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    for (j=0; j<codeLen; ++j) {
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (codeSets[j]!=NULL && uset_containsRange(codeSets[j], start, end)) {
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            existsInScript = TRUE;
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            break;
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    for (j=0; j<codeLen; ++j) {
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (codeSets[j]!=NULL && uset_containsString(codeSets[j], ubuf, strLen)) {
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            existsInScript = TRUE;
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            break;
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (existsInScript == FALSE){
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ExemplarSet containment failed for locale : %s\n", locale);
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertTrue("case-folded is a superset",
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   uset_containsAll(exemplarSets[1], exemplarSets[0]));
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (uset_equals(exemplarSets[1], exemplarSets[0])) {
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++equalCount;
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Note: The case-folded set should sometimes be a strict superset
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       and sometimes be equal. */
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertTrue("case-folded is sometimes a strict superset, and sometimes equal",
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               equalCount > 0 && equalCount < n);
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org END:
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uenum_close(avail);
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(exemplarSets[0]);
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(exemplarSets[1]);
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(unassignedSet);
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<MAX_SCRIPTS_PER_LOCALE; ++i) {
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uset_close(codeSets[i]);
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { kUBufMax = 32 };
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestLocaleDisplayPattern(void){
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status;
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar pattern[kUBufMax] = {0,};
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar separator[kUBufMax] = {0,};
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ULocaleData *uld;
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar enExpectPat[] = { 0x007B,0x0030,0x007D,0x0020,0x0028,0x007B,0x0031,0x007D,0x0029,0 }; /* "{0} ({1})" */
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar enExpectSep[] = { 0x002C,0x0020,0 }; /* ", " */
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar zhExpectPat[] = { 0x007B,0x0030,0x007D,0xFF08,0x007B,0x0031,0x007D,0xFF09,0 };
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar zhExpectSep[] = { 0x3001,0 };
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uld = ulocdata_open("en", &status);
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ulocdata_open en error %s", u_errorName(status));
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_getLocaleDisplayPattern(uld, pattern, kUBufMax, &status);
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)){
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ulocdata_getLocaleDisplayPattern en error %s", u_errorName(status));
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (u_strcmp(pattern, enExpectPat) != 0) {
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("ulocdata_getLocaleDisplayPattern en returns unexpected pattern");
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_getLocaleSeparator(uld, separator, kUBufMax, &status);
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)){
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ulocdata_getLocaleSeparator en error %s", u_errorName(status));
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (u_strcmp(separator, enExpectSep) != 0) {
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("ulocdata_getLocaleSeparator en returns unexpected string ");
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_close(uld);
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uld = ulocdata_open("zh", &status);
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ulocdata_open zh error %s", u_errorName(status));
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_getLocaleDisplayPattern(uld, pattern, kUBufMax, &status);
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)){
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ulocdata_getLocaleDisplayPattern zh error %s", u_errorName(status));
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (u_strcmp(pattern, zhExpectPat) != 0) {
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("ulocdata_getLocaleDisplayPattern zh returns unexpected pattern");
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_getLocaleSeparator(uld, separator, kUBufMax, &status);
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)){
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ulocdata_getLocaleSeparator zh error %s", u_errorName(status));
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (u_strcmp(separator, zhExpectSep) != 0) {
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("ulocdata_getLocaleSeparator zh returns unexpected string ");
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_close(uld);
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCoverage(void){
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ULocaleDataDelimiterType types[] = {
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     ULOCDATA_QUOTATION_START,     /* Quotation start */
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     ULOCDATA_QUOTATION_END,       /* Quotation end */
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     ULOCDATA_ALT_QUOTATION_START, /* Alternate quotation start */
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     ULOCDATA_ALT_QUOTATION_END,   /* Alternate quotation end */
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     ULOCDATA_DELIMITER_COUNT
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool sub;
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ULocaleData *uld = ulocdata_open(uloc_getDefault(), &status);
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ulocdata_open error");
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i < ULOCDATA_DELIMITER_COUNT; i++){
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar result[32] = {0,};
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulocdata_getDelimiter(uld, types[i], result, 32, &status);
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)){
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ulocdata_getgetDelimiter error with type %d", types[i]);
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sub = ulocdata_getNoSubstitute(uld);
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulocdata_setNoSubstitute(uld,sub);
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulocdata_close(uld);
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestIndexChars(void) {
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Very basic test of ULOCDATA_ES_INDEX.
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * No comprehensive test of data, just basic check that the code path is alive.
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ULocaleData  *uld;
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *exemplarChars;
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USet *indexChars;
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uld = ulocdata_open("en", &status);
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    exemplarChars = uset_openEmpty();
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    indexChars = uset_openEmpty();
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulocdata_getExemplarSet(uld, exemplarChars, 0, ULOCDATA_ES_STANDARD, &status);
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulocdata_getExemplarSet(uld, indexChars, 0, ULOCDATA_ES_INDEX, &status);
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("File %s, line %d, Failure opening exemplar chars: %s", __FILE__, __LINE__, u_errorName(status));
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto close_sets;
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* en data, standard exemplars are [a-z], lower case. */
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* en data, index characters are [A-Z], upper case. */
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((uset_contains(exemplarChars, (UChar32)0x41) || uset_contains(indexChars, (UChar32)0x61))) {
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("File %s, line %d, Exemplar characters incorrect.", __FILE__, __LINE__ );
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto close_sets;
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(uset_contains(exemplarChars, (UChar32)0x61) && uset_contains(indexChars, (UChar32)0x41) )) {
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("File %s, line %d, Exemplar characters incorrect.", __FILE__, __LINE__ );
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto close_sets;
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  close_sets:
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(exemplarChars);
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uset_close(indexChars);
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulocdata_close(uld);
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCurrencyList(void){
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t structLocaleCount, currencyCount;
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration *en = ucurr_openISOCurrencies(UCURR_ALL, &errorCode);
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *isoCode, *structISOCode;
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *subBundle;
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *currencies = ures_openDirect(loadTestData(&errorCode), "structLocale", &errorCode);
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Can't open structLocale\n");
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    currencies = ures_getByKey(currencies, "Currencies", currencies, &errorCode);
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    currencyCount = uenum_count(en, &errorCode);
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    structLocaleCount = ures_getSize(currencies);
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (currencyCount != structLocaleCount) {
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("structLocale(%d) and ISO4217(%d) currency list are out of sync.\n", structLocaleCount, currencyCount);
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_FAMILY == U_ASCII_FAMILY
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_resetIterator(currencies);
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while ((isoCode = uenum_next(en, NULL, &errorCode)) != NULL && ures_hasNext(currencies)) {
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            subBundle = ures_getNextResource(currencies, NULL, &errorCode);
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            structISOCode = ures_getKey(subBundle);
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ures_close(subBundle);
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strcmp(structISOCode, isoCode) != 0) {
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("First difference found at structLocale(%s) and ISO4217(%s).\n", structISOCode, isoCode);
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(currencies);
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uenum_close(en);
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAvailableIsoCodes(void){
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* eurCode = "EUR";
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* usdCode = "USD";
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* lastCode = "RHD";
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* zzzCode = "ZZZ";
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1950 = (UDate)-630720000000.0;/* year 1950 */
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1970 = (UDate)0.0;            /* year 1970 */
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1975 = (UDate)173448000000.0; /* year 1975 */
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1978 = (UDate)260172000000.0; /* year 1978 */
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1981 = (UDate)346896000000.0; /* year 1981 */
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1992 = (UDate)693792000000.0; /* year 1992 */
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* isoCode = (UChar*)malloc(sizeof(UChar) * (uprv_strlen(usdCode) + 1));
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* testing available codes with no time ranges */
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charsToUChars(eurCode, isoCode, uprv_strlen(usdCode) + 1);
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) is not found.\n", eurCode);
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charsToUChars(usdCode, isoCode, uprv_strlen(zzzCode) + 1);
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) is not found.\n", usdCode);
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charsToUChars(zzzCode, isoCode, uprv_strlen(zzzCode) + 1);
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == TRUE) {
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: ISO code (%s) is reported as available, but it doesn't exist.\n", zzzCode);
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_charsToUChars(lastCode, isoCode, uprv_strlen(zzzCode) + 1);
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, U_DATE_MAX, &errorCode) == FALSE) {
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) is not found.\n", lastCode);
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* RHD was used from 1970-02-17  to 1980-04-18*/
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* to = null */
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1970, U_DATE_MAX, &errorCode) == FALSE) {
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range >1970-01-01.\n", lastCode);
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1975, U_DATE_MAX, &errorCode) == FALSE) {
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range >1975.\n", lastCode);
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1981, U_DATE_MAX, &errorCode) == TRUE) {
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: ISO code (%s) was not available in time range >1981.\n", lastCode);
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* from = null */
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, date1970, &errorCode) == TRUE) {
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: ISO code (%s) was not available in time range <1970.\n", lastCode);
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, date1975, &errorCode) == FALSE) {
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range <1975.\n", lastCode);
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, U_DATE_MIN, date1981, &errorCode) == FALSE) {
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range <1981.\n", lastCode);
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* full ranges */
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1975, date1978, &errorCode) == FALSE) {
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range 1975-1978.\n", lastCode);
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1970, date1975, &errorCode) == FALSE) {
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range 1970-1975.\n", lastCode);
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1975, date1981, &errorCode) == FALSE) {
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range 1975-1981.\n", lastCode);
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1970,  date1981, &errorCode) == FALSE) {
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: ISO code (%s) was available in time range 1970-1981.\n", lastCode);
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1981,  date1992, &errorCode) == TRUE) {
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: ISO code (%s) was not available in time range 1981-1992.\n", lastCode);
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1950,  date1970, &errorCode) == TRUE) {
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: ISO code (%s) was not available in time range 1950-1970.\n", lastCode);
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* wrong range - from > to*/
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucurr_isAvailable(isoCode, date1975,  date1970, &errorCode) == TRUE) {
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: Wrong range 1975-1970 for ISO code (%s) was not reported.\n", lastCode);
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_data_err("FAIL: Error code not reported for wrong range 1975-1970 for ISO code (%s).\n", lastCode);
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(isoCode);
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TESTCASE(name) addTest(root, &name, "tsutil/cldrtest/" #name)
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCLDRTest(TestNode** root);
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCLDRTest(TestNode** root)
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestLocaleStructure);
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestCurrencyList);
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestConsistentCountryInfo);
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(VerifyTranslation);
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestExemplarSet);
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestLocaleDisplayPattern);
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestCoverage);
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestIndexChars);
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TESTCASE(TestAvailableIsoCodes);
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1522