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
This commit is contained in:
Yoshito Umaoka 2012-06-18 14:14:22 +00:00
parent 37d5ca4c7b
commit fefba73e1d
5 changed files with 65 additions and 24 deletions
icu4c/source

View file

@ -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);

View file

@ -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,

View file

@ -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());
}
}

View file

@ -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);
};

View file

@ -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