| Index: source/test/intltest/numfmtst.cpp
|
| diff --git a/source/test/intltest/numfmtst.cpp b/source/test/intltest/numfmtst.cpp
|
| index 8ae1945a6e92c85089657a04d8ef0ff81acd9d60..92d59bfa934659bb4c66c55334102a3fac2fc03a 100644
|
| --- a/source/test/intltest/numfmtst.cpp
|
| +++ b/source/test/intltest/numfmtst.cpp
|
| @@ -1,6 +1,6 @@
|
| /********************************************************************
|
| * COPYRIGHT:
|
| - * Copyright (c) 1997-2014, International Business Machines Corporation and
|
| + * Copyright (c) 1997-2015, International Business Machines Corporation and
|
| * others. All Rights Reserved.
|
| ********************************************************************/
|
| /* Modification History:
|
| @@ -32,6 +32,435 @@
|
| #include "cstring.h"
|
| #include "unicode/numsys.h"
|
| #include "fmtableimp.h"
|
| +#include "numberformattesttuple.h"
|
| +#include "datadrivennumberformattestsuite.h"
|
| +#include "unicode/msgfmt.h"
|
| +
|
| +class NumberFormatTestDataDriven : public DataDrivenNumberFormatTestSuite {
|
| +protected:
|
| +UBool isFormatPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status);
|
| +UBool isToPatternPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status);
|
| +UBool isParsePass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status);
|
| +UBool isParseCurrencyPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status);
|
| +};
|
| +
|
| +static DigitList &strToDigitList(
|
| + const UnicodeString &str,
|
| + DigitList &digitList,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return digitList;
|
| + }
|
| + if (str == "NaN") {
|
| + digitList.set(uprv_getNaN());
|
| + return digitList;
|
| + }
|
| + if (str == "-Inf") {
|
| + digitList.set(-1*uprv_getInfinity());
|
| + return digitList;
|
| + }
|
| + if (str == "Inf") {
|
| + digitList.set(uprv_getInfinity());
|
| + return digitList;
|
| + }
|
| + CharString formatValue;
|
| + formatValue.appendInvariantChars(str, status);
|
| + digitList.set(StringPiece(formatValue.data()), status, 0);
|
| + return digitList;
|
| +}
|
| +
|
| +static UnicodeString &format(
|
| + const DecimalFormat &fmt,
|
| + const DigitList &digitList,
|
| + UnicodeString &appendTo,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return appendTo;
|
| + }
|
| + FieldPosition fpos(FieldPosition::DONT_CARE);
|
| + return fmt.format(digitList, appendTo, fpos, status);
|
| +}
|
| +
|
| +template<class T>
|
| +static UnicodeString &format(
|
| + const DecimalFormat &fmt,
|
| + T value,
|
| + UnicodeString &appendTo,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return appendTo;
|
| + }
|
| + FieldPosition fpos(FieldPosition::DONT_CARE);
|
| + return fmt.format(value, appendTo, fpos, status);
|
| +}
|
| +
|
| +static void adjustDecimalFormat(
|
| + const NumberFormatTestTuple &tuple,
|
| + DecimalFormat &fmt,
|
| + UnicodeString &appendErrorMessage) {
|
| + if (tuple.minIntegerDigitsFlag) {
|
| + fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
|
| + }
|
| + if (tuple.maxIntegerDigitsFlag) {
|
| + fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
|
| + }
|
| + if (tuple.minFractionDigitsFlag) {
|
| + fmt.setMinimumFractionDigits(tuple.minFractionDigits);
|
| + }
|
| + if (tuple.maxFractionDigitsFlag) {
|
| + fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
|
| + }
|
| + if (tuple.currencyFlag) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString currency(tuple.currency);
|
| + const UChar *terminatedCurrency = currency.getTerminatedBuffer();
|
| + fmt.setCurrency(terminatedCurrency, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error setting currency.");
|
| + }
|
| + }
|
| + if (tuple.minGroupingDigitsFlag) {
|
| + fmt.setMinimumGroupingDigits(tuple.minGroupingDigits);
|
| + }
|
| + if (tuple.useSigDigitsFlag) {
|
| + fmt.setSignificantDigitsUsed(tuple.useSigDigits != 0);
|
| + }
|
| + if (tuple.minSigDigitsFlag) {
|
| + fmt.setMinimumSignificantDigits(tuple.minSigDigits);
|
| + }
|
| + if (tuple.maxSigDigitsFlag) {
|
| + fmt.setMaximumSignificantDigits(tuple.maxSigDigits);
|
| + }
|
| + if (tuple.useGroupingFlag) {
|
| + fmt.setGroupingUsed(tuple.useGrouping != 0);
|
| + }
|
| + if (tuple.multiplierFlag) {
|
| + fmt.setMultiplier(tuple.multiplier);
|
| + }
|
| + if (tuple.roundingIncrementFlag) {
|
| + fmt.setRoundingIncrement(tuple.roundingIncrement);
|
| + }
|
| + if (tuple.formatWidthFlag) {
|
| + fmt.setFormatWidth(tuple.formatWidth);
|
| + }
|
| + if (tuple.padCharacterFlag) {
|
| + fmt.setPadCharacter(tuple.padCharacter);
|
| + }
|
| + if (tuple.useScientificFlag) {
|
| + fmt.setScientificNotation(tuple.useScientific != 0);
|
| + }
|
| + if (tuple.groupingFlag) {
|
| + fmt.setGroupingSize(tuple.grouping);
|
| + }
|
| + if (tuple.grouping2Flag) {
|
| + fmt.setSecondaryGroupingSize(tuple.grouping2);
|
| + }
|
| + if (tuple.roundingModeFlag) {
|
| + fmt.setRoundingMode(tuple.roundingMode);
|
| + }
|
| + if (tuple.currencyUsageFlag) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + fmt.setCurrencyUsage(tuple.currencyUsage, &status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("CurrencyUsage: error setting.");
|
| + }
|
| + }
|
| + if (tuple.minimumExponentDigitsFlag) {
|
| + fmt.setMinimumExponentDigits(tuple.minimumExponentDigits);
|
| + }
|
| + if (tuple.exponentSignAlwaysShownFlag) {
|
| + fmt.setExponentSignAlwaysShown(tuple.exponentSignAlwaysShown != 0);
|
| + }
|
| + if (tuple.decimalSeparatorAlwaysShownFlag) {
|
| + fmt.setDecimalSeparatorAlwaysShown(
|
| + tuple.decimalSeparatorAlwaysShown != 0);
|
| + }
|
| + if (tuple.padPositionFlag) {
|
| + fmt.setPadPosition(tuple.padPosition);
|
| + }
|
| + if (tuple.positivePrefixFlag) {
|
| + fmt.setPositivePrefix(tuple.positivePrefix);
|
| + }
|
| + if (tuple.positiveSuffixFlag) {
|
| + fmt.setPositiveSuffix(tuple.positiveSuffix);
|
| + }
|
| + if (tuple.negativePrefixFlag) {
|
| + fmt.setNegativePrefix(tuple.negativePrefix);
|
| + }
|
| + if (tuple.negativeSuffixFlag) {
|
| + fmt.setNegativeSuffix(tuple.negativeSuffix);
|
| + }
|
| + if (tuple.localizedPatternFlag) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + fmt.applyLocalizedPattern(tuple.localizedPattern, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error setting localized pattern.");
|
| + }
|
| + }
|
| + fmt.setLenient(NFTT_GET_FIELD(tuple, lenient, 1) != 0);
|
| + if (tuple.parseIntegerOnlyFlag) {
|
| + fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
|
| + }
|
| + if (tuple.decimalPatternMatchRequiredFlag) {
|
| + fmt.setDecimalPatternMatchRequired(
|
| + tuple.decimalPatternMatchRequired != 0);
|
| + }
|
| + if (tuple.parseNoExponentFlag) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + fmt.setAttribute(
|
| + UNUM_PARSE_NO_EXPONENT,
|
| + tuple.parseNoExponent,
|
| + status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error setting parse no exponent flag.");
|
| + }
|
| + }
|
| +}
|
| +
|
| +static DecimalFormat *newDecimalFormat(
|
| + const Locale &locale,
|
| + const UnicodeString &pattern,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + LocalPointer<DecimalFormatSymbols> symbols(
|
| + new DecimalFormatSymbols(locale, status), status);
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + UParseError perror;
|
| + LocalPointer<DecimalFormat> result(new DecimalFormat(
|
| + pattern, symbols.getAlias(), perror, status), status);
|
| + if (!result.isNull()) {
|
| + symbols.orphan();
|
| + }
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + return result.orphan();
|
| +}
|
| +
|
| +static DecimalFormat *newDecimalFormat(
|
| + const NumberFormatTestTuple &tuple,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + Locale en("en");
|
| + return newDecimalFormat(
|
| + NFTT_GET_FIELD(tuple, locale, en),
|
| + NFTT_GET_FIELD(tuple, pattern, "0"),
|
| + status);
|
| +}
|
| +
|
| +UBool NumberFormatTestDataDriven::isFormatPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return FALSE;
|
| + }
|
| + LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error creating DecimalFormat.");
|
| + return FALSE;
|
| + }
|
| + adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
|
| + if (appendErrorMessage.length() > 0) {
|
| + return FALSE;
|
| + }
|
| + DigitList digitList;
|
| + strToDigitList(tuple.format, digitList, status);
|
| + {
|
| + UnicodeString appendTo;
|
| + format(*fmtPtr, digitList, appendTo, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error formatting.");
|
| + return FALSE;
|
| + }
|
| + if (appendTo != tuple.output) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("Expected: ") + tuple.output + ", got: " + appendTo);
|
| + return FALSE;
|
| + }
|
| + }
|
| + double doubleVal = digitList.getDouble();
|
| + {
|
| + UnicodeString appendTo;
|
| + format(*fmtPtr, doubleVal, appendTo, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error formatting.");
|
| + return FALSE;
|
| + }
|
| + if (appendTo != tuple.output) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("double Expected: ") + tuple.output + ", got: " + appendTo);
|
| + return FALSE;
|
| + }
|
| + }
|
| + if (!uprv_isNaN(doubleVal) && !uprv_isInfinite(doubleVal) && doubleVal == uprv_floor(doubleVal)) {
|
| + int64_t intVal = digitList.getInt64();
|
| + {
|
| + UnicodeString appendTo;
|
| + format(*fmtPtr, intVal, appendTo, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error formatting.");
|
| + return FALSE;
|
| + }
|
| + if (appendTo != tuple.output) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("int64 Expected: ") + tuple.output + ", got: " + appendTo);
|
| + return FALSE;
|
| + }
|
| + }
|
| + }
|
| + return TRUE;
|
| +}
|
| +
|
| +UBool NumberFormatTestDataDriven::isToPatternPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return FALSE;
|
| + }
|
| + LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error creating DecimalFormat.");
|
| + return FALSE;
|
| + }
|
| + adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
|
| + if (appendErrorMessage.length() > 0) {
|
| + return FALSE;
|
| + }
|
| + if (tuple.toPatternFlag) {
|
| + UnicodeString actual;
|
| + fmtPtr->toPattern(actual);
|
| + if (actual != tuple.toPattern) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("Expected: ") + tuple.toPattern + ", got: " + actual + ". ");
|
| + }
|
| + }
|
| + if (tuple.toLocalizedPatternFlag) {
|
| + UnicodeString actual;
|
| + fmtPtr->toLocalizedPattern(actual);
|
| + if (actual != tuple.toLocalizedPattern) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("Expected: ") + tuple.toLocalizedPattern + ", got: " + actual + ". ");
|
| + }
|
| + }
|
| + return appendErrorMessage.length() == 0;
|
| +}
|
| +
|
| +UBool NumberFormatTestDataDriven::isParsePass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return FALSE;
|
| + }
|
| + LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error creating DecimalFormat.");
|
| + return FALSE;
|
| + }
|
| + adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
|
| + if (appendErrorMessage.length() > 0) {
|
| + return FALSE;
|
| + }
|
| + Formattable result;
|
| + ParsePosition ppos;
|
| + fmtPtr->parse(tuple.parse, result, ppos);
|
| + if (ppos.getIndex() == 0) {
|
| + if (tuple.output != "fail") {
|
| + appendErrorMessage.append("Parse failed but was expected to succeed.");
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| + }
|
| + UnicodeString resultStr(UnicodeString::fromUTF8(result.getDecimalNumber(status)));
|
| + if (tuple.output == "fail") {
|
| + appendErrorMessage.append(UnicodeString("Parse succeeded: ") + resultStr + ", but was expected to fail.");
|
| + return FALSE;
|
| + }
|
| + DigitList expected;
|
| + strToDigitList(tuple.output, expected, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error parsing.");
|
| + return FALSE;
|
| + }
|
| + if (expected != *result.getDigitList()) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("Expected: ") + tuple.output + ", got: " + resultStr + ". ");
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| +}
|
| +
|
| +UBool NumberFormatTestDataDriven::isParseCurrencyPass(
|
| + const NumberFormatTestTuple &tuple,
|
| + UnicodeString &appendErrorMessage,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return FALSE;
|
| + }
|
| + LocalPointer<DecimalFormat> fmtPtr(newDecimalFormat(tuple, status));
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error creating DecimalFormat.");
|
| + return FALSE;
|
| + }
|
| + adjustDecimalFormat(tuple, *fmtPtr, appendErrorMessage);
|
| + if (appendErrorMessage.length() > 0) {
|
| + return FALSE;
|
| + }
|
| + ParsePosition ppos;
|
| + LocalPointer<CurrencyAmount> currAmt(
|
| + fmtPtr->parseCurrency(tuple.parse, ppos));
|
| + if (ppos.getIndex() == 0) {
|
| + if (tuple.output != "fail") {
|
| + appendErrorMessage.append("Parse failed but was expected to succeed.");
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| + }
|
| + UnicodeString currStr(currAmt->getISOCurrency());
|
| + Formattable resultFormattable(currAmt->getNumber());
|
| + UnicodeString resultStr(UnicodeString::fromUTF8(resultFormattable.getDecimalNumber(status)));
|
| + if (tuple.output == "fail") {
|
| + appendErrorMessage.append(UnicodeString("Parse succeeded: ") + resultStr + ", but was expected to fail.");
|
| + return FALSE;
|
| + }
|
| + DigitList expected;
|
| + strToDigitList(tuple.output, expected, status);
|
| + if (U_FAILURE(status)) {
|
| + appendErrorMessage.append("Error parsing.");
|
| + return FALSE;
|
| + }
|
| + if (expected != *currAmt->getNumber().getDigitList()) {
|
| + appendErrorMessage.append(
|
| + UnicodeString("Expected: ") + tuple.output + ", got: " + resultStr + ". ");
|
| + return FALSE;
|
| + }
|
| + if (currStr != tuple.outputCurrency) {
|
| + appendErrorMessage.append(UnicodeString(
|
| + "Expected currency: ") + tuple.outputCurrency + ", got: " + currStr + ". ");
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| +}
|
|
|
| //#define NUMFMTST_CACHE_DEBUG 1
|
| #include "stdio.h" /* for sprintf */
|
| @@ -133,6 +562,22 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
|
| TESTCASE_AUTO(TestAccountingCurrency);
|
| TESTCASE_AUTO(TestEquality);
|
| TESTCASE_AUTO(TestCurrencyUsage);
|
| + TESTCASE_AUTO(TestNumberFormatTestTuple);
|
| + TESTCASE_AUTO(TestDataDriven);
|
| + TESTCASE_AUTO(TestDoubleLimit11439);
|
| + TESTCASE_AUTO(TestFastPathConsistent11524);
|
| + TESTCASE_AUTO(TestGetAffixes);
|
| + TESTCASE_AUTO(TestToPatternScientific11648);
|
| + TESTCASE_AUTO(TestBenchmark);
|
| + TESTCASE_AUTO(TestCtorApplyPatternDifference);
|
| + TESTCASE_AUTO(TestFractionalDigitsForCurrency);
|
| + TESTCASE_AUTO(TestFormatCurrencyPlural);
|
| + TESTCASE_AUTO(Test11868);
|
| + TESTCASE_AUTO(Test10727_RoundingZero);
|
| + TESTCASE_AUTO(Test11376_getAndSetPositivePrefix);
|
| + TESTCASE_AUTO(Test11475_signRecognition);
|
| + TESTCASE_AUTO(Test11640_getAffixes);
|
| + TESTCASE_AUTO(Test11649_toPatternWithMultiCurrency);
|
| TESTCASE_AUTO_END;
|
| }
|
|
|
| @@ -515,6 +960,10 @@ void
|
| NumberFormatTest::TestInt64() {
|
| UErrorCode status = U_ZERO_ERROR;
|
| DecimalFormat fmt("#.#E0",status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| fmt.setMaximumFractionDigits(20);
|
| if (U_SUCCESS(status)) {
|
| expect(fmt, (Formattable)(int64_t)0, "0E0");
|
| @@ -1843,15 +2292,15 @@ void NumberFormatTest::TestCurrencyNames(void) {
|
| UCURR_SYMBOL_NAME,
|
| &isChoiceFormat, &len, &ec)),
|
| possibleDataError);
|
| - assertEquals("USD.getName(SYMBOL_NAME) in en_AU",
|
| + assertEquals("USD.getName(SYMBOL_NAME) in en_NZ",
|
| UnicodeString("US$"),
|
| - UnicodeString(ucurr_getName(USD, "en_AU",
|
| + UnicodeString(ucurr_getName(USD, "en_NZ",
|
| UCURR_SYMBOL_NAME,
|
| &isChoiceFormat, &len, &ec)),
|
| possibleDataError);
|
| assertEquals("CAD.getName(SYMBOL_NAME)",
|
| UnicodeString("CA$"),
|
| - UnicodeString(ucurr_getName(CAD, "en_AU",
|
| + UnicodeString(ucurr_getName(CAD, "en_NZ",
|
| UCURR_SYMBOL_NAME,
|
| &isChoiceFormat, &len, &ec)),
|
| possibleDataError);
|
| @@ -3387,19 +3836,17 @@ NumberFormatTest::TestCurrencyIsoPluralFormat() {
|
| {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
|
| {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
|
| {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
|
| - {"zh_CN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00\\u7F8E\\u5143"},
|
| - {"zh_CN", "1234.56", "USD", "US$\\u00A01,234.56", "USD\\u00A01,234.56", "1,234.56\\u7F8E\\u5143"},
|
| - // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"},
|
| - // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"},
|
| - {"zh_CN", "1", "CNY", "\\uFFE5\\u00A01.00", "CNY\\u00A01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
|
| - {"zh_CN", "1234.56", "CNY", "\\uFFE5\\u00A01,234.56", "CNY\\u00A01,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"},
|
| - {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| - {"ru_RU", "2", "RUB", "2,00\\u00A0\\u0440\\u0443\\u0431.", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| - {"ru_RU", "5", "RUB", "5,00\\u00A0\\u0440\\u0443\\u0431.", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00\\u7F8E\\u5143"},
|
| + {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56\\u7F8E\\u5143"},
|
| + {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY1.00", "1.00\\u4EBA\\u6C11\\u5E01"},
|
| + {"zh_CN", "1234.56", "CNY", "\\uFFE51,234.56", "CNY1,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"},
|
| + {"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + {"ru_RU", "2", "RUB", "2,00\\u00A0\\u20BD", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| + {"ru_RU", "5", "RUB", "5,00\\u00A0\\u20BD", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
|
| // test locale without currency information
|
| {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"},
|
| // test choice format
|
| - {"es_AR", "1", "INR", "INR1,00", "INR1,00", "1,00 rupia india"},
|
| + {"es_AR", "1", "INR", "INR\\u00A01,00", "INR\\u00A01,00", "1,00 rupia india"},
|
| };
|
| static const UNumberFormatStyle currencyStyles[] = {
|
| UNUM_CURRENCY,
|
| @@ -3482,7 +3929,7 @@ NumberFormatTest::TestCurrencyParsing() {
|
| // format result using PLURALCURRENCYSTYLE,
|
| {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollar"},
|
| {"pa_IN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00 \\u0a2f\\u0a42.\\u0a10\\u0a38. \\u0a21\\u0a3e\\u0a32\\u0a30"},
|
| - {"es_AR", "1", "USD", "US$1,00", "USD1,00", "1,00 d\\u00f3lar estadounidense"},
|
| + {"es_AR", "1", "USD", "US$\\u00A01,00", "USD\\u00A01,00", "1,00 d\\u00f3lar estadounidense"},
|
| {"ar_EG", "1", "USD", "US$\\u00a0\\u0661\\u066b\\u0660\\u0660", "USD\\u00a0\\u0661\\u066b\\u0660\\u0660", "\\u0661\\u066b\\u0660\\u0660 \\u062f\\u0648\\u0644\\u0627\\u0631 \\u0623\\u0645\\u0631\\u064a\\u0643\\u064a"},
|
| {"fa_CA", "1", "USD", "\\u200e$\\u06f1\\u066b\\u06f0\\u06f0", "\\u200eUSD\\u06f1\\u066b\\u06f0\\u06f0", "\\u200e\\u062f\\u0644\\u0627\\u0631 \\u0627\\u0645\\u0631\\u06cc\\u06a9\\u0627\\u06f1\\u066b\\u06f0\\u06f0"},
|
| {"he_IL", "1", "USD", "1.00\\u00a0$", "1.00\\u00a0USD", "1.00 \\u05d3\\u05d5\\u05dc\\u05e8 \\u05d0\\u05de\\u05e8\\u05d9\\u05e7\\u05d0\\u05d9"},
|
| @@ -3490,14 +3937,14 @@ NumberFormatTest::TestCurrencyParsing() {
|
| {"id_ID", "1", "USD", "US$1,00", "USD1,00", "1,00 Dolar Amerika Serikat"},
|
| {"it_IT", "1", "USD", "1,00\\u00a0US$", "1,00\\u00a0USD", "1,00 Dollaro Statunitense"},
|
| {"ko_KR", "1", "USD", "US$1.00", "USD1.00", "1.00 \\ubbf8\\uad6d \\ub2ec\\ub7ec"},
|
| - {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00 \\u7c73\\u30c9\\u30eb"},
|
| - {"zh_CN", "1", "CNY", "\\uFFE5\\u00a01.00", "CNY\\u00a01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
|
| + {"ja_JP", "1", "USD", "$1.00", "USD1.00", "1.00\\u7c73\\u30c9\\u30eb"},
|
| + {"zh_CN", "1", "CNY", "\\uFFE51.00", "CNY01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
|
| {"zh_TW", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"},
|
| {"zh_Hant", "1", "CNY", "CN\\u00A51.00", "CNY1.00", "1.00 \\u4eba\\u6c11\\u5e63"},
|
| {"zh_Hant", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00 \\u65e5\\u5713"},
|
| - {"ja_JP", "1", "JPY", "\\uFFE51.00", "JPY1.00", "1.00 \\u65e5\\u672c\\u5186"},
|
| - {"ja_JP", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00 \\u65e5\\u672c\\u5186"},
|
| - {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u0439 \\u0440\\u0443\\u0431\\u043B\\u044C"}
|
| + {"ja_JP", "1", "JPY", "\\uFFE51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"},
|
| + {"ja_JP", "1", "JPY", "\\u00A51.00", "JPY1.00", "1.00\\u65e5\\u672c\\u5186"},
|
| + {"ru_RU", "1", "RUB", "1,00\\u00A0\\u20BD", "1,00\\u00A0RUB", "1,00 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u0438\\u0439 \\u0440\\u0443\\u0431\\u043B\\u044C"}
|
| };
|
| static const UNumberFormatStyle currencyStyles[] = {
|
| UNUM_CURRENCY,
|
| @@ -3796,9 +4243,9 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "Brazilian cruzeiros (1993\\u20131994)1.00",
|
| "Brazilian real1.00",
|
| "Brazilian reals1.00",
|
| - "British Pound Sterling1.00",
|
| - "British pound sterling1.00",
|
| - "British pounds sterling1.00",
|
| + "British Pound1.00",
|
| + "British pound1.00",
|
| + "British pounds1.00",
|
| "Brunei Dollar1.00",
|
| "Brunei dollar1.00",
|
| "Brunei dollars1.00",
|
| @@ -3818,12 +4265,12 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "CAD1.00",
|
| "CDF1.00",
|
| "CDF1.00",
|
| - "CFA Franc BCEAO1.00",
|
| - "CFA Franc BEAC1.00",
|
| - "CFA franc BCEAO1.00",
|
| - "CFA franc BEAC1.00",
|
| - "CFA francs BCEAO1.00",
|
| - "CFA francs BEAC1.00",
|
| + "West African CFA Franc1.00",
|
| + "Central African CFA Franc1.00",
|
| + "West African CFA franc1.00",
|
| + "Central African CFA franc1.00",
|
| + "West African CFA francs1.00",
|
| + "Central African CFA francs1.00",
|
| "CFP Franc1.00",
|
| "CFP franc1.00",
|
| "CFP francs1.00",
|
| @@ -4466,7 +4913,6 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "RSD1.00",
|
| "RSD1.00",
|
| "RUB1.00",
|
| - "RUB1.00",
|
| "RUR1.00",
|
| "RUR1.00",
|
| "RWF1.00",
|
| @@ -4702,9 +5148,9 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "Uruguayan pesos (1975\\u20131993)1.00",
|
| "Uruguayan pesos (indexed units)1.00",
|
| "Uruguayan pesos1.00",
|
| - "Uzbekistan Som1.00",
|
| - "Uzbekistan som1.00",
|
| - "Uzbekistan som1.00",
|
| + "Uzbekistani Som1.00",
|
| + "Uzbekistani som1.00",
|
| + "Uzbekistani som1.00",
|
| "VEB1.00",
|
| "VEF1.00",
|
| "VND1.00",
|
| @@ -4956,9 +5402,9 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "1.00 Brazilian cruzeiros (1993\\u20131994) random",
|
| "1.00 Brazilian real random",
|
| "1.00 Brazilian reals random",
|
| - "1.00 British Pound Sterling random",
|
| - "1.00 British pound sterling random",
|
| - "1.00 British pounds sterling random",
|
| + "1.00 British Pound random",
|
| + "1.00 British pound random",
|
| + "1.00 British pounds random",
|
| "1.00 Brunei Dollar random",
|
| "1.00 Brunei dollar random",
|
| "1.00 Brunei dollars random",
|
| @@ -5550,9 +5996,9 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "1.00 Uruguayan peso random",
|
| "1.00 Uruguayan pesos (1975\\u20131993) random",
|
| "1.00 Uruguayan pesos (indexed units) random",
|
| - "1.00 Uzbekistan Som random",
|
| - "1.00 Uzbekistan som random",
|
| - "1.00 Uzbekistan som random",
|
| + "1.00 Uzbekistani Som random",
|
| + "1.00 Uzbekistani som random",
|
| + "1.00 Uzbekistani som random",
|
| "1.00 Vanuatu Vatu random",
|
| "1.00 Vanuatu vatu random",
|
| "1.00 Vanuatu vatus random",
|
| @@ -5717,8 +6163,6 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "C1.00",
|
| "CA1.00",
|
| "CD1.00",
|
| - "CFA Franc BCEA1.00",
|
| - "CFA Franc BEA1.00",
|
| "CFP Fran1.00",
|
| "CFP1.00",
|
| "CH1.00",
|
| @@ -6088,7 +6532,7 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "Uruguay Peso (1975\\u201319931.00",
|
| "Uruguay Peso Uruguay1.00",
|
| "Uruguay Peso (Indexed Units1.00",
|
| - "Uzbekistan So1.00",
|
| + "Uzbekistani So1.00",
|
| "V1.00",
|
| "VE1.00",
|
| "VN1.00",
|
| @@ -6097,6 +6541,8 @@ NumberFormatTest::TestParseCurrencyInUCurr() {
|
| "Venezuelan Bol\\u00edva1.00",
|
| "Venezuelan Bol\\u00edvar Fuert1.00",
|
| "Vietnamese Don1.00",
|
| + "West African CFA Fran1.00",
|
| + "Central African CFA Fran1.00",
|
| "WIR Eur1.00",
|
| "WIR Fran1.00",
|
| "WS1.00",
|
| @@ -6594,7 +7040,6 @@ void NumberFormatTest::TestExplicitParents() {
|
| static const char* parentLocaleTests[][2]= {
|
| /* locale ID */ /* expected */
|
| {"es_CO", "1.250,75" },
|
| - {"es_CR", "1.250,75" },
|
| {"es_ES", "1.250,75" },
|
| {"es_GQ", "1.250,75" },
|
| {"es_MX", "1,250.75" },
|
| @@ -6640,8 +7085,8 @@ void NumberFormatTest::TestAvailableNumberingSystems() {
|
| CHECK_DATA(status, "NumberingSystem::getAvailableNames()")
|
|
|
| int32_t nsCount = availableNumberingSystems->count(status);
|
| - if ( nsCount < 36 ) {
|
| - errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 36, got %d",nsCount);
|
| + if ( nsCount < 74 ) {
|
| + errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 74, got %d",nsCount);
|
| }
|
|
|
| /* A relatively simple test of the API. We call getAvailableNames() and cycle through */
|
| @@ -6653,6 +7098,7 @@ void NumberFormatTest::TestAvailableNumberingSystems() {
|
| for ( int32_t i = 0 ; i < nsCount ; i++ ) {
|
| const char *nsname = availableNumberingSystems->next(&len,status);
|
| NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status);
|
| + logln("OK for ns = %s",nsname);
|
| if ( uprv_strcmp(nsname,ns->getName()) ) {
|
| errln("FAIL: Numbering system name didn't match for name = %s\n",nsname);
|
| }
|
| @@ -6723,86 +7169,106 @@ void NumberFormatTest::TestFormatFastpaths() {
|
| {
|
| UErrorCode status=U_ZERO_ERROR;
|
| DecimalFormat df(UnicodeString("0000",""),status);
|
| - int64_t long_number = 1;
|
| - UnicodeString expect = "0001";
|
| - UnicodeString result;
|
| - FieldPosition pos;
|
| - df.format(long_number, result, pos);
|
| - if(U_FAILURE(status)||expect!=result) {
|
| - errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),""));
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| } else {
|
| - logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),""));
|
| + int64_t long_number = 1;
|
| + UnicodeString expect = "0001";
|
| + UnicodeString result;
|
| + FieldPosition pos;
|
| + df.format(long_number, result, pos);
|
| + if(U_FAILURE(status)||expect!=result) {
|
| + errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),""));
|
| + } else {
|
| + logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),""));
|
| + }
|
| }
|
| }
|
| {
|
| UErrorCode status=U_ZERO_ERROR;
|
| DecimalFormat df(UnicodeString("0000000000000000000",""),status);
|
| - int64_t long_number = U_INT64_MIN; // -9223372036854775808L;
|
| - // uint8_t bits[8];
|
| - // memcpy(bits,&long_number,8);
|
| - // for(int i=0;i<8;i++) {
|
| - // logln("bits: %02X", (unsigned int)bits[i]);
|
| - // }
|
| - UnicodeString expect = "-9223372036854775808";
|
| - UnicodeString result;
|
| - FieldPosition pos;
|
| - df.format(long_number, result, pos);
|
| - if(U_FAILURE(status)||expect!=result) {
|
| - errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| } else {
|
| - logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
|
| + int64_t long_number = U_INT64_MIN; // -9223372036854775808L;
|
| + // uint8_t bits[8];
|
| + // memcpy(bits,&long_number,8);
|
| + // for(int i=0;i<8;i++) {
|
| + // logln("bits: %02X", (unsigned int)bits[i]);
|
| + // }
|
| + UnicodeString expect = "-9223372036854775808";
|
| + UnicodeString result;
|
| + FieldPosition pos;
|
| + df.format(long_number, result, pos);
|
| + if(U_FAILURE(status)||expect!=result) {
|
| + errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
|
| + } else {
|
| + logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775808");
|
| + }
|
| }
|
| }
|
| {
|
| UErrorCode status=U_ZERO_ERROR;
|
| DecimalFormat df(UnicodeString("0000000000000000000",""),status);
|
| - int64_t long_number = U_INT64_MAX; // -9223372036854775808L;
|
| - // uint8_t bits[8];
|
| - // memcpy(bits,&long_number,8);
|
| - // for(int i=0;i<8;i++) {
|
| - // logln("bits: %02X", (unsigned int)bits[i]);
|
| - // }
|
| - UnicodeString expect = "9223372036854775807";
|
| - UnicodeString result;
|
| - FieldPosition pos;
|
| - df.format(long_number, result, pos);
|
| - if(U_FAILURE(status)||expect!=result) {
|
| - errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| } else {
|
| - logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
|
| + int64_t long_number = U_INT64_MAX; // -9223372036854775808L;
|
| + // uint8_t bits[8];
|
| + // memcpy(bits,&long_number,8);
|
| + // for(int i=0;i<8;i++) {
|
| + // logln("bits: %02X", (unsigned int)bits[i]);
|
| + // }
|
| + UnicodeString expect = "9223372036854775807";
|
| + UnicodeString result;
|
| + FieldPosition pos;
|
| + df.format(long_number, result, pos);
|
| + if(U_FAILURE(status)||expect!=result) {
|
| + errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
|
| + } else {
|
| + logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on U_INT64_MAX");
|
| + }
|
| }
|
| }
|
| {
|
| UErrorCode status=U_ZERO_ERROR;
|
| DecimalFormat df(UnicodeString("0000000000000000000",""),status);
|
| - int64_t long_number = 0;
|
| - // uint8_t bits[8];
|
| - // memcpy(bits,&long_number,8);
|
| - // for(int i=0;i<8;i++) {
|
| - // logln("bits: %02X", (unsigned int)bits[i]);
|
| - // }
|
| - UnicodeString expect = "0000000000000000000";
|
| - UnicodeString result;
|
| - FieldPosition pos;
|
| - df.format(long_number, result, pos);
|
| - if(U_FAILURE(status)||expect!=result) {
|
| - errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| } else {
|
| - logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
|
| + int64_t long_number = 0;
|
| + // uint8_t bits[8];
|
| + // memcpy(bits,&long_number,8);
|
| + // for(int i=0;i<8;i++) {
|
| + // logln("bits: %02X", (unsigned int)bits[i]);
|
| + // }
|
| + UnicodeString expect = "0000000000000000000";
|
| + UnicodeString result;
|
| + FieldPosition pos;
|
| + df.format(long_number, result, pos);
|
| + if(U_FAILURE(status)||expect!=result) {
|
| + errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
|
| + } else {
|
| + logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on 0");
|
| + }
|
| }
|
| }
|
| {
|
| UErrorCode status=U_ZERO_ERROR;
|
| DecimalFormat df(UnicodeString("0000000000000000000",""),status);
|
| - int64_t long_number = U_INT64_MIN + 1;
|
| - UnicodeString expect = "-9223372036854775807";
|
| - UnicodeString result;
|
| - FieldPosition pos;
|
| - df.format(long_number, result, pos);
|
| - if(U_FAILURE(status)||expect!=result) {
|
| - errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| } else {
|
| - logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
|
| + int64_t long_number = U_INT64_MIN + 1;
|
| + UnicodeString expect = "-9223372036854775807";
|
| + UnicodeString result;
|
| + FieldPosition pos;
|
| + df.format(long_number, result, pos);
|
| + if(U_FAILURE(status)||expect!=result) {
|
| + errcheckln(status, "FAIL: expected '"+expect+"' got '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
|
| + } else {
|
| + logln("OK: got expected '"+result+"' status "+UnicodeString(u_errorName(status),"")+" on -9223372036854775807");
|
| + }
|
| }
|
| }
|
| }
|
| @@ -7371,7 +7837,7 @@ void NumberFormatTest::Test10468ApplyPattern() {
|
| fmt.applyPattern("AA#,##0.00ZZ", status);
|
|
|
| // Oops this still prints 'a' even though we changed the pattern.
|
| - if (fmt.getPadCharacterString() != UnicodeString("*")) {
|
| + if (fmt.getPadCharacterString() != UnicodeString(" ")) {
|
| errln("applyPattern did not clear padding character.");
|
| }
|
| }
|
| @@ -7736,4 +8202,538 @@ void NumberFormatTest::TestCurrencyUsage() {
|
| delete fmt;
|
| }
|
| }
|
| +
|
| +void NumberFormatTest::TestNumberFormatTestTuple() {
|
| + NumberFormatTestTuple tuple;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| +
|
| + tuple.setField(
|
| + NumberFormatTestTuple::getFieldByName("locale"),
|
| + "en",
|
| + status);
|
| + tuple.setField(
|
| + NumberFormatTestTuple::getFieldByName("pattern"),
|
| + "#,##0.00",
|
| + status);
|
| + tuple.setField(
|
| + NumberFormatTestTuple::getFieldByName("minIntegerDigits"),
|
| + "-10",
|
| + status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| +
|
| + // only what we set should be set.
|
| + assertEquals("", "en", tuple.locale.getName());
|
| + assertEquals("", "#,##0.00", tuple.pattern);
|
| + assertEquals("", -10, tuple.minIntegerDigits);
|
| + assertTrue("", tuple.localeFlag);
|
| + assertTrue("", tuple.patternFlag);
|
| + assertTrue("", tuple.minIntegerDigitsFlag);
|
| + assertFalse("", tuple.formatFlag);
|
| +
|
| + UnicodeString appendTo;
|
| + assertEquals(
|
| + "",
|
| + "{locale: en, pattern: #,##0.00, minIntegerDigits: -10}",
|
| + tuple.toString(appendTo));
|
| +
|
| + tuple.clear();
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "",
|
| + "{}",
|
| + tuple.toString(appendTo));
|
| + tuple.setField(
|
| + NumberFormatTestTuple::getFieldByName("aBadFieldName"),
|
| + "someValue",
|
| + status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| + status = U_ZERO_ERROR;
|
| + tuple.setField(
|
| + NumberFormatTestTuple::getFieldByName("minIntegerDigits"),
|
| + "someBadValue",
|
| + status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| +}
|
| +
|
| +void
|
| +NumberFormatTest::TestDataDriven() {
|
| + NumberFormatTestDataDriven dd;
|
| + dd.setCaller(this);
|
| + dd.run("numberformattestspecification.txt", FALSE);
|
| +}
|
| +
|
| +
|
| +// Check the constant MAX_INT64_IN_DOUBLE.
|
| +// The value should convert to a double with no loss of precision.
|
| +// A failure may indicate a platform with a different double format, requiring
|
| +// a revision to the constant.
|
| +//
|
| +// Note that this is actually hard to test, because the language standard gives
|
| +// compilers considerable flexibility to do unexpected things with rounding and
|
| +// with overflow in simple int to/from float conversions. Some compilers will completely optimize
|
| +// away a simple round-trip conversion from int64_t -> double -> int64_t.
|
| +
|
| +void NumberFormatTest::TestDoubleLimit11439() {
|
| + char buf[50];
|
| + for (int64_t num = MAX_INT64_IN_DOUBLE-10; num<=MAX_INT64_IN_DOUBLE; num++) {
|
| + sprintf(buf, "%lld", (long long)num);
|
| + double fNum = 0.0;
|
| + sscanf(buf, "%lf", &fNum);
|
| + int64_t rtNum = fNum;
|
| + if (num != rtNum) {
|
| + errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum);
|
| + return;
|
| + }
|
| + }
|
| + for (int64_t num = -MAX_INT64_IN_DOUBLE+10; num>=-MAX_INT64_IN_DOUBLE; num--) {
|
| + sprintf(buf, "%lld", (long long)num);
|
| + double fNum = 0.0;
|
| + sscanf(buf, "%lf", &fNum);
|
| + int64_t rtNum = fNum;
|
| + if (num != rtNum) {
|
| + errln("%s:%d MAX_INT64_IN_DOUBLE test, %lld did not round trip. Got %lld", __FILE__, __LINE__, (long long)num, (long long)rtNum);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +void NumberFormatTest::TestFastPathConsistent11524() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + NumberFormat *fmt = NumberFormat::createInstance("en", status);
|
| + if (U_FAILURE(status) || fmt == NULL) {
|
| + dataerrln("Failed call to NumberFormat::createInstance() - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + fmt->setMaximumIntegerDigits(INT32_MIN);
|
| + UnicodeString appendTo;
|
| + assertEquals("", "0", fmt->format(123, appendTo));
|
| + appendTo.remove();
|
| + assertEquals("", "0", fmt->format(12345, appendTo));
|
| + delete fmt;
|
| +}
|
| +
|
| +void NumberFormatTest::TestGetAffixes() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols sym("en_US", status);
|
| + UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00 %\\u00a4\\u00a4");
|
| + pattern = pattern.unescape();
|
| + DecimalFormat fmt(pattern, sym, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + UnicodeString affixStr;
|
| + assertEquals("", "US dollars ", fmt.getPositivePrefix(affixStr));
|
| + assertEquals("", " %USD", fmt.getPositiveSuffix(affixStr));
|
| + assertEquals("", "-US dollars ", fmt.getNegativePrefix(affixStr));
|
| + assertEquals("", " %USD", fmt.getNegativeSuffix(affixStr));
|
| +
|
| + // Test equality with affixes. set affix methods can't capture special
|
| + // characters which is why equality should fail.
|
| + {
|
| + DecimalFormat fmtCopy(fmt);
|
| + assertTrue("", fmt == fmtCopy);
|
| + UnicodeString someAffix;
|
| + fmtCopy.setPositivePrefix(fmtCopy.getPositivePrefix(someAffix));
|
| + assertTrue("", fmt != fmtCopy);
|
| + }
|
| + {
|
| + DecimalFormat fmtCopy(fmt);
|
| + assertTrue("", fmt == fmtCopy);
|
| + UnicodeString someAffix;
|
| + fmtCopy.setPositiveSuffix(fmtCopy.getPositiveSuffix(someAffix));
|
| + assertTrue("", fmt != fmtCopy);
|
| + }
|
| + {
|
| + DecimalFormat fmtCopy(fmt);
|
| + assertTrue("", fmt == fmtCopy);
|
| + UnicodeString someAffix;
|
| + fmtCopy.setNegativePrefix(fmtCopy.getNegativePrefix(someAffix));
|
| + assertTrue("", fmt != fmtCopy);
|
| + }
|
| + {
|
| + DecimalFormat fmtCopy(fmt);
|
| + assertTrue("", fmt == fmtCopy);
|
| + UnicodeString someAffix;
|
| + fmtCopy.setNegativeSuffix(fmtCopy.getNegativeSuffix(someAffix));
|
| + assertTrue("", fmt != fmtCopy);
|
| + }
|
| + fmt.setPositivePrefix("Don't");
|
| + fmt.setPositiveSuffix("do");
|
| + UnicodeString someAffix("be''eet\\u00a4\\u00a4\\u00a4 it.");
|
| + someAffix = someAffix.unescape();
|
| + fmt.setNegativePrefix(someAffix);
|
| + fmt.setNegativeSuffix("%");
|
| + assertEquals("", "Don't", fmt.getPositivePrefix(affixStr));
|
| + assertEquals("", "do", fmt.getPositiveSuffix(affixStr));
|
| + assertEquals("", someAffix, fmt.getNegativePrefix(affixStr));
|
| + assertEquals("", "%", fmt.getNegativeSuffix(affixStr));
|
| +}
|
| +
|
| +void NumberFormatTest::TestToPatternScientific11648() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + DecimalFormatSymbols sym(en, status);
|
| + DecimalFormat fmt("0.00", sym, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + fmt.setScientificNotation(TRUE);
|
| + UnicodeString pattern;
|
| + assertEquals("", "0.00E0", fmt.toPattern(pattern));
|
| + DecimalFormat fmt2(pattern, sym, status);
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormatTest::TestBenchmark() {
|
| +/*
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + DecimalFormatSymbols sym(en, status);
|
| + DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(sym), status);
|
| +// DecimalFormat fmt("0.00000E0", new DecimalFormatSymbols(sym), status);
|
| +// DecimalFormat fmt("0", new DecimalFormatSymbols(sym), status);
|
| + FieldPosition fpos(0);
|
| + clock_t start = clock();
|
| + for (int32_t i = 0; i < 1000000; ++i) {
|
| + UnicodeString append;
|
| + fmt.format(3.0, append, fpos, status);
|
| +// fmt.format(4.6692016, append, fpos, status);
|
| +// fmt.format(1234567.8901, append, fpos, status);
|
| +// fmt.format(2.99792458E8, append, fpos, status);
|
| +// fmt.format(31, append);
|
| + }
|
| + errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
|
| + assertSuccess("", status);
|
| +
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + MessageFormat fmt("{0, plural, one {I have # friend.} other {I have # friends.}}", status);
|
| + FieldPosition fpos(0);
|
| + Formattable one(1.0);
|
| + Formattable three(3.0);
|
| + clock_t start = clock();
|
| + for (int32_t i = 0; i < 500000; ++i) {
|
| + UnicodeString append;
|
| + fmt.format(&one, 1, append, fpos, status);
|
| + UnicodeString append2;
|
| + fmt.format(&three, 1, append2, fpos, status);
|
| + }
|
| + errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
|
| + assertSuccess("", status);
|
| +
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + Measure measureC(23, MeasureUnit::createCelsius(status), status);
|
| + MeasureFormat fmt(en, UMEASFMT_WIDTH_WIDE, status);
|
| + FieldPosition fpos(0);
|
| + clock_t start = clock();
|
| + for (int32_t i = 0; i < 1000000; ++i) {
|
| + UnicodeString appendTo;
|
| + fmt.formatMeasures(
|
| + &measureC, 1, appendTo, fpos, status);
|
| + }
|
| + errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
|
| + assertSuccess("", status);
|
| +*/
|
| +}
|
| +
|
| +void NumberFormatTest::TestFractionalDigitsForCurrency() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + LocalPointer<NumberFormat> fmt(NumberFormat::createCurrencyInstance("en", status));
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating NumberFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + UChar JPY[] = {0x4A, 0x50, 0x59, 0x0};
|
| + fmt->setCurrency(JPY, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + assertEquals("", 0, fmt->getMaximumFractionDigits());
|
| +}
|
| +
|
| +
|
| +void NumberFormatTest::TestFormatCurrencyPlural() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale locale = Locale::createCanonical("en_US");
|
| + NumberFormat *fmt = NumberFormat::createInstance(locale, UNUM_CURRENCY_PLURAL, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating NumberFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + UnicodeString formattedNum;
|
| + fmt->format(11234.567, formattedNum, NULL, status);
|
| + assertEquals("", "11,234.57 US dollars", formattedNum);
|
| + delete fmt;
|
| +}
|
| +
|
| +void NumberFormatTest::TestCtorApplyPatternDifference() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols sym("en_US", status);
|
| + UnicodeString pattern("\\u00a40");
|
| + DecimalFormat fmt(pattern.unescape(), sym, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormat - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + UnicodeString result;
|
| + assertEquals(
|
| + "ctor favors precision of currency",
|
| + "$5.00",
|
| + fmt.format(5, result));
|
| + result.remove();
|
| + fmt.applyPattern(pattern.unescape(), status);
|
| + assertEquals(
|
| + "applyPattern favors precision of pattern",
|
| + "$5",
|
| + fmt.format(5, result));
|
| +}
|
| +
|
| +void NumberFormatTest::Test11868() {
|
| + double posAmt = 34.567;
|
| + double negAmt = -9876.543;
|
| +
|
| + Locale selectedLocale("en_US");
|
| + UErrorCode status = U_ZERO_ERROR;
|
| +
|
| + UnicodeString result;
|
| + FieldPosition fpCurr(UNUM_CURRENCY_FIELD);
|
| + LocalPointer<NumberFormat> fmt(
|
| + NumberFormat::createInstance(
|
| + selectedLocale, UNUM_CURRENCY_PLURAL, status));
|
| + if (!assertSuccess("Format creation", status)) {
|
| + return;
|
| + }
|
| + fmt->format(posAmt, result, fpCurr, status);
|
| + assertEquals("", "34.57 US dollars", result);
|
| + assertEquals("begin index", 6, fpCurr.getBeginIndex());
|
| + assertEquals("end index", 16, fpCurr.getEndIndex());
|
| +
|
| + // Test field position iterator
|
| + {
|
| + NumberFormatTest_Attributes attributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 2},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
|
| + {UNUM_FRACTION_FIELD, 3, 5},
|
| + {UNUM_CURRENCY_FIELD, 6, 16},
|
| + {0, -1, 0}};
|
| + UnicodeString result;
|
| + FieldPositionIterator iter;
|
| + fmt->format(posAmt, result, &iter, status);
|
| + assertEquals("", "34.57 US dollars", result);
|
| + verifyFieldPositionIterator(attributes, iter);
|
| + }
|
| +
|
| + result.remove();
|
| + fmt->format(negAmt, result, fpCurr, status);
|
| + assertEquals("", "-9,876.54 US dollars", result);
|
| + assertEquals("begin index", 10, fpCurr.getBeginIndex());
|
| + assertEquals("end index", 20, fpCurr.getEndIndex());
|
| +
|
| + // Test field position iterator
|
| + {
|
| + NumberFormatTest_Attributes attributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_GROUPING_SEPARATOR_FIELD, 2, 3},
|
| + {UNUM_INTEGER_FIELD, 1, 6},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 6, 7},
|
| + {UNUM_FRACTION_FIELD, 7, 9},
|
| + {UNUM_CURRENCY_FIELD, 10, 20},
|
| + {0, -1, 0}};
|
| + UnicodeString result;
|
| + FieldPositionIterator iter;
|
| + fmt->format(negAmt, result, &iter, status);
|
| + assertEquals("", "-9,876.54 US dollars", result);
|
| + verifyFieldPositionIterator(attributes, iter);
|
| + }
|
| +}
|
| +
|
| +void NumberFormatTest::Test10727_RoundingZero() {
|
| + DigitList d;
|
| + d.set(-0.0);
|
| + assertFalse("", d.isPositive());
|
| + d.round(3);
|
| + assertFalse("", d.isPositive());
|
| +}
|
| +
|
| +void NumberFormatTest::Test11376_getAndSetPositivePrefix() {
|
| + {
|
| + const UChar USD[] = {0x55, 0x53, 0x44, 0x0};
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + LocalPointer<NumberFormat> fmt(
|
| + NumberFormat::createCurrencyInstance("en", status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DecimalFormat *dfmt = (DecimalFormat *) fmt.getAlias();
|
| + dfmt->setCurrency(USD);
|
| + UnicodeString result;
|
| +
|
| + // This line should be a no-op. I am setting the positive prefix
|
| + // to be the same thing it was before.
|
| + dfmt->setPositivePrefix(dfmt->getPositivePrefix(result));
|
| +
|
| + UnicodeString appendTo;
|
| + assertEquals("", "$3.78", dfmt->format(3.78, appendTo, status));
|
| + assertSuccess("", status);
|
| + }
|
| + {
|
| + const UChar USD[] = {0x55, 0x53, 0x44, 0x0};
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + LocalPointer<NumberFormat> fmt(
|
| + NumberFormat::createInstance("en", UNUM_CURRENCY_PLURAL, status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DecimalFormat *dfmt = (DecimalFormat *) fmt.getAlias();
|
| + UnicodeString result;
|
| + UnicodeString tripleIntlCurrency(" \\u00a4\\u00a4\\u00a4");
|
| + tripleIntlCurrency = tripleIntlCurrency.unescape();
|
| + assertEquals("", tripleIntlCurrency, dfmt->getPositiveSuffix(result));
|
| + dfmt->setCurrency(USD);
|
| +
|
| + // getPositiveSuffix() always returns the suffix for the
|
| + // "other" plural category
|
| + assertEquals("", " US dollars", dfmt->getPositiveSuffix(result));
|
| + UnicodeString appendTo;
|
| + assertEquals("", "3.78 US dollars", dfmt->format(3.78, appendTo, status));
|
| + assertEquals("", " US dollars", dfmt->getPositiveSuffix(result));
|
| + dfmt->setPositiveSuffix("booya");
|
| + appendTo.remove();
|
| + assertEquals("", "3.78booya", dfmt->format(3.78, appendTo, status));
|
| + assertEquals("", "booya", dfmt->getPositiveSuffix(result));
|
| + }
|
| +}
|
| +
|
| +void NumberFormatTest::Test11475_signRecognition() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols sym("en", status);
|
| + UnicodeString result;
|
| + {
|
| + DecimalFormat fmt("+0.00", sym, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + NumberFormatTest_Attributes attributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_INTEGER_FIELD, 1, 2},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
|
| + {UNUM_FRACTION_FIELD, 3, 5},
|
| + {0, -1, 0}};
|
| + UnicodeString result;
|
| + FieldPositionIterator iter;
|
| + fmt.format(2.3, result, &iter, status);
|
| + assertEquals("", "+2.30", result);
|
| + verifyFieldPositionIterator(attributes, iter);
|
| + }
|
| + {
|
| + DecimalFormat fmt("++0.00+;-(#)--", sym, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + {
|
| + NumberFormatTest_Attributes attributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 2},
|
| + {UNUM_INTEGER_FIELD, 2, 3},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_FRACTION_FIELD, 4, 6},
|
| + {UNUM_SIGN_FIELD, 6, 7},
|
| + {0, -1, 0}};
|
| + UnicodeString result;
|
| + FieldPositionIterator iter;
|
| + fmt.format(2.3, result, &iter, status);
|
| + assertEquals("", "++2.30+", result);
|
| + verifyFieldPositionIterator(attributes, iter);
|
| + }
|
| + {
|
| + NumberFormatTest_Attributes attributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_INTEGER_FIELD, 2, 3},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_FRACTION_FIELD, 4, 6},
|
| + {UNUM_SIGN_FIELD, 7, 9},
|
| + {0, -1, 0}};
|
| + UnicodeString result;
|
| + FieldPositionIterator iter;
|
| + fmt.format(-2.3, result, &iter, status);
|
| + assertEquals("", "-(2.30)--", result);
|
| + verifyFieldPositionIterator(attributes, iter);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void NumberFormatTest::Test11640_getAffixes() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en_US", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00 %\\u00a4\\u00a4");
|
| + pattern = pattern.unescape();
|
| + DecimalFormat fmt(pattern, symbols, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + UnicodeString affixStr;
|
| + assertEquals("", "US dollars ", fmt.getPositivePrefix(affixStr));
|
| + assertEquals("", " %USD", fmt.getPositiveSuffix(affixStr));
|
| + assertEquals("", "-US dollars ", fmt.getNegativePrefix(affixStr));
|
| + assertEquals("", " %USD", fmt.getNegativeSuffix(affixStr));
|
| +}
|
| +
|
| +void NumberFormatTest::Test11649_toPatternWithMultiCurrency() {
|
| + UnicodeString pattern("\\u00a4\\u00a4\\u00a4 0.00");
|
| + pattern = pattern.unescape();
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormat fmt(pattern, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
|
| + fmt.setCurrency(USD);
|
| + UnicodeString appendTo;
|
| +
|
| + assertEquals("", "US dollars 12.34", fmt.format(12.34, appendTo));
|
| +
|
| + UnicodeString topattern;
|
| + fmt.toPattern(topattern);
|
| + DecimalFormat fmt2(topattern, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + fmt2.setCurrency(USD);
|
| +
|
| + appendTo.remove();
|
| + assertEquals("", "US dollars 12.34", fmt2.format(12.34, appendTo));
|
| +}
|
| +
|
| +
|
| +void NumberFormatTest::verifyFieldPositionIterator(
|
| + NumberFormatTest_Attributes *expected, FieldPositionIterator &iter) {
|
| + int32_t idx = 0;
|
| + FieldPosition fp;
|
| + while (iter.next(fp)) {
|
| + if (expected[idx].spos == -1) {
|
| + errln("Iterator should have ended. got %d", fp.getField());
|
| + return;
|
| + }
|
| + assertEquals("id", expected[idx].id, fp.getField());
|
| + assertEquals("start", expected[idx].spos, fp.getBeginIndex());
|
| + assertEquals("end", expected[idx].epos, fp.getEndIndex());
|
| + ++idx;
|
| + }
|
| + if (expected[idx].spos != -1) {
|
| + errln("Premature end of iterator. expected %d", expected[idx].id);
|
| + }
|
| +}
|
| +
|
| +
|
| +
|
| #endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|