Index: source/test/intltest/loctest.cpp |
diff --git a/source/test/intltest/loctest.cpp b/source/test/intltest/loctest.cpp |
index 5922e1c7ab3661dfb4ab53fdffa62acf53f8d82e..2c7816c0159d51a21a7f28f31a9bfdeaeffcf53b 100644 |
--- a/source/test/intltest/loctest.cpp |
+++ b/source/test/intltest/loctest.cpp |
@@ -16,6 +16,7 @@ |
#include <string.h> |
#include "putilimp.h" |
#include "unicode/ustring.h" |
+#include "hash.h" |
static const char* const rawData[33][8] = { |
@@ -860,8 +861,8 @@ LocaleTest::TestGetLangsAndCountries() |
; |
/* TODO: Change this test to be more like the cloctst version? */ |
- if (testCount != 560) |
- errln("Expected getISOLanguages() to return 560 languages; it returned %d", testCount); |
+ if (testCount != 593) |
+ errln("Expected getISOLanguages() to return 593 languages; it returned %d", testCount); |
else { |
for (i = 0; i < 15; i++) { |
int32_t j; |
@@ -1842,130 +1843,164 @@ void LocaleTest::_checklocs(const char* label, |
void LocaleTest::TestGetLocale(void) { |
#if !UCONFIG_NO_SERVICE |
- UErrorCode ec = U_ZERO_ERROR; |
const char *req; |
Locale valid, actual, reqLoc; |
// Calendar |
#if !UCONFIG_NO_FORMATTING |
- req = "en_US_BROOKLYN"; |
- Calendar* cal = Calendar::createInstance(Locale::createFromName(req), ec); |
- if (U_FAILURE(ec)) { |
- dataerrln("FAIL: Calendar::createInstance failed - %s", u_errorName(ec)); |
- } else { |
- valid = cal->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = cal->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ { |
+ UErrorCode ec = U_ZERO_ERROR; // give each resource type its own error code |
+ req = "en_US_BROOKLYN"; |
+ Calendar* cal = Calendar::createInstance(Locale::createFromName(req), ec); |
if (U_FAILURE(ec)) { |
- errln("FAIL: Calendar::getLocale() failed"); |
+ dataerrln("FAIL: Calendar::createInstance failed - %s", u_errorName(ec)); |
} else { |
- _checklocs("Calendar", req, valid, actual); |
- } |
- /* Make sure that it fails correctly */ |
- ec = U_FILE_ACCESS_ERROR; |
- if (cal->getLocale(ULOC_VALID_LOCALE, ec).getName()[0] != 0) { |
- errln("FAIL: Calendar::getLocale() failed to fail correctly. It should have returned \"\""); |
+ valid = cal->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = cal->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Calendar::getLocale() failed"); |
+ } else { |
+ _checklocs("Calendar", req, valid, actual); |
+ } |
+ /* Make sure that it fails correctly */ |
+ ec = U_FILE_ACCESS_ERROR; |
+ if (cal->getLocale(ULOC_VALID_LOCALE, ec).getName()[0] != 0) { |
+ errln("FAIL: Calendar::getLocale() failed to fail correctly. It should have returned \"\""); |
+ } |
+ ec = U_ZERO_ERROR; |
} |
- ec = U_ZERO_ERROR; |
+ delete cal; |
} |
- delete cal; |
#endif |
// DecimalFormat, DecimalFormatSymbols |
#if !UCONFIG_NO_FORMATTING |
- req = "fr_FR_NICE"; |
- NumberFormat* nf = NumberFormat::createInstance(Locale::createFromName(req), ec); |
- if (U_FAILURE(ec)) { |
- dataerrln("FAIL: NumberFormat::createInstance failed - %s", u_errorName(ec)); |
- } else { |
- DecimalFormat* dec = dynamic_cast<DecimalFormat*>(nf); |
- if (dec == NULL) { |
- errln("FAIL: NumberFormat::createInstance does not return a DecimalFormat"); |
- return; |
- } |
- valid = dec->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = dec->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ { |
+ UErrorCode ec = U_ZERO_ERROR; // give each resource type its own error code |
+ req = "fr_FR_NICE"; |
+ NumberFormat* nf = NumberFormat::createInstance(Locale::createFromName(req), ec); |
if (U_FAILURE(ec)) { |
- errln("FAIL: DecimalFormat::getLocale() failed"); |
+ dataerrln("FAIL: NumberFormat::createInstance failed - %s", u_errorName(ec)); |
} else { |
- _checklocs("DecimalFormat", req, valid, actual); |
- } |
+ DecimalFormat* dec = dynamic_cast<DecimalFormat*>(nf); |
+ if (dec == NULL) { |
+ errln("FAIL: NumberFormat::createInstance does not return a DecimalFormat"); |
+ return; |
+ } |
+ valid = dec->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = dec->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: DecimalFormat::getLocale() failed"); |
+ } else { |
+ _checklocs("DecimalFormat", req, valid, actual); |
+ } |
- const DecimalFormatSymbols* sym = dec->getDecimalFormatSymbols(); |
- if (sym == NULL) { |
- errln("FAIL: getDecimalFormatSymbols returned NULL"); |
- return; |
+ const DecimalFormatSymbols* sym = dec->getDecimalFormatSymbols(); |
+ if (sym == NULL) { |
+ errln("FAIL: getDecimalFormatSymbols returned NULL"); |
+ return; |
+ } |
+ valid = sym->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: DecimalFormatSymbols::getLocale() failed"); |
+ } else { |
+ _checklocs("DecimalFormatSymbols", req, valid, actual); |
+ } |
} |
- valid = sym->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: DecimalFormatSymbols::getLocale() failed"); |
- } else { |
- _checklocs("DecimalFormatSymbols", req, valid, actual); |
- } |
+ delete nf; |
} |
- delete nf; |
#endif |
// DateFormat, DateFormatSymbols |
#if !UCONFIG_NO_FORMATTING |
- req = "de_CH_LUCERNE"; |
- DateFormat* df = |
- DateFormat::createDateInstance(DateFormat::kDefault, |
- Locale::createFromName(req)); |
- if (df == 0){ |
- dataerrln("Error calling DateFormat::createDateInstance()"); |
- } else { |
- SimpleDateFormat* dat = dynamic_cast<SimpleDateFormat*>(df); |
- if (dat == NULL) { |
- errln("FAIL: DateFormat::createInstance does not return a SimpleDateFormat"); |
- return; |
- } |
- valid = dat->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = dat->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: SimpleDateFormat::getLocale() failed"); |
+ { |
+ UErrorCode ec = U_ZERO_ERROR; // give each resource type its own error code |
+ req = "de_CH_LUCERNE"; |
+ DateFormat* df = |
+ DateFormat::createDateInstance(DateFormat::kDefault, |
+ Locale::createFromName(req)); |
+ if (df == 0){ |
+ dataerrln("Error calling DateFormat::createDateInstance()"); |
} else { |
- _checklocs("SimpleDateFormat", req, valid, actual); |
- } |
+ SimpleDateFormat* dat = dynamic_cast<SimpleDateFormat*>(df); |
+ if (dat == NULL) { |
+ errln("FAIL: DateFormat::createInstance does not return a SimpleDateFormat"); |
+ return; |
+ } |
+ valid = dat->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = dat->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: SimpleDateFormat::getLocale() failed"); |
+ } else { |
+ _checklocs("SimpleDateFormat", req, valid, actual); |
+ } |
- const DateFormatSymbols* sym = dat->getDateFormatSymbols(); |
- if (sym == NULL) { |
- errln("FAIL: getDateFormatSymbols returned NULL"); |
- return; |
+ const DateFormatSymbols* sym = dat->getDateFormatSymbols(); |
+ if (sym == NULL) { |
+ errln("FAIL: getDateFormatSymbols returned NULL"); |
+ return; |
+ } |
+ valid = sym->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: DateFormatSymbols::getLocale() failed"); |
+ } else { |
+ _checklocs("DateFormatSymbols", req, valid, actual); |
+ } |
} |
- valid = sym->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: DateFormatSymbols::getLocale() failed"); |
- } else { |
- _checklocs("DateFormatSymbols", req, valid, actual); |
- } |
+ delete df; |
} |
- delete df; |
#endif |
// BreakIterator |
#if !UCONFIG_NO_BREAK_ITERATION |
- req = "es_ES_BARCELONA"; |
- reqLoc = Locale::createFromName(req); |
- BreakIterator* brk = BreakIterator::createWordInstance(reqLoc, ec); |
- if (U_FAILURE(ec)) { |
- dataerrln("FAIL: BreakIterator::createWordInstance failed - %s", u_errorName(ec)); |
- } else { |
- valid = brk->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ { |
+ UErrorCode ec = U_ZERO_ERROR; // give each resource type its own error code |
+ req = "es_ES_BARCELONA"; |
+ reqLoc = Locale::createFromName(req); |
+ BreakIterator* brk = BreakIterator::createWordInstance(reqLoc, ec); |
if (U_FAILURE(ec)) { |
- errln("FAIL: BreakIterator::getLocale() failed"); |
+ dataerrln("FAIL: BreakIterator::createWordInstance failed - %s", u_errorName(ec)); |
} else { |
- _checklocs("BreakIterator", req, valid, actual); |
- } |
+ valid = brk->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: BreakIterator::getLocale() failed"); |
+ } else { |
+ _checklocs("BreakIterator", req, valid, actual); |
+ } |
- // After registering something, the behavior should be different |
- URegistryKey key = BreakIterator::registerInstance(brk, reqLoc, UBRK_WORD, ec); |
- brk = 0; // registerInstance adopts |
- if (U_FAILURE(ec)) { |
- errln("FAIL: BreakIterator::registerInstance() failed"); |
- } else { |
+ // After registering something, the behavior should be different |
+ URegistryKey key = BreakIterator::registerInstance(brk, reqLoc, UBRK_WORD, ec); |
+ brk = 0; // registerInstance adopts |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: BreakIterator::registerInstance() failed"); |
+ } else { |
+ brk = BreakIterator::createWordInstance(reqLoc, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: BreakIterator::createWordInstance failed"); |
+ } else { |
+ valid = brk->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: BreakIterator::getLocale() failed"); |
+ } else { |
+ // N.B.: now expect valid==actual==req |
+ _checklocs("BreakIterator(registered)", |
+ req, valid, actual, "eq", "eq"); |
+ } |
+ } |
+ // No matter what, unregister |
+ BreakIterator::unregister(key, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: BreakIterator::unregister() failed"); |
+ } |
+ delete brk; |
+ brk = 0; |
+ } |
+ |
+ // After unregistering, should behave normally again |
brk = BreakIterator::createWordInstance(reqLoc, ec); |
if (U_FAILURE(ec)) { |
errln("FAIL: BreakIterator::createWordInstance failed"); |
@@ -1975,100 +2010,181 @@ void LocaleTest::TestGetLocale(void) { |
if (U_FAILURE(ec)) { |
errln("FAIL: BreakIterator::getLocale() failed"); |
} else { |
- // N.B.: now expect valid==actual==req |
- _checklocs("BreakIterator(registered)", |
- req, valid, actual, "eq", "eq"); |
+ _checklocs("BreakIterator(unregistered)", req, valid, actual); |
} |
} |
- // No matter what, unregister |
- BreakIterator::unregister(key, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: BreakIterator::unregister() failed"); |
- } |
- delete brk; |
- brk = 0; |
- } |
- |
- // After unregistering, should behave normally again |
- brk = BreakIterator::createWordInstance(reqLoc, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: BreakIterator::createWordInstance failed"); |
- } else { |
- valid = brk->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: BreakIterator::getLocale() failed"); |
- } else { |
- _checklocs("BreakIterator(unregistered)", req, valid, actual); |
- } |
} |
+ delete brk; |
} |
- delete brk; |
#endif |
// Collator |
#if !UCONFIG_NO_COLLATION |
- req = "hi_IN_BHOPAL"; |
- reqLoc = Locale::createFromName(req); |
- Collator* coll = Collator::createInstance(reqLoc, ec); |
- if (U_FAILURE(ec)) { |
- dataerrln("FAIL: Collator::createInstance failed - %s", u_errorName(ec)); |
- } else { |
- valid = coll->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::getLocale() failed"); |
- } else { |
- _checklocs("Collator", req, valid, actual); |
- } |
+ { |
+ UErrorCode ec = U_ZERO_ERROR; // give each resource type its own error code |
- // After registering something, the behavior should be different |
- URegistryKey key = Collator::registerInstance(coll, reqLoc, ec); |
- coll = 0; // registerInstance adopts |
+ checkRegisteredCollators(NULL); // Don't expect any extras |
+ |
+ req = "hi_IN_BHOPAL"; |
+ reqLoc = Locale::createFromName(req); |
+ Collator* coll = Collator::createInstance(reqLoc, ec); |
if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::registerInstance() failed"); |
+ dataerrln("FAIL: Collator::createInstance failed - %s", u_errorName(ec)); |
} else { |
+ valid = coll->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Collator::getLocale() failed"); |
+ } else { |
+ _checklocs("Collator", req, valid, actual); |
+ } |
+ |
+ // After registering something, the behavior should be different |
+ URegistryKey key = Collator::registerInstance(coll, reqLoc, ec); |
+ coll = 0; // registerInstance adopts |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Collator::registerInstance() failed"); |
+ } else { |
+ coll = Collator::createInstance(reqLoc, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Collator::createWordInstance failed"); |
+ } else { |
+ valid = coll->getLocale(ULOC_VALID_LOCALE, ec); |
+ actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Collator::getLocale() failed"); |
+ } else { |
+ // N.B.: now expect valid==actual==req |
+ _checklocs("Collator(registered)", |
+ req, valid, actual, "eq", "eq"); |
+ } |
+ } |
+ checkRegisteredCollators(req); // include hi_IN_BHOPAL |
+ |
+ // No matter what, unregister |
+ Collator::unregister(key, ec); |
+ if (U_FAILURE(ec)) { |
+ errln("FAIL: Collator::unregister() failed"); |
+ } |
+ delete coll; |
+ coll = 0; |
+ } |
+ |
+ // After unregistering, should behave normally again |
coll = Collator::createInstance(reqLoc, ec); |
if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::createWordInstance failed"); |
+ errln("FAIL: Collator::createInstance failed"); |
} else { |
valid = coll->getLocale(ULOC_VALID_LOCALE, ec); |
actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); |
if (U_FAILURE(ec)) { |
errln("FAIL: Collator::getLocale() failed"); |
} else { |
- // N.B.: now expect valid==actual==req |
- _checklocs("Collator(registered)", |
- req, valid, actual, "eq", "eq"); |
+ _checklocs("Collator(unregistered)", req, valid, actual); |
} |
} |
- // No matter what, unregister |
- Collator::unregister(key, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::unregister() failed"); |
- } |
- delete coll; |
- coll = 0; |
} |
+ delete coll; |
- // After unregistering, should behave normally again |
- coll = Collator::createInstance(reqLoc, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::createInstance failed"); |
- } else { |
- valid = coll->getLocale(ULOC_VALID_LOCALE, ec); |
- actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); |
- if (U_FAILURE(ec)) { |
- errln("FAIL: Collator::getLocale() failed"); |
+ checkRegisteredCollators(NULL); // extra should be gone again |
+ } |
+#endif |
+#endif |
+} |
+ |
+#if !UCONFIG_NO_COLLATION |
+/** |
+ * Compare Collator::getAvailableLocales(int) [ "old", returning an array ] |
+ * with Collator::getAvailableLocales() [ "new", returning a StringEnumeration ] |
+ * These should be identical (check their API docs) EXCEPT that |
+ * if expectExtra is non-NULL, it will be in the "new" array but not "old". |
+ * Does not return any status but calls errln on error. |
+ * @param expectExtra an extra locale, will be in "new" but not "old". Or NULL. |
+ */ |
+void LocaleTest::checkRegisteredCollators(const char *expectExtra) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ int32_t count1=0,count2=0; |
+ Hashtable oldHash(status); |
+ Hashtable newHash(status); |
+ TEST_ASSERT_STATUS(status); |
+ |
+ UnicodeString expectStr(expectExtra?expectExtra:"n/a", ""); |
+ |
+ // the 'old' list (non enumeration) |
+ const Locale* oldList = Collator::getAvailableLocales(count1); |
+ if(oldList == NULL) { |
+ dataerrln("Error: Collator::getAvailableLocales(count) returned NULL"); |
+ return; |
+ } |
+ |
+ // the 'new' list (enumeration) |
+ LocalPointer<StringEnumeration> newEnum(Collator::getAvailableLocales()); |
+ if(newEnum.isNull()) { |
+ errln("Error: collator::getAvailableLocales() returned NULL"); |
+ return; |
+ } |
+ |
+ // OK. Let's add all of the OLD |
+ // then check for any in the NEW not in OLD |
+ // then check for any in OLD not in NEW. |
+ |
+ // 1. add all of OLD |
+ for(int32_t i=0;i<count1;i++) { |
+ const UnicodeString key(oldList[i].getName(), ""); |
+ int32_t oldI = oldHash.puti(key, 1, status); |
+ if( oldI == 1 ){ |
+ errln("Error: duplicate key %s in Collator::getAvailableLocales(count) list.\n", |
+ oldList[i].getName()); |
+ return; |
+ } |
+ if(expectExtra != NULL && !strcmp(expectExtra, oldList[i].getName())) { |
+ errln("Inexplicably, Collator::getAvailableCollators(count) had registered collator %s. This shouldn't happen, so I am going to consider it an error.\n", expectExtra); |
+ } |
+ } |
+ |
+ // 2. add all of NEW |
+ const UnicodeString *locStr; |
+ UBool foundExpected = FALSE; |
+ while((locStr = newEnum->snext(status)) && U_SUCCESS(status)) { |
+ count2++; |
+ |
+ if(expectExtra != NULL && expectStr == *locStr) { |
+ foundExpected = TRUE; |
+ logln(UnicodeString("Found expected registered collator: ","") + expectStr); |
+ } |
+ (void)foundExpected; // Hush unused variable compiler warning. |
+ |
+ if( oldHash.geti(*locStr) == 0 ) { |
+ if(expectExtra != NULL && expectStr==*locStr) { |
+ logln(UnicodeString("As expected, Collator::getAvailableLocales(count) is missing registered collator ") + expectStr); |
} else { |
- _checklocs("Collator(unregistered)", req, valid, actual); |
+ errln(UnicodeString("Error: Collator::getAvailableLocales(count) is missing: ","") |
+ + *locStr); |
} |
} |
+ newHash.puti(*locStr, 1, status); |
} |
- delete coll; |
-#endif |
-#endif |
+ |
+ // 3. check all of OLD again |
+ for(int32_t i=0;i<count1;i++) { |
+ const UnicodeString key(oldList[i].getName(), ""); |
+ int32_t newI = newHash.geti(key); |
+ if(newI == 0) { |
+ errln(UnicodeString("Error: Collator::getAvailableLocales() is missing: ","") |
+ + key); |
+ } |
+ } |
+ |
+ int32_t expectCount2 = count1; |
+ if(expectExtra != NULL) { |
+ expectCount2 ++; // if an extra item registered, bump the expect count |
+ } |
+ |
+ assertEquals("Collator::getAvail() count", expectCount2, count2); |
} |
+#endif |
+ |
+ |
void LocaleTest::TestVariantWithOutCountry(void) { |
Locale loc("en","","POSIX"); |