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