void PluralRulesTest::testGetSamples() { // TODO: fix samples, re-enable this test. // no get functional equivalent API in ICU4C, so just // test every locale... UErrorCode status = U_ZERO_ERROR; int32_t numLocales; const Locale* locales = Locale::getAvailableLocales(numLocales); double values[1000]; for (int32_t i = 0; U_SUCCESS(status) && i < numLocales; ++i) { PluralRules *rules = PluralRules::forLocale(locales[i], status); if (U_FAILURE(status)) { break; } StringEnumeration *keywords = rules->getKeywords(status); if (U_FAILURE(status)) { delete rules; break; } const UnicodeString* keyword; while (NULL != (keyword = keywords->snext(status))) { int32_t count = rules->getSamples(*keyword, values, LENGTHOF(values), status); if (U_FAILURE(status)) { errln(UNICODE_STRING_SIMPLE("getSamples() failed for locale ") + locales[i].getName() + UNICODE_STRING_SIMPLE(", keyword ") + *keyword); continue; } if (count == 0) { // TODO: Lots of these. // errln(UNICODE_STRING_SIMPLE("no samples for keyword ") + *keyword + UNICODE_STRING_SIMPLE(" in locale ") + locales[i].getName() ); } if (count > LENGTHOF(values)) { errln(UNICODE_STRING_SIMPLE("getSamples()=") + count + UNICODE_STRING_SIMPLE(", too many values, for locale ") + locales[i].getName() + UNICODE_STRING_SIMPLE(", keyword ") + *keyword); count = LENGTHOF(values); } for (int32_t j = 0; j < count; ++j) { if (values[j] == UPLRULES_NO_UNIQUE_VALUE) { errln("got 'no unique value' among values"); } else { UnicodeString resultKeyword = rules->select(values[j]); // if (strcmp(locales[i].getName(), "uk") == 0) { // Debug only. // std::cout << " uk " << US(resultKeyword).cstr() << " " << values[j] << std::endl; // } if (*keyword != resultKeyword) { errln("file %s, line %d, Locale %s, sample for keyword \"%s\": %g, select(%g) returns keyword \"%s\"", __FILE__, __LINE__, locales[i].getName(), US(*keyword).cstr(), values[j], values[j], US(resultKeyword).cstr()); } } } } delete keywords; delete rules; } }
UBool PluralRules::operator==(const PluralRules& other) const { int32_t limit; const UnicodeString *ptrKeyword; UErrorCode status= U_ZERO_ERROR; if ( this == &other ) { return TRUE; } LocalPointer<StringEnumeration> myKeywordList(getKeywords(status)); LocalPointer<StringEnumeration> otherKeywordList(other.getKeywords(status)); if (U_FAILURE(status)) { return FALSE; } if (myKeywordList->count(status)!=otherKeywordList->count(status)) { return FALSE; } myKeywordList->reset(status); while ((ptrKeyword=myKeywordList->snext(status))!=NULL) { if (!other.isKeyword(*ptrKeyword)) { return FALSE; } } otherKeywordList->reset(status); while ((ptrKeyword=otherKeywordList->snext(status))!=NULL) { if (!this->isKeyword(*ptrKeyword)) { return FALSE; } } if (U_FAILURE(status)) { return FALSE; } if ((limit=this->getRepeatLimit()) != other.getRepeatLimit()) { return FALSE; } UnicodeString myKeyword, otherKeyword; for (int32_t i=0; i<limit; ++i) { myKeyword = this->select(i); otherKeyword = other.select(i); if (myKeyword!=otherKeyword) { return FALSE; } } return TRUE; }