X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b75a7d8f3b4adbae880cab104ce2c6a50eee4db2..2be6500137966bba13903b24204a44804f9e133a:/icuSources/test/intltest/svccoll.cpp diff --git a/icuSources/test/intltest/svccoll.cpp b/icuSources/test/intltest/svccoll.cpp index 43f4ef19..a781d4a8 100644 --- a/icuSources/test/intltest/svccoll.cpp +++ b/icuSources/test/intltest/svccoll.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 2003, International Business Machines Corporation and * + * Copyright (C) 2003-2011, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -13,31 +13,44 @@ #include "unicode/coll.h" #include "unicode/strenum.h" #include "hash.h" +#include "uassert.h" #include "ucol_imp.h" // internal api needed to test ucollator equality #include "cstring.h" // internal api used to compare locale strings -void CollationServiceTest::TestRegister() +void CollationServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par */) +{ + if (exec) logln("TestSuite CollationServiceTest: "); + switch (index) { + TESTCASE(0, TestRegister); + TESTCASE(1, TestRegisterFactory); + TESTCASE(2, TestSeparateTree); + default: name = ""; break; + } +} + +void CollationServiceTest::TestRegister() { - // register a singleton +#if !UCONFIG_NO_SERVICE + // register a singleton const Locale& FR = Locale::getFrance(); const Locale& US = Locale::getUS(); const Locale US_FOO("en", "US", "FOO"); - + UErrorCode status = U_ZERO_ERROR; - + Collator* frcol = Collator::createInstance(FR, status); Collator* uscol = Collator::createInstance(US, status); if(U_FAILURE(status)) { - errln("Failed to create collators with %s", u_errorName(status)); + errcheckln(status, "Failed to create collators with %s", u_errorName(status)); delete frcol; delete uscol; return; } - + { // try override en_US collator URegistryKey key = Collator::registerInstance(frcol, US, status); - + Collator* ncol = Collator::createInstance(US_FOO, status); if (*frcol != *ncol) { errln("register of french collator for en_US failed on request for en_US_FOO"); @@ -45,13 +58,13 @@ void CollationServiceTest::TestRegister() // ensure original collator's params not touched Locale loc = frcol->getLocale(ULOC_REQUESTED_LOCALE, status); if (loc != FR) { - errln(UnicodeString("fr collator's requested locale changed to ") + loc.getName()); + errln(UnicodeString("fr collator's requested locale changed to ") + loc.getName()); } loc = frcol->getLocale(ULOC_VALID_LOCALE, status); if (loc != FR) { - errln(UnicodeString("fr collator's valid locale changed to ") + loc.getName()); + errln(UnicodeString("fr collator's valid locale changed to ") + loc.getName()); } - + loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status); if (loc != US_FOO) { errln(UnicodeString("requested locale for en_US_FOO is not en_US_FOO but ") + loc.getName()); @@ -65,39 +78,39 @@ void CollationServiceTest::TestRegister() errln(UnicodeString("actual locale for en_US_FOO is not en_US but ") + loc.getName()); } delete ncol; ncol = NULL; - + if (!Collator::unregister(key, status)) { errln("failed to unregister french collator"); } // !!! frcol pointer is now invalid !!! - + ncol = Collator::createInstance(US, status); if (*uscol != *ncol) { errln("collator after unregister does not match original"); } delete ncol; ncol = NULL; } - + // recreate frcol frcol = Collator::createInstance(FR, status); - - UCollator* frFR = ucol_open("fr_FR", &status); - + + LocalUCollatorPointer frFR(ucol_open("fr_FR", &status)); + { // try create collator for new locale Locale fu_FU_FOO("fu", "FU", "FOO"); Locale fu_FU("fu", "FU", ""); - + Collator* fucol = Collator::createInstance(fu_FU, status); URegistryKey key = Collator::registerInstance(frcol, fu_FU, status); Collator* ncol = Collator::createInstance(fu_FU_FOO, status); if (*frcol != *ncol) { errln("register of fr collator for fu_FU failed"); } - + UnicodeString locName = fu_FU.getName(); StringEnumeration* localeEnum = Collator::getAvailableLocales(); UBool found = FALSE; - const UnicodeString* locStr; + const UnicodeString* locStr, *ls2; for (locStr = localeEnum->snext(status); !found && locStr != NULL; locStr = localeEnum->snext(status)) { @@ -106,54 +119,85 @@ void CollationServiceTest::TestRegister() found = TRUE; } } + + StringEnumeration *le2 = NULL; + localeEnum->reset(status); + int32_t i, count; + count = localeEnum->count(status); + for(i = 0; i < count; ++i) { + if(i == count / 2) { + le2 = localeEnum->clone(); + if(le2 == NULL || count != le2->count(status)) { + errln("ServiceEnumeration.clone() failed"); + break; + } + } + if(i >= count / 2) { + locStr = localeEnum->snext(status); + ls2 = le2->snext(status); + if(*locStr != *ls2) { + errln("ServiceEnumeration.clone() failed for item %d", i); + } + } else { + localeEnum->snext(status); + } + } + delete localeEnum; - + delete le2; + if (!found) { errln("new locale fu_FU not reported as supported locale"); } - + UnicodeString displayName; Collator::getDisplayName(fu_FU, displayName); - if (displayName != "fu (FU)") { + /* The locale display pattern for the locale ja, ko, and zh are different. */ + const UChar zh_fuFU_Array[] = { 0x0066, 0x0075, 0xff08, 0x0046, 0x0055, 0xff09, 0 }; + const UnicodeString zh_fuFU(zh_fuFU_Array); + const Locale& defaultLocale = Locale::getDefault(); + if (displayName != "fu (FU)" && + ((defaultLocale == Locale::getKorean() && defaultLocale == Locale::getJapanese()) && displayName == "fu(FU)") && + ((defaultLocale == Locale::getChinese()) && displayName != zh_fuFU)) { errln(UnicodeString("found ") + displayName + " for fu_FU"); } - + Collator::getDisplayName(fu_FU, fu_FU, displayName); - if (displayName != "fu (FU)") { + if (displayName != "fu (FU)" && + ((defaultLocale == Locale::getKorean() && defaultLocale == Locale::getJapanese()) && displayName == "fu(FU)") && + ((defaultLocale == Locale::getChinese()) && displayName != zh_fuFU)) { errln(UnicodeString("found ") + displayName + " for fu_FU"); } - + // test ucol_open - UCollator* fufu = ucol_open("fu_FU_FOO", &status); - if (!fufu) { + LocalUCollatorPointer fufu(ucol_open("fu_FU_FOO", &status)); + if (fufu.isNull()) { errln("could not open fu_FU_FOO with ucol_open"); } else { - if (!ucol_equals(fufu, frFR)) { + if (!ucol_equals(fufu.getAlias(), frFR.getAlias())) { errln("collator fufu != collator frFR"); } } - + if (!Collator::unregister(key, status)) { errln("failed to unregister french collator"); } // !!! note frcoll invalid again, but we're no longer using it - + // other collators should still work ok Locale nloc = ncol->getLocale(ULOC_VALID_LOCALE, status); if (nloc != fu_FU) { errln(UnicodeString("asked for nloc valid locale after close and got") + nloc.getName()); } delete ncol; ncol = NULL; - - if (fufu) { - const char* nlocstr = ucol_getLocale(fufu, ULOC_VALID_LOCALE, &status); + + if (fufu.isValid()) { + const char* nlocstr = ucol_getLocaleByType(fufu.getAlias(), ULOC_VALID_LOCALE, &status); if (uprv_strcmp(nlocstr, "fu_FU") != 0) { errln(UnicodeString("asked for uloc valid locale after close and got ") + nlocstr); } - ucol_close(fufu); } - ucol_close(frFR); - + ncol = Collator::createInstance(fu_FU, status); if (*fucol != *ncol) { errln("collator after unregister does not match original fu_FU"); @@ -162,10 +206,12 @@ void CollationServiceTest::TestRegister() delete ncol; ncol = NULL; delete fucol; fucol = NULL; } +#endif } // ------------------ +#if !UCONFIG_NO_SERVICE struct CollatorInfo { Locale locale; Collator* collator; @@ -188,7 +234,7 @@ CollatorInfo::~CollatorInfo() { delete displayNames; } -UnicodeString& +UnicodeString& CollatorInfo::getDisplayName(const Locale& displayLocale, UnicodeString& name) const { if (displayNames) { UnicodeString* val = (UnicodeString*)displayNames->get(displayLocale.getName()); @@ -217,15 +263,15 @@ class TestFactory : public CollatorFactory { return NULL; } -public: - TestFactory(CollatorInfo** _info) +public: + TestFactory(CollatorInfo** _info) : info(_info) , count(0) , ids(NULL) { CollatorInfo** p; for (p = info; *p; ++p) {} - count = p - info; + count = (int32_t)(p - info); } ~TestFactory() { @@ -244,7 +290,7 @@ public: return NULL; } - virtual UnicodeString& getDisplayName(const Locale& objectLocale, + virtual UnicodeString& getDisplayName(const Locale& objectLocale, const Locale& displayLocale, UnicodeString& result) { @@ -291,70 +337,79 @@ private: }; char TestFactory::gClassID = 0; +#endif -void CollationServiceTest::TestRegisterFactory(void) +void CollationServiceTest::TestRegisterFactory(void) { +#if !UCONFIG_NO_SERVICE + int32_t n1, n2, n3; Locale fu_FU("fu", "FU", ""); Locale fu_FU_FOO("fu", "FU", "FOO"); - + UErrorCode status = U_ZERO_ERROR; - + Hashtable* fuFUNames = new Hashtable(FALSE, status); if (!fuFUNames) { errln("memory allocation error"); return; } - fuFUNames->setValueDeleter(uhash_deleteUnicodeString); - + fuFUNames->setValueDeleter(uprv_deleteUObject); + fuFUNames->put(fu_FU.getName(), new UnicodeString("ze leetle bunny Fu-Fu"), status); fuFUNames->put(fu_FU_FOO.getName(), new UnicodeString("zee leetel bunny Foo-Foo"), status); - fuFUNames->put(Locale::getUS().getName(), new UnicodeString("little bunny Foo Foo"), status); - + fuFUNames->put(Locale::getDefault().getName(), new UnicodeString("little bunny Foo Foo"), status); + Collator* frcol = Collator::createInstance(Locale::getFrance(), status); Collator* gecol = Collator::createInstance(Locale::getGermany(), status); Collator* jpcol = Collator::createInstance(Locale::getJapan(), status); if(U_FAILURE(status)) { - errln("Failed to create collators with %s", u_errorName(status)); + errcheckln(status, "Failed to create collators with %s", u_errorName(status)); delete frcol; delete gecol; delete jpcol; delete fuFUNames; return; } - + CollatorInfo** info = new CollatorInfo*[4]; if (!info) { errln("memory allocation error"); return; } - + info[0] = new CollatorInfo(Locale::getUS(), frcol, NULL); info[1] = new CollatorInfo(Locale::getFrance(), gecol, NULL); info[2] = new CollatorInfo(fu_FU, jpcol, fuFUNames); info[3] = NULL; - + TestFactory* factory = new TestFactory(info); if (!factory) { errln("memory allocation error"); return; } - + Collator* uscol = Collator::createInstance(Locale::getUS(), status); Collator* fucol = Collator::createInstance(fu_FU, status); - + { + n1 = checkAvailable("before registerFactory"); + URegistryKey key = Collator::registerFactory(factory, status); + + n2 = checkAvailable("after registerFactory"); + assertTrue("count after > count before", n2 > n1); + Collator* ncol = Collator::createInstance(Locale::getUS(), status); if (*frcol != *ncol) { errln("frcoll for en_US failed"); } delete ncol; ncol = NULL; - + ncol = Collator::createInstance(fu_FU_FOO, status); if (*jpcol != *ncol) { errln("jpcol for fu_FU_FOO failed"); } - + Locale loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status); if (loc != fu_FU_FOO) { errln(UnicodeString("requested locale for fu_FU_FOO is not fu_FU_FOO but ") + loc.getName()); @@ -364,7 +419,7 @@ void CollationServiceTest::TestRegisterFactory(void) errln(UnicodeString("valid locale for fu_FU_FOO is not fu_FU but ") + loc.getName()); } delete ncol; ncol = NULL; - + UnicodeString locName = fu_FU.getName(); StringEnumeration* localeEnum = Collator::getAvailableLocales(); UBool found = FALSE; @@ -378,46 +433,160 @@ void CollationServiceTest::TestRegisterFactory(void) } } delete localeEnum; - + if (!found) { errln("new locale fu_FU not reported as supported locale"); } - + UnicodeString name; Collator::getDisplayName(fu_FU, name); if (name != "little bunny Foo Foo") { errln(UnicodeString("found ") + name + " for fu_FU"); } - + Collator::getDisplayName(fu_FU, fu_FU_FOO, name); if (name != "zee leetel bunny Foo-Foo") { errln(UnicodeString("found ") + name + " for fu_FU in fu_FU_FOO"); } - + if (!Collator::unregister(key, status)) { errln("failed to unregister factory"); } // ja, fr, ge collators no longer valid - + ncol = Collator::createInstance(fu_FU, status); if (*fucol != *ncol) { errln("collator after unregister does not match original fu_FU"); } - delete ncol; + delete ncol; + + n3 = checkAvailable("after unregister"); + assertTrue("count after unregister == count before register", n3 == n1); } - + delete fucol; delete uscol; +#endif } -void CollationServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par */) -{ - if (exec) logln("TestSuite CollationServiceTest: "); - switch (index) { - TESTCASE(0, TestRegister); - TESTCASE(1, TestRegisterFactory); - default: name = ""; break; +/** + * Iterate through the given iterator, checking to see that all the strings + * in the expected array are present. + * @param expected array of strings we expect to see, or NULL + * @param expectedCount number of elements of expected, or 0 + */ +int32_t CollationServiceTest::checkStringEnumeration(const char* msg, + StringEnumeration& iter, + const char** expected, + int32_t expectedCount) { + UErrorCode ec = U_ZERO_ERROR; + U_ASSERT(expectedCount >= 0 && expectedCount < 31); // [sic] 31 not 32 + int32_t i = 0, idxAfterReset = 0, n = iter.count(ec); + assertSuccess("count", ec); + UnicodeString buf, buffAfterReset; + int32_t seenMask = 0; + for (;; ++i) { + const UnicodeString* s = iter.snext(ec); + if (!assertSuccess("snext", ec) || s == NULL) + break; + if (i != 0) + buf.append(UNICODE_STRING_SIMPLE(", ")); + buf.append(*s); + // check expected list + for (int32_t j=0, bit=1; j