From f46b567ba3e257c43df8b1d85a24b3c43c28338e Mon Sep 17 00:00:00 2001 From: Peter Edberg Date: Fri, 30 Aug 2019 00:42:41 -0700 Subject: [PATCH] ICU-20701 Add more PluralRules tests for locales with keywords --- icu4c/source/test/intltest/plurults.cpp | 22 +++++++++++++++++++ icu4c/source/test/intltest/plurults.h | 1 + .../icu/dev/test/format/PluralRulesTest.java | 18 +++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/icu4c/source/test/intltest/plurults.cpp b/icu4c/source/test/intltest/plurults.cpp index ba5817e811a..a70c362b7ab 100644 --- a/icu4c/source/test/intltest/plurults.cpp +++ b/icu4c/source/test/intltest/plurults.cpp @@ -1037,12 +1037,34 @@ void PluralRulesTest::testSelectTrailingZeros() { } } +void PluralRulesTest::compareLocaleResults(const char* loc1, const char* loc2, const char* loc3) { + UErrorCode status = U_ZERO_ERROR; + LocalPointer rules1(PluralRules::forLocale(loc1, status)); + LocalPointer rules2(PluralRules::forLocale(loc2, status)); + LocalPointer rules3(PluralRules::forLocale(loc3, status)); + if (U_FAILURE(status)) { + dataerrln("Failed to create PluralRules for one of %s, %s, %s: %s\n", loc1, loc2, loc3, u_errorName(status)); + return; + } + for (int32_t value = 0; value <= 12; value++) { + UnicodeString result1 = rules1->select(value); + UnicodeString result2 = rules2->select(value); + UnicodeString result3 = rules3->select(value); + if (result1 != result2 || result1 != result3) { + errln("PluralRules.select(%d) does not return the same values for %s, %s, %s\n", value, loc1, loc2, loc3); + } + } +} + void PluralRulesTest::testLocaleExtension() { IcuTestErrorCode errorCode(*this, "testLocaleExtension"); LocalPointer rules(PluralRules::forLocale("pt@calendar=gregorian", errorCode)); if (errorCode.errIfFailureAndReset("PluralRules::forLocale()")) { return; } UnicodeString key = rules->select(1); assertEquals("pt@calendar=gregorian select(1)", u"one", key); + compareLocaleResults("ar", "ar_SA", "ar_SA@calendar=gregorian"); + compareLocaleResults("ru", "ru_UA", "ru-u-cu-RUB"); + compareLocaleResults("fr", "fr_CH", "fr@ms=uksystem"); } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/plurults.h b/icu4c/source/test/intltest/plurults.h index 91df27b7638..784b0d3bf27 100644 --- a/icu4c/source/test/intltest/plurults.h +++ b/icu4c/source/test/intltest/plurults.h @@ -45,6 +45,7 @@ private: double expected); void checkSelect(const LocalPointer &rules, UErrorCode &status, int32_t line, const char *keyword, ...); + void compareLocaleResults(const char* loc1, const char* loc2, const char* loc3); }; #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java index 906ad328956..7e11c3e052d 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java @@ -526,11 +526,29 @@ public class PluralRulesTest extends TestFmwk { } } + private void compareLocaleResults(String loc1, String loc2, String loc3) { + PluralRules rules1 = PluralRules.forLocale(new ULocale(loc1)); + PluralRules rules2 = PluralRules.forLocale(new ULocale(loc2)); + PluralRules rules3 = PluralRules.forLocale(new ULocale(loc3)); + for (int value = 0; value <= 12; value++) { + String result1 = rules1.select(value); + String result2 = rules2.select(value); + String result3 = rules3.select(value); + if (!result1.equals(result2) || !result1.equals(result3)) { + errln("PluralRules.select(" + value + ") does not return the same values for " + + loc1 + ", " + loc2 + ", " + loc3); + } + } + } + @Test public void testLocaleExtension() { PluralRules rules = PluralRules.forLocale(new ULocale("pt@calendar=gregorian")); String key = rules.select(1); assertEquals("pt@calendar=gregorian select(1)", "one", key); + compareLocaleResults("ar", "ar_SA", "ar_SA@calendar=gregorian"); + compareLocaleResults("ru", "ru_UA", "ru-u-cu-RUB"); + compareLocaleResults("fr", "fr_CH", "fr@ms=uksystem"); } @Test