From 8b67b86c7919f2d6f5df103bba0f82becdcc891b Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Mon, 7 May 2018 22:07:43 +0000 Subject: [PATCH] ICU-12567 port NumberFormatTest.Test12567 to C++ X-SVN-Rev: 41335 --- icu4c/source/i18n/decimfmt.cpp | 6 +++++- icu4c/source/test/intltest/numfmtst.cpp | 19 +++++++++++++++++++ icu4c/source/test/intltest/numfmtst.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/icu4c/source/i18n/decimfmt.cpp b/icu4c/source/i18n/decimfmt.cpp index 662325bcc9e..8e37bd2e84e 100644 --- a/icu4c/source/i18n/decimfmt.cpp +++ b/icu4c/source/i18n/decimfmt.cpp @@ -623,7 +623,11 @@ void DecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) { } void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) { - *fields->properties->currencyPluralInfo.fPtr = info; // copy-assignment operator + if (fields->properties->currencyPluralInfo.fPtr.isNull()) { + fields->properties->currencyPluralInfo.fPtr.adoptInstead(info.clone()); + } else { + *fields->properties->currencyPluralInfo.fPtr = info; // copy-assignment operator + } touchNoError(); } diff --git a/icu4c/source/test/intltest/numfmtst.cpp b/icu4c/source/test/intltest/numfmtst.cpp index 754679b6d7e..e5178ed63f5 100644 --- a/icu4c/source/test/intltest/numfmtst.cpp +++ b/icu4c/source/test/intltest/numfmtst.cpp @@ -665,6 +665,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n TESTCASE_AUTO(Test11897_LocalizedPatternSeparator); TESTCASE_AUTO(Test10354); TESTCASE_AUTO(Test11645_ApplyPatternEquality); + TESTCASE_AUTO(Test12567); TESTCASE_AUTO_END; } @@ -9220,4 +9221,22 @@ void NumberFormatTest::Test11645_ApplyPatternEquality() { assertFalse("currencyUsage", *fmt == *fmtCopy); } +void NumberFormatTest::Test12567() { + IcuTestErrorCode errorCode(*this, "Test12567"); + // Ticket #12567: DecimalFormat.equals() may not be symmetric + LocalPointer df1((DecimalFormat *) + NumberFormat::createInstance(Locale::getUS(), UNUM_CURRENCY_PLURAL, errorCode)); + LocalPointer df2((DecimalFormat *) + NumberFormat::createInstance(Locale::getUS(), UNUM_DECIMAL, errorCode)); + df2->setCurrency(df1->getCurrency()); + df2->setCurrencyPluralInfo(*df1->getCurrencyPluralInfo()); + df1->applyPattern(u"0.00", errorCode); + df2->applyPattern(u"0.00", errorCode); + // TODO(shane): assertTrue("df1 == df2", *df1 == *df2); + // TODO(shane): assertTrue("df2 == df1", *df2 == *df1); + df2->setPositivePrefix(u"abc"); + assertTrue("df1 != df2", *df1 != *df2); + assertTrue("df2 != df1", *df2 != *df1); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/numfmtst.h b/icu4c/source/test/intltest/numfmtst.h index af0bd5bf11d..8a5b35681a5 100644 --- a/icu4c/source/test/intltest/numfmtst.h +++ b/icu4c/source/test/intltest/numfmtst.h @@ -230,6 +230,7 @@ class NumberFormatTest: public CalendarTimeZoneTest { void Test11897_LocalizedPatternSeparator(); void Test10354(); void Test11645_ApplyPatternEquality(); + void Test12567(); private: UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f); -- 2.50.0