diff --git a/icu4c/source/test/intltest/numfmtst.cpp b/icu4c/source/test/intltest/numfmtst.cpp index 41622220702..7baf98538d6 100644 --- a/icu4c/source/test/intltest/numfmtst.cpp +++ b/icu4c/source/test/intltest/numfmtst.cpp @@ -594,6 +594,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n TESTCASE_AUTO(TestCurrencyAmount); TESTCASE_AUTO(TestCurrencyUnit); TESTCASE_AUTO(TestCoverage); + TESTCASE_AUTO(TestLocalizedPatternSymbolCoverage); TESTCASE_AUTO(TestJB3832); TESTCASE_AUTO(TestHost); TESTCASE_AUTO(TestHostClone); @@ -764,6 +765,58 @@ NumberFormatTest::TestCoverage(void){ }; } +void NumberFormatTest::TestLocalizedPatternSymbolCoverage() { + IcuTestErrorCode errorCode(*this, "TestLocalizedPatternSymbolCoverage"); + // Ticket #12961: DecimalFormat::toLocalizedPattern() is not working as designed. + DecimalFormatSymbols dfs(errorCode); + dfs.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, u'⁖'); + dfs.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, u'⁘'); + dfs.setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, u'⁙'); + dfs.setSymbol(DecimalFormatSymbols::kDigitSymbol, u'▰'); + dfs.setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, u'໐'); + dfs.setSymbol(DecimalFormatSymbols::kSignificantDigitSymbol, u'⁕'); + dfs.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, u'†'); + dfs.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, u'‡'); + dfs.setSymbol(DecimalFormatSymbols::kPercentSymbol, u'⁜'); + dfs.setSymbol(DecimalFormatSymbols::kPerMillSymbol, u'‱'); + dfs.setSymbol(DecimalFormatSymbols::kExponentialSymbol, u"⁑⁑"); // tests multi-char sequence + dfs.setSymbol(DecimalFormatSymbols::kPadEscapeSymbol, u'⁂'); + + { + UnicodeString standardPattern(u"#,##0.05+%;#,##0.05-%"); + UnicodeString localizedPattern(u"▰⁖▰▰໐⁘໐໕†⁜⁙▰⁖▰▰໐⁘໐໕‡⁜"); + + DecimalFormat df1("#", new DecimalFormatSymbols(dfs), errorCode); + df1.applyPattern(standardPattern, errorCode); + DecimalFormat df2("#", new DecimalFormatSymbols(dfs), errorCode); + df2.applyLocalizedPattern(localizedPattern, errorCode); + assertTrue("DecimalFormat instances should be equal", df1 == df2); + UnicodeString p2; + assertEquals("toPattern should match on localizedPattern instance", + standardPattern, df2.toPattern(p2)); + UnicodeString lp1; + assertEquals("toLocalizedPattern should match on standardPattern instance", + localizedPattern, df1.toLocalizedPattern(lp1)); + } + + { + UnicodeString standardPattern(u"* @@@E0‰"); + UnicodeString localizedPattern(u"⁂ ⁕⁕⁕⁑⁑໐‱"); + + DecimalFormat df1("#", new DecimalFormatSymbols(dfs), errorCode); + df1.applyPattern(standardPattern, errorCode); + DecimalFormat df2("#", new DecimalFormatSymbols(dfs), errorCode); + df2.applyLocalizedPattern(localizedPattern, errorCode); + assertTrue("DecimalFormat instances should be equal", df1 == df2); + UnicodeString p2; + assertEquals("toPattern should match on localizedPattern instance", + standardPattern, df2.toPattern(p2)); + UnicodeString lp1; + assertEquals("toLocalizedPattern should match on standardPattern instance", + localizedPattern, df1.toLocalizedPattern(lp1)); + } +} + // Test various patterns void NumberFormatTest::TestPatterns(void) diff --git a/icu4c/source/test/intltest/numfmtst.h b/icu4c/source/test/intltest/numfmtst.h index 5147ef93b6c..6634cd30677 100644 --- a/icu4c/source/test/intltest/numfmtst.h +++ b/icu4c/source/test/intltest/numfmtst.h @@ -45,6 +45,7 @@ class NumberFormatTest: public CalendarTimeZoneTest { void TestAPI(void); void TestCoverage(void); + void TestLocalizedPatternSymbolCoverage(); /** * Test the handling of quotes