1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/********************************************************************
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * COPYRIGHT:
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (c) 1997-2009, International Business Machines Corporation and
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * others. All Rights Reserved.
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ********************************************************************/
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "cintltst.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ures.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ucurr.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ustring.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/uset.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/udat.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/uscript.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ulocdata.h"
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "cstring.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "locmap.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "uresimp.h"
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*--------------------------------------------------------------------
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time bomb - allows temporary behavior that expires at a given
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              release
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ---------------------------------------------------------------------*/
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const UVersionInfo ICU_37 = {3,7,0,0};
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottreturns a new UnicodeSet that is a flattened form of the original
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnicodeSet.
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic USet*
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottcreateFlattenSet(USet *origSet, UErrorCode *status) {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet *newSet = NULL;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t origItemCount = 0;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t idx, graphmeSize;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar32 start, end;
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar graphme[64];
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(*status)) {
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("createFlattenSet called with %s\n", u_errorName(*status));
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return NULL;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    newSet = uset_open(1, 0);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    origItemCount = uset_getItemCount(origSet);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (idx = 0; idx < origItemCount; idx++) {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        graphmeSize = uset_getItem(origSet, idx,
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            &start, &end,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            graphme, (int32_t)(sizeof(graphme)/sizeof(graphme[0])),
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            status);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_FAILURE(*status)) {
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("ERROR: uset_getItem returned %s\n", u_errorName(*status));
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            *status = U_ZERO_ERROR;
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (graphmeSize) {
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            uset_addAllCodePoints(newSet, graphme, graphmeSize);
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            uset_addRange(newSet, start, end);
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return newSet;
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic UBool
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottisCurrencyPreEuro(const char* currencyKey){
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if( strcmp(currencyKey, "PTE") == 0 ||
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "ESP") == 0 ||
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "LUF") == 0 ||
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "GRD") == 0 ||
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "BEF") == 0 ||
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "ITL") == 0 ||
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcmp(currencyKey, "EEK") == 0){
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return TRUE;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return FALSE;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestKeyInRootRecursive(UResourceBundle *root, const char *rootName,
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       UResourceBundle *currentBundle, const char *locale) {
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *subRootBundle = NULL, *subBundle = NULL, *arr = NULL;
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_resetIterator(root);
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_resetIterator(currentBundle);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    while (ures_hasNext(currentBundle)) {
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const char *subBundleKey = NULL;
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const char *currentBundleKey = NULL;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        errorCode = U_ZERO_ERROR;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        currentBundleKey = ures_getKey(currentBundle);
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        subBundle = ures_getNextResource(currentBundle, NULL, &errorCode);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_FAILURE(errorCode)) {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Can't open a resource for lnocale %s. Error: %s\n", locale, u_errorName(errorCode));
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        subBundleKey = ures_getKey(subBundle);
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        subRootBundle = ures_getByKey(root, subBundleKey, NULL, &errorCode);
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_FAILURE(errorCode)) {
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Can't open a resource with key \"%s\" in \"%s\" from %s for locale \"%s\"\n",
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    subBundleKey,
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getKey(currentBundle),
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    rootName,
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    locale);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(subBundle);
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (ures_getType(subRootBundle) != ures_getType(subBundle)) {
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("key \"%s\" in \"%s\" has a different type from root for locale \"%s\"\n"
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    "\troot=%d, locale=%d\n",
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    subBundleKey,
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getKey(currentBundle),
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    locale,
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getType(subRootBundle),
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getType(subBundle));
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(subBundle);
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getType(subBundle) == URES_INT_VECTOR) {
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t minSize;
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t subBundleSize;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t idx;
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UBool sameArray = TRUE;
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            const int32_t *subRootBundleArr = ures_getIntVector(subRootBundle, &minSize, &errorCode);
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            const int32_t *subBundleArr = ures_getIntVector(subBundle, &subBundleSize, &errorCode);
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (minSize > subBundleSize) {
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                minSize = subBundleSize;
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Arrays are different size with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            for (idx = 0; idx < minSize && sameArray; idx++) {
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (subRootBundleArr[idx] != subBundleArr[idx]) {
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    sameArray = FALSE;
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (strcmp(subBundleKey, "DateTimeElements") == 0
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    && (subBundleArr[idx] < 1 || 7 < subBundleArr[idx]))
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                {
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("Value out of range with key \"%s\" at index %d in \"%s\" for locale \"%s\"\n",
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            subBundleKey,
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            idx,
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(currentBundle),
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            locale);
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* Special exception es_US and DateTimeElements */
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (sameArray
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                && !(strcmp(locale, "es_US") == 0 && strcmp(subBundleKey, "DateTimeElements") == 0))
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            {
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Integer vectors are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getType(subBundle) == URES_ARRAY) {
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UResourceBundle *subSubBundle = ures_getByIndex(subBundle, 0, NULL, &errorCode);
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UResourceBundle *subSubRootBundle = ures_getByIndex(subRootBundle, 0, NULL, &errorCode);
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (U_SUCCESS(errorCode)
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                && (ures_getType(subSubBundle) == URES_ARRAY || ures_getType(subSubRootBundle) == URES_ARRAY))
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            {
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Here is one of the recursive parts */
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale);
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            else {
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                int32_t minSize = ures_getSize(subRootBundle);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                int32_t idx;
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                UBool sameArray = TRUE;
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (minSize > ures_getSize(subBundle)) {
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    minSize = ures_getSize(subBundle);
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if ((subBundleKey == NULL
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    || (subBundleKey != NULL &&  strcmp(subBundleKey, "LocaleScript") != 0 && !isCurrencyPreEuro(subBundleKey)))
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    && ures_getSize(subRootBundle) != ures_getSize(subBundle))
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                {
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("Different size array with key \"%s\" in \"%s\" from root for locale \"%s\"\n"
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            "\troot array size=%d, locale array size=%d\n",
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            subBundleKey,
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(currentBundle),
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            locale,
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getSize(subRootBundle),
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getSize(subBundle));
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /*
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if(isCurrencyPreEuro(subBundleKey) && ures_getSize(subBundle)!=3){
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("Different size array with key \"%s\" in \"%s\" for locale \"%s\" the expected size is 3 got size=%d\n",
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            subBundleKey,
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(currentBundle),
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            locale,
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getSize(subBundle));
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                */
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                for (idx = 0; idx < minSize; idx++) {
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    int32_t rootStrLen, localeStrLen;
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    const UChar *rootStr = ures_getStringByIndex(subRootBundle,idx,&rootStrLen,&errorCode);
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    const UChar *localeStr = ures_getStringByIndex(subBundle,idx,&localeStrLen,&errorCode);
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (rootStr && localeStr && U_SUCCESS(errorCode)) {
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if (u_strcmp(rootStr, localeStr) != 0) {
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            sameArray = FALSE;
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    else {
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if ( rootStrLen > 1 && rootStr[0] == 0x41 && rootStr[1] >= 0x30 && rootStr[1] <= 0x39 ) {
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           /* A2 or A4 in the root string indicates that the resource can optionally be an array instead of a */
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           /* string.  Attempt to read it as an array. */
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          errorCode = U_ZERO_ERROR;
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          arr = ures_getByIndex(subBundle,idx,NULL,&errorCode);
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          if (U_FAILURE(errorCode)) {
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      subBundleKey,
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      ures_getKey(currentBundle),
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      idx,
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      locale);
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              continue;
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          }
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          if (ures_getType(arr) != URES_ARRAY || ures_getSize(arr) != (int32_t)rootStr[1] - 0x30) {
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              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",
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      rootStr[1] - 0x30,
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      subBundleKey,
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      ures_getKey(currentBundle),
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      idx,
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      locale);
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              ures_close(arr);
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              continue;
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          }
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          localeStr = ures_getStringByIndex(arr,0,&localeStrLen,&errorCode);
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          ures_close(arr);
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          if (U_FAILURE(errorCode)) {
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              log_err("Got something other than a string or array for key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      subBundleKey,
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      ures_getKey(currentBundle),
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      idx,
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      locale);
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              continue;
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          }
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        } else {
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n",
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                subBundleKey,
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                ures_getKey(currentBundle),
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                idx,
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            continue;
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (localeStr[0] == (UChar)0x20) {
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("key \"%s\" at index %d in \"%s\" starts with a space in locale \"%s\"\n",
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                subBundleKey,
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                idx,
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                ures_getKey(currentBundle),
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    else if ((localeStr[localeStrLen - 1] == (UChar)0x20) && (strcmp(subBundleKey,"separator") != 0)) {
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("key \"%s\" at index %d in \"%s\" ends with a space in locale \"%s\"\n",
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                subBundleKey,
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                idx,
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                ures_getKey(currentBundle),
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    else if (subBundleKey != NULL
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        && strcmp(subBundleKey, "DateTimePatterns") == 0)
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    {
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        int32_t quoted = 0;
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        const UChar *localeStrItr = localeStr;
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        while (*localeStrItr) {
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            if (*localeStrItr == (UChar)0x27 /* ' */) {
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                quoted++;
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            }
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            else if ((quoted % 2) == 0) {
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                /* Search for unquoted characters */
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                if (4 <= idx && idx <= 7
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    && (*localeStrItr == (UChar)0x6B /* k */
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x48 /* H */
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x6D /* m */
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x73 /* s */
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x53 /* S */
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x61 /* a */
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x68 /* h */
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x7A /* z */))
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                {
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    log_err("key \"%s\" at index %d has time pattern chars in date for locale \"%s\"\n",
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            subBundleKey,
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            idx,
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            locale);
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                }
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                else if (0 <= idx && idx <= 3
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    && (*localeStrItr == (UChar)0x47 /* G */
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x79 /* y */
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x4D /* M */
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x64 /* d */
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x45 /* E */
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x44 /* D */
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x46 /* F */
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x77 /* w */
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    || *localeStrItr == (UChar)0x57 /* W */))
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                {
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    log_err("key \"%s\" at index %d has date pattern chars in time for locale \"%s\"\n",
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            subBundleKey,
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            idx,
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            locale);
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                }
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            }
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            localeStrItr++;
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    else if (idx == 4 && subBundleKey != NULL
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        && strcmp(subBundleKey, "NumberElements") == 0
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        && u_charDigitValue(localeStr[0]) != 0)
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    {
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("key \"%s\" at index %d has a non-zero based number for locale \"%s\"\n",
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                subBundleKey,
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                idx,
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*                if (sameArray && strcmp(rootName, "root") == 0) {
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("Arrays are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n",
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            subBundleKey,
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(currentBundle),
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            locale);
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }*/
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(subSubBundle);
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(subSubRootBundle);
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getType(subBundle) == URES_STRING) {
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t len = 0;
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            const UChar *string = ures_getString(subBundle, &len, &errorCode);
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (U_FAILURE(errorCode) || string == NULL) {
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Can't open a string with key \"%s\" in \"%s\" for locale \"%s\"\n",
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            } else if (string[0] == (UChar)0x20) {
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("key \"%s\" in \"%s\" starts with a space in locale \"%s\"\n",
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* localeDisplayPattern/separator can end with a space */
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            } else if (string[len - 1] == (UChar)0x20 && (strcmp(subBundleKey,"separator"))) {
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("key \"%s\" in \"%s\" ends with a space in locale \"%s\"\n",
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            } else if (strcmp(subBundleKey, "localPatternChars") == 0) {
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Note: We no longer import localPatternChars data starting
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 * ICU 3.8.  So it never comes into this else if block. (ticket#5597)
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 */
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Check well-formedness of localPatternChars.  First, the
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 * length must match the number of fields defined by
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 * DateFormat.  Second, each character in the string must
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 * be in the set [A-Za-z].  Finally, each character must be
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 * unique.
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 */
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                int32_t i,j;
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !UCONFIG_NO_FORMATTING
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (len != UDAT_FIELD_COUNT) {
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("key \"%s\" has the wrong number of characters in locale \"%s\"\n",
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            subBundleKey,
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            locale);
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Check char validity. */
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                for (i=0; i<len; ++i) {
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (!((string[i] >= 65/*'A'*/ && string[i] <= 90/*'Z'*/) ||
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          (string[i] >= 97/*'a'*/ && string[i] <= 122/*'z'*/))) {
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("key \"%s\" has illegal character '%c' in locale \"%s\"\n",
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                subBundleKey,
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                (char) string[i],
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    /* Do O(n^2) check for duplicate chars. */
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    for (j=0; j<i; ++j) {
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if (string[j] == string[i]) {
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            log_err("key \"%s\" has duplicate character '%c' in locale \"%s\"\n",
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    subBundleKey,
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    (char) string[i],
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                    locale);
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* No fallback was done. Check for duplicate data */
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* The ures_* API does not do fallback of sub-resource bundles,
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               So we can't do this now. */
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if 0
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            else if (strcmp(locale, "root") != 0 && errorCode == U_ZERO_ERROR) {
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                const UChar *rootString = ures_getString(subRootBundle, &len, &errorCode);
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (U_FAILURE(errorCode) || rootString == NULL) {
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("Can't open a string with key \"%s\" in \"%s\" in root\n",
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(subRootBundle),
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            ures_getKey(currentBundle));
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    continue;
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                } else if (u_strcmp(string, rootString) == 0) {
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (strcmp(locale, "de_CH") != 0 && strcmp(subBundleKey, "Countries") != 0 &&
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        strcmp(subBundleKey, "Version") != 0) {
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("Found duplicate data with key \"%s\" in \"%s\" in locale \"%s\"\n",
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                ures_getKey(subRootBundle),
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                ures_getKey(currentBundle),
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                locale);
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    else {
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        /* Ignore for now. */
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        /* Can be fixed if fallback through de locale was done. */
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_verbose("Skipping key %s in %s\n", subBundleKey, locale);
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getType(subBundle) == URES_TABLE) {
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (strcmp(subBundleKey, "availableFormats")!=0) {
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Here is one of the recursive parts */
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale);
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            else {
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_verbose("Skipping key %s in %s\n", subBundleKey, locale);
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getType(subBundle) == URES_BINARY || ures_getType(subBundle) == URES_INT) {
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* Can't do anything to check it */
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* We'll assume it's all correct */
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (strcmp(subBundleKey, "MeasurementSystem") != 0) {
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_verbose("Skipping key \"%s\" in \"%s\" for locale \"%s\"\n",
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        subBundleKey,
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ures_getKey(currentBundle),
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        locale);
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* Testing for MeasurementSystem is done in VerifyTranslation */
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else {
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Type %d for key \"%s\" in \"%s\" is unknown for locale \"%s\"\n",
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getType(subBundle),
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    subBundleKey,
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    ures_getKey(currentBundle),
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    locale);
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_close(subRootBundle);
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_close(subBundle);
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScotttestLCID(UResourceBundle *currentBundle,
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         const char *localeName)
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uint32_t expectedLCID;
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char lcidStringC[64] = {0};
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    expectedLCID = uloc_getLCID(localeName);
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (expectedLCID == 0) {
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_verbose("INFO:    %-5s does not have any LCID mapping\n",
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            localeName);
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    status = U_ZERO_ERROR;
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uprv_strcpy(lcidStringC, uprv_convertToPosix(expectedLCID, &status));
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(status)) {
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("ERROR:   %.4x does not have a POSIX mapping due to %s\n",
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            expectedLCID, u_errorName(status));
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(strcmp(localeName, lcidStringC) != 0) {
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        char langName[1024];
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        char langLCID[1024];
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        uloc_getLanguage(localeName, langName, sizeof(langName), &status);
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        uloc_getLanguage(lcidStringC, langLCID, sizeof(langLCID), &status);
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (strcmp(langName, langLCID) == 0) {
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_verbose("WARNING: %-5s resolves to %s (0x%.4x)\n",
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                localeName, lcidStringC, expectedLCID);
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else {
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("ERROR:   %-5s has 0x%.4x and the number resolves wrongfully to %s\n",
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                localeName, expectedLCID, lcidStringC);
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestLocaleStructure(void) {
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *root, *currentLocale;
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t locCount = uloc_countAvailable();
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t locIndex;
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *currLoc, *resolvedLoc;
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* TODO: Compare against parent's data too. This code can't handle fallbacks that some tools do already. */
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*    char locName[ULOC_FULLNAME_CAPACITY];
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char *locNamePtr;
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (locIndex = 0; locIndex < locCount; locIndex++) {
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        errorCode=U_ZERO_ERROR;
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcpy(locName, uloc_getAvailable(locIndex));
504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        locNamePtr = strrchr(locName, '_');
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (locNamePtr) {
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            *locNamePtr = 0;
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else {
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            strcpy(locName, "root");
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        root = ures_openDirect(NULL, locName, &errorCode);
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(U_FAILURE(errorCode)) {
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Can't open %s\n", locName);
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (locCount <= 1) {
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_data_err("At least root needs to be installed\n");
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    root = ures_openDirect(loadTestData(&errorCode), "structLocale", &errorCode);
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)) {
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_data_err("Can't open structLocale\n");
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (locIndex = 0; locIndex < locCount; locIndex++) {
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        errorCode=U_ZERO_ERROR;
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        currLoc = uloc_getAvailable(locIndex);
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        currentLocale = ures_open(NULL, currLoc, &errorCode);
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(errorCode != U_ZERO_ERROR) {
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if(U_SUCCESS(errorCode)) {
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* It's installed, but there is no data.
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   It's installed for the g18n white paper [grhoten] */
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("ERROR: Locale %-5s not installed, and it should be, err %s\n",
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    uloc_getAvailable(locIndex), u_errorName(errorCode));
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            } else {
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("%%%%%%% Unexpected error %d in %s %%%%%%%",
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    u_errorName(errorCode),
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    uloc_getAvailable(locIndex));
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(currentLocale);
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_getStringByKey(currentLocale, "Version", NULL, &errorCode);
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(errorCode != U_ZERO_ERROR) {
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("No version information is available for locale %s, and it should be!\n",
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                currLoc);
549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (ures_getStringByKey(currentLocale, "Version", NULL, &errorCode)[0] == (UChar)(0x78)) {
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_verbose("WARNING: The locale %s is experimental! It shouldn't be listed as an installed locale.\n",
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                currLoc);
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        resolvedLoc = ures_getLocaleByType(currentLocale, ULOC_ACTUAL_LOCALE, &errorCode);
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (strcmp(resolvedLoc, currLoc) != 0) {
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* All locales have at least a Version resource.
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               If it's absolutely empty, then the previous test will fail too.*/
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Locale resolves to different locale. Is %s an alias of %s?\n",
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                currLoc, resolvedLoc);
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        TestKeyInRootRecursive(root, "root", currentLocale, currLoc);
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        testLCID(currentLocale, currLoc);
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_close(currentLocale);
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(root);
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottcompareArrays(const char *keyName,
573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              UResourceBundle *fromArray, const char *fromLocale,
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              UResourceBundle *toArray, const char *toLocale,
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              int32_t start, int32_t end)
576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t fromSize = ures_getSize(fromArray);
578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t toSize = ures_getSize(fromArray);
579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t idx;
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fromSize > toSize) {
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fromSize = toSize;
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("Arrays are different size from \"%s\" to \"%s\"\n",
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                fromLocale,
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                toLocale);
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (idx = start; idx <= end; idx++) {
590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const UChar *fromBundleStr = ures_getStringByIndex(fromArray, idx, NULL, &errorCode);
591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const UChar *toBundleStr = ures_getStringByIndex(toArray, idx, NULL, &errorCode);
592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (fromBundleStr && toBundleStr && u_strcmp(fromBundleStr, toBundleStr) != 0)
593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        {
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Difference for %s at index %d from %s= \"%s\" to %s= \"%s\"\n",
595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    keyName,
596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    idx,
597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    fromLocale,
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    austrdup(fromBundleStr),
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    toLocale,
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    austrdup(toBundleStr));
601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottcompareConsistentCountryInfo(const char *fromLocale, const char *toLocale) {
607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *fromDateTimeElements, *toDateTimeElements, *fromWeekendData = NULL, *toWeekendData = NULL;
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *fromArray, *toArray;
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *fromLocaleBund = ures_open(NULL, fromLocale, &errorCode);
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *toLocaleBund = ures_open(NULL, toLocale, &errorCode);
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *toCalendar, *fromCalendar, *toGregorian, *fromGregorian;
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)) {
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("Can't open resource bundle %s or %s - %s\n", fromLocale, toLocale, u_errorName(errorCode));
616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromCalendar = ures_getByKey(fromLocaleBund, "calendar", NULL, &errorCode);
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromGregorian = ures_getByKeyWithFallback(fromCalendar, "gregorian", NULL, &errorCode);
620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromDateTimeElements = ures_getByKeyWithFallback(fromGregorian, "DateTimeElements", NULL, &errorCode);
621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toCalendar = ures_getByKey(toLocaleBund, "calendar", NULL, &errorCode);
623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toGregorian = ures_getByKeyWithFallback(toCalendar, "gregorian", NULL, &errorCode);
624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toDateTimeElements = ures_getByKeyWithFallback(toGregorian, "DateTimeElements", NULL, &errorCode);
625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)){
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("Did not get DateTimeElements from the bundle %s or %s\n", fromLocale, toLocale);
628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        goto cleanup;
629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromWeekendData = ures_getByKeyWithFallback(fromGregorian, "weekend", NULL, &errorCode);
632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)){
633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("Did not get weekend data from the bundle %s to compare against %s\n", fromLocale, toLocale);
634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        goto cleanup;
635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toWeekendData = ures_getByKeyWithFallback(toGregorian, "weekend", NULL, &errorCode);
637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)){
638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("Did not get weekend data from the bundle %s to compare against %s\n", toLocale, fromLocale);
639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        goto cleanup;
640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (strcmp(fromLocale, "ar_IN") != 0)
643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t fromSize;
645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t toSize;
646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t idx;
647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const int32_t *fromBundleArr = ures_getIntVector(fromDateTimeElements, &fromSize, &errorCode);
648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const int32_t *toBundleArr = ures_getIntVector(toDateTimeElements, &toSize, &errorCode);
649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (fromSize > toSize) {
651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            fromSize = toSize;
652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Arrays are different size with key \"DateTimeElements\" from \"%s\" to \"%s\"\n",
653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    fromLocale,
654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    toLocale);
655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for (idx = 0; idx < fromSize; idx++) {
658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (fromBundleArr[idx] != toBundleArr[idx]) {
659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Difference with key \"DateTimeElements\" at index %d from \"%s\" to \"%s\"\n",
660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        idx,
661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        fromLocale,
662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        toLocale);
663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* test for weekend data */
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t fromSize;
670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t toSize;
671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t idx;
672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const int32_t *fromBundleArr = ures_getIntVector(fromWeekendData, &fromSize, &errorCode);
673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const int32_t *toBundleArr = ures_getIntVector(toWeekendData, &toSize, &errorCode);
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (fromSize > toSize) {
676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            fromSize = toSize;
677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Arrays are different size with key \"weekend\" data from \"%s\" to \"%s\"\n",
678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    fromLocale,
679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    toLocale);
680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for (idx = 0; idx < fromSize; idx++) {
683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (fromBundleArr[idx] != toBundleArr[idx]) {
684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Difference with key \"weekend\" data at index %d from \"%s\" to \"%s\"\n",
685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        idx,
686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        fromLocale,
687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        toLocale);
688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromArray = ures_getByKey(fromLocaleBund, "CurrencyElements", NULL, &errorCode);
693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toArray = ures_getByKey(toLocaleBund, "CurrencyElements", NULL, &errorCode);
694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (strcmp(fromLocale, "en_CA") != 0)
695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        /* The first one is probably localized. */
697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        compareArrays("CurrencyElements", fromArray, fromLocale, toArray, toLocale, 1, 2);
698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromArray);
700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toArray);
701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromArray = ures_getByKey(fromLocaleBund, "NumberPatterns", NULL, &errorCode);
703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toArray = ures_getByKey(toLocaleBund, "NumberPatterns", NULL, &errorCode);
704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (strcmp(fromLocale, "en_CA") != 0)
705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        compareArrays("NumberPatterns", fromArray, fromLocale, toArray, toLocale, 0, 3);
707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromArray);
709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toArray);
710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* Difficult to test properly */
712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromArray = ures_getByKey(fromLocaleBund, "DateTimePatterns", NULL, &errorCode);
714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toArray = ures_getByKey(toLocaleBund, "DateTimePatterns", NULL, &errorCode);
715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        compareArrays("DateTimePatterns", fromArray, fromLocale, toArray, toLocale);
717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromArray);
719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toArray);*/
720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fromArray = ures_getByKey(fromLocaleBund, "NumberElements", NULL, &errorCode);
722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    toArray = ures_getByKey(toLocaleBund, "NumberElements", NULL, &errorCode);
723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (strcmp(fromLocale, "en_CA") != 0)
724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 0, 3);
726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        /* Index 4 is a script based 0 */
727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 5, 10);
728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromArray);
730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toArray);
731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottcleanup:
733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromDateTimeElements);
734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toDateTimeElements);
735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromWeekendData);
736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toWeekendData);
737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromCalendar);
739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toCalendar);
740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromGregorian);
741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toGregorian);
742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(fromLocaleBund);
744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(toLocaleBund);
745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestConsistentCountryInfo(void) {
749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*    UResourceBundle *fromLocale, *toLocale;*/
750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t locCount = uloc_countAvailable();
751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t fromLocIndex, toLocIndex;
752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t fromCountryLen, toCountryLen;
754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char fromCountry[ULOC_FULLNAME_CAPACITY], toCountry[ULOC_FULLNAME_CAPACITY];
755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t fromVariantLen, toVariantLen;
757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char fromVariant[ULOC_FULLNAME_CAPACITY], toVariant[ULOC_FULLNAME_CAPACITY];
758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (fromLocIndex = 0; fromLocIndex < locCount; fromLocIndex++) {
762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const char *fromLocale = uloc_getAvailable(fromLocIndex);
763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        errorCode=U_ZERO_ERROR;
765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fromCountryLen = uloc_getCountry(fromLocale, fromCountry, ULOC_FULLNAME_CAPACITY, &errorCode);
766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (fromCountryLen <= 0) {
767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* Ignore countryless locales */
768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fromVariantLen = uloc_getVariant(fromLocale, fromVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (fromVariantLen > 0) {
772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* Most variants are ignorable like PREEURO, or collation variants. */
773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        /* Start comparing only after the current index.
776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           Previous loop should have already compared fromLocIndex.
777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        */
778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for (toLocIndex = fromLocIndex + 1; toLocIndex < locCount; toLocIndex++) {
779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            const char *toLocale = uloc_getAvailable(toLocIndex);
780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            toCountryLen = uloc_getCountry(toLocale, toCountry, ULOC_FULLNAME_CAPACITY, &errorCode);
782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if(U_FAILURE(errorCode)) {
783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("Unknown failure fromLocale=%s toLocale=%s errorCode=%s\n",
784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    fromLocale, toLocale, u_errorName(errorCode));
785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                continue;
786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (toCountryLen <= 0) {
789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Ignore countryless locales */
790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                continue;
791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            toVariantLen = uloc_getVariant(toLocale, toVariant, ULOC_FULLNAME_CAPACITY, &errorCode);
793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (toVariantLen > 0) {
794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* Most variants are ignorable like PREEURO, or collation variants. */
795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* They're a variant for a reason. */
796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                continue;
797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (strcmp(fromCountry, toCountry) == 0) {
799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_verbose("comparing fromLocale=%s toLocale=%s\n",
800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    fromLocale, toLocale);
801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                compareConsistentCountryInfo(fromLocale, toLocale);
802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int32_t
808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottfindStringSetMismatch(const char *currLoc, const UChar *string, int32_t langSize,
809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                      const UChar *exemplarCharacters, int32_t exemplarLen,
810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                      UBool ignoreNumbers) {
811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet *origSet = uset_openPatternOptions(exemplarCharacters, exemplarLen, USET_CASE_INSENSITIVE, &errorCode);
813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet *exemplarSet = createFlattenSet(origSet, &errorCode);
814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t strIdx;
815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uset_close(origSet);
816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(errorCode)) {
817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("%s: error uset_openPattern returned %s\n", currLoc, u_errorName(errorCode));
818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return -1;
819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (strIdx = 0; strIdx < langSize; strIdx++) {
822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (!uset_contains(exemplarSet, string[strIdx])
823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            && string[strIdx] != 0x0020 && string[strIdx] != 0x00A0 && string[strIdx] != 0x002e && string[strIdx] != 0x002c && string[strIdx] != 0x002d && string[strIdx] != 0x0027
824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            && string[strIdx] != 0x200C && string[strIdx] != 0x200D) {
825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (!ignoreNumbers || (ignoreNumbers && (string[strIdx] < 0x30 || string[strIdx] > 0x39))) {
826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uset_close(exemplarSet);
827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                return strIdx;
828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uset_close(exemplarSet);
832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return -1;
833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* include non-invariant chars */
835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int32_t
836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottmyUCharsToChars(const UChar* us, char* cs, int32_t len){
837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t i=0;
838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for(; i< len; i++){
839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(us[i] < 0x7f){
840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            cs[i] = (char)us[i];
841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }else{
842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return -1;
843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return i;
846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void
848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottfindSetMatch( UScriptCode *scriptCodes, int32_t scriptsLen,
849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              USet *exemplarSet,
850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              const char  *locale){
851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet *scripts[10]= {0};
852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char pattern[256] = { '[', ':', 0x000 };
853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t patternLen;
854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar uPattern[256] = {0};
855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t i;
857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* create the sets with script codes */
859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for(i = 0; i<scriptsLen; i++){
860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcat(pattern, uscript_getShortName(scriptCodes[i]));
861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        strcat(pattern, ":]");
862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        patternLen = (int32_t)strlen(pattern);
863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        u_charsToUChars(pattern, uPattern, patternLen);
864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        scripts[i] = uset_openPattern(uPattern, patternLen, &status);
865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(U_FAILURE(status)){
866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("Could not create set for pattern %s. Error: %s\n", pattern, u_errorName(status));
867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return;
868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        pattern[2] = 0;
870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (strcmp(locale, "uk") == 0 || strcmp(locale, "uk_UA") == 0) {
872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        /* Special addition. Add the modifying apostrophe, which isn't in Cyrillic. */
873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        uset_add(scripts[0], 0x2bc);
874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_SUCCESS(status)){
876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        UBool existsInScript = FALSE;
877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        /* iterate over the exemplarSet and ascertain if all
878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * UChars in exemplarSet belong to the scripts returned
879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * by getScript
880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         */
881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t count = uset_getItemCount(exemplarSet);
882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for( i=0; i < count; i++){
884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UChar32 start = 0;
885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UChar32 end = 0;
886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UChar *str = NULL;
887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t strCapacity = 0;
888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            strCapacity = uset_getItem(exemplarSet, i, &start, &end, str, strCapacity, &status);
890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if(U_SUCCESS(status)){
891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                int32_t j;
892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if(strCapacity == 0){
893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    /* ok the item is a range */
894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     for( j = 0; j < scriptsLen; j++){
895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if(uset_containsRange(scripts[j], start, end) == TRUE){
896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            existsInScript = TRUE;
897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if(existsInScript == FALSE){
900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        for( j = 0; j < scriptsLen; j++){
901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            UChar toPattern[500]={'\0'};
902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            char pat[500]={'\0'};
903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            int32_t len = uset_toPattern(scripts[j], toPattern, 500, TRUE, &status);
904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            len = myUCharsToChars(toPattern, pat, len);
905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            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));
906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            if(len!=-1){
907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                log_err("Pattern: %s\n",pat);
908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            }
909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("ExemplarCharacters and LocaleScript containment test failed for locale %s. \n", locale);
911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }else{
913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    strCapacity++; /* increment for NUL termination */
914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    /* allocate the str and call the api again */
915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    str = (UChar*) malloc(U_SIZEOF_UCHAR * strCapacity);
916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    strCapacity =  uset_getItem(exemplarSet, i, &start, &end, str, strCapacity, &status);
917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    /* iterate over the scripts and figure out if the string contained is actually
918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     * in the script set
919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     */
920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    for( j = 0; j < scriptsLen; j++){
921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if(uset_containsString(scripts[j],str, strCapacity) == TRUE){
922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            existsInScript = TRUE;
923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if(existsInScript == FALSE){
926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("ExemplarCharacters and LocaleScript containment test failed for locale %s. \n", locale);
927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* close the sets */
935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for(i = 0; i<scriptsLen; i++){
936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        uset_close(scripts[i]);
937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void VerifyTranslation(void) {
941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *root, *currentLocale;
942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t locCount = uloc_countAvailable();
943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t locIndex;
944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t exemplarLen;
946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const UChar *exemplarCharacters;
947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *currLoc;
948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UScriptCode scripts[USCRIPT_CODE_LIMIT];
949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t numScripts;
950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t idx;
951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t end;
952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *resArray;
953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (locCount <= 1) {
955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_data_err("At least root needs to be installed\n");
956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    root = ures_openDirect(NULL, "root", &errorCode);
959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)) {
960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_data_err("Can't open root\n");
961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (locIndex = 0; locIndex < locCount; locIndex++) {
964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        errorCode=U_ZERO_ERROR;
965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        currLoc = uloc_getAvailable(locIndex);
966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        currentLocale = ures_open(NULL, currLoc, &errorCode);
967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(errorCode != U_ZERO_ERROR) {
968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if(U_SUCCESS(errorCode)) {
969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* It's installed, but there is no data.
970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   It's installed for the g18n white paper [grhoten] */
971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("ERROR: Locale %-5s not installed, and it should be!\n",
972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    uloc_getAvailable(locIndex));
973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            } else {
974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("%%%%%%% Unexpected error %d in %s %%%%%%%",
975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    u_errorName(errorCode),
976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    uloc_getAvailable(locIndex));
977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(currentLocale);
979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            continue;
980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        exemplarCharacters = ures_getStringByKey(currentLocale, "ExemplarCharacters", &exemplarLen, &errorCode);
982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_FAILURE(errorCode)) {
983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("error ures_getStringByKey returned %s\n", u_errorName(errorCode));
984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else if (QUICK && exemplarLen > 2048) {
986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_verbose("skipping test for %s\n", currLoc);
987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        else {
989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UChar langBuffer[128];
990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t langSize;
991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            int32_t strIdx;
992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            langSize = uloc_getDisplayLanguage(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode);
993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (U_FAILURE(errorCode)) {
994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("error uloc_getDisplayLanguage returned %s\n", u_errorName(errorCode));
995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            else {
997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                strIdx = findStringSetMismatch(currLoc, langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE);
998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (strIdx >= 0) {
999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("getDisplayLanguage(%s) at index %d returned characters not in the exemplar characters.\n",
1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        currLoc, strIdx);
1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            langSize = uloc_getDisplayCountry(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode);
1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (U_FAILURE(errorCode)) {
1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("error uloc_getDisplayCountry returned %s\n", u_errorName(errorCode));
1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            else {
1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              strIdx = findStringSetMismatch(currLoc, langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE);
1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (strIdx >= 0) {
1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("getDisplayCountry(%s) at index %d returned characters not in the exemplar characters.\n",
1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        currLoc, strIdx);
1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            {
1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                UResourceBundle* cal = ures_getByKey(currentLocale, "calendar", NULL, &errorCode);
1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                UResourceBundle* greg = ures_getByKeyWithFallback(cal, "gregorian", NULL, &errorCode);
1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                UResourceBundle* names = ures_getByKeyWithFallback(greg,  "dayNames", NULL, &errorCode);
1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                UResourceBundle* format = ures_getByKeyWithFallback(names,  "format", NULL, &errorCode);
1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                resArray = ures_getByKeyWithFallback(format,  "wide", NULL, &errorCode);
1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (U_FAILURE(errorCode)) {
1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("error ures_getByKey returned %s\n", u_errorName(errorCode));
1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (QUICK) {
1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    end = 1;
1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                else {
1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    end = ures_getSize(resArray);
1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                for (idx = 0; idx < end; idx++) {
1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);
1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (U_FAILURE(errorCode)) {
1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode));
1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        continue;
1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE);
1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (strIdx >= 0) {
1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("getDayNames(%s, %d) at index %d returned characters not in the exemplar characters.\n",
1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            currLoc, idx, strIdx);
1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(resArray);
1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(format);
1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(names);
1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                names = ures_getByKeyWithFallback(greg, "monthNames", NULL, &errorCode);
1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                format = ures_getByKeyWithFallback(names,"format", NULL, &errorCode);
1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                resArray = ures_getByKeyWithFallback(format, "wide", NULL, &errorCode);
1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (U_FAILURE(errorCode)) {
1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("error ures_getByKey returned %s\n", u_errorName(errorCode));
1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (QUICK) {
1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    end = 1;
1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                else {
1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    end = ures_getSize(resArray);
1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                for (idx = 0; idx < end; idx++) {
1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);
1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (U_FAILURE(errorCode)) {
1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode));
1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        continue;
1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE);
1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    if (strIdx >= 0) {
1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("getMonthNames(%s, %d) at index %d returned characters not in the exemplar characters.\n",
1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            currLoc, idx, strIdx);
1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(resArray);
1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(format);
1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(names);
1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(greg);
1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ures_close(cal);
1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            errorCode = U_ZERO_ERROR;
1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            numScripts = uscript_getCode(currLoc, scripts, sizeof(scripts)/sizeof(scripts[0]), &errorCode);
1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (numScripts == 0) {
1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("uscript_getCode(%s) doesn't work.\n", currLoc);
1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }else if(scripts[0] == USCRIPT_COMMON){
1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("uscript_getCode(%s) returned USCRIPT_COMMON.\n", currLoc);
1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* test that the scripts are a superset of exemplar characters. */
1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           {
1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ULocaleData *uld = ulocdata_open(currLoc,&errorCode);
1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                USet *exemplarSet =  ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &errorCode);
1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* test if exemplar characters are part of script code */
1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                findSetMatch(scripts, numScripts, exemplarSet, currLoc);
1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uset_close(exemplarSet);
1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                ulocdata_close(uld);
1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           /* test that the paperSize API works */
1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           {
1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               int32_t height=0, width=0;
1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               ulocdata_getPaperSize(currLoc, &height, &width, &errorCode);
1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               if(U_FAILURE(errorCode)){
1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   log_err("ulocdata_getPaperSize failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode));
1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               }
1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               if(strstr(currLoc, "_US")!=NULL && height != 279 && width != 216 ){
1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   log_err("ulocdata_getPaperSize did not return expected data for locale %s \n", currLoc);
1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               }
1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           }
1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            /* test that the MeasurementSystem works API works */
1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           {
1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               UMeasurementSystem measurementSystem = ulocdata_getMeasurementSystem(currLoc, &errorCode);
1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               if(U_FAILURE(errorCode)){
1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   log_err("ulocdata_getMeasurementSystem failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode));
1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               }
1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               if(strstr(currLoc, "_US")!=NULL){
1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   if(measurementSystem != UMS_US){
1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc);
1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   }
1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               }else if(measurementSystem != UMS_SI){
1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc);
1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               }
1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           }
1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_close(currentLocale);
1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(root);
1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* adjust this limit as appropriate */
1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define MAX_SCRIPTS_PER_LOCALE 8
1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestExemplarSet(void){
1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t i, j, k, m, n;
1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t equalCount = 0;
1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode ec = U_ZERO_ERROR;
1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UEnumeration* avail;
1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet* exemplarSets[2];
1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet* unassignedSet;
1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UScriptCode code[MAX_SCRIPTS_PER_LOCALE];
1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    USet* codeSets[MAX_SCRIPTS_PER_LOCALE];
1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t codeLen;
1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char cbuf[32]; /* 9 should be enough */
1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar ubuf[64]; /* adjust as needed */
1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UBool existsInScript;
1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t itemCount;
1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t strLen;
1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar32 start, end;
1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unassignedSet = NULL;
1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    exemplarSets[0] = NULL;
1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    exemplarSets[1] = NULL;
1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (i=0; i<MAX_SCRIPTS_PER_LOCALE; ++i) {
1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        codeSets[i] = NULL;
1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    avail = ures_openAvailableLocales(NULL, &ec);
1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (!assertSuccess("ures_openAvailableLocales", &ec)) goto END;
1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    n = uenum_count(avail, &ec);
1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (!assertSuccess("uenum_count", &ec)) goto END;
1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    u_uastrcpy(ubuf, "[:unassigned:]");
1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unassignedSet = uset_openPattern(ubuf, -1, &ec);
1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (!assertSuccess("uset_openPattern", &ec)) goto END;
1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for(i=0; i<n; i++){
1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        const char* locale = uenum_next(avail, NULL, &ec);
1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (!assertSuccess("uenum_next", &ec)) goto END;
1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_verbose("%s\n", locale);
1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for (k=0; k<2; ++k) {
1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            uint32_t option = (k==0) ? 0 : USET_CASE_INSENSITIVE;
1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ULocaleData *uld = ulocdata_open(locale,&ec);
1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            USet* exemplarSet = ulocdata_getExemplarSet(uld,NULL, option, ULOCDATA_ES_STANDARD, &ec);
1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            uset_close(exemplarSets[k]);
1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ulocdata_close(uld);
1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            exemplarSets[k] = exemplarSet;
1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (!assertSuccess("ulocaledata_getExemplarSet", &ec)) goto END;
1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (uset_containsSome(exemplarSet, unassignedSet)) {
1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("ExemplarSet contains unassigned characters for locale : %s\n", locale);
1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            codeLen = uscript_getCode(locale, code, 8, &ec);
1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (!assertSuccess("uscript_getCode", &ec)) goto END;
1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            for (j=0; j<MAX_SCRIPTS_PER_LOCALE; ++j) {
1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uset_close(codeSets[j]);
1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                codeSets[j] = NULL;
1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            for (j=0; j<codeLen; ++j) {
1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uprv_strcpy(cbuf, "[:");
1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if(code[j]==-1){
1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    log_err("USCRIPT_INVALID_CODE returned for locale: %s\n", locale);
1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    continue;
1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uprv_strcat(cbuf, uscript_getShortName(code[j]));
1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                uprv_strcat(cbuf, ":]");
1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                u_uastrcpy(ubuf, cbuf);
1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                codeSets[j] = uset_openPattern(ubuf, -1, &ec);
1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (!assertSuccess("uset_openPattern", &ec)) goto END;
1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            existsInScript = FALSE;
1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            itemCount = uset_getItemCount(exemplarSet);
1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            for (m=0; m<itemCount && !existsInScript; ++m) {
1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                strLen = uset_getItem(exemplarSet, m, &start, &end, ubuf,
1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      sizeof(ubuf)/sizeof(ubuf[0]), &ec);
1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                /* failure here might mean str[] needs to be larger */
1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (!assertSuccess("uset_getItem", &ec)) goto END;
1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                if (strLen == 0) {
1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    for (j=0; j<codeLen; ++j) {
1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if (codeSets[j]!=NULL && uset_containsRange(codeSets[j], start, end)) {
1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            existsInScript = TRUE;
1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            break;
1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                } else {
1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    for (j=0; j<codeLen; ++j) {
1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        if (codeSets[j]!=NULL && uset_containsString(codeSets[j], ubuf, strLen)) {
1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            existsInScript = TRUE;
1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                            break;
1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        }
1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    }
1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                }
1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (existsInScript == FALSE){
1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("ExemplarSet containment failed for locale : %s\n", locale);
1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        assertTrue("case-folded is a superset",
1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   uset_containsAll(exemplarSets[1], exemplarSets[0]));
1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (uset_equals(exemplarSets[1], exemplarSets[0])) {
1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ++equalCount;
1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /* Note: The case-folded set should sometimes be a strict superset
1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       and sometimes be equal. */
1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    assertTrue("case-folded is sometimes a strict superset, and sometimes equal",
1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott               equalCount > 0 && equalCount < n);
1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott END:
1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uenum_close(avail);
1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uset_close(exemplarSets[0]);
1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uset_close(exemplarSets[1]);
1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uset_close(unassignedSet);
1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (i=0; i<MAX_SCRIPTS_PER_LOCALE; ++i) {
1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        uset_close(codeSets[i]);
1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestLocaleDisplayPattern(void){
1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar pattern[32] = {0,};
1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UChar separator[32] = {0,};
1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ULocaleData *uld = ulocdata_open(uloc_getDefault(), &status);
1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(status)){
1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("ulocdata_open error");
1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ulocdata_getLocaleDisplayPattern(uld, pattern, 32, &status);
1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(status)){
1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("ulocdata_getLocaleDisplayPattern error!");
1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    status = U_ZERO_ERROR;
1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ulocdata_getLocaleSeparator(uld, separator, 32, &status);
1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(status)){
1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("ulocdata_getLocaleSeparator error!");
1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ulocdata_close(uld);
1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestCoverage(void){
1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ULocaleDataDelimiterType types[] = {
1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     ULOCDATA_QUOTATION_START,     /* Quotation start */
1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     ULOCDATA_QUOTATION_END,       /* Quotation end */
1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     ULOCDATA_ALT_QUOTATION_START, /* Alternate quotation start */
1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     ULOCDATA_ALT_QUOTATION_END,   /* Alternate quotation end */
1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     ULOCDATA_DELIMITER_COUNT
1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    };
1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int i;
1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UBool sub;
1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ULocaleData *uld = ulocdata_open(uloc_getDefault(), &status);
1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(status)){
1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("ulocdata_open error");
1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for(i = 0; i < ULOCDATA_DELIMITER_COUNT; i++){
1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        UChar result[32] = {0,};
1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        status = U_ZERO_ERROR;
1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ulocdata_getDelimiter(uld, types[i], result, 32, &status);
1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_FAILURE(status)){
1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            log_err("ulocdata_getgetDelimiter error with type %d", types[i]);
1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    sub = ulocdata_getNoSubstitute(uld);
1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ulocdata_setNoSubstitute(uld,sub);
1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ulocdata_close(uld);
1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestCurrencyList(void){
1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !UCONFIG_NO_FORMATTING
1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode errorCode = U_ZERO_ERROR;
1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t structLocaleCount, currencyCount;
1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UEnumeration *en = ucurr_openISOCurrencies(UCURR_ALL, &errorCode);
1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *isoCode, *structISOCode;
1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *subBundle;
1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UResourceBundle *currencies = ures_openDirect(loadTestData(&errorCode), "structLocale", &errorCode);
1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(U_FAILURE(errorCode)) {
1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_data_err("Can't open structLocale\n");
1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return;
1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    currencies = ures_getByKey(currencies, "Currencies", currencies, &errorCode);
1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    currencyCount = uenum_count(en, &errorCode);
1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    structLocaleCount = ures_getSize(currencies);
1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (currencyCount != structLocaleCount) {
1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        log_err("structLocale(%d) and ISO4217(%d) currency list are out of sync.\n", structLocaleCount, currencyCount);
1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if U_CHARSET_FAMILY == U_ASCII_FAMILY
1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        ures_resetIterator(currencies);
1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        while ((isoCode = uenum_next(en, NULL, &errorCode)) != NULL && ures_hasNext(currencies)) {
1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            subBundle = ures_getNextResource(currencies, NULL, &errorCode);
1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            structISOCode = ures_getKey(subBundle);
1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            ures_close(subBundle);
1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (strcmp(structISOCode, isoCode) != 0) {
1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                log_err("First difference found at structLocale(%s) and ISO4217(%s).\n", structISOCode, isoCode);
1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                break;
1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ures_close(currencies);
1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    uenum_close(en);
1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define TESTCASE(name) addTest(root, &name, "tsutil/cldrtest/" #name)
1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid addCLDRTest(TestNode** root);
1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid addCLDRTest(TestNode** root)
1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestLocaleStructure);
1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestConsistentCountryInfo);
1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(VerifyTranslation);
1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestExemplarSet);
1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestCurrencyList);
1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestLocaleDisplayPattern);
1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TESTCASE(TestCoverage);
1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1354