| Index: source/test/intltest/numberformat2test.cpp
|
| diff --git a/source/test/intltest/numberformat2test.cpp b/source/test/intltest/numberformat2test.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6beb35b8b45582c6bcc0d48a00c9106245f71fe3
|
| --- /dev/null
|
| +++ b/source/test/intltest/numberformat2test.cpp
|
| @@ -0,0 +1,3088 @@
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2015, International Business Machines Corporation and *
|
| +* others. All Rights Reserved. *
|
| +*******************************************************************************
|
| +*
|
| +* File NUMBERFORMAT2TEST.CPP
|
| +*
|
| +*******************************************************************************
|
| +*/
|
| +#include "unicode/utypes.h"
|
| +
|
| +#include "intltest.h"
|
| +
|
| +#if !UCONFIG_NO_FORMATTING
|
| +
|
| +#include "unicode/localpointer.h"
|
| +#include "unicode/plurrule.h"
|
| +
|
| +#include "affixpatternparser.h"
|
| +#include "charstr.h"
|
| +#include "datadrivennumberformattestsuite.h"
|
| +#include "decimalformatpattern.h"
|
| +#include "digitaffixesandpadding.h"
|
| +#include "digitformatter.h"
|
| +#include "digitgrouping.h"
|
| +#include "digitinterval.h"
|
| +#include "digitlst.h"
|
| +#include "fphdlimp.h"
|
| +#include "plurrule_impl.h"
|
| +#include "precision.h"
|
| +#include "significantdigitinterval.h"
|
| +#include "smallintformatter.h"
|
| +#include "uassert.h"
|
| +#include "valueformatter.h"
|
| +#include "visibledigits.h"
|
| +
|
| +struct NumberFormat2Test_Attributes {
|
| + int32_t id;
|
| + int32_t spos;
|
| + int32_t epos;
|
| +};
|
| +
|
| +class NumberFormat2Test_FieldPositionHandler : public FieldPositionHandler {
|
| +public:
|
| +NumberFormat2Test_Attributes attributes[100];
|
| +int32_t count;
|
| +UBool bRecording;
|
| +
|
| +
|
| +
|
| +NumberFormat2Test_FieldPositionHandler() : count(0), bRecording(TRUE) { attributes[0].spos = -1; }
|
| +NumberFormat2Test_FieldPositionHandler(UBool recording) : count(0), bRecording(recording) { attributes[0].spos = -1; }
|
| +virtual ~NumberFormat2Test_FieldPositionHandler();
|
| +virtual void addAttribute(int32_t id, int32_t start, int32_t limit);
|
| +virtual void shiftLast(int32_t delta);
|
| +virtual UBool isRecording(void) const;
|
| +};
|
| +
|
| +NumberFormat2Test_FieldPositionHandler::~NumberFormat2Test_FieldPositionHandler() {
|
| +}
|
| +
|
| +void NumberFormat2Test_FieldPositionHandler::addAttribute(
|
| + int32_t id, int32_t start, int32_t limit) {
|
| + if (count == UPRV_LENGTHOF(attributes) - 1) {
|
| + return;
|
| + }
|
| + attributes[count].id = id;
|
| + attributes[count].spos = start;
|
| + attributes[count].epos = limit;
|
| + ++count;
|
| + attributes[count].spos = -1;
|
| +}
|
| +
|
| +void NumberFormat2Test_FieldPositionHandler::shiftLast(int32_t /* delta */) {
|
| +}
|
| +
|
| +UBool NumberFormat2Test_FieldPositionHandler::isRecording() const {
|
| + return bRecording;
|
| +}
|
| +
|
| +
|
| +class NumberFormat2Test : public IntlTest {
|
| +public:
|
| + void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
|
| +private:
|
| + void TestQuantize();
|
| + void TestConvertScientificNotation();
|
| + void TestLowerUpperExponent();
|
| + void TestRounding();
|
| + void TestRoundingIncrement();
|
| + void TestDigitInterval();
|
| + void TestGroupingUsed();
|
| + void TestBenchmark();
|
| + void TestBenchmark2();
|
| + void TestSmallIntFormatter();
|
| + void TestPositiveIntDigitFormatter();
|
| + void TestDigitListInterval();
|
| + void TestLargeIntValue();
|
| + void TestIntInitVisibleDigits();
|
| + void TestIntInitVisibleDigitsToDigitList();
|
| + void TestDoubleInitVisibleDigits();
|
| + void TestDoubleInitVisibleDigitsToDigitList();
|
| + void TestDigitListInitVisibleDigits();
|
| + void TestSpecialInitVisibleDigits();
|
| + void TestVisibleDigitsWithExponent();
|
| + void TestDigitAffixesAndPadding();
|
| + void TestPluralsAndRounding();
|
| + void TestPluralsAndRoundingScientific();
|
| + void TestValueFormatterIsFastFormattable();
|
| + void TestCurrencyAffixInfo();
|
| + void TestAffixPattern();
|
| + void TestAffixPatternAppend();
|
| + void TestAffixPatternAppendAjoiningLiterals();
|
| + void TestAffixPatternDoubleQuote();
|
| + void TestAffixPatternParser();
|
| + void TestPluralAffix();
|
| + void TestDigitAffix();
|
| + void TestDigitFormatterDefaultCtor();
|
| + void TestDigitFormatterMonetary();
|
| + void TestDigitFormatter();
|
| + void TestSciFormatterDefaultCtor();
|
| + void TestSciFormatter();
|
| + void TestToPatternScientific11648();
|
| + void verifyInterval(const DigitInterval &, int32_t minInclusive, int32_t maxExclusive);
|
| + void verifyAffix(
|
| + const UnicodeString &expected,
|
| + const DigitAffix &affix,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifyAffixesAndPadding(
|
| + const UnicodeString &expected,
|
| + const DigitAffixesAndPadding &aaf,
|
| + DigitList &digits,
|
| + const ValueFormatter &vf,
|
| + const PluralRules *optPluralRules,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifyAffixesAndPaddingInt32(
|
| + const UnicodeString &expected,
|
| + const DigitAffixesAndPadding &aaf,
|
| + int32_t value,
|
| + const ValueFormatter &vf,
|
| + const PluralRules *optPluralRules,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifyDigitList(
|
| + const UnicodeString &expected,
|
| + const DigitList &digits);
|
| + void verifyVisibleDigits(
|
| + const UnicodeString &expected,
|
| + UBool bNegative,
|
| + const VisibleDigits &digits);
|
| + void verifyVisibleDigitsWithExponent(
|
| + const UnicodeString &expected,
|
| + UBool bNegative,
|
| + const VisibleDigitsWithExponent &digits);
|
| + void verifyDigitFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + const VisibleDigits &digits,
|
| + const DigitGrouping &grouping,
|
| + const DigitFormatterOptions &options,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifySciFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + const VisibleDigitsWithExponent &digits,
|
| + const SciFormatterOptions &options,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifySmallIntFormatter(
|
| + const UnicodeString &expected,
|
| + int32_t positiveValue,
|
| + int32_t minDigits,
|
| + int32_t maxDigits);
|
| + void verifyPositiveIntDigitFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + int32_t value,
|
| + int32_t minDigits,
|
| + int32_t maxDigits,
|
| + const NumberFormat2Test_Attributes *expectedAttributes);
|
| + void verifyAttributes(
|
| + const NumberFormat2Test_Attributes *expected,
|
| + const NumberFormat2Test_Attributes *actual);
|
| + void verifyIntValue(
|
| + int64_t expected, const VisibleDigits &digits);
|
| + void verifySource(
|
| + double expected, const VisibleDigits &digits);
|
| +};
|
| +
|
| +void NumberFormat2Test::runIndexedTest(
|
| + int32_t index, UBool exec, const char *&name, char *) {
|
| + if (exec) {
|
| + logln("TestSuite ScientificNumberFormatterTest: ");
|
| + }
|
| + TESTCASE_AUTO_BEGIN;
|
| + TESTCASE_AUTO(TestQuantize);
|
| + TESTCASE_AUTO(TestConvertScientificNotation);
|
| + TESTCASE_AUTO(TestLowerUpperExponent);
|
| + TESTCASE_AUTO(TestRounding);
|
| + TESTCASE_AUTO(TestRoundingIncrement);
|
| + TESTCASE_AUTO(TestDigitInterval);
|
| + TESTCASE_AUTO(TestGroupingUsed);
|
| + TESTCASE_AUTO(TestDigitListInterval);
|
| + TESTCASE_AUTO(TestDigitFormatterDefaultCtor);
|
| + TESTCASE_AUTO(TestDigitFormatterMonetary);
|
| + TESTCASE_AUTO(TestDigitFormatter);
|
| + TESTCASE_AUTO(TestSciFormatterDefaultCtor);
|
| + TESTCASE_AUTO(TestSciFormatter);
|
| + TESTCASE_AUTO(TestBenchmark);
|
| + TESTCASE_AUTO(TestBenchmark2);
|
| + TESTCASE_AUTO(TestSmallIntFormatter);
|
| + TESTCASE_AUTO(TestPositiveIntDigitFormatter);
|
| + TESTCASE_AUTO(TestCurrencyAffixInfo);
|
| + TESTCASE_AUTO(TestAffixPattern);
|
| + TESTCASE_AUTO(TestAffixPatternAppend);
|
| + TESTCASE_AUTO(TestAffixPatternAppendAjoiningLiterals);
|
| + TESTCASE_AUTO(TestAffixPatternDoubleQuote);
|
| + TESTCASE_AUTO(TestAffixPatternParser);
|
| + TESTCASE_AUTO(TestPluralAffix);
|
| + TESTCASE_AUTO(TestDigitAffix);
|
| + TESTCASE_AUTO(TestValueFormatterIsFastFormattable);
|
| + TESTCASE_AUTO(TestLargeIntValue);
|
| + TESTCASE_AUTO(TestIntInitVisibleDigits);
|
| + TESTCASE_AUTO(TestIntInitVisibleDigitsToDigitList);
|
| + TESTCASE_AUTO(TestDoubleInitVisibleDigits);
|
| + TESTCASE_AUTO(TestDoubleInitVisibleDigitsToDigitList);
|
| + TESTCASE_AUTO(TestDigitListInitVisibleDigits);
|
| + TESTCASE_AUTO(TestSpecialInitVisibleDigits);
|
| + TESTCASE_AUTO(TestVisibleDigitsWithExponent);
|
| + TESTCASE_AUTO(TestDigitAffixesAndPadding);
|
| + TESTCASE_AUTO(TestPluralsAndRounding);
|
| + TESTCASE_AUTO(TestPluralsAndRoundingScientific);
|
| + TESTCASE_AUTO(TestToPatternScientific11648);
|
| +
|
| + TESTCASE_AUTO_END;
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitInterval() {
|
| + DigitInterval all;
|
| + DigitInterval threeInts;
|
| + DigitInterval fourFrac;
|
| + threeInts.setIntDigitCount(3);
|
| + fourFrac.setFracDigitCount(4);
|
| + verifyInterval(all, INT32_MIN, INT32_MAX);
|
| + verifyInterval(threeInts, INT32_MIN, 3);
|
| + verifyInterval(fourFrac, -4, INT32_MAX);
|
| + {
|
| + DigitInterval result(threeInts);
|
| + result.shrinkToFitWithin(fourFrac);
|
| + verifyInterval(result, -4, 3);
|
| + assertEquals("", 7, result.length());
|
| + }
|
| + {
|
| + DigitInterval result(threeInts);
|
| + result.expandToContain(fourFrac);
|
| + verifyInterval(result, INT32_MIN, INT32_MAX);
|
| + }
|
| + {
|
| + DigitInterval result(threeInts);
|
| + result.setIntDigitCount(0);
|
| + verifyInterval(result, INT32_MIN, 0);
|
| + result.setIntDigitCount(-1);
|
| + verifyInterval(result, INT32_MIN, INT32_MAX);
|
| + }
|
| + {
|
| + DigitInterval result(fourFrac);
|
| + result.setFracDigitCount(0);
|
| + verifyInterval(result, 0, INT32_MAX);
|
| + result.setFracDigitCount(-1);
|
| + verifyInterval(result, INT32_MIN, INT32_MAX);
|
| + }
|
| + {
|
| + DigitInterval result;
|
| + result.setIntDigitCount(3);
|
| + result.setFracDigitCount(1);
|
| + result.expandToContainDigit(0);
|
| + result.expandToContainDigit(-1);
|
| + result.expandToContainDigit(2);
|
| + verifyInterval(result, -1, 3);
|
| + result.expandToContainDigit(3);
|
| + verifyInterval(result, -1, 4);
|
| + result.expandToContainDigit(-2);
|
| + verifyInterval(result, -2, 4);
|
| + result.expandToContainDigit(15);
|
| + result.expandToContainDigit(-15);
|
| + verifyInterval(result, -15, 16);
|
| + }
|
| + {
|
| + DigitInterval result;
|
| + result.setIntDigitCount(3);
|
| + result.setFracDigitCount(1);
|
| + assertTrue("", result.contains(2));
|
| + assertTrue("", result.contains(-1));
|
| + assertFalse("", result.contains(3));
|
| + assertFalse("", result.contains(-2));
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyInterval(
|
| + const DigitInterval &interval,
|
| + int32_t minInclusive, int32_t maxExclusive) {
|
| + assertEquals("", minInclusive, interval.getLeastSignificantInclusive());
|
| + assertEquals("", maxExclusive, interval.getMostSignificantExclusive());
|
| + assertEquals("", maxExclusive, interval.getIntDigitCount());
|
| +}
|
| +
|
| +void NumberFormat2Test::TestGroupingUsed() {
|
| + {
|
| + DigitGrouping grouping;
|
| + assertFalse("", grouping.isGroupingUsed());
|
| + }
|
| + {
|
| + DigitGrouping grouping;
|
| + grouping.fGrouping = 2;
|
| + assertTrue("", grouping.isGroupingUsed());
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitListInterval() {
|
| + DigitInterval result;
|
| + DigitList digitList;
|
| + {
|
| + digitList.set(12345);
|
| + verifyInterval(digitList.getSmallestInterval(result), 0, 5);
|
| + }
|
| + {
|
| + digitList.set(1000.00);
|
| + verifyInterval(digitList.getSmallestInterval(result), 0, 4);
|
| + }
|
| + {
|
| + digitList.set(43.125);
|
| + verifyInterval(digitList.getSmallestInterval(result), -3, 2);
|
| + }
|
| + {
|
| + digitList.set(.0078125);
|
| + verifyInterval(digitList.getSmallestInterval(result), -7, 0);
|
| + }
|
| + {
|
| + digitList.set(1000.00);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(3);
|
| + verifyInterval(result, 0, 4);
|
| + }
|
| + {
|
| + digitList.set(1000.00);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(4);
|
| + verifyInterval(result, 0, 5);
|
| + }
|
| + {
|
| + digitList.set(1000.00);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(0);
|
| + verifyInterval(result, 0, 4);
|
| + }
|
| + {
|
| + digitList.set(1000.00);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(-1);
|
| + verifyInterval(result, -1, 4);
|
| + }
|
| + {
|
| + digitList.set(43.125);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(1);
|
| + verifyInterval(result, -3, 2);
|
| + }
|
| + {
|
| + digitList.set(43.125);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(2);
|
| + verifyInterval(result, -3, 3);
|
| + }
|
| + {
|
| + digitList.set(43.125);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(-3);
|
| + verifyInterval(result, -3, 2);
|
| + }
|
| + {
|
| + digitList.set(43.125);
|
| + digitList.getSmallestInterval(result);
|
| + result.expandToContainDigit(-4);
|
| + verifyInterval(result, -4, 2);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestQuantize() {
|
| + DigitList quantity;
|
| + quantity.set(0.00168);
|
| + quantity.roundAtExponent(-5);
|
| + DigitList digits;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + {
|
| + digits.set(1);
|
| + digits.quantize(quantity, status);
|
| + verifyDigitList(".9996", digits);
|
| + }
|
| + {
|
| + // round half even up
|
| + digits.set(1.00044);
|
| + digits.roundAtExponent(-5);
|
| + digits.quantize(quantity, status);
|
| + verifyDigitList("1.00128", digits);
|
| + }
|
| + {
|
| + // round half down
|
| + digits.set(0.99876);
|
| + digits.roundAtExponent(-5);
|
| + digits.quantize(quantity, status);
|
| + verifyDigitList(".99792", digits);
|
| + }
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestConvertScientificNotation() {
|
| + DigitList digits;
|
| + {
|
| + digits.set(186283);
|
| + assertEquals("", 5, digits.toScientific(1, 1));
|
| + verifyDigitList(
|
| + "1.86283",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(186283);
|
| + assertEquals("", 0, digits.toScientific(6, 1));
|
| + verifyDigitList(
|
| + "186283",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(186283);
|
| + assertEquals("", -2, digits.toScientific(8, 1));
|
| + verifyDigitList(
|
| + "18628300",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", 6, digits.toScientific(-1, 3));
|
| + verifyDigitList(
|
| + ".043561",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", 3, digits.toScientific(0, 3));
|
| + verifyDigitList(
|
| + "43.561",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", 3, digits.toScientific(2, 3));
|
| + verifyDigitList(
|
| + "43.561",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", 0, digits.toScientific(3, 3));
|
| + verifyDigitList(
|
| + "43561",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", 0, digits.toScientific(5, 3));
|
| + verifyDigitList(
|
| + "43561",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", -3, digits.toScientific(6, 3));
|
| + verifyDigitList(
|
| + "43561000",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", -3, digits.toScientific(8, 3));
|
| + verifyDigitList(
|
| + "43561000",
|
| + digits);
|
| + }
|
| + {
|
| + digits.set(43561);
|
| + assertEquals("", -6, digits.toScientific(9, 3));
|
| + verifyDigitList(
|
| + "43561000000",
|
| + digits);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestLowerUpperExponent() {
|
| + DigitList digits;
|
| +
|
| + digits.set(98.7);
|
| + assertEquals("", -1, digits.getLowerExponent());
|
| + assertEquals("", 2, digits.getUpperExponent());
|
| +}
|
| +
|
| +void NumberFormat2Test::TestRounding() {
|
| + DigitList digits;
|
| + uprv_decContextSetRounding(&digits.fContext, DEC_ROUND_CEILING);
|
| + {
|
| + // Round at very large exponent
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(100);
|
| + verifyDigitList(
|
| + "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", // 100 0's after 1
|
| + digits);
|
| + }
|
| + {
|
| + // Round at very large exponent
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(1);
|
| + verifyDigitList(
|
| + "790", // 100 0's after 1
|
| + digits);
|
| + }
|
| + {
|
| + // Round at positive exponent
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(1);
|
| + verifyDigitList("790", digits);
|
| + }
|
| + {
|
| + // Round at zero exponent
|
| + digits.set(788.123);
|
| + digits.roundAtExponent(0);
|
| + verifyDigitList("789", digits);
|
| + }
|
| + {
|
| + // Round at negative exponent
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(-2);
|
| + verifyDigitList("789.13", digits);
|
| + }
|
| + {
|
| + // Round to exponent of digits.
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(-3);
|
| + verifyDigitList("789.123", digits);
|
| + }
|
| + {
|
| + // Round at large negative exponent
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(-100);
|
| + verifyDigitList("789.123", digits);
|
| + }
|
| + {
|
| + // Round negative
|
| + digits.set(-789.123);
|
| + digits.roundAtExponent(-2);
|
| + digits.setPositive(TRUE);
|
| + verifyDigitList("789.12", digits);
|
| + }
|
| + {
|
| + // Round to 1 significant digit
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(INT32_MIN, 1);
|
| + verifyDigitList("800", digits);
|
| + }
|
| + {
|
| + // Round to 5 significant digit
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(INT32_MIN, 5);
|
| + verifyDigitList("789.13", digits);
|
| + }
|
| + {
|
| + // Round to 6 significant digit
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(INT32_MIN, 6);
|
| + verifyDigitList("789.123", digits);
|
| + }
|
| + {
|
| + // no-op
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(INT32_MIN, INT32_MAX);
|
| + verifyDigitList("789.123", digits);
|
| + }
|
| + {
|
| + // Rounding at -1 produces fewer than 5 significant digits
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(-1, 5);
|
| + verifyDigitList("789.2", digits);
|
| + }
|
| + {
|
| + // Rounding at -1 produces exactly 4 significant digits
|
| + digits.set(789.123);
|
| + digits.roundAtExponent(-1, 4);
|
| + verifyDigitList("789.2", digits);
|
| + }
|
| + {
|
| + // Rounding at -1 produces more than 3 significant digits
|
| + digits.set(788.123);
|
| + digits.roundAtExponent(-1, 3);
|
| + verifyDigitList("789", digits);
|
| + }
|
| + {
|
| + digits.set(123.456);
|
| + digits.round(INT32_MAX);
|
| + verifyDigitList("123.456", digits);
|
| + }
|
| + {
|
| + digits.set(123.456);
|
| + digits.round(1);
|
| + verifyDigitList("200", digits);
|
| + }
|
| +}
|
| +void NumberFormat2Test::TestBenchmark() {
|
| +/*
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
|
| + DecimalFormat2 fmt(en, "0.0000000", status);
|
| + FieldPosition fpos(0);
|
| + clock_t start = clock();
|
| + for (int32_t i = 0; i < 100000; ++i) {
|
| + UParseError perror;
|
| + DecimalFormat2 fmt2("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
|
| +// UnicodeString append;
|
| +// fmt.format(4.6692016, append, fpos, status);
|
| + }
|
| + errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
|
| + assertSuccess("", status);
|
| +*/
|
| +}
|
| +
|
| +void NumberFormat2Test::TestBenchmark2() {
|
| +/*
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
|
| + DecimalFormat fmt("0.0000000", sym, status);
|
| + FieldPosition fpos(0);
|
| + clock_t start = clock();
|
| + for (int32_t i = 0; i < 100000; ++i) {
|
| + UParseError perror;
|
| + DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
|
| +// UnicodeString append;
|
| +// fmt.format(4.6692016, append, fpos, status);
|
| + }
|
| + errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
|
| + assertSuccess("", status);
|
| +*/
|
| +}
|
| +
|
| +void NumberFormat2Test::TestSmallIntFormatter() {
|
| + verifySmallIntFormatter("0", 7, 0, -2);
|
| + verifySmallIntFormatter("7", 7, 1, -2);
|
| + verifySmallIntFormatter("07", 7, 2, -2);
|
| + verifySmallIntFormatter("07", 7, 2, 2);
|
| + verifySmallIntFormatter("007", 7, 3, 4);
|
| + verifySmallIntFormatter("7", 7, -1, 3);
|
| + verifySmallIntFormatter("0", 0, -1, 3);
|
| + verifySmallIntFormatter("057", 57, 3, 7);
|
| + verifySmallIntFormatter("0057", 57, 4, 7);
|
| + // too many digits for small int
|
| + verifySmallIntFormatter("", 57, 5, 7);
|
| + // too many digits for small int
|
| + verifySmallIntFormatter("", 57, 5, 4);
|
| + verifySmallIntFormatter("03", 3, 2, 3);
|
| + verifySmallIntFormatter("32", 32, 2, 3);
|
| + verifySmallIntFormatter("321", 321, 2, 3);
|
| + verifySmallIntFormatter("219", 3219, 2, 3);
|
| + verifySmallIntFormatter("4095", 4095, 2, 4);
|
| + verifySmallIntFormatter("4095", 4095, 2, 5);
|
| + verifySmallIntFormatter("", 4096, 2, 5);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestPositiveIntDigitFormatter() {
|
| + DigitFormatter formatter;
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 4},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "0057",
|
| + formatter,
|
| + 57,
|
| + 4,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 5},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "00057",
|
| + formatter,
|
| + 57,
|
| + 5,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 5},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "01000",
|
| + formatter,
|
| + 1000,
|
| + 5,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 3},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "100",
|
| + formatter,
|
| + 100,
|
| + 0,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 10},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "2147483647",
|
| + formatter,
|
| + 2147483647,
|
| + 5,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 12},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "002147483647",
|
| + formatter,
|
| + 2147483647,
|
| + 12,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // Test long digit string where we have to append one
|
| + // character at a time.
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 40},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "0000000000000000000000000000002147483647",
|
| + formatter,
|
| + 2147483647,
|
| + 40,
|
| + INT32_MAX,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 4},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "6283",
|
| + formatter,
|
| + 186283,
|
| + 2,
|
| + 4,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "0",
|
| + formatter,
|
| + 186283,
|
| + 0,
|
| + 0,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {0, -1, 0}};
|
| + verifyPositiveIntDigitFormatter(
|
| + "3",
|
| + formatter,
|
| + 186283,
|
| + 1,
|
| + 1,
|
| + expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +
|
| +void NumberFormat2Test::TestDigitFormatterDefaultCtor() {
|
| + DigitFormatter formatter;
|
| + VisibleDigits digits;
|
| + FixedPrecision precision;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + precision.initVisibleDigits(246.801, digits, status);
|
| + assertSuccess("", status);
|
| + DigitGrouping grouping;
|
| + DigitFormatterOptions options;
|
| + verifyDigitFormatter(
|
| + "246.801",
|
| + formatter,
|
| + digits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitFormatterMonetary() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + symbols.setSymbol(
|
| + DecimalFormatSymbols::kMonetarySeparatorSymbol,
|
| + "decimal separator");
|
| + symbols.setSymbol(
|
| + DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol,
|
| + "grouping separator");
|
| + DigitFormatter formatter(symbols);
|
| + VisibleDigits visibleDigits;
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + precision.initVisibleDigits(43560.02, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatterOptions options;
|
| + grouping.fGrouping = 3;
|
| + {
|
| + verifyDigitFormatter(
|
| + "43,560.02",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| + formatter.setDecimalFormatSymbolsForMonetary(symbols);
|
| + verifyDigitFormatter(
|
| + "43grouping separator560decimal separator02",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitFormatter() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + DigitInterval interval;
|
| + {
|
| + VisibleDigits visibleDigits;
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + precision.initVisibleDigits((int64_t) 8192, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatterOptions options;
|
| + verifyDigitFormatter(
|
| + "8192",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 4},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
|
| + {0, -1, 0}};
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + verifyDigitFormatter(
|
| + "8192.",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + expectedAttributes);
|
| +
|
| + // Turn on grouping
|
| + grouping.fGrouping = 3;
|
| + options.fAlwaysShowDecimal = FALSE;
|
| + verifyDigitFormatter(
|
| + "8,192",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +
|
| + // turn on min grouping which will suppress grouping
|
| + grouping.fMinGrouping = 2;
|
| + verifyDigitFormatter(
|
| + "8192",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +
|
| + // adding one more digit will enable grouping once again.
|
| + precision.initVisibleDigits((int64_t) 43560, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + verifyDigitFormatter(
|
| + "43,560",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| + }
|
| + {
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + VisibleDigits visibleDigits;
|
| + precision.initVisibleDigits(
|
| + 31415926.0078125, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatterOptions options;
|
| + verifyDigitFormatter(
|
| + "31415926.0078125",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +
|
| + // Turn on grouping with secondary.
|
| + grouping.fGrouping = 2;
|
| + grouping.fGrouping2 = 3;
|
| + verifyDigitFormatter(
|
| + "314,159,26.0078125",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +
|
| + // Pad with zeros by widening interval.
|
| + precision.fMin.setIntDigitCount(9);
|
| + precision.fMin.setFracDigitCount(10);
|
| + precision.initVisibleDigits(
|
| + 31415926.0078125, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_GROUPING_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_GROUPING_SEPARATOR_FIELD, 5, 6},
|
| + {UNUM_GROUPING_SEPARATOR_FIELD, 9, 10},
|
| + {UNUM_INTEGER_FIELD, 0, 12},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 12, 13},
|
| + {UNUM_FRACTION_FIELD, 13, 23},
|
| + {0, -1, 0}};
|
| + verifyDigitFormatter(
|
| + "0,314,159,26.0078125000",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + VisibleDigits visibleDigits;
|
| + DigitFormatterOptions options;
|
| + precision.fMax.setIntDigitCount(0);
|
| + precision.fMax.setFracDigitCount(0);
|
| + precision.initVisibleDigits(
|
| + 3125.0, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {0, -1, 0}};
|
| + verifyDigitFormatter(
|
| + "0",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + expectedAttributes);
|
| + NumberFormat2Test_Attributes expectedAttributesWithDecimal[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {0, -1, 0}};
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + verifyDigitFormatter(
|
| + "0.",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + expectedAttributesWithDecimal);
|
| + }
|
| + {
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + VisibleDigits visibleDigits;
|
| + DigitFormatterOptions options;
|
| + precision.fMax.setIntDigitCount(1);
|
| + precision.fMin.setFracDigitCount(1);
|
| + precision.initVisibleDigits(
|
| + 3125.0, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_FRACTION_FIELD, 2, 3},
|
| + {0, -1, 0}};
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + verifyDigitFormatter(
|
| + "5.0",
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestSciFormatterDefaultCtor() {
|
| + DigitFormatter formatter;
|
| + ScientificPrecision precision;
|
| + VisibleDigitsWithExponent visibleDigits;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + precision.initVisibleDigitsWithExponent(
|
| + 6.02E23, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + SciFormatterOptions options;
|
| + verifySciFormatter(
|
| + "6.02E23",
|
| + formatter,
|
| + visibleDigits,
|
| + options,
|
| + NULL);
|
| + precision.initVisibleDigitsWithExponent(
|
| + 6.62E-34, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + verifySciFormatter(
|
| + "6.62E-34",
|
| + formatter,
|
| + visibleDigits,
|
| + options,
|
| + NULL);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestSciFormatter() {
|
| + DigitFormatter formatter;
|
| + ScientificPrecision precision;
|
| + precision.fMantissa.fMin.setIntDigitCount(4);
|
| + precision.fMantissa.fMax.setIntDigitCount(4);
|
| + precision.fMantissa.fMin.setFracDigitCount(0);
|
| + precision.fMantissa.fMax.setFracDigitCount(0);
|
| + precision.fMinExponentDigits = 3;
|
| + VisibleDigitsWithExponent visibleDigits;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + precision.initVisibleDigitsWithExponent(
|
| + 1.248E26, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + SciFormatterOptions options;
|
| +
|
| + {
|
| + options.fExponent.fAlwaysShowSign = TRUE;
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 4},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 4, 5},
|
| + {UNUM_EXPONENT_SIGN_FIELD, 5, 6},
|
| + {UNUM_EXPONENT_FIELD, 6, 9},
|
| + {0, -1, 0}};
|
| + verifySciFormatter(
|
| + "1248E+023",
|
| + formatter,
|
| + visibleDigits,
|
| + options,
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + options.fMantissa.fAlwaysShowDecimal = TRUE;
|
| + options.fExponent.fAlwaysShowSign = FALSE;
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 4},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
|
| + {UNUM_EXPONENT_FIELD, 6, 9},
|
| + {0, -1, 0}};
|
| + verifySciFormatter(
|
| + "1248.E023",
|
| + formatter,
|
| + visibleDigits,
|
| + options,
|
| + expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestValueFormatterIsFastFormattable() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + DigitFormatterOptions options;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("", vf.isFastFormattable(0));
|
| + assertTrue("", vf.isFastFormattable(35));
|
| + assertTrue("", vf.isFastFormattable(-48));
|
| + assertTrue("", vf.isFastFormattable(2147483647));
|
| + assertTrue("", vf.isFastFormattable(-2147483647));
|
| + assertFalse("", vf.isFastFormattable(-2147483648L));
|
| + {
|
| + DigitGrouping grouping;
|
| + grouping.fGrouping = 3;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("0", vf.isFastFormattable(0));
|
| + assertTrue("62", vf.isFastFormattable(62));
|
| + assertTrue("999", vf.isFastFormattable(999));
|
| + assertFalse("1000", vf.isFastFormattable(1000));
|
| + assertTrue("-1", vf.isFastFormattable(-1));
|
| + assertTrue("-38", vf.isFastFormattable(-38));
|
| + assertTrue("-999", vf.isFastFormattable(-999));
|
| + assertFalse("-1000", vf.isFastFormattable(-1000));
|
| + grouping.fMinGrouping = 2;
|
| + assertTrue("-1000", vf.isFastFormattable(-1000));
|
| + assertTrue("-4095", vf.isFastFormattable(-4095));
|
| + assertTrue("4095", vf.isFastFormattable(4095));
|
| + // We give up on acounting digits at 4096
|
| + assertFalse("-4096", vf.isFastFormattable(-4096));
|
| + assertFalse("4096", vf.isFastFormattable(4096));
|
| + }
|
| + {
|
| + // grouping on but with max integer digits set.
|
| + DigitGrouping grouping;
|
| + grouping.fGrouping = 4;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(4);
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("-4096", vf.isFastFormattable(-4096));
|
| + assertTrue("4096", vf.isFastFormattable(4096));
|
| + assertTrue("-10000", vf.isFastFormattable(-10000));
|
| + assertTrue("10000", vf.isFastFormattable(10000));
|
| + assertTrue("-2147483647", vf.isFastFormattable(-2147483647));
|
| + assertTrue("2147483647", vf.isFastFormattable(2147483647));
|
| +
|
| + precision.fMax.setIntDigitCount(5);
|
| + assertFalse("-4096", vf.isFastFormattable(-4096));
|
| + assertFalse("4096", vf.isFastFormattable(4096));
|
| +
|
| + }
|
| + {
|
| + // grouping on but with min integer digits set.
|
| + DigitGrouping grouping;
|
| + grouping.fGrouping = 3;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(3);
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("-999", vf.isFastFormattable(-999));
|
| + assertTrue("999", vf.isFastFormattable(999));
|
| + assertFalse("-1000", vf.isFastFormattable(-1000));
|
| + assertFalse("1000", vf.isFastFormattable(1000));
|
| +
|
| + precision.fMin.setIntDigitCount(4);
|
| + assertFalse("-999", vf.isFastFormattable(-999));
|
| + assertFalse("999", vf.isFastFormattable(999));
|
| + assertFalse("-2147483647", vf.isFastFormattable(-2147483647));
|
| + assertFalse("2147483647", vf.isFastFormattable(2147483647));
|
| + }
|
| + {
|
| + // options set.
|
| + DigitFormatterOptions options;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("5125", vf.isFastFormattable(5125));
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + assertFalse("5125", vf.isFastFormattable(5125));
|
| + options.fAlwaysShowDecimal = FALSE;
|
| + assertTrue("5125", vf.isFastFormattable(5125));
|
| + }
|
| + {
|
| + // test fraction digits
|
| + FixedPrecision precision;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("7127", vf.isFastFormattable(7127));
|
| + precision.fMin.setFracDigitCount(1);
|
| + assertFalse("7127", vf.isFastFormattable(7127));
|
| + }
|
| + {
|
| + // test presence of significant digits
|
| + FixedPrecision precision;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("1049", vf.isFastFormattable(1049));
|
| + precision.fSignificant.setMin(1);
|
| + assertFalse("1049", vf.isFastFormattable(1049));
|
| + }
|
| + {
|
| + // test presence of rounding increment
|
| + FixedPrecision precision;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter, grouping, precision, options);
|
| + assertTrue("1099", vf.isFastFormattable(1099));
|
| + precision.fRoundingIncrement.set(2.3);
|
| + assertFalse("1099", vf.isFastFormattable(1099));
|
| + }
|
| + {
|
| + // test scientific notation
|
| + ScientificPrecision precision;
|
| + SciFormatterOptions options;
|
| + ValueFormatter vf;
|
| + vf.prepareScientificFormatting(
|
| + formatter, precision, options);
|
| + assertFalse("1081", vf.isFastFormattable(1081));
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitAffix() {
|
| + DigitAffix affix;
|
| + {
|
| + affix.append("foo");
|
| + affix.append("--", UNUM_SIGN_FIELD);
|
| + affix.append("%", UNUM_PERCENT_FIELD);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 3, 5},
|
| + {UNUM_PERCENT_FIELD, 5, 6},
|
| + {0, -1, 0}};
|
| + verifyAffix("foo--%", affix, expectedAttributes);
|
| + }
|
| + {
|
| + affix.remove();
|
| + affix.append("USD", UNUM_CURRENCY_FIELD);
|
| + affix.append(" ");
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 3},
|
| + {0, -1, 0}};
|
| + verifyAffix("USD ", affix, expectedAttributes);
|
| + }
|
| + {
|
| + affix.setTo("%%", UNUM_PERCENT_FIELD);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_PERCENT_FIELD, 0, 2},
|
| + {0, -1, 0}};
|
| + verifyAffix("%%", affix, expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestPluralAffix() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + PluralAffix part;
|
| + part.setVariant("one", "Dollar", status);
|
| + part.setVariant("few", "DollarFew", status);
|
| + part.setVariant("other", "Dollars", status);
|
| + PluralAffix dollar(part);
|
| + PluralAffix percent(part);
|
| + part.remove();
|
| + part.setVariant("one", "Percent", status);
|
| + part.setVariant("many", "PercentMany", status);
|
| + part.setVariant("other", "Percents", status);
|
| + percent = part;
|
| + part.remove();
|
| + part.setVariant("one", "foo", status);
|
| +
|
| + PluralAffix pa;
|
| + assertEquals("", "", pa.getOtherVariant().toString());
|
| + pa.append(dollar, UNUM_CURRENCY_FIELD, status);
|
| + pa.append(" and ");
|
| + pa.append(percent, UNUM_PERCENT_FIELD, status);
|
| + pa.append("-", UNUM_SIGN_FIELD);
|
| +
|
| + {
|
| + // other
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 7},
|
| + {UNUM_PERCENT_FIELD, 12, 20},
|
| + {UNUM_SIGN_FIELD, 20, 21},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "Dollars and Percents-",
|
| + pa.getByCategory("other"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // two which is same as other
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 7},
|
| + {UNUM_PERCENT_FIELD, 12, 20},
|
| + {UNUM_SIGN_FIELD, 20, 21},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "Dollars and Percents-",
|
| + pa.getByCategory("two"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // bad which is same as other
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 7},
|
| + {UNUM_PERCENT_FIELD, 12, 20},
|
| + {UNUM_SIGN_FIELD, 20, 21},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "Dollars and Percents-",
|
| + pa.getByCategory("bad"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // one
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 6},
|
| + {UNUM_PERCENT_FIELD, 11, 18},
|
| + {UNUM_SIGN_FIELD, 18, 19},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "Dollar and Percent-",
|
| + pa.getByCategory("one"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // few
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 9},
|
| + {UNUM_PERCENT_FIELD, 14, 22},
|
| + {UNUM_SIGN_FIELD, 22, 23},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "DollarFew and Percents-",
|
| + pa.getByCategory("few"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // many
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_CURRENCY_FIELD, 0, 7},
|
| + {UNUM_PERCENT_FIELD, 12, 23},
|
| + {UNUM_SIGN_FIELD, 23, 24},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "Dollars and PercentMany-",
|
| + pa.getByCategory("many"),
|
| + expectedAttributes);
|
| + }
|
| + assertTrue("", pa.hasMultipleVariants());
|
| + pa.remove();
|
| + pa.append("$$$", UNUM_CURRENCY_FIELD);
|
| + assertFalse("", pa.hasMultipleVariants());
|
| +
|
| +}
|
| +
|
| +void NumberFormat2Test::TestCurrencyAffixInfo() {
|
| + CurrencyAffixInfo info;
|
| + assertTrue("", info.isDefault());
|
| + UnicodeString expectedSymbol("\\u00a4");
|
| + UnicodeString expectedSymbolIso("\\u00a4\\u00a4");
|
| + UnicodeString expectedSymbols("\\u00a4\\u00a4\\u00a4");
|
| + assertEquals("", expectedSymbol.unescape(), info.getSymbol());
|
| + assertEquals("", expectedSymbolIso.unescape(), info.getISO());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("one").toString());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("other").toString());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("two").toString());
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
|
| + LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + info.set("en", rules.getAlias(), USD, status);
|
| + assertEquals("", "$", info.getSymbol(), TRUE);
|
| + assertEquals("", "USD", info.getISO(), TRUE);
|
| + assertEquals("", "US dollar", info.getLong().getByCategory("one").toString(), TRUE);
|
| + assertEquals("", "US dollars", info.getLong().getByCategory("other").toString(), TRUE);
|
| + assertEquals("", "US dollars", info.getLong().getByCategory("two").toString(), TRUE);
|
| + assertFalse("", info.isDefault());
|
| + info.set(NULL, NULL, NULL, status);
|
| + assertTrue("", info.isDefault());
|
| + assertEquals("", expectedSymbol.unescape(), info.getSymbol());
|
| + assertEquals("", expectedSymbolIso.unescape(), info.getISO());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("one").toString());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("other").toString());
|
| + assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("two").toString());
|
| + info.setSymbol("$");
|
| + assertFalse("", info.isDefault());
|
| + info.set(NULL, NULL, NULL, status);
|
| + assertTrue("", info.isDefault());
|
| + info.setISO("USD");
|
| + assertFalse("", info.isDefault());
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestAffixPattern() {
|
| + static UChar chars[500];
|
| + for (int32_t i = 0; i < UPRV_LENGTHOF(chars); ++i) {
|
| + chars[i] = (UChar) (i + 1);
|
| + }
|
| + AffixPattern first;
|
| + first.add(AffixPattern::kPercent);
|
| + first.addLiteral(chars, 0, 200);
|
| + first.addLiteral(chars, 200, 300);
|
| + first.addCurrency(2);
|
| + first.addLiteral(chars, 0, 256);
|
| + AffixPattern second;
|
| + second.add(AffixPattern::kPercent);
|
| + second.addLiteral(chars, 0, 300);
|
| + second.addLiteral(chars, 300, 200);
|
| + second.addCurrency(2);
|
| + second.addLiteral(chars, 0, 150);
|
| + second.addLiteral(chars, 150, 106);
|
| + assertTrue("", first.equals(second));
|
| + AffixPatternIterator iter;
|
| + second.remove();
|
| + assertFalse("", second.iterator(iter).nextToken());
|
| + assertTrue("", first.iterator(iter).nextToken());
|
| + assertEquals("", AffixPattern::kPercent, iter.getTokenType());
|
| + assertEquals("", 1, iter.getTokenLength());
|
| + assertTrue("", iter.nextToken());
|
| + UnicodeString str;
|
| + assertEquals("", 500, iter.getLiteral(str).length());
|
| + assertEquals("", AffixPattern::kLiteral, iter.getTokenType());
|
| + assertEquals("", 500, iter.getTokenLength());
|
| + assertTrue("", iter.nextToken());
|
| + assertEquals("", AffixPattern::kCurrency, iter.getTokenType());
|
| + assertEquals("", 2, iter.getTokenLength());
|
| + assertTrue("", iter.nextToken());
|
| + assertEquals("", 256, iter.getLiteral(str).length());
|
| + assertEquals("", AffixPattern::kLiteral, iter.getTokenType());
|
| + assertEquals("", 256, iter.getTokenLength());
|
| + assertFalse("", iter.nextToken());
|
| +}
|
| +
|
| +void NumberFormat2Test::TestAffixPatternDoubleQuote() {
|
| + UnicodeString str("'Don''t'");
|
| + AffixPattern expected;
|
| + // Don't
|
| + static UChar chars[] = {0x44, 0x6F, 0x6E, 0x27, 0x74};
|
| + expected.addLiteral(chars, 0, UPRV_LENGTHOF(chars));
|
| + AffixPattern actual;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + AffixPattern::parseUserAffixString(str, actual, status);
|
| + assertTrue("", expected.equals(actual));
|
| + UnicodeString formattedString;
|
| + assertEquals("", "Don''t", actual.toUserString(formattedString));
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestAffixPatternParser() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
|
| + LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + AffixPatternParser parser(symbols);
|
| + CurrencyAffixInfo currencyAffixInfo;
|
| + currencyAffixInfo.set("en", rules.getAlias(), USD, status);
|
| + PluralAffix affix;
|
| + UnicodeString str("'--y'''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
|
| + str = str.unescape();
|
| + assertSuccess("", status);
|
| + AffixPattern affixPattern;
|
| + parser.parse(
|
| + AffixPattern::parseAffixString(str, affixPattern, status),
|
| + currencyAffixInfo,
|
| + affix,
|
| + status);
|
| + UnicodeString formattedStr;
|
| + affixPattern.toString(formattedStr);
|
| + UnicodeString expectedFormattedStr("'--y''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
|
| + expectedFormattedStr = expectedFormattedStr.unescape();
|
| + assertEquals("1", expectedFormattedStr, formattedStr);
|
| + AffixPattern userAffixPattern;
|
| + UnicodeString userStr("-'-'y'''d'z%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
|
| + userStr = userStr.unescape();
|
| + AffixPattern::parseUserAffixString(userStr, userAffixPattern, status),
|
| + assertTrue("", affixPattern.equals(userAffixPattern));
|
| + AffixPattern userAffixPattern2;
|
| + UnicodeString formattedUserStr;
|
| + AffixPattern::parseUserAffixString(
|
| + userAffixPattern.toUserString(formattedUserStr),
|
| + userAffixPattern2,
|
| + status);
|
| + UnicodeString expectedFormattedUserStr(
|
| + "-'-'y''dz%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
|
| + assertEquals("2", expectedFormattedUserStr.unescape(), formattedUserStr);
|
| + assertTrue("", userAffixPattern2.equals(userAffixPattern));
|
| + assertSuccess("", status);
|
| + assertTrue("", affixPattern.usesCurrency());
|
| + assertTrue("", affixPattern.usesPercent());
|
| + assertFalse("", affixPattern.usesPermill());
|
| + assertTrue("", affix.hasMultipleVariants());
|
| + {
|
| + // other
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_PERCENT_FIELD, 6, 7},
|
| + {UNUM_CURRENCY_FIELD, 7, 17},
|
| + {UNUM_CURRENCY_FIELD, 21, 31},
|
| + {UNUM_CURRENCY_FIELD, 35, 38},
|
| + {UNUM_CURRENCY_FIELD, 43, 44},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "--y'dz%US dollars\\u00a4 y US dollars or USD but $",
|
| + affix.getByCategory("other"),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + // one
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_PERCENT_FIELD, 6, 7},
|
| + {UNUM_CURRENCY_FIELD, 7, 16},
|
| + {UNUM_CURRENCY_FIELD, 20, 29},
|
| + {UNUM_CURRENCY_FIELD, 33, 36},
|
| + {UNUM_CURRENCY_FIELD, 41, 42},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "--y'dz%US dollar\\u00a4 y US dollar or USD but $",
|
| + affix.getByCategory("one"),
|
| + expectedAttributes);
|
| + }
|
| + affix.remove();
|
| + str = "%'-";
|
| + affixPattern.remove();
|
| + parser.parse(
|
| + AffixPattern::parseAffixString(str, affixPattern, status),
|
| + currencyAffixInfo,
|
| + affix,
|
| + status);
|
| + assertSuccess("", status);
|
| + assertFalse("", affixPattern.usesCurrency());
|
| + assertFalse("", affixPattern.usesPercent());
|
| + assertFalse("", affixPattern.usesPermill());
|
| + assertFalse("", affix.hasMultipleVariants());
|
| + {
|
| + // other
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 1, 2},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + "%-",
|
| + affix.getByCategory("other"),
|
| + expectedAttributes);
|
| + }
|
| + UnicodeString a4("\\u00a4");
|
| + AffixPattern scratchPattern;
|
| + AffixPattern::parseAffixString(a4.unescape(), scratchPattern, status);
|
| + assertFalse("", scratchPattern.usesCurrency());
|
| +
|
| + // Test really long string > 256 chars.
|
| + str = "'\\u2030012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789";
|
| + str = str.unescape();
|
| + affixPattern.remove();
|
| + affix.remove();
|
| + parser.parse(
|
| + AffixPattern::parseAffixString(str, affixPattern, status),
|
| + currencyAffixInfo,
|
| + affix,
|
| + status);
|
| + assertSuccess("", status);
|
| + assertFalse("", affixPattern.usesCurrency());
|
| + assertFalse("", affixPattern.usesPercent());
|
| + assertTrue("", affixPattern.usesPermill());
|
| + assertFalse("", affix.hasMultipleVariants());
|
| + {
|
| + UnicodeString expected =
|
| + "\\u2030012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789"
|
| + "012345678901234567890123456789012345678901234567890123456789";
|
| + expected = expected.unescape();
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_PERMILL_FIELD, 0, 1},
|
| + {0, -1, 0}};
|
| + verifyAffix(
|
| + expected,
|
| + affix.getOtherVariant(),
|
| + expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestAffixPatternAppend() {
|
| + AffixPattern pattern;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString patternStr("%\\u2030");
|
| + AffixPattern::parseUserAffixString(
|
| + patternStr.unescape(), pattern, status);
|
| +
|
| + AffixPattern appendPattern;
|
| + UnicodeString appendPatternStr("-\\u00a4\\u00a4*");
|
| + AffixPattern::parseUserAffixString(
|
| + appendPatternStr.unescape(), appendPattern, status);
|
| +
|
| + AffixPattern expectedPattern;
|
| + UnicodeString expectedPatternStr("%\\u2030-\\u00a4\\u00a4*");
|
| + AffixPattern::parseUserAffixString(
|
| + expectedPatternStr.unescape(), expectedPattern, status);
|
| +
|
| + assertTrue("", pattern.append(appendPattern).equals(expectedPattern));
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestAffixPatternAppendAjoiningLiterals() {
|
| + AffixPattern pattern;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString patternStr("%baaa");
|
| + AffixPattern::parseUserAffixString(
|
| + patternStr, pattern, status);
|
| +
|
| + AffixPattern appendPattern;
|
| + UnicodeString appendPatternStr("caa%");
|
| + AffixPattern::parseUserAffixString(
|
| + appendPatternStr, appendPattern, status);
|
| +
|
| + AffixPattern expectedPattern;
|
| + UnicodeString expectedPatternStr("%baaacaa%");
|
| + AffixPattern::parseUserAffixString(
|
| + expectedPatternStr, expectedPattern, status);
|
| +
|
| + assertTrue("", pattern.append(appendPattern).equals(expectedPattern));
|
| + assertSuccess("", status);
|
| +}
|
| +
|
| +void NumberFormat2Test::TestLargeIntValue() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| +
|
| + // Last 18 digits for int values.
|
| + verifyIntValue(
|
| + 223372036854775807LL,
|
| + precision.initVisibleDigits(INT64_MAX, digits, status));
|
| + assertSuccess("INT64_MAX", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(5);
|
| +
|
| + // Last 18 digits for int values.
|
| + verifyIntValue(
|
| + 75807LL,
|
| + precision.initVisibleDigits(INT64_MAX, digits, status));
|
| + verifySource(75807.0, digits);
|
| + assertSuccess("75807", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| +
|
| + // Last 18 digits for int values.
|
| + verifyIntValue(
|
| + 223372036854775808LL,
|
| + precision.initVisibleDigits(INT64_MIN, digits, status));
|
| + assertSuccess("INT64_MIN", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(5);
|
| +
|
| + // Last 18 digits for int values.
|
| + verifyIntValue(
|
| + 75808LL,
|
| + precision.initVisibleDigits(INT64_MIN, digits, status));
|
| + verifySource(75808.0, digits);
|
| + assertSuccess("75808", status);
|
| + }
|
| +
|
| +}
|
| +
|
| +void NumberFormat2Test::TestIntInitVisibleDigits() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "13",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 13LL, digits, status));
|
| + assertSuccess("13", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "17",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -17LL, digits, status));
|
| + assertSuccess("-17", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "9223372036854775808",
|
| + TRUE,
|
| + precision.initVisibleDigits(INT64_MIN, digits, status));
|
| + assertSuccess("-9223372036854775808", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "9223372036854775807",
|
| + FALSE,
|
| + precision.initVisibleDigits(INT64_MAX, digits, status));
|
| + assertSuccess("9223372036854775807", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "31536000",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -31536000LL, digits, status));
|
| + assertSuccess("-31536000", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "0",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 0LL, digits, status));
|
| + assertSuccess("0", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(4);
|
| + precision.fMin.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "0000.00",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 0LL, digits, status));
|
| + assertSuccess("0", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(4);
|
| + precision.fMin.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "0057.00",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 57LL, digits, status));
|
| + assertSuccess("57", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(4);
|
| + precision.fMin.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "0057.00",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -57LL, digits, status));
|
| + assertSuccess("-57", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(2);
|
| + precision.fMin.setFracDigitCount(1);
|
| + verifyVisibleDigits(
|
| + "35.0",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 235LL, digits, status));
|
| + assertSuccess("235", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(2);
|
| + precision.fMin.setFracDigitCount(1);
|
| + precision.fFailIfOverMax = TRUE;
|
| + precision.initVisibleDigits((int64_t) 239LL, digits, status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("239: Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMin(5);
|
| + verifyVisibleDigits(
|
| + "153.00",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 153LL, digits, status));
|
| + assertSuccess("153", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(2);
|
| + precision.fExactOnly = TRUE;
|
| + precision.initVisibleDigits((int64_t) 154LL, digits, status);
|
| + if (status != U_FORMAT_INEXACT_ERROR) {
|
| + errln("154: Expected U_FORMAT_INEXACT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(5);
|
| + verifyVisibleDigits(
|
| + "150",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 150LL, digits, status));
|
| + assertSuccess("150", status);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestIntInitVisibleDigitsToDigitList() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fRoundingIncrement.set(7.3);
|
| + verifyVisibleDigits(
|
| + "29.2",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -30LL, digits, status));
|
| + assertSuccess("-29.2", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fRoundingIncrement.set(7.3);
|
| + precision.fRoundingMode = DecimalFormat::kRoundFloor;
|
| + verifyVisibleDigits(
|
| + "36.5",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -30LL, digits, status));
|
| + assertSuccess("-36.5", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(3);
|
| + precision.fRoundingMode = DecimalFormat::kRoundCeiling;
|
| + verifyVisibleDigits(
|
| + "1390",
|
| + FALSE,
|
| + precision.initVisibleDigits((int64_t) 1381LL, digits, status));
|
| + assertSuccess("1390", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(1);
|
| + precision.fRoundingMode = DecimalFormat::kRoundFloor;
|
| + verifyVisibleDigits(
|
| + "2000",
|
| + TRUE,
|
| + precision.initVisibleDigits((int64_t) -1381LL, digits, status));
|
| + assertSuccess("-2000", status);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDoubleInitVisibleDigits() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "2.05",
|
| + FALSE,
|
| + precision.initVisibleDigits(2.05, digits, status));
|
| + assertSuccess("2.05", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + verifyVisibleDigits(
|
| + "3547",
|
| + FALSE,
|
| + precision.initVisibleDigits(3547.0, digits, status));
|
| + assertSuccess("3547", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setFracDigitCount(2);
|
| + precision.fMax.setIntDigitCount(1);
|
| + precision.fFailIfOverMax = TRUE;
|
| + precision.fExactOnly = TRUE;
|
| + verifyVisibleDigits(
|
| + "2.05",
|
| + TRUE,
|
| + precision.initVisibleDigits(-2.05, digits, status));
|
| + assertSuccess("-2.05", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setFracDigitCount(1);
|
| + precision.fMax.setIntDigitCount(1);
|
| + precision.fFailIfOverMax = TRUE;
|
| + precision.fExactOnly = TRUE;
|
| + precision.initVisibleDigits(-2.05, digits, status);
|
| + if (status != U_FORMAT_INEXACT_ERROR) {
|
| + errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setFracDigitCount(2);
|
| + precision.fMax.setIntDigitCount(0);
|
| + precision.fFailIfOverMax = TRUE;
|
| + precision.fExactOnly = TRUE;
|
| + precision.initVisibleDigits(-2.05, digits, status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("-2.05: Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(5);
|
| + precision.fMin.setFracDigitCount(2);
|
| + precision.fExactOnly = TRUE;
|
| + verifyVisibleDigits(
|
| + "06245.30",
|
| + FALSE,
|
| + precision.initVisibleDigits(6245.3, digits, status));
|
| + assertSuccess("06245.30", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(5);
|
| + precision.fExactOnly = TRUE;
|
| + verifyVisibleDigits(
|
| + "6245.3",
|
| + FALSE,
|
| + precision.initVisibleDigits(6245.3, digits, status));
|
| + assertSuccess("6245.3", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(4);
|
| + precision.fExactOnly = TRUE;
|
| + precision.initVisibleDigits(6245.3, digits, status);
|
| + if (status != U_FORMAT_INEXACT_ERROR) {
|
| + errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(3);
|
| + precision.fMin.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "384.90",
|
| + FALSE,
|
| + precision.initVisibleDigits(2384.9, digits, status));
|
| + assertSuccess("380.00", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(3);
|
| + precision.fMin.setFracDigitCount(2);
|
| + precision.fFailIfOverMax = TRUE;
|
| + precision.initVisibleDigits(2384.9, digits, status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDoubleInitVisibleDigitsToDigitList() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + // 2.01 produces round off error when multiplied by powers of
|
| + // 10 forcing the use of DigitList.
|
| + verifyVisibleDigits(
|
| + "2.01",
|
| + TRUE,
|
| + precision.initVisibleDigits(-2.01, digits, status));
|
| + assertSuccess("-2.01", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(3);
|
| + precision.fMin.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "2380.00",
|
| + FALSE,
|
| + precision.initVisibleDigits(2385.0, digits, status));
|
| + assertSuccess("2380.00", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setFracDigitCount(2);
|
| + verifyVisibleDigits(
|
| + "45.83",
|
| + TRUE,
|
| + precision.initVisibleDigits(-45.8251, digits, status));
|
| + assertSuccess("45.83", status);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitListInitVisibleDigits() {
|
| + VisibleDigits digits;
|
| + DigitList dlist;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fMax.setIntDigitCount(3);
|
| + precision.fMin.setFracDigitCount(2);
|
| + precision.fFailIfOverMax = TRUE;
|
| + dlist.set(2384.9);
|
| + precision.initVisibleDigits(dlist, digits, status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(4);
|
| + precision.fExactOnly = TRUE;
|
| + dlist.set(6245.3);
|
| + precision.initVisibleDigits(dlist, digits, status);
|
| + if (status != U_FORMAT_INEXACT_ERROR) {
|
| + errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
|
| + }
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestSpecialInitVisibleDigits() {
|
| + VisibleDigits digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(3);
|
| + precision.fMin.setFracDigitCount(2);
|
| + precision.initVisibleDigits(-uprv_getInfinity(), digits, status);
|
| + assertFalse("", digits.isNaN());
|
| + assertTrue("", digits.isInfinite());
|
| + assertTrue("", digits.isNegative());
|
| + assertSuccess("-Inf", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.initVisibleDigits(uprv_getInfinity(), digits, status);
|
| + assertFalse("", digits.isNaN());
|
| + assertTrue("", digits.isInfinite());
|
| + assertFalse("", digits.isNegative());
|
| + assertSuccess("Inf", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + FixedPrecision precision;
|
| + precision.initVisibleDigits(uprv_getNaN(), digits, status);
|
| + assertTrue("", digits.isNaN());
|
| + assertSuccess("Inf", status);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestVisibleDigitsWithExponent() {
|
| + VisibleDigitsWithExponent digits;
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + ScientificPrecision precision;
|
| + precision.initVisibleDigitsWithExponent(389.256, digits, status);
|
| + verifyVisibleDigitsWithExponent(
|
| + "3.89256E2", FALSE, digits);
|
| + assertSuccess("3.89256E2", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + ScientificPrecision precision;
|
| + precision.initVisibleDigitsWithExponent(-389.256, digits, status);
|
| + verifyVisibleDigitsWithExponent(
|
| + "3.89256E2", TRUE, digits);
|
| + assertSuccess("-3.89256E2", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + ScientificPrecision precision;
|
| + precision.fMinExponentDigits = 3;
|
| + precision.fMantissa.fMin.setIntDigitCount(1);
|
| + precision.fMantissa.fMax.setIntDigitCount(3);
|
| + precision.initVisibleDigitsWithExponent(12345.67, digits, status);
|
| + verifyVisibleDigitsWithExponent(
|
| + "12.34567E003", FALSE, digits);
|
| + assertSuccess("12.34567E003", status);
|
| + }
|
| + {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + ScientificPrecision precision;
|
| + precision.fMantissa.fRoundingIncrement.set(0.073);
|
| + precision.fMantissa.fMin.setIntDigitCount(2);
|
| + precision.fMantissa.fMax.setIntDigitCount(2);
|
| + precision.initVisibleDigitsWithExponent(999.74, digits, status);
|
| + verifyVisibleDigitsWithExponent(
|
| + "10.001E2", FALSE, digits);
|
| + assertSuccess("10.001E2", status);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestDigitAffixesAndPadding() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + DigitGrouping grouping;
|
| + grouping.fGrouping = 3;
|
| + FixedPrecision precision;
|
| + DigitFormatterOptions options;
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter,
|
| + grouping,
|
| + precision,
|
| + options);
|
| + DigitAffixesAndPadding aap;
|
| + aap.fPositivePrefix.append("(+", UNUM_SIGN_FIELD);
|
| + aap.fPositiveSuffix.append("+)", UNUM_SIGN_FIELD);
|
| + aap.fNegativePrefix.append("(-", UNUM_SIGN_FIELD);
|
| + aap.fNegativeSuffix.append("-)", UNUM_SIGN_FIELD);
|
| + aap.fWidth = 10;
|
| + aap.fPadPosition = DigitAffixesAndPadding::kPadBeforePrefix;
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 4, 6},
|
| + {UNUM_INTEGER_FIELD, 6, 7},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
|
| + {UNUM_SIGN_FIELD, 8, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "****(+3.+)",
|
| + aap,
|
| + 3,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + }
|
| + aap.fPadPosition = DigitAffixesAndPadding::kPadAfterPrefix;
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 2},
|
| + {UNUM_INTEGER_FIELD, 6, 7},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
|
| + {UNUM_SIGN_FIELD, 8, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "(+****3.+)",
|
| + aap,
|
| + 3,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + }
|
| + aap.fPadPosition = DigitAffixesAndPadding::kPadBeforeSuffix;
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 2},
|
| + {UNUM_INTEGER_FIELD, 2, 3},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_SIGN_FIELD, 8, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "(+3.****+)",
|
| + aap,
|
| + 3,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + }
|
| + aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix;
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 2},
|
| + {UNUM_INTEGER_FIELD, 2, 3},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_SIGN_FIELD, 4, 6},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "(+3.+)****",
|
| + aap,
|
| + 3,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + }
|
| + aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix;
|
| + {
|
| + DigitList digits;
|
| + digits.set(-1234.5);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 2},
|
| + {UNUM_GROUPING_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_INTEGER_FIELD, 2, 7},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
|
| + {UNUM_FRACTION_FIELD, 8, 9},
|
| + {UNUM_SIGN_FIELD, 9, 11},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "(-1,234.5-)",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + }
|
| + assertFalse("", aap.needsPluralRules());
|
| +
|
| + aap.fWidth = 0;
|
| + aap.fPositivePrefix.remove();
|
| + aap.fPositiveSuffix.remove();
|
| + aap.fNegativePrefix.remove();
|
| + aap.fNegativeSuffix.remove();
|
| +
|
| + // Set up for plural currencies.
|
| + aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
|
| + {
|
| + PluralAffix part;
|
| + part.setVariant("one", " Dollar", status);
|
| + part.setVariant("other", " Dollars", status);
|
| + aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status);
|
| + }
|
| + aap.fNegativeSuffix = aap.fPositiveSuffix;
|
| +
|
| + LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| +
|
| + // Exercise the fastrack path
|
| + {
|
| + options.fAlwaysShowDecimal = FALSE;
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_INTEGER_FIELD, 1, 3},
|
| + {UNUM_CURRENCY_FIELD, 3, 11},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "-45 Dollars",
|
| + aap,
|
| + -45,
|
| + vf,
|
| + NULL,
|
| + expectedAttributes);
|
| + options.fAlwaysShowDecimal = TRUE;
|
| + }
|
| +
|
| + // Now test plurals
|
| + assertTrue("", aap.needsPluralRules());
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_CURRENCY_FIELD, 2, 9},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "1. Dollar",
|
| + aap,
|
| + 1,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_INTEGER_FIELD, 1, 2},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
|
| + {UNUM_CURRENCY_FIELD, 3, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "-1. Dollar",
|
| + aap,
|
| + -1,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + precision.fMin.setFracDigitCount(2);
|
| + {
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_FRACTION_FIELD, 2, 4},
|
| + {UNUM_CURRENCY_FIELD, 4, 12},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPaddingInt32(
|
| + "1.00 Dollars",
|
| + aap,
|
| + 1,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestPluralsAndRounding() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + DigitGrouping grouping;
|
| + FixedPrecision precision;
|
| + precision.fSignificant.setMax(3);
|
| + DigitFormatterOptions options;
|
| + ValueFormatter vf;
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter,
|
| + grouping,
|
| + precision,
|
| + options);
|
| + DigitList digits;
|
| + DigitAffixesAndPadding aap;
|
| + // Set up for plural currencies.
|
| + aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
|
| + {
|
| + PluralAffix part;
|
| + part.setVariant("one", " Dollar", status);
|
| + part.setVariant("other", " Dollars", status);
|
| + aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status);
|
| + }
|
| + aap.fNegativeSuffix = aap.fPositiveSuffix;
|
| + aap.fWidth = 14;
|
| + LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + {
|
| + digits.set(0.999);
|
| + verifyAffixesAndPadding(
|
| + "*0.999 Dollars",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + {
|
| + digits.set(0.9996);
|
| + verifyAffixesAndPadding(
|
| + "******1 Dollar",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + {
|
| + digits.set(1.004);
|
| + verifyAffixesAndPadding(
|
| + "******1 Dollar",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + precision.fSignificant.setMin(2);
|
| + {
|
| + digits.set(0.9996);
|
| + verifyAffixesAndPadding(
|
| + "***1.0 Dollars",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + {
|
| + digits.set(1.004);
|
| + verifyAffixesAndPadding(
|
| + "***1.0 Dollars",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + precision.fSignificant.setMin(0);
|
| + {
|
| + digits.set(-79.214);
|
| + verifyAffixesAndPadding(
|
| + "*-79.2 Dollars",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + // No more sig digits just max fractions
|
| + precision.fSignificant.setMax(0);
|
| + precision.fMax.setFracDigitCount(4);
|
| + {
|
| + digits.set(79.213562);
|
| + verifyAffixesAndPadding(
|
| + "79.2136 Dollars",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| +
|
| +}
|
| +
|
| +
|
| +void NumberFormat2Test::TestPluralsAndRoundingScientific() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + ScientificPrecision precision;
|
| + precision.fMantissa.fSignificant.setMax(4);
|
| + SciFormatterOptions options;
|
| + ValueFormatter vf;
|
| + vf.prepareScientificFormatting(
|
| + formatter,
|
| + precision,
|
| + options);
|
| + DigitList digits;
|
| + DigitAffixesAndPadding aap;
|
| + aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
|
| + {
|
| + PluralAffix part;
|
| + part.setVariant("one", " Meter", status);
|
| + part.setVariant("other", " Meters", status);
|
| + aap.fPositiveSuffix.append(part, UNUM_FIELD_COUNT, status);
|
| + }
|
| + aap.fNegativeSuffix = aap.fPositiveSuffix;
|
| + LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + {
|
| + digits.set(0.99996);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 1, 2},
|
| + {UNUM_EXPONENT_FIELD, 2, 3},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "1E0 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + options.fMantissa.fAlwaysShowDecimal = TRUE;
|
| + {
|
| + digits.set(0.99996);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 2, 3},
|
| + {UNUM_EXPONENT_FIELD, 3, 4},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "1.E0 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + digits.set(-299792458);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_SIGN_FIELD, 0, 1},
|
| + {UNUM_INTEGER_FIELD, 1, 2},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
|
| + {UNUM_FRACTION_FIELD, 3, 6},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 6, 7},
|
| + {UNUM_EXPONENT_FIELD, 7, 8},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "-2.998E8 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + precision.fMantissa.fSignificant.setMin(4);
|
| + options.fExponent.fAlwaysShowSign = TRUE;
|
| + precision.fMinExponentDigits = 3;
|
| + {
|
| + digits.set(3);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_FRACTION_FIELD, 2, 5},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
|
| + {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
|
| + {UNUM_EXPONENT_FIELD, 7, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "3.000E+000 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + precision.fMantissa.fMax.setIntDigitCount(3);
|
| + {
|
| + digits.set(0.00025001);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 3},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
|
| + {UNUM_FRACTION_FIELD, 4, 5},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
|
| + {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
|
| + {UNUM_EXPONENT_FIELD, 7, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "250.0E-006 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + {
|
| + digits.set(0.0000025001);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_FRACTION_FIELD, 2, 5},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
|
| + {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
|
| + {UNUM_EXPONENT_FIELD, 7, 10},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "2.500E-006 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + precision.fMantissa.fMax.setFracDigitCount(1);
|
| + {
|
| + digits.set(0.0000025499);
|
| + NumberFormat2Test_Attributes expectedAttributes[] = {
|
| + {UNUM_INTEGER_FIELD, 0, 1},
|
| + {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
|
| + {UNUM_FRACTION_FIELD, 2, 3},
|
| + {UNUM_EXPONENT_SYMBOL_FIELD, 3, 4},
|
| + {UNUM_EXPONENT_SIGN_FIELD, 4, 5},
|
| + {UNUM_EXPONENT_FIELD, 5, 8},
|
| + {0, -1, 0}};
|
| + verifyAffixesAndPadding(
|
| + "2.5E-006 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + expectedAttributes);
|
| + }
|
| + precision.fMantissa.fMax.setIntDigitCount(1);
|
| + precision.fMantissa.fMax.setFracDigitCount(2);
|
| + {
|
| + digits.set(299792458);
|
| + verifyAffixesAndPadding(
|
| + "3.00E+008 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + // clear significant digits
|
| + precision.fMantissa.fSignificant.setMin(0);
|
| + precision.fMantissa.fSignificant.setMax(0);
|
| +
|
| + // set int and fraction digits
|
| + precision.fMantissa.fMin.setFracDigitCount(2);
|
| + precision.fMantissa.fMax.setFracDigitCount(4);
|
| + precision.fMantissa.fMin.setIntDigitCount(2);
|
| + precision.fMantissa.fMax.setIntDigitCount(3);
|
| + {
|
| + digits.set(-0.0000025300001);
|
| + verifyAffixesAndPadding(
|
| + "-253.00E-008 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + {
|
| + digits.set(-0.0000025300006);
|
| + verifyAffixesAndPadding(
|
| + "-253.0001E-008 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| + {
|
| + digits.set(-0.000025300006);
|
| + verifyAffixesAndPadding(
|
| + "-25.30E-006 Meters",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + rules.getAlias(),
|
| + NULL);
|
| + }
|
| +}
|
| +
|
| +
|
| +void NumberFormat2Test::TestRoundingIncrement() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DecimalFormatSymbols symbols("en", status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status));
|
| + return;
|
| + }
|
| + DigitFormatter formatter(symbols);
|
| + ScientificPrecision precision;
|
| + SciFormatterOptions options;
|
| + precision.fMantissa.fRoundingIncrement.set(0.25);
|
| + precision.fMantissa.fSignificant.setMax(4);
|
| + DigitGrouping grouping;
|
| + ValueFormatter vf;
|
| +
|
| + // fixed
|
| + vf.prepareFixedDecimalFormatting(
|
| + formatter,
|
| + grouping,
|
| + precision.fMantissa,
|
| + options.fMantissa);
|
| + DigitList digits;
|
| + DigitAffixesAndPadding aap;
|
| + aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
|
| + {
|
| + digits.set(3.7);
|
| + verifyAffixesAndPadding(
|
| + "3.75",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + {
|
| + digits.set(-7.4);
|
| + verifyAffixesAndPadding(
|
| + "-7.5",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + {
|
| + digits.set(99.8);
|
| + verifyAffixesAndPadding(
|
| + "99.75",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + precision.fMantissa.fMin.setFracDigitCount(2);
|
| + {
|
| + digits.set(99.1);
|
| + verifyAffixesAndPadding(
|
| + "99.00",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + {
|
| + digits.set(-639.65);
|
| + verifyAffixesAndPadding(
|
| + "-639.80",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| +
|
| + precision.fMantissa.fMin.setIntDigitCount(2);
|
| + // Scientific notation
|
| + vf.prepareScientificFormatting(
|
| + formatter,
|
| + precision,
|
| + options);
|
| + {
|
| + digits.set(-6396.5);
|
| + verifyAffixesAndPadding(
|
| + "-64.00E2",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + {
|
| + digits.set(-0.00092374);
|
| + verifyAffixesAndPadding(
|
| + "-92.25E-5",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| + precision.fMantissa.fMax.setIntDigitCount(3);
|
| + {
|
| + digits.set(-0.00092374);
|
| + verifyAffixesAndPadding(
|
| + "-923.80E-6",
|
| + aap,
|
| + digits,
|
| + vf,
|
| + NULL, NULL);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::TestToPatternScientific11648() {
|
| +/*
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale en("en");
|
| + DecimalFormat2 fmt(en, "0.00", status);
|
| + fmt.setScientificNotation(TRUE);
|
| + UnicodeString pattern;
|
| + // Fails, produces "0.00E"
|
| + assertEquals("", "0.00E0", fmt.toPattern(pattern));
|
| + DecimalFormat fmt2(pattern, status);
|
| + // Fails, bad pattern.
|
| + assertSuccess("", status);
|
| +*/
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyAffixesAndPadding(
|
| + const UnicodeString &expected,
|
| + const DigitAffixesAndPadding &aaf,
|
| + DigitList &digits,
|
| + const ValueFormatter &vf,
|
| + const PluralRules *optPluralRules,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + assertEquals(
|
| + "",
|
| + expected,
|
| + aaf.format(
|
| + digits,
|
| + vf,
|
| + handler,
|
| + optPluralRules,
|
| + appendTo,
|
| + status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyAffixesAndPaddingInt32(
|
| + const UnicodeString &expected,
|
| + const DigitAffixesAndPadding &aaf,
|
| + int32_t value,
|
| + const ValueFormatter &vf,
|
| + const PluralRules *optPluralRules,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + assertEquals(
|
| + "",
|
| + expected,
|
| + aaf.formatInt32(
|
| + value,
|
| + vf,
|
| + handler,
|
| + optPluralRules,
|
| + appendTo,
|
| + status));
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| + DigitList digits;
|
| + digits.set(value);
|
| + verifyAffixesAndPadding(
|
| + expected, aaf, digits, vf, optPluralRules, expectedAttributes);
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyAffix(
|
| + const UnicodeString &expected,
|
| + const DigitAffix &affix,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + assertEquals(
|
| + "",
|
| + expected.unescape(),
|
| + affix.format(handler, appendTo));
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| +}
|
| +
|
| +// Right now only works for positive values.
|
| +void NumberFormat2Test::verifyDigitList(
|
| + const UnicodeString &expected,
|
| + const DigitList &digits) {
|
| + DigitFormatter formatter;
|
| + DigitGrouping grouping;
|
| + VisibleDigits visibleDigits;
|
| + FixedPrecision precision;
|
| + precision.fMin.setIntDigitCount(0);
|
| + DigitFormatterOptions options;
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + DigitList dlCopy(digits);
|
| + precision.initVisibleDigits(
|
| + dlCopy, visibleDigits, status);
|
| + if (!assertSuccess("", status)) {
|
| + return;
|
| + }
|
| + verifyDigitFormatter(
|
| + expected,
|
| + formatter,
|
| + visibleDigits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyVisibleDigits(
|
| + const UnicodeString &expected,
|
| + UBool bNegative,
|
| + const VisibleDigits &digits) {
|
| + DigitFormatter formatter;
|
| + DigitGrouping grouping;
|
| + DigitFormatterOptions options;
|
| + verifyDigitFormatter(
|
| + expected,
|
| + formatter,
|
| + digits,
|
| + grouping,
|
| + options,
|
| + NULL);
|
| + if (digits.isNegative() != bNegative) {
|
| + errln(expected + ": Wrong sign.");
|
| + }
|
| + if (digits.isNaN() || digits.isInfinite()) {
|
| + errln(expected + ": Require real value.");
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyVisibleDigitsWithExponent(
|
| + const UnicodeString &expected,
|
| + UBool bNegative,
|
| + const VisibleDigitsWithExponent &digits) {
|
| + DigitFormatter formatter;
|
| + SciFormatterOptions options;
|
| + verifySciFormatter(
|
| + expected,
|
| + formatter,
|
| + digits,
|
| + options,
|
| + NULL);
|
| + if (digits.isNegative() != bNegative) {
|
| + errln(expected + ": Wrong sign.");
|
| + }
|
| + if (digits.isNaN() || digits.isInfinite()) {
|
| + errln(expected + ": Require real value.");
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifySciFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + const VisibleDigitsWithExponent &digits,
|
| + const SciFormatterOptions &options,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + assertEquals(
|
| + "",
|
| + expected.countChar32(),
|
| + formatter.countChar32(digits, options));
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + assertEquals(
|
| + "",
|
| + expected,
|
| + formatter.format(
|
| + digits,
|
| + options,
|
| + handler,
|
| + appendTo));
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyPositiveIntDigitFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + int32_t value,
|
| + int32_t minDigits,
|
| + int32_t maxDigits,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + IntDigitCountRange range(minDigits, maxDigits);
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + assertEquals(
|
| + "",
|
| + expected,
|
| + formatter.formatPositiveInt32(
|
| + value,
|
| + range,
|
| + handler,
|
| + appendTo));
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyDigitFormatter(
|
| + const UnicodeString &expected,
|
| + const DigitFormatter &formatter,
|
| + const VisibleDigits &digits,
|
| + const DigitGrouping &grouping,
|
| + const DigitFormatterOptions &options,
|
| + const NumberFormat2Test_Attributes *expectedAttributes) {
|
| + assertEquals(
|
| + "",
|
| + expected.countChar32(),
|
| + formatter.countChar32(digits, grouping, options));
|
| + UnicodeString appendTo;
|
| + NumberFormat2Test_FieldPositionHandler handler;
|
| + assertEquals(
|
| + "",
|
| + expected,
|
| + formatter.format(
|
| + digits,
|
| + grouping,
|
| + options,
|
| + handler,
|
| + appendTo));
|
| + if (expectedAttributes != NULL) {
|
| + verifyAttributes(expectedAttributes, handler.attributes);
|
| + }
|
| +}
|
| +
|
| +void NumberFormat2Test::verifySmallIntFormatter(
|
| + const UnicodeString &expected,
|
| + int32_t positiveValue,
|
| + int32_t minDigits,
|
| + int32_t maxDigits) {
|
| + IntDigitCountRange range(minDigits, maxDigits);
|
| + if (!SmallIntFormatter::canFormat(positiveValue, range)) {
|
| + UnicodeString actual;
|
| + assertEquals("", expected, actual);
|
| + return;
|
| + }
|
| + UnicodeString actual;
|
| + assertEquals("", expected, SmallIntFormatter::format(positiveValue, range, actual));
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyAttributes(
|
| + const NumberFormat2Test_Attributes *expected,
|
| + const NumberFormat2Test_Attributes *actual) {
|
| + int32_t idx = 0;
|
| + while (expected[idx].spos != -1 && actual[idx].spos != -1) {
|
| + assertEquals("id", expected[idx].id, actual[idx].id);
|
| + assertEquals("spos", expected[idx].spos, actual[idx].spos);
|
| + assertEquals("epos", expected[idx].epos, actual[idx].epos);
|
| + ++idx;
|
| + }
|
| + assertEquals(
|
| + "expected and actual not same length",
|
| + expected[idx].spos,
|
| + actual[idx].spos);
|
| +}
|
| +
|
| +void NumberFormat2Test::verifyIntValue(
|
| + int64_t expected, const VisibleDigits &digits) {
|
| + double unusedSource;
|
| + int64_t intValue;
|
| + int64_t unusedF;
|
| + int64_t unusedT;
|
| + int32_t unusedV;
|
| + UBool unusedHasIntValue;
|
| + digits.getFixedDecimal(
|
| + unusedSource, intValue, unusedF,
|
| + unusedT, unusedV, unusedHasIntValue);
|
| + assertEquals("", expected, intValue);
|
| +}
|
| +
|
| +void NumberFormat2Test::verifySource(
|
| + double expected, const VisibleDigits &digits) {
|
| + double source;
|
| + int64_t unusedIntValue;
|
| + int64_t unusedF;
|
| + int64_t unusedT;
|
| + int32_t unusedV;
|
| + UBool unusedHasIntValue;
|
| + digits.getFixedDecimal(
|
| + source, unusedIntValue, unusedF,
|
| + unusedT, unusedV, unusedHasIntValue);
|
| + if (expected != source) {
|
| + errln("Expected %f, got %f instead", expected, source);
|
| + }
|
| +}
|
| +
|
| +extern IntlTest *createNumberFormat2Test() {
|
| + return new NumberFormat2Test();
|
| +}
|
| +
|
| +#endif /* !UCONFIG_NO_FORMATTING */
|
|
|