mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-13 08:53:20 +00:00
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:
parent
37d5ca4c7b
commit
fefba73e1d
5 changed files with 65 additions and 24 deletions
icu4c/source
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
4
icu4c/source/test/testdata/dcfmtest.txt
vendored
4
icu4c/source/test/testdata/dcfmtest.txt
vendored
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue