From fefba73e1ddafd5ee42c7d82b0cb7a02cee211eb Mon Sep 17 00:00:00 2001 From: Yoshito Umaoka Date: Mon, 18 Jun 2012 14:14:22 +0000 Subject: [PATCH] ICU-9258 Updated format/DecimalFormatTest/DataDrivenTests to format StringPiece in addition to DigitList. Fixed an error status problem (not returning U_FORMAT_INEXACT_ERROR) found by the StringPiece test. X-SVN-Rev: 31961 --- icu4c/source/i18n/decimfmt.cpp | 28 +++++++++++------ icu4c/source/i18n/unicode/decimfmt.h | 6 ++-- icu4c/source/test/intltest/dcfmtest.cpp | 41 +++++++++++++++++++------ icu4c/source/test/intltest/dcfmtest.h | 10 +++++- icu4c/source/test/testdata/dcfmtest.txt | 4 +-- 5 files changed, 65 insertions(+), 24 deletions(-) diff --git a/icu4c/source/i18n/decimfmt.cpp b/icu4c/source/i18n/decimfmt.cpp index 1a31b876fa1..986243e62e6 100644 --- a/icu4c/source/i18n/decimfmt.cpp +++ b/icu4c/source/i18n/decimfmt.cpp @@ -1031,6 +1031,8 @@ void DecimalFormat::handleChanged() { debug("No fastpath: fMinFractionDigits>0"); } else if(fCurrencySignCount > fgCurrencySignCountZero) { debug("No fastpath: fCurrencySignCount > fgCurrencySignCountZero"); + } else if(fRoundingIncrement!=0) { + debug("No fastpath: fRoundingIncrement!=0"); } else { data.fFastpathStatus = kFastpathYES; debug("kFastpathYES!"); @@ -1044,8 +1046,9 @@ DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& fieldPosition) const { - FieldPositionOnlyHandler handler(fieldPosition); - return _format(number, appendTo, handler); + UErrorCode status = U_ZERO_ERROR; + FieldPositionOnlyHandler handler(fieldPosition); + return _format(number, appendTo, handler, status); } UnicodeString& @@ -1055,16 +1058,19 @@ DecimalFormat::format(int64_t number, UErrorCode& status) const { FieldPositionIteratorHandler handler(posIter, status); - return _format(number, appendTo, handler); + return _format(number, appendTo, handler, status); } UnicodeString& DecimalFormat::_format(int64_t number, UnicodeString& appendTo, - FieldPositionHandler& handler) const + FieldPositionHandler& handler, + UErrorCode &status) const { // Bottleneck function for formatting int64_t - UErrorCode status = U_ZERO_ERROR; + if (U_FAILURE(status)) { + return appendTo; + } #if UCONFIG_FORMAT_FASTPATHS_49 // const UnicodeString *posPrefix = fPosPrefixPattern; @@ -1148,8 +1154,9 @@ DecimalFormat::format( double number, UnicodeString& appendTo, FieldPosition& fieldPosition) const { + UErrorCode status = U_ZERO_ERROR; FieldPositionOnlyHandler handler(fieldPosition); - return _format(number, appendTo, handler); + return _format(number, appendTo, handler, status); } UnicodeString& @@ -1159,14 +1166,18 @@ DecimalFormat::format( double number, UErrorCode& status) const { FieldPositionIteratorHandler handler(posIter, status); - return _format(number, appendTo, handler); + return _format(number, appendTo, handler, status); } UnicodeString& DecimalFormat::_format( double number, UnicodeString& appendTo, - FieldPositionHandler& handler) const + FieldPositionHandler& handler, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return appendTo; + } // Special case for NaN, sets the begin and end index to be the // the string length of localized name of NaN. // TODO: let NaNs go through DigitList. @@ -1181,7 +1192,6 @@ DecimalFormat::_format( double number, return appendTo; } - UErrorCode status = U_ZERO_ERROR; DigitList digits; digits.set(number); _format(digits, appendTo, handler, status); diff --git a/icu4c/source/i18n/unicode/decimfmt.h b/icu4c/source/i18n/unicode/decimfmt.h index f483cffed2e..4c44ce171d7 100644 --- a/icu4c/source/i18n/unicode/decimfmt.h +++ b/icu4c/source/i18n/unicode/decimfmt.h @@ -2109,10 +2109,12 @@ private: UnicodeString& _format(int64_t number, UnicodeString& appendTo, - FieldPositionHandler& handler) const; + FieldPositionHandler& handler, + UErrorCode &status) const; UnicodeString& _format(double number, UnicodeString& appendTo, - FieldPositionHandler& handler) const; + FieldPositionHandler& handler, + UErrorCode &status) const; UnicodeString& _format(const DigitList &number, UnicodeString& appendTo, FieldPositionHandler& handler, diff --git a/icu4c/source/test/intltest/dcfmtest.cpp b/icu4c/source/test/intltest/dcfmtest.cpp index 6a55e7a0100..89788b5cb56 100644 --- a/icu4c/source/test/intltest/dcfmtest.cpp +++ b/icu4c/source/test/intltest/dcfmtest.cpp @@ -280,6 +280,15 @@ void DecimalFormatTest::DataDrivenTests() { formatLineMat.group(2, status), // rounding mode formatLineMat.group(3, status), // input decimal number formatLineMat.group(4, status), // expected formatted result + kFormattable, + status); + + execFormatTest(lineNum, + formatLineMat.group(1, status), // Pattern + formatLineMat.group(2, status), // rounding mode + formatLineMat.group(3, status), // input decimal number + formatLineMat.group(4, status), // expected formatted result + kStringPiece, status); continue; } @@ -368,6 +377,7 @@ void DecimalFormatTest::execFormatTest(int32_t lineNum, const UnicodeString &round, // rounding mode const UnicodeString &input, // input decimal number const UnicodeString &expected, // expected formatted result + EFormatInputType inType, // input number type UErrorCode &status) { if (U_FAILURE(status)) { return; @@ -404,31 +414,42 @@ void DecimalFormatTest::execFormatTest(int32_t lineNum, errln("file dcfmtest.txt, line %d: Bad rounding mode \"%s\"", lineNum, UnicodeStringPiece(round).data()); } - + + const char *typeStr; UnicodeString result; UnicodeStringPiece spInput(input); - //fmtr.format(spInput, result, NULL, status); - Formattable fmtbl; - fmtbl.setDecimalNumber(spInput, status); - //NumberFormat &nfmtr = fmtr; - fmtr.format(fmtbl, result, NULL, status); + switch (inType) { + case kFormattable: + { + typeStr = "Formattable"; + Formattable fmtbl; + fmtbl.setDecimalNumber(spInput, status); + fmtr.format(fmtbl, result, NULL, status); + } + break; + case kStringPiece: + typeStr = "StringPiece"; + fmtr.format(spInput, result, NULL, status); + break; + } if ((status == U_FORMAT_INEXACT_ERROR) && (result == "") && (expected == "Inexact")) { // Test succeeded. status = U_ZERO_ERROR; return; } + if (U_FAILURE(status)) { - errln("file dcfmtest.txt, line %d: format() returned %s.", - lineNum, u_errorName(status)); + errln("[%s] file dcfmtest.txt, line %d: format() returned %s.", + typeStr, lineNum, u_errorName(status)); status = U_ZERO_ERROR; return; } if (result != expected) { - errln("file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", - lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data()); + errln("[%s] file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", + typeStr, lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data()); } } diff --git a/icu4c/source/test/intltest/dcfmtest.h b/icu4c/source/test/intltest/dcfmtest.h index 87444b3dfda..7379ff19af2 100644 --- a/icu4c/source/test/intltest/dcfmtest.h +++ b/icu4c/source/test/intltest/dcfmtest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2010, International Business Machines Corporation and + * Copyright (c) 2010-2012, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -41,11 +41,19 @@ public: const UnicodeString &expectedDecimal, UErrorCode &status); +private: + enum EFormatInputType { + kFormattable, + kStringPiece + }; + +public: virtual void execFormatTest(int32_t lineNum, const UnicodeString &pattern, const UnicodeString &round, const UnicodeString &input, const UnicodeString &expected, + EFormatInputType inType, UErrorCode &status); }; diff --git a/icu4c/source/test/testdata/dcfmtest.txt b/icu4c/source/test/testdata/dcfmtest.txt index a08bac9a6a6..041e1dbbbd6 100644 --- a/icu4c/source/test/testdata/dcfmtest.txt +++ b/icu4c/source/test/testdata/dcfmtest.txt @@ -1,5 +1,4 @@ - -# Note: Please make sure that this utf-8 file contains a BOM. +# Note: Please make sure that this utf-8 file contains a BOM. # Copyright (c) 2011-2012, International Business Machines Corporation and # others. All Rights Reserved. # @@ -64,6 +63,7 @@ format 00.##E0 default "1234567" "12.35E5" format 00.##E0 default "1234567E111" "12.35E116" format 00.##E0 default "-1234567E111" "-12.35E116" +format 0005 default "1234" "1235" # # Rounding Modes