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 */ |