From e71be2e3b7496d21270758ac8028e0a8045c8dec Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Wed, 7 Sep 2011 23:18:54 +0000 Subject: [PATCH] ICU-8806 fix MessageFormat plural # formatting: fix offset lookup X-SVN-Rev: 30635 --- icu4c/source/i18n/msgfmt.cpp | 2 +- icu4c/source/test/intltest/plurfmts.cpp | 26 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/icu4c/source/i18n/msgfmt.cpp b/icu4c/source/i18n/msgfmt.cpp index e5825384208..67a3d858127 100644 --- a/icu4c/source/i18n/msgfmt.cpp +++ b/icu4c/source/i18n/msgfmt.cpp @@ -1067,7 +1067,7 @@ void MessageFormat::format(int32_t msgStart, double pluralNumber, double number = arg->getDouble(success); int32_t subMsgStart = PluralFormat::findSubMessage(msgPattern, i, pluralProvider, number, success); - double offset = msgPattern.getPluralOffset(subMsgStart); + double offset = msgPattern.getPluralOffset(i); formatComplexSubMessage(subMsgStart, number-offset, arguments, argumentNames, cnt, appendTo, success); } else if (argType == UMSGPAT_ARG_TYPE_SELECT) { diff --git a/icu4c/source/test/intltest/plurfmts.cpp b/icu4c/source/test/intltest/plurfmts.cpp index b415b4e4687..f62aae3f1b8 100644 --- a/icu4c/source/test/intltest/plurfmts.cpp +++ b/icu4c/source/test/intltest/plurfmts.cpp @@ -11,10 +11,10 @@ #include "plurults.h" #include "plurfmts.h" #include "cmemory.h" +#include "unicode/msgfmt.h" #include "unicode/plurrule.h" #include "unicode/plurfmt.h" - #define PLURAL_PATTERN_DATA 4 #define PLURAL_TEST_ARRAY_SIZE 256 @@ -518,7 +518,11 @@ PluralFormatTest::pluralFormatExtendedTest(void) { UErrorCode status = U_ZERO_ERROR; UnicodeString fmtString(fmt, -1, US_INV); - PluralFormat pf(fmtString, status); + PluralFormat pf(Locale::getEnglish(), fmtString, status); + MessageFormat mf(UNICODE_STRING_SIMPLE("{0,plural,").append(fmtString).append((UChar)0x7d /* '}' */), + Locale::getEnglish(), status); + Formattable args; + FieldPosition ignore; if (U_FAILURE(status)) { dataerrln("Failed to apply pattern - %s", u_errorName(status)); return; @@ -526,18 +530,32 @@ PluralFormatTest::pluralFormatExtendedTest(void) { for (int i = 0; i < 7; ++i) { UnicodeString result = pf.format(i, status); if (U_FAILURE(status)) { - errln("Failed to format - %s", u_errorName(status)); + errln("PluralFormat.format(value %d) failed - %s", i, u_errorName(status)); + return; } UnicodeString expected(targets[i], -1, US_INV); if (expected != result) { - UnicodeString message("Expected '", -1, US_INV); + UnicodeString message("PluralFormat.format(): Expected '", -1, US_INV); message.append(expected); message.append(UnicodeString("' but got '", -1, US_INV)); message.append(result); message.append("'", -1, US_INV); errln(message); + } + args.setLong(i); + mf.format(&args, 1, result.remove(), ignore, status); + if (U_FAILURE(status)) { + errln("MessageFormat.format(value %d) failed - %s", i, u_errorName(status)); return; } + if (expected != result) { + UnicodeString message("MessageFormat.format(): Expected '", -1, US_INV); + message.append(expected); + message.append(UnicodeString("' but got '", -1, US_INV)); + message.append(result); + message.append("'", -1, US_INV); + errln(message); + } } } -- 2.40.0