Home | History | Annotate | Download | only in intltest
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 2015, International Business Machines Corporation and         *
      4 * others. All Rights Reserved.                                                *
      5 *******************************************************************************
      6 *
      7 * File NUMBERFORMAT2TEST.CPP
      8 *
      9 *******************************************************************************
     10 */
     11 #include "unicode/utypes.h"
     12 
     13 #include "intltest.h"
     14 
     15 #if !UCONFIG_NO_FORMATTING
     16 
     17 #include "unicode/localpointer.h"
     18 #include "unicode/plurrule.h"
     19 
     20 #include "affixpatternparser.h"
     21 #include "charstr.h"
     22 #include "datadrivennumberformattestsuite.h"
     23 #include "decimalformatpattern.h"
     24 #include "digitaffixesandpadding.h"
     25 #include "digitformatter.h"
     26 #include "digitgrouping.h"
     27 #include "digitinterval.h"
     28 #include "digitlst.h"
     29 #include "fphdlimp.h"
     30 #include "plurrule_impl.h"
     31 #include "precision.h"
     32 #include "significantdigitinterval.h"
     33 #include "smallintformatter.h"
     34 #include "uassert.h"
     35 #include "valueformatter.h"
     36 #include "visibledigits.h"
     37 
     38 struct NumberFormat2Test_Attributes {
     39     int32_t id;
     40     int32_t spos;
     41     int32_t epos;
     42 };
     43 
     44 class NumberFormat2Test_FieldPositionHandler : public FieldPositionHandler {
     45 public:
     46 NumberFormat2Test_Attributes attributes[100];
     47 int32_t count;
     48 UBool bRecording;
     49 
     50 
     51 
     52 NumberFormat2Test_FieldPositionHandler() : count(0), bRecording(TRUE) { attributes[0].spos = -1; }
     53 NumberFormat2Test_FieldPositionHandler(UBool recording) : count(0), bRecording(recording) { attributes[0].spos = -1; }
     54 virtual ~NumberFormat2Test_FieldPositionHandler();
     55 virtual void addAttribute(int32_t id, int32_t start, int32_t limit);
     56 virtual void shiftLast(int32_t delta);
     57 virtual UBool isRecording(void) const;
     58 };
     59 
     60 NumberFormat2Test_FieldPositionHandler::~NumberFormat2Test_FieldPositionHandler() {
     61 }
     62 
     63 void NumberFormat2Test_FieldPositionHandler::addAttribute(
     64         int32_t id, int32_t start, int32_t limit) {
     65     if (count == UPRV_LENGTHOF(attributes) - 1) {
     66         return;
     67     }
     68     attributes[count].id = id;
     69     attributes[count].spos = start;
     70     attributes[count].epos = limit;
     71     ++count;
     72     attributes[count].spos = -1;
     73 }
     74 
     75 void NumberFormat2Test_FieldPositionHandler::shiftLast(int32_t /* delta */) {
     76 }
     77 
     78 UBool NumberFormat2Test_FieldPositionHandler::isRecording() const {
     79     return bRecording;
     80 }
     81 
     82 
     83 class NumberFormat2Test : public IntlTest {
     84 public:
     85     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
     86 private:
     87     void TestQuantize();
     88     void TestConvertScientificNotation();
     89     void TestLowerUpperExponent();
     90     void TestRounding();
     91     void TestRoundingIncrement();
     92     void TestDigitInterval();
     93     void TestGroupingUsed();
     94     void TestBenchmark();
     95     void TestBenchmark2();
     96     void TestSmallIntFormatter();
     97     void TestPositiveIntDigitFormatter();
     98     void TestDigitListInterval();
     99     void TestLargeIntValue();
    100     void TestIntInitVisibleDigits();
    101     void TestIntInitVisibleDigitsToDigitList();
    102     void TestDoubleInitVisibleDigits();
    103     void TestDoubleInitVisibleDigitsToDigitList();
    104     void TestDigitListInitVisibleDigits();
    105     void TestSpecialInitVisibleDigits();
    106     void TestVisibleDigitsWithExponent();
    107     void TestDigitAffixesAndPadding();
    108     void TestPluralsAndRounding();
    109     void TestPluralsAndRoundingScientific();
    110     void TestValueFormatterIsFastFormattable();
    111     void TestCurrencyAffixInfo();
    112     void TestAffixPattern();
    113     void TestAffixPatternAppend();
    114     void TestAffixPatternAppendAjoiningLiterals();
    115     void TestAffixPatternDoubleQuote();
    116     void TestAffixPatternParser();
    117     void TestPluralAffix();
    118     void TestDigitAffix();
    119     void TestDigitFormatterDefaultCtor();
    120     void TestDigitFormatterMonetary();
    121     void TestDigitFormatter();
    122     void TestSciFormatterDefaultCtor();
    123     void TestSciFormatter();
    124     void TestToPatternScientific11648();
    125     void verifyInterval(const DigitInterval &, int32_t minInclusive, int32_t maxExclusive);
    126     void verifyAffix(
    127             const UnicodeString &expected,
    128             const DigitAffix &affix,
    129             const NumberFormat2Test_Attributes *expectedAttributes);
    130     void verifyAffixesAndPadding(
    131             const UnicodeString &expected,
    132             const DigitAffixesAndPadding &aaf,
    133             DigitList &digits,
    134             const ValueFormatter &vf,
    135             const PluralRules *optPluralRules,
    136             const NumberFormat2Test_Attributes *expectedAttributes);
    137     void verifyAffixesAndPaddingInt32(
    138             const UnicodeString &expected,
    139             const DigitAffixesAndPadding &aaf,
    140             int32_t value,
    141             const ValueFormatter &vf,
    142             const PluralRules *optPluralRules,
    143             const NumberFormat2Test_Attributes *expectedAttributes);
    144     void verifyDigitList(
    145         const UnicodeString &expected,
    146         const DigitList &digits);
    147     void verifyVisibleDigits(
    148         const UnicodeString &expected,
    149         UBool bNegative,
    150         const VisibleDigits &digits);
    151     void verifyVisibleDigitsWithExponent(
    152         const UnicodeString &expected,
    153         UBool bNegative,
    154         const VisibleDigitsWithExponent &digits);
    155     void verifyDigitFormatter(
    156             const UnicodeString &expected,
    157             const DigitFormatter &formatter,
    158             const VisibleDigits &digits,
    159             const DigitGrouping &grouping,
    160             const DigitFormatterOptions &options,
    161             const NumberFormat2Test_Attributes *expectedAttributes);
    162     void verifySciFormatter(
    163             const UnicodeString &expected,
    164             const DigitFormatter &formatter,
    165             const VisibleDigitsWithExponent &digits,
    166             const SciFormatterOptions &options,
    167             const NumberFormat2Test_Attributes *expectedAttributes);
    168     void verifySmallIntFormatter(
    169             const UnicodeString &expected,
    170             int32_t positiveValue,
    171             int32_t minDigits,
    172             int32_t maxDigits);
    173     void verifyPositiveIntDigitFormatter(
    174             const UnicodeString &expected,
    175             const DigitFormatter &formatter,
    176             int32_t value,
    177             int32_t minDigits,
    178             int32_t maxDigits,
    179             const NumberFormat2Test_Attributes *expectedAttributes);
    180     void verifyAttributes(
    181             const NumberFormat2Test_Attributes *expected,
    182             const NumberFormat2Test_Attributes *actual);
    183     void verifyIntValue(
    184             int64_t expected, const VisibleDigits &digits);
    185     void verifySource(
    186             double expected, const VisibleDigits &digits);
    187 };
    188 
    189 void NumberFormat2Test::runIndexedTest(
    190         int32_t index, UBool exec, const char *&name, char *) {
    191     if (exec) {
    192         logln("TestSuite ScientificNumberFormatterTest: ");
    193     }
    194     TESTCASE_AUTO_BEGIN;
    195     TESTCASE_AUTO(TestQuantize);
    196     TESTCASE_AUTO(TestConvertScientificNotation);
    197     TESTCASE_AUTO(TestLowerUpperExponent);
    198     TESTCASE_AUTO(TestRounding);
    199     TESTCASE_AUTO(TestRoundingIncrement);
    200     TESTCASE_AUTO(TestDigitInterval);
    201     TESTCASE_AUTO(TestGroupingUsed);
    202     TESTCASE_AUTO(TestDigitListInterval);
    203     TESTCASE_AUTO(TestDigitFormatterDefaultCtor);
    204     TESTCASE_AUTO(TestDigitFormatterMonetary);
    205     TESTCASE_AUTO(TestDigitFormatter);
    206     TESTCASE_AUTO(TestSciFormatterDefaultCtor);
    207     TESTCASE_AUTO(TestSciFormatter);
    208     TESTCASE_AUTO(TestBenchmark);
    209     TESTCASE_AUTO(TestBenchmark2);
    210     TESTCASE_AUTO(TestSmallIntFormatter);
    211     TESTCASE_AUTO(TestPositiveIntDigitFormatter);
    212     TESTCASE_AUTO(TestCurrencyAffixInfo);
    213     TESTCASE_AUTO(TestAffixPattern);
    214     TESTCASE_AUTO(TestAffixPatternAppend);
    215     TESTCASE_AUTO(TestAffixPatternAppendAjoiningLiterals);
    216     TESTCASE_AUTO(TestAffixPatternDoubleQuote);
    217     TESTCASE_AUTO(TestAffixPatternParser);
    218     TESTCASE_AUTO(TestPluralAffix);
    219     TESTCASE_AUTO(TestDigitAffix);
    220     TESTCASE_AUTO(TestValueFormatterIsFastFormattable);
    221     TESTCASE_AUTO(TestLargeIntValue);
    222     TESTCASE_AUTO(TestIntInitVisibleDigits);
    223     TESTCASE_AUTO(TestIntInitVisibleDigitsToDigitList);
    224     TESTCASE_AUTO(TestDoubleInitVisibleDigits);
    225     TESTCASE_AUTO(TestDoubleInitVisibleDigitsToDigitList);
    226     TESTCASE_AUTO(TestDigitListInitVisibleDigits);
    227     TESTCASE_AUTO(TestSpecialInitVisibleDigits);
    228     TESTCASE_AUTO(TestVisibleDigitsWithExponent);
    229     TESTCASE_AUTO(TestDigitAffixesAndPadding);
    230     TESTCASE_AUTO(TestPluralsAndRounding);
    231     TESTCASE_AUTO(TestPluralsAndRoundingScientific);
    232     TESTCASE_AUTO(TestToPatternScientific11648);
    233 
    234     TESTCASE_AUTO_END;
    235 }
    236 
    237 void NumberFormat2Test::TestDigitInterval() {
    238     DigitInterval all;
    239     DigitInterval threeInts;
    240     DigitInterval fourFrac;
    241     threeInts.setIntDigitCount(3);
    242     fourFrac.setFracDigitCount(4);
    243     verifyInterval(all, INT32_MIN, INT32_MAX);
    244     verifyInterval(threeInts, INT32_MIN, 3);
    245     verifyInterval(fourFrac, -4, INT32_MAX);
    246     {
    247         DigitInterval result(threeInts);
    248         result.shrinkToFitWithin(fourFrac);
    249         verifyInterval(result, -4, 3);
    250         assertEquals("", 7, result.length());
    251     }
    252     {
    253         DigitInterval result(threeInts);
    254         result.expandToContain(fourFrac);
    255         verifyInterval(result, INT32_MIN, INT32_MAX);
    256     }
    257     {
    258         DigitInterval result(threeInts);
    259         result.setIntDigitCount(0);
    260         verifyInterval(result, INT32_MIN, 0);
    261         result.setIntDigitCount(-1);
    262         verifyInterval(result, INT32_MIN, INT32_MAX);
    263     }
    264     {
    265         DigitInterval result(fourFrac);
    266         result.setFracDigitCount(0);
    267         verifyInterval(result, 0, INT32_MAX);
    268         result.setFracDigitCount(-1);
    269         verifyInterval(result, INT32_MIN, INT32_MAX);
    270     }
    271     {
    272         DigitInterval result;
    273         result.setIntDigitCount(3);
    274         result.setFracDigitCount(1);
    275         result.expandToContainDigit(0);
    276         result.expandToContainDigit(-1);
    277         result.expandToContainDigit(2);
    278         verifyInterval(result, -1, 3);
    279         result.expandToContainDigit(3);
    280         verifyInterval(result, -1, 4);
    281         result.expandToContainDigit(-2);
    282         verifyInterval(result, -2, 4);
    283         result.expandToContainDigit(15);
    284         result.expandToContainDigit(-15);
    285         verifyInterval(result, -15, 16);
    286     }
    287     {
    288         DigitInterval result;
    289         result.setIntDigitCount(3);
    290         result.setFracDigitCount(1);
    291         assertTrue("", result.contains(2));
    292         assertTrue("", result.contains(-1));
    293         assertFalse("", result.contains(3));
    294         assertFalse("", result.contains(-2));
    295     }
    296 }
    297 
    298 void NumberFormat2Test::verifyInterval(
    299         const DigitInterval &interval,
    300         int32_t minInclusive, int32_t maxExclusive) {
    301     assertEquals("", minInclusive, interval.getLeastSignificantInclusive());
    302     assertEquals("", maxExclusive, interval.getMostSignificantExclusive());
    303     assertEquals("", maxExclusive, interval.getIntDigitCount());
    304 }
    305 
    306 void NumberFormat2Test::TestGroupingUsed() {
    307     {
    308         DigitGrouping grouping;
    309         assertFalse("", grouping.isGroupingUsed());
    310     }
    311     {
    312         DigitGrouping grouping;
    313         grouping.fGrouping = 2;
    314         assertTrue("", grouping.isGroupingUsed());
    315     }
    316 }
    317 
    318 void NumberFormat2Test::TestDigitListInterval() {
    319     DigitInterval result;
    320     DigitList digitList;
    321     {
    322         digitList.set(12345);
    323         verifyInterval(digitList.getSmallestInterval(result), 0, 5);
    324     }
    325     {
    326         digitList.set(1000.00);
    327         verifyInterval(digitList.getSmallestInterval(result), 0, 4);
    328     }
    329     {
    330         digitList.set(43.125);
    331         verifyInterval(digitList.getSmallestInterval(result), -3, 2);
    332     }
    333     {
    334         digitList.set(.0078125);
    335         verifyInterval(digitList.getSmallestInterval(result), -7, 0);
    336     }
    337     {
    338         digitList.set(1000.00);
    339         digitList.getSmallestInterval(result);
    340         result.expandToContainDigit(3);
    341         verifyInterval(result, 0, 4);
    342     }
    343     {
    344         digitList.set(1000.00);
    345         digitList.getSmallestInterval(result);
    346         result.expandToContainDigit(4);
    347         verifyInterval(result, 0, 5);
    348     }
    349     {
    350         digitList.set(1000.00);
    351         digitList.getSmallestInterval(result);
    352         result.expandToContainDigit(0);
    353         verifyInterval(result, 0, 4);
    354     }
    355     {
    356         digitList.set(1000.00);
    357         digitList.getSmallestInterval(result);
    358         result.expandToContainDigit(-1);
    359         verifyInterval(result, -1, 4);
    360     }
    361     {
    362         digitList.set(43.125);
    363         digitList.getSmallestInterval(result);
    364         result.expandToContainDigit(1);
    365         verifyInterval(result, -3, 2);
    366     }
    367     {
    368         digitList.set(43.125);
    369         digitList.getSmallestInterval(result);
    370         result.expandToContainDigit(2);
    371         verifyInterval(result, -3, 3);
    372     }
    373     {
    374         digitList.set(43.125);
    375         digitList.getSmallestInterval(result);
    376         result.expandToContainDigit(-3);
    377         verifyInterval(result, -3, 2);
    378     }
    379     {
    380         digitList.set(43.125);
    381         digitList.getSmallestInterval(result);
    382         result.expandToContainDigit(-4);
    383         verifyInterval(result, -4, 2);
    384     }
    385 }
    386 
    387 void NumberFormat2Test::TestQuantize() {
    388     DigitList quantity;
    389     quantity.set(0.00168);
    390     quantity.roundAtExponent(-5);
    391     DigitList digits;
    392     UErrorCode status = U_ZERO_ERROR;
    393     {
    394         digits.set(1);
    395         digits.quantize(quantity, status);
    396         verifyDigitList(".9996", digits);
    397     }
    398     {
    399         // round half even up
    400         digits.set(1.00044);
    401         digits.roundAtExponent(-5);
    402         digits.quantize(quantity, status);
    403         verifyDigitList("1.00128", digits);
    404     }
    405     {
    406         // round half down
    407         digits.set(0.99876);
    408         digits.roundAtExponent(-5);
    409         digits.quantize(quantity, status);
    410         verifyDigitList(".99792", digits);
    411     }
    412     assertSuccess("", status);
    413 }
    414 
    415 void NumberFormat2Test::TestConvertScientificNotation() {
    416     DigitList digits;
    417     {
    418         digits.set(186283);
    419         assertEquals("", 5, digits.toScientific(1, 1));
    420         verifyDigitList(
    421                 "1.86283",
    422                 digits);
    423     }
    424     {
    425         digits.set(186283);
    426         assertEquals("", 0, digits.toScientific(6, 1));
    427         verifyDigitList(
    428                 "186283",
    429                 digits);
    430     }
    431     {
    432         digits.set(186283);
    433         assertEquals("", -2, digits.toScientific(8, 1));
    434         verifyDigitList(
    435                 "18628300",
    436                 digits);
    437     }
    438     {
    439         digits.set(43561);
    440         assertEquals("", 6, digits.toScientific(-1, 3));
    441         verifyDigitList(
    442                 ".043561",
    443                 digits);
    444     }
    445     {
    446         digits.set(43561);
    447         assertEquals("", 3, digits.toScientific(0, 3));
    448         verifyDigitList(
    449                 "43.561",
    450                 digits);
    451     }
    452     {
    453         digits.set(43561);
    454         assertEquals("", 3, digits.toScientific(2, 3));
    455         verifyDigitList(
    456                 "43.561",
    457                 digits);
    458     }
    459     {
    460         digits.set(43561);
    461         assertEquals("", 0, digits.toScientific(3, 3));
    462         verifyDigitList(
    463                 "43561",
    464                 digits);
    465     }
    466     {
    467         digits.set(43561);
    468         assertEquals("", 0, digits.toScientific(5, 3));
    469         verifyDigitList(
    470                 "43561",
    471                 digits);
    472     }
    473     {
    474         digits.set(43561);
    475         assertEquals("", -3, digits.toScientific(6, 3));
    476         verifyDigitList(
    477                 "43561000",
    478                 digits);
    479     }
    480     {
    481         digits.set(43561);
    482         assertEquals("", -3, digits.toScientific(8, 3));
    483         verifyDigitList(
    484                 "43561000",
    485                 digits);
    486     }
    487     {
    488         digits.set(43561);
    489         assertEquals("", -6, digits.toScientific(9, 3));
    490         verifyDigitList(
    491                 "43561000000",
    492                 digits);
    493     }
    494 }
    495 
    496 void NumberFormat2Test::TestLowerUpperExponent() {
    497     DigitList digits;
    498 
    499     digits.set(98.7);
    500     assertEquals("", -1, digits.getLowerExponent());
    501     assertEquals("", 2, digits.getUpperExponent());
    502 }
    503 
    504 void NumberFormat2Test::TestRounding() {
    505     DigitList digits;
    506     uprv_decContextSetRounding(&digits.fContext, DEC_ROUND_CEILING);
    507     {
    508         // Round at very large exponent
    509         digits.set(789.123);
    510         digits.roundAtExponent(100);
    511         verifyDigitList(
    512                 "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", // 100 0's after 1
    513                 digits);
    514     }
    515     {
    516         // Round at very large exponent
    517         digits.set(789.123);
    518         digits.roundAtExponent(1);
    519         verifyDigitList(
    520                 "790", // 100 0's after 1
    521                 digits);
    522     }
    523     {
    524         // Round at positive exponent
    525         digits.set(789.123);
    526         digits.roundAtExponent(1);
    527         verifyDigitList("790", digits);
    528     }
    529     {
    530         // Round at zero exponent
    531         digits.set(788.123);
    532         digits.roundAtExponent(0);
    533         verifyDigitList("789", digits);
    534     }
    535     {
    536         // Round at negative exponent
    537         digits.set(789.123);
    538         digits.roundAtExponent(-2);
    539         verifyDigitList("789.13", digits);
    540     }
    541     {
    542         // Round to exponent of digits.
    543         digits.set(789.123);
    544         digits.roundAtExponent(-3);
    545         verifyDigitList("789.123", digits);
    546     }
    547     {
    548         // Round at large negative exponent
    549         digits.set(789.123);
    550         digits.roundAtExponent(-100);
    551         verifyDigitList("789.123", digits);
    552     }
    553     {
    554         // Round negative
    555         digits.set(-789.123);
    556         digits.roundAtExponent(-2);
    557         digits.setPositive(TRUE);
    558         verifyDigitList("789.12", digits);
    559     }
    560     {
    561         // Round to 1 significant digit
    562         digits.set(789.123);
    563         digits.roundAtExponent(INT32_MIN, 1);
    564         verifyDigitList("800", digits);
    565     }
    566     {
    567         // Round to 5 significant digit
    568         digits.set(789.123);
    569         digits.roundAtExponent(INT32_MIN, 5);
    570         verifyDigitList("789.13", digits);
    571     }
    572     {
    573         // Round to 6 significant digit
    574         digits.set(789.123);
    575         digits.roundAtExponent(INT32_MIN, 6);
    576         verifyDigitList("789.123", digits);
    577     }
    578     {
    579         // no-op
    580         digits.set(789.123);
    581         digits.roundAtExponent(INT32_MIN, INT32_MAX);
    582         verifyDigitList("789.123", digits);
    583     }
    584     {
    585         // Rounding at -1 produces fewer than 5 significant digits
    586         digits.set(789.123);
    587         digits.roundAtExponent(-1, 5);
    588         verifyDigitList("789.2", digits);
    589     }
    590     {
    591         // Rounding at -1 produces exactly 4 significant digits
    592         digits.set(789.123);
    593         digits.roundAtExponent(-1, 4);
    594         verifyDigitList("789.2", digits);
    595     }
    596     {
    597         // Rounding at -1 produces more than 3 significant digits
    598         digits.set(788.123);
    599         digits.roundAtExponent(-1, 3);
    600         verifyDigitList("789", digits);
    601     }
    602     {
    603         digits.set(123.456);
    604         digits.round(INT32_MAX);
    605         verifyDigitList("123.456", digits);
    606     }
    607     {
    608         digits.set(123.456);
    609         digits.round(1);
    610         verifyDigitList("200", digits);
    611     }
    612 }
    613 void NumberFormat2Test::TestBenchmark() {
    614 /*
    615     UErrorCode status = U_ZERO_ERROR;
    616     Locale en("en");
    617     DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
    618     DecimalFormat2 fmt(en, "0.0000000", status);
    619     FieldPosition fpos(0);
    620     clock_t start = clock();
    621     for (int32_t i = 0; i < 100000; ++i) {
    622        UParseError perror;
    623        DecimalFormat2 fmt2("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
    624 //       UnicodeString append;
    625 //       fmt.format(4.6692016, append, fpos, status);
    626     }
    627     errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
    628     assertSuccess("", status);
    629 */
    630 }
    631 
    632 void NumberFormat2Test::TestBenchmark2() {
    633 /*
    634     UErrorCode status = U_ZERO_ERROR;
    635     Locale en("en");
    636     DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
    637     DecimalFormat fmt("0.0000000", sym, status);
    638     FieldPosition fpos(0);
    639     clock_t start = clock();
    640     for (int32_t i = 0; i < 100000; ++i) {
    641       UParseError perror;
    642       DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
    643 //        UnicodeString append;
    644 //        fmt.format(4.6692016, append, fpos, status);
    645     }
    646     errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
    647     assertSuccess("", status);
    648 */
    649 }
    650 
    651 void NumberFormat2Test::TestSmallIntFormatter() {
    652     verifySmallIntFormatter("0", 7, 0, -2);
    653     verifySmallIntFormatter("7", 7, 1, -2);
    654     verifySmallIntFormatter("07", 7, 2, -2);
    655     verifySmallIntFormatter("07", 7, 2, 2);
    656     verifySmallIntFormatter("007", 7, 3, 4);
    657     verifySmallIntFormatter("7", 7, -1, 3);
    658     verifySmallIntFormatter("0", 0, -1, 3);
    659     verifySmallIntFormatter("057", 57, 3, 7);
    660     verifySmallIntFormatter("0057", 57, 4, 7);
    661     // too many digits for small int
    662     verifySmallIntFormatter("", 57, 5, 7);
    663     // too many digits for small int
    664     verifySmallIntFormatter("", 57, 5, 4);
    665     verifySmallIntFormatter("03", 3, 2, 3);
    666     verifySmallIntFormatter("32", 32, 2, 3);
    667     verifySmallIntFormatter("321", 321, 2, 3);
    668     verifySmallIntFormatter("219", 3219, 2, 3);
    669     verifySmallIntFormatter("4095", 4095, 2, 4);
    670     verifySmallIntFormatter("4095", 4095, 2, 5);
    671     verifySmallIntFormatter("", 4096, 2, 5);
    672 }
    673 
    674 void NumberFormat2Test::TestPositiveIntDigitFormatter() {
    675     DigitFormatter formatter;
    676     {
    677         NumberFormat2Test_Attributes expectedAttributes[] = {
    678             {UNUM_INTEGER_FIELD, 0, 4},
    679             {0, -1, 0}};
    680         verifyPositiveIntDigitFormatter(
    681                 "0057",
    682                 formatter,
    683                 57,
    684                 4,
    685                 INT32_MAX,
    686                 expectedAttributes);
    687     }
    688     {
    689         NumberFormat2Test_Attributes expectedAttributes[] = {
    690             {UNUM_INTEGER_FIELD, 0, 5},
    691             {0, -1, 0}};
    692         verifyPositiveIntDigitFormatter(
    693                 "00057",
    694                 formatter,
    695                 57,
    696                 5,
    697                 INT32_MAX,
    698                 expectedAttributes);
    699     }
    700     {
    701         NumberFormat2Test_Attributes expectedAttributes[] = {
    702             {UNUM_INTEGER_FIELD, 0, 5},
    703             {0, -1, 0}};
    704         verifyPositiveIntDigitFormatter(
    705                 "01000",
    706                 formatter,
    707                 1000,
    708                 5,
    709                 INT32_MAX,
    710                 expectedAttributes);
    711     }
    712     {
    713         NumberFormat2Test_Attributes expectedAttributes[] = {
    714             {UNUM_INTEGER_FIELD, 0, 3},
    715             {0, -1, 0}};
    716         verifyPositiveIntDigitFormatter(
    717                 "100",
    718                 formatter,
    719                 100,
    720                 0,
    721                 INT32_MAX,
    722                 expectedAttributes);
    723     }
    724     {
    725         NumberFormat2Test_Attributes expectedAttributes[] = {
    726             {UNUM_INTEGER_FIELD, 0, 10},
    727             {0, -1, 0}};
    728         verifyPositiveIntDigitFormatter(
    729                 "2147483647",
    730                 formatter,
    731                 2147483647,
    732                 5,
    733                 INT32_MAX,
    734                 expectedAttributes);
    735     }
    736     {
    737         NumberFormat2Test_Attributes expectedAttributes[] = {
    738             {UNUM_INTEGER_FIELD, 0, 12},
    739             {0, -1, 0}};
    740         verifyPositiveIntDigitFormatter(
    741                 "002147483647",
    742                 formatter,
    743                 2147483647,
    744                 12,
    745                 INT32_MAX,
    746                 expectedAttributes);
    747     }
    748     {
    749         // Test long digit string where we have to append one
    750         // character at a time.
    751         NumberFormat2Test_Attributes expectedAttributes[] = {
    752             {UNUM_INTEGER_FIELD, 0, 40},
    753             {0, -1, 0}};
    754         verifyPositiveIntDigitFormatter(
    755                 "0000000000000000000000000000002147483647",
    756                 formatter,
    757                 2147483647,
    758                 40,
    759                 INT32_MAX,
    760                 expectedAttributes);
    761     }
    762     {
    763         NumberFormat2Test_Attributes expectedAttributes[] = {
    764             {UNUM_INTEGER_FIELD, 0, 4},
    765             {0, -1, 0}};
    766         verifyPositiveIntDigitFormatter(
    767                 "6283",
    768                 formatter,
    769                 186283,
    770                 2,
    771                 4,
    772                 expectedAttributes);
    773     }
    774     {
    775         NumberFormat2Test_Attributes expectedAttributes[] = {
    776             {UNUM_INTEGER_FIELD, 0, 1},
    777             {0, -1, 0}};
    778         verifyPositiveIntDigitFormatter(
    779                 "0",
    780                 formatter,
    781                 186283,
    782                 0,
    783                 0,
    784                 expectedAttributes);
    785     }
    786     {
    787         NumberFormat2Test_Attributes expectedAttributes[] = {
    788             {UNUM_INTEGER_FIELD, 0, 1},
    789             {0, -1, 0}};
    790         verifyPositiveIntDigitFormatter(
    791                 "3",
    792                 formatter,
    793                 186283,
    794                 1,
    795                 1,
    796                 expectedAttributes);
    797     }
    798 }
    799 
    800 
    801 void NumberFormat2Test::TestDigitFormatterDefaultCtor() {
    802     DigitFormatter formatter;
    803     VisibleDigits digits;
    804     FixedPrecision precision;
    805     UErrorCode status = U_ZERO_ERROR;
    806     precision.initVisibleDigits(246.801, digits, status);
    807     assertSuccess("", status);
    808     DigitGrouping grouping;
    809     DigitFormatterOptions options;
    810     verifyDigitFormatter(
    811             "246.801",
    812             formatter,
    813             digits,
    814             grouping,
    815             options,
    816             NULL);
    817 }
    818 
    819 void NumberFormat2Test::TestDigitFormatterMonetary() {
    820     UErrorCode status = U_ZERO_ERROR;
    821     DecimalFormatSymbols symbols("en", status);
    822     if (!assertSuccess("", status)) {
    823         return;
    824     }
    825     symbols.setSymbol(
    826             DecimalFormatSymbols::kMonetarySeparatorSymbol,
    827             "decimal separator");
    828     symbols.setSymbol(
    829             DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol,
    830             "grouping separator");
    831     DigitFormatter formatter(symbols);
    832     VisibleDigits visibleDigits;
    833     DigitGrouping grouping;
    834     FixedPrecision precision;
    835     precision.initVisibleDigits(43560.02, visibleDigits, status);
    836     if (!assertSuccess("", status)) {
    837         return;
    838     }
    839     DigitFormatterOptions options;
    840     grouping.fGrouping = 3;
    841     {
    842         verifyDigitFormatter(
    843                 "43,560.02",
    844                 formatter,
    845                 visibleDigits,
    846                 grouping,
    847                 options,
    848                 NULL);
    849         formatter.setDecimalFormatSymbolsForMonetary(symbols);
    850         verifyDigitFormatter(
    851                 "43grouping separator560decimal separator02",
    852                 formatter,
    853                 visibleDigits,
    854                 grouping,
    855                 options,
    856                 NULL);
    857     }
    858 }
    859 
    860 void NumberFormat2Test::TestDigitFormatter() {
    861     UErrorCode status = U_ZERO_ERROR;
    862     DecimalFormatSymbols symbols("en", status);
    863     if (!assertSuccess("", status)) {
    864         return;
    865     }
    866     DigitFormatter formatter(symbols);
    867     DigitInterval interval;
    868     {
    869         VisibleDigits visibleDigits;
    870         DigitGrouping grouping;
    871         FixedPrecision precision;
    872         precision.initVisibleDigits((int64_t) 8192, visibleDigits, status);
    873         if (!assertSuccess("", status)) {
    874             return;
    875         }
    876         DigitFormatterOptions options;
    877         verifyDigitFormatter(
    878                 "8192",
    879                 formatter,
    880                 visibleDigits,
    881                 grouping,
    882                 options,
    883                 NULL);
    884         NumberFormat2Test_Attributes expectedAttributes[] = {
    885             {UNUM_INTEGER_FIELD, 0, 4},
    886             {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
    887             {0, -1, 0}};
    888         options.fAlwaysShowDecimal = TRUE;
    889         verifyDigitFormatter(
    890                 "8192.",
    891                 formatter,
    892                 visibleDigits,
    893                 grouping,
    894                 options,
    895                 expectedAttributes);
    896 
    897         // Turn on grouping
    898         grouping.fGrouping = 3;
    899         options.fAlwaysShowDecimal = FALSE;
    900         verifyDigitFormatter(
    901                 "8,192",
    902                 formatter,
    903                 visibleDigits,
    904                 grouping,
    905                 options,
    906                 NULL);
    907 
    908         // turn on min grouping which will suppress grouping
    909         grouping.fMinGrouping = 2;
    910         verifyDigitFormatter(
    911                 "8192",
    912                 formatter,
    913                 visibleDigits,
    914                 grouping,
    915                 options,
    916                 NULL);
    917 
    918         // adding one more digit will enable grouping once again.
    919         precision.initVisibleDigits((int64_t) 43560, visibleDigits, status);
    920         if (!assertSuccess("", status)) {
    921             return;
    922         }
    923         verifyDigitFormatter(
    924                 "43,560",
    925                 formatter,
    926                 visibleDigits,
    927                 grouping,
    928                 options,
    929                 NULL);
    930     }
    931     {
    932         DigitGrouping grouping;
    933         FixedPrecision precision;
    934         VisibleDigits visibleDigits;
    935         precision.initVisibleDigits(
    936                 31415926.0078125, visibleDigits, status);
    937         if (!assertSuccess("", status)) {
    938             return;
    939         }
    940         DigitFormatterOptions options;
    941         verifyDigitFormatter(
    942                 "31415926.0078125",
    943                 formatter,
    944                 visibleDigits,
    945                 grouping,
    946                 options,
    947                 NULL);
    948 
    949         // Turn on grouping with secondary.
    950         grouping.fGrouping = 2;
    951         grouping.fGrouping2 = 3;
    952         verifyDigitFormatter(
    953                 "314,159,26.0078125",
    954                 formatter,
    955                 visibleDigits,
    956                 grouping,
    957                 options,
    958                 NULL);
    959 
    960         // Pad with zeros by widening interval.
    961         precision.fMin.setIntDigitCount(9);
    962         precision.fMin.setFracDigitCount(10);
    963         precision.initVisibleDigits(
    964                 31415926.0078125, visibleDigits, status);
    965         if (!assertSuccess("", status)) {
    966             return;
    967         }
    968         NumberFormat2Test_Attributes expectedAttributes[] = {
    969             {UNUM_GROUPING_SEPARATOR_FIELD, 1, 2},
    970             {UNUM_GROUPING_SEPARATOR_FIELD, 5, 6},
    971             {UNUM_GROUPING_SEPARATOR_FIELD, 9, 10},
    972             {UNUM_INTEGER_FIELD, 0, 12},
    973             {UNUM_DECIMAL_SEPARATOR_FIELD, 12, 13},
    974             {UNUM_FRACTION_FIELD, 13, 23},
    975             {0, -1, 0}};
    976         verifyDigitFormatter(
    977                 "0,314,159,26.0078125000",
    978                 formatter,
    979                 visibleDigits,
    980                 grouping,
    981                 options,
    982                 expectedAttributes);
    983     }
    984     {
    985         DigitGrouping grouping;
    986         FixedPrecision precision;
    987         VisibleDigits visibleDigits;
    988         DigitFormatterOptions options;
    989         precision.fMax.setIntDigitCount(0);
    990         precision.fMax.setFracDigitCount(0);
    991         precision.initVisibleDigits(
    992                 3125.0, visibleDigits, status);
    993         if (!assertSuccess("", status)) {
    994             return;
    995         }
    996         NumberFormat2Test_Attributes expectedAttributes[] = {
    997             {UNUM_INTEGER_FIELD, 0, 1},
    998             {0, -1, 0}};
    999         verifyDigitFormatter(
   1000                 "0",
   1001                 formatter,
   1002                 visibleDigits,
   1003                 grouping,
   1004                 options,
   1005                 expectedAttributes);
   1006         NumberFormat2Test_Attributes expectedAttributesWithDecimal[] = {
   1007             {UNUM_INTEGER_FIELD, 0, 1},
   1008             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   1009             {0, -1, 0}};
   1010         options.fAlwaysShowDecimal = TRUE;
   1011         verifyDigitFormatter(
   1012                 "0.",
   1013                 formatter,
   1014                 visibleDigits,
   1015                 grouping,
   1016                 options,
   1017                 expectedAttributesWithDecimal);
   1018     }
   1019     {
   1020         DigitGrouping grouping;
   1021         FixedPrecision precision;
   1022         VisibleDigits visibleDigits;
   1023         DigitFormatterOptions options;
   1024         precision.fMax.setIntDigitCount(1);
   1025         precision.fMin.setFracDigitCount(1);
   1026         precision.initVisibleDigits(
   1027                 3125.0, visibleDigits, status);
   1028         if (!assertSuccess("", status)) {
   1029             return;
   1030         }
   1031         NumberFormat2Test_Attributes expectedAttributes[] = {
   1032             {UNUM_INTEGER_FIELD, 0, 1},
   1033             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   1034             {UNUM_FRACTION_FIELD, 2, 3},
   1035             {0, -1, 0}};
   1036         options.fAlwaysShowDecimal = TRUE;
   1037         verifyDigitFormatter(
   1038                 "5.0",
   1039                 formatter,
   1040                 visibleDigits,
   1041                 grouping,
   1042                 options,
   1043                 expectedAttributes);
   1044     }
   1045 }
   1046 
   1047 void NumberFormat2Test::TestSciFormatterDefaultCtor() {
   1048     DigitFormatter formatter;
   1049     ScientificPrecision precision;
   1050     VisibleDigitsWithExponent visibleDigits;
   1051     UErrorCode status = U_ZERO_ERROR;
   1052     precision.initVisibleDigitsWithExponent(
   1053             6.02E23, visibleDigits, status);
   1054     if (!assertSuccess("", status)) {
   1055         return;
   1056     }
   1057     SciFormatterOptions options;
   1058     verifySciFormatter(
   1059             "6.02E23",
   1060             formatter,
   1061             visibleDigits,
   1062             options,
   1063             NULL);
   1064     precision.initVisibleDigitsWithExponent(
   1065             6.62E-34, visibleDigits, status);
   1066     if (!assertSuccess("", status)) {
   1067         return;
   1068     }
   1069     verifySciFormatter(
   1070             "6.62E-34",
   1071             formatter,
   1072             visibleDigits,
   1073             options,
   1074             NULL);
   1075 }
   1076 
   1077 void NumberFormat2Test::TestSciFormatter() {
   1078     DigitFormatter formatter;
   1079     ScientificPrecision precision;
   1080     precision.fMantissa.fMin.setIntDigitCount(4);
   1081     precision.fMantissa.fMax.setIntDigitCount(4);
   1082     precision.fMantissa.fMin.setFracDigitCount(0);
   1083     precision.fMantissa.fMax.setFracDigitCount(0);
   1084     precision.fMinExponentDigits = 3;
   1085     VisibleDigitsWithExponent visibleDigits;
   1086     UErrorCode status = U_ZERO_ERROR;
   1087     precision.initVisibleDigitsWithExponent(
   1088             1.248E26, visibleDigits, status);
   1089     if (!assertSuccess("", status)) {
   1090         return;
   1091     }
   1092     SciFormatterOptions options;
   1093 
   1094     {
   1095         options.fExponent.fAlwaysShowSign = TRUE;
   1096         NumberFormat2Test_Attributes expectedAttributes[] = {
   1097             {UNUM_INTEGER_FIELD, 0, 4},
   1098             {UNUM_EXPONENT_SYMBOL_FIELD, 4, 5},
   1099             {UNUM_EXPONENT_SIGN_FIELD, 5, 6},
   1100             {UNUM_EXPONENT_FIELD, 6, 9},
   1101             {0, -1, 0}};
   1102         verifySciFormatter(
   1103                 "1248E+023",
   1104                 formatter,
   1105                 visibleDigits,
   1106                 options,
   1107                 expectedAttributes);
   1108     }
   1109     {
   1110         options.fMantissa.fAlwaysShowDecimal = TRUE;
   1111         options.fExponent.fAlwaysShowSign = FALSE;
   1112         NumberFormat2Test_Attributes expectedAttributes[] = {
   1113             {UNUM_INTEGER_FIELD, 0, 4},
   1114             {UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
   1115             {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
   1116             {UNUM_EXPONENT_FIELD, 6, 9},
   1117             {0, -1, 0}};
   1118         verifySciFormatter(
   1119                 "1248.E023",
   1120                 formatter,
   1121                 visibleDigits,
   1122                 options,
   1123                 expectedAttributes);
   1124     }
   1125 }
   1126 
   1127 void NumberFormat2Test::TestValueFormatterIsFastFormattable() {
   1128     UErrorCode status = U_ZERO_ERROR;
   1129     DecimalFormatSymbols symbols("en", status);
   1130     if (!assertSuccess("", status)) {
   1131         return;
   1132     }
   1133     DigitFormatter formatter(symbols);
   1134     DigitGrouping grouping;
   1135     FixedPrecision precision;
   1136     DigitFormatterOptions options;
   1137     ValueFormatter vf;
   1138     vf.prepareFixedDecimalFormatting(
   1139             formatter, grouping, precision, options);
   1140     assertTrue("", vf.isFastFormattable(0));
   1141     assertTrue("", vf.isFastFormattable(35));
   1142     assertTrue("", vf.isFastFormattable(-48));
   1143     assertTrue("", vf.isFastFormattable(2147483647));
   1144     assertTrue("", vf.isFastFormattable(-2147483647));
   1145     assertFalse("", vf.isFastFormattable(-2147483648L));
   1146     {
   1147         DigitGrouping grouping;
   1148         grouping.fGrouping = 3;
   1149         ValueFormatter vf;
   1150         vf.prepareFixedDecimalFormatting(
   1151                 formatter, grouping, precision, options);
   1152         assertTrue("0", vf.isFastFormattable(0));
   1153         assertTrue("62", vf.isFastFormattable(62));
   1154         assertTrue("999", vf.isFastFormattable(999));
   1155         assertFalse("1000", vf.isFastFormattable(1000));
   1156         assertTrue("-1", vf.isFastFormattable(-1));
   1157         assertTrue("-38", vf.isFastFormattable(-38));
   1158         assertTrue("-999", vf.isFastFormattable(-999));
   1159         assertFalse("-1000", vf.isFastFormattable(-1000));
   1160         grouping.fMinGrouping = 2;
   1161         assertTrue("-1000", vf.isFastFormattable(-1000));
   1162         assertTrue("-4095", vf.isFastFormattable(-4095));
   1163         assertTrue("4095", vf.isFastFormattable(4095));
   1164         // We give up on acounting digits at 4096
   1165         assertFalse("-4096", vf.isFastFormattable(-4096));
   1166         assertFalse("4096", vf.isFastFormattable(4096));
   1167     }
   1168     {
   1169         // grouping on but with max integer digits set.
   1170         DigitGrouping grouping;
   1171         grouping.fGrouping = 4;
   1172         FixedPrecision precision;
   1173         precision.fMax.setIntDigitCount(4);
   1174         ValueFormatter vf;
   1175         vf.prepareFixedDecimalFormatting(
   1176                 formatter, grouping, precision, options);
   1177         assertTrue("-4096", vf.isFastFormattable(-4096));
   1178         assertTrue("4096", vf.isFastFormattable(4096));
   1179         assertTrue("-10000", vf.isFastFormattable(-10000));
   1180         assertTrue("10000", vf.isFastFormattable(10000));
   1181         assertTrue("-2147483647", vf.isFastFormattable(-2147483647));
   1182         assertTrue("2147483647", vf.isFastFormattable(2147483647));
   1183 
   1184         precision.fMax.setIntDigitCount(5);
   1185         assertFalse("-4096", vf.isFastFormattable(-4096));
   1186         assertFalse("4096", vf.isFastFormattable(4096));
   1187 
   1188     }
   1189     {
   1190         // grouping on but with min integer digits set.
   1191         DigitGrouping grouping;
   1192         grouping.fGrouping = 3;
   1193         FixedPrecision precision;
   1194         precision.fMin.setIntDigitCount(3);
   1195         ValueFormatter vf;
   1196         vf.prepareFixedDecimalFormatting(
   1197                 formatter, grouping, precision, options);
   1198         assertTrue("-999", vf.isFastFormattable(-999));
   1199         assertTrue("999", vf.isFastFormattable(999));
   1200         assertFalse("-1000", vf.isFastFormattable(-1000));
   1201         assertFalse("1000", vf.isFastFormattable(1000));
   1202 
   1203         precision.fMin.setIntDigitCount(4);
   1204         assertFalse("-999", vf.isFastFormattable(-999));
   1205         assertFalse("999", vf.isFastFormattable(999));
   1206         assertFalse("-2147483647", vf.isFastFormattable(-2147483647));
   1207         assertFalse("2147483647", vf.isFastFormattable(2147483647));
   1208     }
   1209     {
   1210         // options set.
   1211         DigitFormatterOptions options;
   1212         ValueFormatter vf;
   1213         vf.prepareFixedDecimalFormatting(
   1214                 formatter, grouping, precision, options);
   1215         assertTrue("5125", vf.isFastFormattable(5125));
   1216         options.fAlwaysShowDecimal = TRUE;
   1217         assertFalse("5125", vf.isFastFormattable(5125));
   1218         options.fAlwaysShowDecimal = FALSE;
   1219         assertTrue("5125", vf.isFastFormattable(5125));
   1220     }
   1221     {
   1222         // test fraction digits
   1223         FixedPrecision precision;
   1224         ValueFormatter vf;
   1225         vf.prepareFixedDecimalFormatting(
   1226                 formatter, grouping, precision, options);
   1227         assertTrue("7127", vf.isFastFormattable(7127));
   1228         precision.fMin.setFracDigitCount(1);
   1229         assertFalse("7127", vf.isFastFormattable(7127));
   1230     }
   1231     {
   1232         // test presence of significant digits
   1233         FixedPrecision precision;
   1234         ValueFormatter vf;
   1235         vf.prepareFixedDecimalFormatting(
   1236                 formatter, grouping, precision, options);
   1237         assertTrue("1049", vf.isFastFormattable(1049));
   1238         precision.fSignificant.setMin(1);
   1239         assertFalse("1049", vf.isFastFormattable(1049));
   1240     }
   1241     {
   1242         // test presence of rounding increment
   1243         FixedPrecision precision;
   1244         ValueFormatter vf;
   1245         vf.prepareFixedDecimalFormatting(
   1246                 formatter, grouping, precision, options);
   1247         assertTrue("1099", vf.isFastFormattable(1099));
   1248         precision.fRoundingIncrement.set(2.3);
   1249         assertFalse("1099", vf.isFastFormattable(1099));
   1250     }
   1251     {
   1252         // test scientific notation
   1253         ScientificPrecision precision;
   1254         SciFormatterOptions options;
   1255         ValueFormatter vf;
   1256         vf.prepareScientificFormatting(
   1257                 formatter, precision, options);
   1258         assertFalse("1081", vf.isFastFormattable(1081));
   1259     }
   1260 }
   1261 
   1262 void NumberFormat2Test::TestDigitAffix() {
   1263     DigitAffix affix;
   1264     {
   1265         affix.append("foo");
   1266         affix.append("--", UNUM_SIGN_FIELD);
   1267         affix.append("%", UNUM_PERCENT_FIELD);
   1268         NumberFormat2Test_Attributes expectedAttributes[] = {
   1269             {UNUM_SIGN_FIELD, 3, 5},
   1270             {UNUM_PERCENT_FIELD, 5, 6},
   1271             {0, -1, 0}};
   1272         verifyAffix("foo--%", affix, expectedAttributes);
   1273     }
   1274     {
   1275         affix.remove();
   1276         affix.append("USD", UNUM_CURRENCY_FIELD);
   1277         affix.append(" ");
   1278         NumberFormat2Test_Attributes expectedAttributes[] = {
   1279             {UNUM_CURRENCY_FIELD, 0, 3},
   1280             {0, -1, 0}};
   1281         verifyAffix("USD ", affix, expectedAttributes);
   1282     }
   1283     {
   1284         affix.setTo("%%", UNUM_PERCENT_FIELD);
   1285         NumberFormat2Test_Attributes expectedAttributes[] = {
   1286             {UNUM_PERCENT_FIELD, 0, 2},
   1287             {0, -1, 0}};
   1288         verifyAffix("%%", affix, expectedAttributes);
   1289     }
   1290 }
   1291 
   1292 void NumberFormat2Test::TestPluralAffix() {
   1293     UErrorCode status = U_ZERO_ERROR;
   1294     PluralAffix part;
   1295     part.setVariant("one", "Dollar", status);
   1296     part.setVariant("few", "DollarFew", status);
   1297     part.setVariant("other", "Dollars", status);
   1298     PluralAffix dollar(part);
   1299     PluralAffix percent(part);
   1300     part.remove();
   1301     part.setVariant("one", "Percent", status);
   1302     part.setVariant("many", "PercentMany", status);
   1303     part.setVariant("other", "Percents", status);
   1304     percent = part;
   1305     part.remove();
   1306     part.setVariant("one", "foo", status);
   1307 
   1308     PluralAffix pa;
   1309     assertEquals("", "", pa.getOtherVariant().toString());
   1310     pa.append(dollar, UNUM_CURRENCY_FIELD, status);
   1311     pa.append(" and ");
   1312     pa.append(percent, UNUM_PERCENT_FIELD, status);
   1313     pa.append("-", UNUM_SIGN_FIELD);
   1314 
   1315     {
   1316         // other
   1317         NumberFormat2Test_Attributes expectedAttributes[] = {
   1318             {UNUM_CURRENCY_FIELD, 0, 7},
   1319             {UNUM_PERCENT_FIELD, 12, 20},
   1320             {UNUM_SIGN_FIELD, 20, 21},
   1321             {0, -1, 0}};
   1322         verifyAffix(
   1323                 "Dollars and Percents-",
   1324                 pa.getByCategory("other"),
   1325                 expectedAttributes);
   1326     }
   1327     {
   1328         // two which is same as other
   1329         NumberFormat2Test_Attributes expectedAttributes[] = {
   1330             {UNUM_CURRENCY_FIELD, 0, 7},
   1331             {UNUM_PERCENT_FIELD, 12, 20},
   1332             {UNUM_SIGN_FIELD, 20, 21},
   1333             {0, -1, 0}};
   1334         verifyAffix(
   1335                 "Dollars and Percents-",
   1336                 pa.getByCategory("two"),
   1337                 expectedAttributes);
   1338     }
   1339     {
   1340         // bad which is same as other
   1341         NumberFormat2Test_Attributes expectedAttributes[] = {
   1342             {UNUM_CURRENCY_FIELD, 0, 7},
   1343             {UNUM_PERCENT_FIELD, 12, 20},
   1344             {UNUM_SIGN_FIELD, 20, 21},
   1345             {0, -1, 0}};
   1346         verifyAffix(
   1347                 "Dollars and Percents-",
   1348                 pa.getByCategory("bad"),
   1349                 expectedAttributes);
   1350     }
   1351     {
   1352         // one
   1353         NumberFormat2Test_Attributes expectedAttributes[] = {
   1354             {UNUM_CURRENCY_FIELD, 0, 6},
   1355             {UNUM_PERCENT_FIELD, 11, 18},
   1356             {UNUM_SIGN_FIELD, 18, 19},
   1357             {0, -1, 0}};
   1358         verifyAffix(
   1359                 "Dollar and Percent-",
   1360                 pa.getByCategory("one"),
   1361                 expectedAttributes);
   1362     }
   1363     {
   1364         // few
   1365         NumberFormat2Test_Attributes expectedAttributes[] = {
   1366             {UNUM_CURRENCY_FIELD, 0, 9},
   1367             {UNUM_PERCENT_FIELD, 14, 22},
   1368             {UNUM_SIGN_FIELD, 22, 23},
   1369             {0, -1, 0}};
   1370         verifyAffix(
   1371                 "DollarFew and Percents-",
   1372                 pa.getByCategory("few"),
   1373                 expectedAttributes);
   1374     }
   1375     {
   1376         // many
   1377         NumberFormat2Test_Attributes expectedAttributes[] = {
   1378             {UNUM_CURRENCY_FIELD, 0, 7},
   1379             {UNUM_PERCENT_FIELD, 12, 23},
   1380             {UNUM_SIGN_FIELD, 23, 24},
   1381             {0, -1, 0}};
   1382         verifyAffix(
   1383                 "Dollars and PercentMany-",
   1384                 pa.getByCategory("many"),
   1385                 expectedAttributes);
   1386     }
   1387     assertTrue("", pa.hasMultipleVariants());
   1388     pa.remove();
   1389     pa.append("$$$", UNUM_CURRENCY_FIELD);
   1390     assertFalse("", pa.hasMultipleVariants());
   1391 
   1392 }
   1393 
   1394 void NumberFormat2Test::TestCurrencyAffixInfo() {
   1395     CurrencyAffixInfo info;
   1396     assertTrue("", info.isDefault());
   1397     UnicodeString expectedSymbol("\\u00a4");
   1398     UnicodeString expectedSymbolIso("\\u00a4\\u00a4");
   1399     UnicodeString expectedSymbols("\\u00a4\\u00a4\\u00a4");
   1400     assertEquals("", expectedSymbol.unescape(), info.getSymbol());
   1401     assertEquals("", expectedSymbolIso.unescape(), info.getISO());
   1402     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("one").toString());
   1403     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("other").toString());
   1404     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("two").toString());
   1405     UErrorCode status = U_ZERO_ERROR;
   1406     static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
   1407     LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
   1408     if (!assertSuccess("", status)) {
   1409         return;
   1410     }
   1411     info.set("en", rules.getAlias(), USD, status);
   1412     assertEquals("", "$", info.getSymbol(), TRUE);
   1413     assertEquals("", "USD", info.getISO(), TRUE);
   1414     assertEquals("", "US dollar", info.getLong().getByCategory("one").toString(), TRUE);
   1415     assertEquals("", "US dollars", info.getLong().getByCategory("other").toString(), TRUE);
   1416     assertEquals("", "US dollars", info.getLong().getByCategory("two").toString(), TRUE);
   1417     assertFalse("", info.isDefault());
   1418     info.set(NULL, NULL, NULL, status);
   1419     assertTrue("", info.isDefault());
   1420     assertEquals("", expectedSymbol.unescape(), info.getSymbol());
   1421     assertEquals("", expectedSymbolIso.unescape(), info.getISO());
   1422     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("one").toString());
   1423     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("other").toString());
   1424     assertEquals("", expectedSymbols.unescape(), info.getLong().getByCategory("two").toString());
   1425     info.setSymbol("$");
   1426     assertFalse("", info.isDefault());
   1427     info.set(NULL, NULL, NULL, status);
   1428     assertTrue("", info.isDefault());
   1429     info.setISO("USD");
   1430     assertFalse("", info.isDefault());
   1431     assertSuccess("", status);
   1432 }
   1433 
   1434 void NumberFormat2Test::TestAffixPattern() {
   1435     static UChar chars[500];
   1436     for (int32_t i = 0; i < UPRV_LENGTHOF(chars); ++i) {
   1437         chars[i] = (UChar) (i + 1);
   1438     }
   1439     AffixPattern first;
   1440     first.add(AffixPattern::kPercent);
   1441     first.addLiteral(chars, 0, 200);
   1442     first.addLiteral(chars, 200, 300);
   1443     first.addCurrency(2);
   1444     first.addLiteral(chars, 0, 256);
   1445     AffixPattern second;
   1446     second.add(AffixPattern::kPercent);
   1447     second.addLiteral(chars, 0, 300);
   1448     second.addLiteral(chars, 300, 200);
   1449     second.addCurrency(2);
   1450     second.addLiteral(chars, 0, 150);
   1451     second.addLiteral(chars, 150, 106);
   1452     assertTrue("", first.equals(second));
   1453     AffixPatternIterator iter;
   1454     second.remove();
   1455     assertFalse("", second.iterator(iter).nextToken());
   1456     assertTrue("", first.iterator(iter).nextToken());
   1457     assertEquals("", AffixPattern::kPercent, iter.getTokenType());
   1458     assertEquals("", 1, iter.getTokenLength());
   1459     assertTrue("", iter.nextToken());
   1460     UnicodeString str;
   1461     assertEquals("", 500, iter.getLiteral(str).length());
   1462     assertEquals("", AffixPattern::kLiteral, iter.getTokenType());
   1463     assertEquals("", 500, iter.getTokenLength());
   1464     assertTrue("", iter.nextToken());
   1465     assertEquals("", AffixPattern::kCurrency, iter.getTokenType());
   1466     assertEquals("", 2, iter.getTokenLength());
   1467     assertTrue("", iter.nextToken());
   1468     assertEquals("", 256, iter.getLiteral(str).length());
   1469     assertEquals("", AffixPattern::kLiteral, iter.getTokenType());
   1470     assertEquals("", 256, iter.getTokenLength());
   1471     assertFalse("", iter.nextToken());
   1472 }
   1473 
   1474 void NumberFormat2Test::TestAffixPatternDoubleQuote() {
   1475     UnicodeString str("'Don''t'");
   1476     AffixPattern expected;
   1477     // Don't
   1478     static UChar chars[] = {0x44, 0x6F, 0x6E, 0x27, 0x74};
   1479     expected.addLiteral(chars, 0, UPRV_LENGTHOF(chars));
   1480     AffixPattern actual;
   1481     UErrorCode status = U_ZERO_ERROR;
   1482     AffixPattern::parseUserAffixString(str, actual, status);
   1483     assertTrue("", expected.equals(actual));
   1484     UnicodeString formattedString;
   1485     assertEquals("", "Don''t", actual.toUserString(formattedString));
   1486     assertSuccess("", status);
   1487 }
   1488 
   1489 void NumberFormat2Test::TestAffixPatternParser() {
   1490     UErrorCode status = U_ZERO_ERROR;
   1491     static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
   1492     LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
   1493     DecimalFormatSymbols symbols("en", status);
   1494     if (U_FAILURE(status)) {
   1495         dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status));
   1496         return;
   1497     }
   1498     AffixPatternParser parser(symbols);
   1499     CurrencyAffixInfo currencyAffixInfo;
   1500     currencyAffixInfo.set("en", rules.getAlias(), USD, status);
   1501     PluralAffix affix;
   1502     UnicodeString str("'--y'''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
   1503     str = str.unescape();
   1504     assertSuccess("", status);
   1505     AffixPattern affixPattern;
   1506     parser.parse(
   1507             AffixPattern::parseAffixString(str, affixPattern, status),
   1508             currencyAffixInfo,
   1509             affix,
   1510             status);
   1511     UnicodeString formattedStr;
   1512     affixPattern.toString(formattedStr);
   1513     UnicodeString expectedFormattedStr("'--y''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
   1514     expectedFormattedStr = expectedFormattedStr.unescape();
   1515     assertEquals("1", expectedFormattedStr, formattedStr);
   1516     AffixPattern userAffixPattern;
   1517     UnicodeString userStr("-'-'y'''d'z%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
   1518     userStr = userStr.unescape();
   1519     AffixPattern::parseUserAffixString(userStr, userAffixPattern, status),
   1520     assertTrue("", affixPattern.equals(userAffixPattern));
   1521     AffixPattern userAffixPattern2;
   1522     UnicodeString formattedUserStr;
   1523     AffixPattern::parseUserAffixString(
   1524             userAffixPattern.toUserString(formattedUserStr),
   1525             userAffixPattern2,
   1526             status);
   1527     UnicodeString expectedFormattedUserStr(
   1528             "-'-'y''dz%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
   1529     assertEquals("2", expectedFormattedUserStr.unescape(), formattedUserStr);
   1530     assertTrue("", userAffixPattern2.equals(userAffixPattern));
   1531     assertSuccess("", status);
   1532     assertTrue("", affixPattern.usesCurrency());
   1533     assertTrue("", affixPattern.usesPercent());
   1534     assertFalse("", affixPattern.usesPermill());
   1535     assertTrue("", affix.hasMultipleVariants());
   1536     {
   1537         // other
   1538         NumberFormat2Test_Attributes expectedAttributes[] = {
   1539             {UNUM_SIGN_FIELD, 0, 1},
   1540             {UNUM_PERCENT_FIELD, 6, 7},
   1541             {UNUM_CURRENCY_FIELD, 7, 17},
   1542             {UNUM_CURRENCY_FIELD, 21, 31},
   1543             {UNUM_CURRENCY_FIELD, 35, 38},
   1544             {UNUM_CURRENCY_FIELD, 43, 44},
   1545             {0, -1, 0}};
   1546         verifyAffix(
   1547                 "--y'dz%US dollars\\u00a4 y US dollars or USD but $",
   1548                 affix.getByCategory("other"),
   1549                 expectedAttributes);
   1550     }
   1551     {
   1552         // one
   1553         NumberFormat2Test_Attributes expectedAttributes[] = {
   1554             {UNUM_SIGN_FIELD, 0, 1},
   1555             {UNUM_PERCENT_FIELD, 6, 7},
   1556             {UNUM_CURRENCY_FIELD, 7, 16},
   1557             {UNUM_CURRENCY_FIELD, 20, 29},
   1558             {UNUM_CURRENCY_FIELD, 33, 36},
   1559             {UNUM_CURRENCY_FIELD, 41, 42},
   1560             {0, -1, 0}};
   1561         verifyAffix(
   1562                 "--y'dz%US dollar\\u00a4 y US dollar or USD but $",
   1563                 affix.getByCategory("one"),
   1564                 expectedAttributes);
   1565     }
   1566     affix.remove();
   1567     str = "%'-";
   1568     affixPattern.remove();
   1569     parser.parse(
   1570             AffixPattern::parseAffixString(str, affixPattern, status),
   1571             currencyAffixInfo,
   1572             affix,
   1573             status);
   1574     assertSuccess("", status);
   1575     assertFalse("", affixPattern.usesCurrency());
   1576     assertFalse("", affixPattern.usesPercent());
   1577     assertFalse("", affixPattern.usesPermill());
   1578     assertFalse("", affix.hasMultipleVariants());
   1579     {
   1580         // other
   1581         NumberFormat2Test_Attributes expectedAttributes[] = {
   1582             {UNUM_SIGN_FIELD, 1, 2},
   1583             {0, -1, 0}};
   1584         verifyAffix(
   1585                 "%-",
   1586                 affix.getByCategory("other"),
   1587                 expectedAttributes);
   1588     }
   1589     UnicodeString a4("\\u00a4");
   1590     AffixPattern scratchPattern;
   1591     AffixPattern::parseAffixString(a4.unescape(), scratchPattern, status);
   1592     assertFalse("", scratchPattern.usesCurrency());
   1593 
   1594     // Test really long string > 256 chars.
   1595     str = "'\\u2030012345678901234567890123456789012345678901234567890123456789"
   1596           "012345678901234567890123456789012345678901234567890123456789"
   1597           "012345678901234567890123456789012345678901234567890123456789"
   1598           "012345678901234567890123456789012345678901234567890123456789"
   1599           "012345678901234567890123456789012345678901234567890123456789";
   1600     str = str.unescape();
   1601     affixPattern.remove();
   1602     affix.remove();
   1603     parser.parse(
   1604             AffixPattern::parseAffixString(str, affixPattern, status),
   1605             currencyAffixInfo,
   1606             affix,
   1607             status);
   1608     assertSuccess("", status);
   1609     assertFalse("", affixPattern.usesCurrency());
   1610     assertFalse("", affixPattern.usesPercent());
   1611     assertTrue("", affixPattern.usesPermill());
   1612     assertFalse("", affix.hasMultipleVariants());
   1613     {
   1614        UnicodeString expected =
   1615            "\\u2030012345678901234567890123456789012345678901234567890123456789"
   1616            "012345678901234567890123456789012345678901234567890123456789"
   1617            "012345678901234567890123456789012345678901234567890123456789"
   1618            "012345678901234567890123456789012345678901234567890123456789"
   1619            "012345678901234567890123456789012345678901234567890123456789";
   1620         expected = expected.unescape();
   1621         NumberFormat2Test_Attributes expectedAttributes[] = {
   1622             {UNUM_PERMILL_FIELD, 0, 1},
   1623             {0, -1, 0}};
   1624         verifyAffix(
   1625                 expected,
   1626                 affix.getOtherVariant(),
   1627                 expectedAttributes);
   1628     }
   1629 }
   1630 
   1631 void NumberFormat2Test::TestAffixPatternAppend() {
   1632   AffixPattern pattern;
   1633   UErrorCode status = U_ZERO_ERROR;
   1634   UnicodeString patternStr("%\\u2030");
   1635   AffixPattern::parseUserAffixString(
   1636           patternStr.unescape(), pattern, status);
   1637 
   1638   AffixPattern appendPattern;
   1639   UnicodeString appendPatternStr("-\\u00a4\\u00a4*");
   1640   AffixPattern::parseUserAffixString(
   1641           appendPatternStr.unescape(), appendPattern, status);
   1642 
   1643   AffixPattern expectedPattern;
   1644   UnicodeString expectedPatternStr("%\\u2030-\\u00a4\\u00a4*");
   1645   AffixPattern::parseUserAffixString(
   1646           expectedPatternStr.unescape(), expectedPattern, status);
   1647 
   1648   assertTrue("", pattern.append(appendPattern).equals(expectedPattern));
   1649   assertSuccess("", status);
   1650 }
   1651 
   1652 void NumberFormat2Test::TestAffixPatternAppendAjoiningLiterals() {
   1653   AffixPattern pattern;
   1654   UErrorCode status = U_ZERO_ERROR;
   1655   UnicodeString patternStr("%baaa");
   1656   AffixPattern::parseUserAffixString(
   1657           patternStr, pattern, status);
   1658 
   1659   AffixPattern appendPattern;
   1660   UnicodeString appendPatternStr("caa%");
   1661   AffixPattern::parseUserAffixString(
   1662           appendPatternStr, appendPattern, status);
   1663 
   1664   AffixPattern expectedPattern;
   1665   UnicodeString expectedPatternStr("%baaacaa%");
   1666   AffixPattern::parseUserAffixString(
   1667           expectedPatternStr, expectedPattern, status);
   1668 
   1669   assertTrue("", pattern.append(appendPattern).equals(expectedPattern));
   1670   assertSuccess("", status);
   1671 }
   1672 
   1673 void NumberFormat2Test::TestLargeIntValue() {
   1674     VisibleDigits digits;
   1675     {
   1676         UErrorCode status = U_ZERO_ERROR;
   1677         FixedPrecision precision;
   1678 
   1679         // Last 18 digits for int values.
   1680         verifyIntValue(
   1681                 223372036854775807LL,
   1682                 precision.initVisibleDigits(INT64_MAX, digits, status));
   1683         assertSuccess("INT64_MAX", status);
   1684     }
   1685     {
   1686         UErrorCode status = U_ZERO_ERROR;
   1687         FixedPrecision precision;
   1688         precision.fMax.setIntDigitCount(5);
   1689 
   1690         // Last 18 digits for int values.
   1691         verifyIntValue(
   1692                 75807LL,
   1693                 precision.initVisibleDigits(INT64_MAX, digits, status));
   1694         verifySource(75807.0, digits);
   1695         assertSuccess("75807", status);
   1696     }
   1697     {
   1698         UErrorCode status = U_ZERO_ERROR;
   1699         FixedPrecision precision;
   1700 
   1701         // Last 18 digits for int values.
   1702         verifyIntValue(
   1703                 223372036854775808LL,
   1704                 precision.initVisibleDigits(INT64_MIN, digits, status));
   1705         assertSuccess("INT64_MIN", status);
   1706     }
   1707     {
   1708         UErrorCode status = U_ZERO_ERROR;
   1709         FixedPrecision precision;
   1710         precision.fMax.setIntDigitCount(5);
   1711 
   1712         // Last 18 digits for int values.
   1713         verifyIntValue(
   1714                 75808LL,
   1715                 precision.initVisibleDigits(INT64_MIN, digits, status));
   1716         verifySource(75808.0, digits);
   1717         assertSuccess("75808", status);
   1718     }
   1719 
   1720 }
   1721 
   1722 void NumberFormat2Test::TestIntInitVisibleDigits() {
   1723     VisibleDigits digits;
   1724     {
   1725         UErrorCode status = U_ZERO_ERROR;
   1726         FixedPrecision precision;
   1727         verifyVisibleDigits(
   1728                 "13",
   1729                 FALSE,
   1730                 precision.initVisibleDigits((int64_t) 13LL, digits, status));
   1731         assertSuccess("13", status);
   1732     }
   1733     {
   1734         UErrorCode status = U_ZERO_ERROR;
   1735         FixedPrecision precision;
   1736         verifyVisibleDigits(
   1737                 "17",
   1738                 TRUE,
   1739                 precision.initVisibleDigits((int64_t) -17LL, digits, status));
   1740         assertSuccess("-17", status);
   1741     }
   1742     {
   1743         UErrorCode status = U_ZERO_ERROR;
   1744         FixedPrecision precision;
   1745         verifyVisibleDigits(
   1746                 "9223372036854775808",
   1747                 TRUE,
   1748                 precision.initVisibleDigits(INT64_MIN, digits, status));
   1749         assertSuccess("-9223372036854775808", status);
   1750     }
   1751     {
   1752         UErrorCode status = U_ZERO_ERROR;
   1753         FixedPrecision precision;
   1754         verifyVisibleDigits(
   1755                 "9223372036854775807",
   1756                 FALSE,
   1757                 precision.initVisibleDigits(INT64_MAX, digits, status));
   1758         assertSuccess("9223372036854775807", status);
   1759     }
   1760     {
   1761         UErrorCode status = U_ZERO_ERROR;
   1762         FixedPrecision precision;
   1763         verifyVisibleDigits(
   1764                 "31536000",
   1765                 TRUE,
   1766                 precision.initVisibleDigits((int64_t) -31536000LL, digits, status));
   1767         assertSuccess("-31536000", status);
   1768     }
   1769     {
   1770         UErrorCode status = U_ZERO_ERROR;
   1771         FixedPrecision precision;
   1772         verifyVisibleDigits(
   1773                 "0",
   1774                 FALSE,
   1775                 precision.initVisibleDigits((int64_t) 0LL, digits, status));
   1776         assertSuccess("0", status);
   1777     }
   1778     {
   1779         UErrorCode status = U_ZERO_ERROR;
   1780         FixedPrecision precision;
   1781         precision.fMin.setIntDigitCount(4);
   1782         precision.fMin.setFracDigitCount(2);
   1783         verifyVisibleDigits(
   1784                 "0000.00",
   1785                 FALSE,
   1786                 precision.initVisibleDigits((int64_t) 0LL, digits, status));
   1787         assertSuccess("0", status);
   1788     }
   1789     {
   1790         UErrorCode status = U_ZERO_ERROR;
   1791         FixedPrecision precision;
   1792         precision.fMin.setIntDigitCount(4);
   1793         precision.fMin.setFracDigitCount(2);
   1794         verifyVisibleDigits(
   1795                 "0057.00",
   1796                 FALSE,
   1797                 precision.initVisibleDigits((int64_t) 57LL, digits, status));
   1798         assertSuccess("57", status);
   1799     }
   1800     {
   1801         UErrorCode status = U_ZERO_ERROR;
   1802         FixedPrecision precision;
   1803         precision.fMin.setIntDigitCount(4);
   1804         precision.fMin.setFracDigitCount(2);
   1805         verifyVisibleDigits(
   1806                 "0057.00",
   1807                 TRUE,
   1808                 precision.initVisibleDigits((int64_t) -57LL, digits, status));
   1809         assertSuccess("-57", status);
   1810     }
   1811     {
   1812         UErrorCode status = U_ZERO_ERROR;
   1813         FixedPrecision precision;
   1814         precision.fMax.setIntDigitCount(2);
   1815         precision.fMin.setFracDigitCount(1);
   1816         verifyVisibleDigits(
   1817                 "35.0",
   1818                 FALSE,
   1819                 precision.initVisibleDigits((int64_t) 235LL, digits, status));
   1820         assertSuccess("235", status);
   1821     }
   1822     {
   1823         UErrorCode status = U_ZERO_ERROR;
   1824         FixedPrecision precision;
   1825         precision.fMax.setIntDigitCount(2);
   1826         precision.fMin.setFracDigitCount(1);
   1827         precision.fFailIfOverMax = TRUE;
   1828         precision.initVisibleDigits((int64_t) 239LL, digits, status);
   1829         if (status != U_ILLEGAL_ARGUMENT_ERROR) {
   1830             errln("239: Expected U_ILLEGAL_ARGUMENT_ERROR");
   1831         }
   1832     }
   1833     {
   1834         UErrorCode status = U_ZERO_ERROR;
   1835         FixedPrecision precision;
   1836         precision.fSignificant.setMin(5);
   1837         verifyVisibleDigits(
   1838                 "153.00",
   1839                 FALSE,
   1840                 precision.initVisibleDigits((int64_t) 153LL, digits, status));
   1841         assertSuccess("153", status);
   1842     }
   1843     {
   1844         UErrorCode status = U_ZERO_ERROR;
   1845         FixedPrecision precision;
   1846         precision.fSignificant.setMax(2);
   1847         precision.fExactOnly = TRUE;
   1848         precision.initVisibleDigits((int64_t) 154LL, digits, status);
   1849         if (status != U_FORMAT_INEXACT_ERROR) {
   1850             errln("154: Expected U_FORMAT_INEXACT_ERROR");
   1851         }
   1852     }
   1853     {
   1854         UErrorCode status = U_ZERO_ERROR;
   1855         FixedPrecision precision;
   1856         precision.fSignificant.setMax(5);
   1857         verifyVisibleDigits(
   1858                 "150",
   1859                 FALSE,
   1860                 precision.initVisibleDigits((int64_t) 150LL, digits, status));
   1861         assertSuccess("150", status);
   1862     }
   1863 }
   1864 
   1865 void NumberFormat2Test::TestIntInitVisibleDigitsToDigitList() {
   1866     VisibleDigits digits;
   1867     {
   1868         UErrorCode status = U_ZERO_ERROR;
   1869         FixedPrecision precision;
   1870         precision.fRoundingIncrement.set(7.3);
   1871         verifyVisibleDigits(
   1872                 "29.2",
   1873                 TRUE,
   1874                 precision.initVisibleDigits((int64_t) -30LL, digits, status));
   1875         assertSuccess("-29.2", status);
   1876     }
   1877     {
   1878         UErrorCode status = U_ZERO_ERROR;
   1879         FixedPrecision precision;
   1880         precision.fRoundingIncrement.set(7.3);
   1881         precision.fRoundingMode = DecimalFormat::kRoundFloor;
   1882         verifyVisibleDigits(
   1883                 "36.5",
   1884                 TRUE,
   1885                 precision.initVisibleDigits((int64_t) -30LL, digits, status));
   1886         assertSuccess("-36.5", status);
   1887     }
   1888     {
   1889         UErrorCode status = U_ZERO_ERROR;
   1890         FixedPrecision precision;
   1891         precision.fSignificant.setMax(3);
   1892         precision.fRoundingMode = DecimalFormat::kRoundCeiling;
   1893         verifyVisibleDigits(
   1894                 "1390",
   1895                 FALSE,
   1896                 precision.initVisibleDigits((int64_t) 1381LL, digits, status));
   1897         assertSuccess("1390", status);
   1898     }
   1899     {
   1900         UErrorCode status = U_ZERO_ERROR;
   1901         FixedPrecision precision;
   1902         precision.fSignificant.setMax(1);
   1903         precision.fRoundingMode = DecimalFormat::kRoundFloor;
   1904         verifyVisibleDigits(
   1905                 "2000",
   1906                 TRUE,
   1907                 precision.initVisibleDigits((int64_t) -1381LL, digits, status));
   1908         assertSuccess("-2000", status);
   1909     }
   1910 }
   1911 
   1912 void NumberFormat2Test::TestDoubleInitVisibleDigits() {
   1913     VisibleDigits digits;
   1914     {
   1915         UErrorCode status = U_ZERO_ERROR;
   1916         FixedPrecision precision;
   1917         verifyVisibleDigits(
   1918                 "2.05",
   1919                 FALSE,
   1920                 precision.initVisibleDigits(2.05, digits, status));
   1921         assertSuccess("2.05", status);
   1922     }
   1923     {
   1924         UErrorCode status = U_ZERO_ERROR;
   1925         FixedPrecision precision;
   1926         verifyVisibleDigits(
   1927                 "3547",
   1928                 FALSE,
   1929                 precision.initVisibleDigits(3547.0, digits, status));
   1930         assertSuccess("3547", status);
   1931     }
   1932     {
   1933         UErrorCode status = U_ZERO_ERROR;
   1934         FixedPrecision precision;
   1935         precision.fMax.setFracDigitCount(2);
   1936         precision.fMax.setIntDigitCount(1);
   1937         precision.fFailIfOverMax = TRUE;
   1938         precision.fExactOnly = TRUE;
   1939         verifyVisibleDigits(
   1940                 "2.05",
   1941                 TRUE,
   1942                 precision.initVisibleDigits(-2.05, digits, status));
   1943         assertSuccess("-2.05", status);
   1944     }
   1945     {
   1946         UErrorCode status = U_ZERO_ERROR;
   1947         FixedPrecision precision;
   1948         precision.fMax.setFracDigitCount(1);
   1949         precision.fMax.setIntDigitCount(1);
   1950         precision.fFailIfOverMax = TRUE;
   1951         precision.fExactOnly = TRUE;
   1952         precision.initVisibleDigits(-2.05, digits, status);
   1953         if (status != U_FORMAT_INEXACT_ERROR) {
   1954             errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
   1955         }
   1956     }
   1957     {
   1958         UErrorCode status = U_ZERO_ERROR;
   1959         FixedPrecision precision;
   1960         precision.fMax.setFracDigitCount(2);
   1961         precision.fMax.setIntDigitCount(0);
   1962         precision.fFailIfOverMax = TRUE;
   1963         precision.fExactOnly = TRUE;
   1964         precision.initVisibleDigits(-2.05, digits, status);
   1965         if (status != U_ILLEGAL_ARGUMENT_ERROR) {
   1966             errln("-2.05: Expected U_ILLEGAL_ARGUMENT_ERROR");
   1967         }
   1968     }
   1969     {
   1970         UErrorCode status = U_ZERO_ERROR;
   1971         FixedPrecision precision;
   1972         precision.fMin.setIntDigitCount(5);
   1973         precision.fMin.setFracDigitCount(2);
   1974         precision.fExactOnly = TRUE;
   1975         verifyVisibleDigits(
   1976                 "06245.30",
   1977                 FALSE,
   1978                 precision.initVisibleDigits(6245.3, digits, status));
   1979         assertSuccess("06245.30", status);
   1980     }
   1981     {
   1982         UErrorCode status = U_ZERO_ERROR;
   1983         FixedPrecision precision;
   1984         precision.fSignificant.setMax(5);
   1985         precision.fExactOnly = TRUE;
   1986         verifyVisibleDigits(
   1987                 "6245.3",
   1988                 FALSE,
   1989                 precision.initVisibleDigits(6245.3, digits, status));
   1990         assertSuccess("6245.3", status);
   1991     }
   1992     {
   1993         UErrorCode status = U_ZERO_ERROR;
   1994         FixedPrecision precision;
   1995         precision.fSignificant.setMax(4);
   1996         precision.fExactOnly = TRUE;
   1997         precision.initVisibleDigits(6245.3, digits, status);
   1998         if (status != U_FORMAT_INEXACT_ERROR) {
   1999             errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
   2000         }
   2001     }
   2002     {
   2003         UErrorCode status = U_ZERO_ERROR;
   2004         FixedPrecision precision;
   2005         precision.fMax.setIntDigitCount(3);
   2006         precision.fMin.setFracDigitCount(2);
   2007         verifyVisibleDigits(
   2008                 "384.90",
   2009                 FALSE,
   2010                 precision.initVisibleDigits(2384.9, digits, status));
   2011         assertSuccess("380.00", status);
   2012     }
   2013     {
   2014         UErrorCode status = U_ZERO_ERROR;
   2015         FixedPrecision precision;
   2016         precision.fMax.setIntDigitCount(3);
   2017         precision.fMin.setFracDigitCount(2);
   2018         precision.fFailIfOverMax = TRUE;
   2019         precision.initVisibleDigits(2384.9, digits, status);
   2020         if (status != U_ILLEGAL_ARGUMENT_ERROR) {
   2021             errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
   2022         }
   2023     }
   2024 }
   2025 
   2026 void NumberFormat2Test::TestDoubleInitVisibleDigitsToDigitList() {
   2027     VisibleDigits digits;
   2028     {
   2029         UErrorCode status = U_ZERO_ERROR;
   2030         FixedPrecision precision;
   2031         // 2.01 produces round off error when multiplied by powers of
   2032         // 10 forcing the use of DigitList.
   2033         verifyVisibleDigits(
   2034                 "2.01",
   2035                 TRUE,
   2036                 precision.initVisibleDigits(-2.01, digits, status));
   2037         assertSuccess("-2.01", status);
   2038     }
   2039     {
   2040         UErrorCode status = U_ZERO_ERROR;
   2041         FixedPrecision precision;
   2042         precision.fSignificant.setMax(3);
   2043         precision.fMin.setFracDigitCount(2);
   2044         verifyVisibleDigits(
   2045                 "2380.00",
   2046                 FALSE,
   2047                 precision.initVisibleDigits(2385.0, digits, status));
   2048         assertSuccess("2380.00", status);
   2049     }
   2050     {
   2051         UErrorCode status = U_ZERO_ERROR;
   2052         FixedPrecision precision;
   2053         precision.fMax.setFracDigitCount(2);
   2054         verifyVisibleDigits(
   2055                 "45.83",
   2056                 TRUE,
   2057                 precision.initVisibleDigits(-45.8251, digits, status));
   2058         assertSuccess("45.83", status);
   2059     }
   2060 }
   2061 
   2062 void NumberFormat2Test::TestDigitListInitVisibleDigits() {
   2063     VisibleDigits digits;
   2064     DigitList dlist;
   2065     {
   2066         UErrorCode status = U_ZERO_ERROR;
   2067         FixedPrecision precision;
   2068         precision.fMax.setIntDigitCount(3);
   2069         precision.fMin.setFracDigitCount(2);
   2070         precision.fFailIfOverMax = TRUE;
   2071         dlist.set(2384.9);
   2072         precision.initVisibleDigits(dlist, digits, status);
   2073         if (status != U_ILLEGAL_ARGUMENT_ERROR) {
   2074             errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
   2075         }
   2076     }
   2077     {
   2078         UErrorCode status = U_ZERO_ERROR;
   2079         FixedPrecision precision;
   2080         precision.fSignificant.setMax(4);
   2081         precision.fExactOnly = TRUE;
   2082         dlist.set(6245.3);
   2083         precision.initVisibleDigits(dlist, digits, status);
   2084         if (status != U_FORMAT_INEXACT_ERROR) {
   2085             errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
   2086         }
   2087     }
   2088 }
   2089 
   2090 void NumberFormat2Test::TestSpecialInitVisibleDigits() {
   2091     VisibleDigits digits;
   2092     {
   2093         UErrorCode status = U_ZERO_ERROR;
   2094         FixedPrecision precision;
   2095         precision.fSignificant.setMax(3);
   2096         precision.fMin.setFracDigitCount(2);
   2097         precision.initVisibleDigits(-uprv_getInfinity(), digits, status);
   2098         assertFalse("", digits.isNaN());
   2099         assertTrue("", digits.isInfinite());
   2100         assertTrue("", digits.isNegative());
   2101         assertSuccess("-Inf", status);
   2102     }
   2103     {
   2104         UErrorCode status = U_ZERO_ERROR;
   2105         FixedPrecision precision;
   2106         precision.initVisibleDigits(uprv_getInfinity(), digits, status);
   2107         assertFalse("", digits.isNaN());
   2108         assertTrue("", digits.isInfinite());
   2109         assertFalse("", digits.isNegative());
   2110         assertSuccess("Inf", status);
   2111     }
   2112     {
   2113         UErrorCode status = U_ZERO_ERROR;
   2114         FixedPrecision precision;
   2115         precision.initVisibleDigits(uprv_getNaN(), digits, status);
   2116         assertTrue("", digits.isNaN());
   2117         assertSuccess("Inf", status);
   2118     }
   2119 }
   2120 
   2121 void NumberFormat2Test::TestVisibleDigitsWithExponent() {
   2122     VisibleDigitsWithExponent digits;
   2123     {
   2124         UErrorCode status = U_ZERO_ERROR;
   2125         ScientificPrecision precision;
   2126         precision.initVisibleDigitsWithExponent(389.256, digits, status);
   2127         verifyVisibleDigitsWithExponent(
   2128                 "3.89256E2", FALSE, digits);
   2129         assertSuccess("3.89256E2", status);
   2130     }
   2131     {
   2132         UErrorCode status = U_ZERO_ERROR;
   2133         ScientificPrecision precision;
   2134         precision.initVisibleDigitsWithExponent(-389.256, digits, status);
   2135         verifyVisibleDigitsWithExponent(
   2136                 "3.89256E2", TRUE, digits);
   2137         assertSuccess("-3.89256E2", status);
   2138     }
   2139     {
   2140         UErrorCode status = U_ZERO_ERROR;
   2141         ScientificPrecision precision;
   2142         precision.fMinExponentDigits = 3;
   2143         precision.fMantissa.fMin.setIntDigitCount(1);
   2144         precision.fMantissa.fMax.setIntDigitCount(3);
   2145         precision.initVisibleDigitsWithExponent(12345.67, digits, status);
   2146         verifyVisibleDigitsWithExponent(
   2147                 "12.34567E003", FALSE, digits);
   2148         assertSuccess("12.34567E003", status);
   2149     }
   2150     {
   2151         UErrorCode status = U_ZERO_ERROR;
   2152         ScientificPrecision precision;
   2153         precision.fMantissa.fRoundingIncrement.set(0.073);
   2154         precision.fMantissa.fMin.setIntDigitCount(2);
   2155         precision.fMantissa.fMax.setIntDigitCount(2);
   2156         precision.initVisibleDigitsWithExponent(999.74, digits, status);
   2157         verifyVisibleDigitsWithExponent(
   2158                 "10.001E2", FALSE, digits);
   2159         assertSuccess("10.001E2", status);
   2160     }
   2161 }
   2162 
   2163 void NumberFormat2Test::TestDigitAffixesAndPadding() {
   2164     UErrorCode status = U_ZERO_ERROR;
   2165     DecimalFormatSymbols symbols("en", status);
   2166     if (!assertSuccess("", status)) {
   2167         return;
   2168     }
   2169     DigitFormatter formatter(symbols);
   2170     DigitGrouping grouping;
   2171     grouping.fGrouping = 3;
   2172     FixedPrecision precision;
   2173     DigitFormatterOptions options;
   2174     options.fAlwaysShowDecimal = TRUE;
   2175     ValueFormatter vf;
   2176     vf.prepareFixedDecimalFormatting(
   2177             formatter,
   2178             grouping,
   2179             precision,
   2180             options);
   2181     DigitAffixesAndPadding aap;
   2182     aap.fPositivePrefix.append("(+", UNUM_SIGN_FIELD);
   2183     aap.fPositiveSuffix.append("+)", UNUM_SIGN_FIELD);
   2184     aap.fNegativePrefix.append("(-", UNUM_SIGN_FIELD);
   2185     aap.fNegativeSuffix.append("-)", UNUM_SIGN_FIELD);
   2186     aap.fWidth = 10;
   2187     aap.fPadPosition = DigitAffixesAndPadding::kPadBeforePrefix;
   2188     {
   2189         NumberFormat2Test_Attributes expectedAttributes[] = {
   2190             {UNUM_SIGN_FIELD, 4, 6},
   2191             {UNUM_INTEGER_FIELD, 6, 7},
   2192             {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
   2193             {UNUM_SIGN_FIELD, 8, 10},
   2194             {0, -1, 0}};
   2195         verifyAffixesAndPaddingInt32(
   2196                 "****(+3.+)",
   2197                 aap,
   2198                 3,
   2199                 vf,
   2200                 NULL,
   2201                 expectedAttributes);
   2202     }
   2203     aap.fPadPosition = DigitAffixesAndPadding::kPadAfterPrefix;
   2204     {
   2205         NumberFormat2Test_Attributes expectedAttributes[] = {
   2206             {UNUM_SIGN_FIELD, 0, 2},
   2207             {UNUM_INTEGER_FIELD, 6, 7},
   2208             {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
   2209             {UNUM_SIGN_FIELD, 8, 10},
   2210             {0, -1, 0}};
   2211         verifyAffixesAndPaddingInt32(
   2212                 "(+****3.+)",
   2213                 aap,
   2214                 3,
   2215                 vf,
   2216                 NULL,
   2217                 expectedAttributes);
   2218     }
   2219     aap.fPadPosition = DigitAffixesAndPadding::kPadBeforeSuffix;
   2220     {
   2221         NumberFormat2Test_Attributes expectedAttributes[] = {
   2222             {UNUM_SIGN_FIELD, 0, 2},
   2223             {UNUM_INTEGER_FIELD, 2, 3},
   2224             {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
   2225             {UNUM_SIGN_FIELD, 8, 10},
   2226             {0, -1, 0}};
   2227         verifyAffixesAndPaddingInt32(
   2228                 "(+3.****+)",
   2229                 aap,
   2230                 3,
   2231                 vf,
   2232                 NULL,
   2233                 expectedAttributes);
   2234     }
   2235     aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix;
   2236     {
   2237         NumberFormat2Test_Attributes expectedAttributes[] = {
   2238             {UNUM_SIGN_FIELD, 0, 2},
   2239             {UNUM_INTEGER_FIELD, 2, 3},
   2240             {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
   2241             {UNUM_SIGN_FIELD, 4, 6},
   2242             {0, -1, 0}};
   2243         verifyAffixesAndPaddingInt32(
   2244                 "(+3.+)****",
   2245                 aap,
   2246                 3,
   2247                 vf,
   2248                 NULL,
   2249                 expectedAttributes);
   2250     }
   2251     aap.fPadPosition = DigitAffixesAndPadding::kPadAfterSuffix;
   2252     {
   2253         DigitList digits;
   2254         digits.set(-1234.5);
   2255         NumberFormat2Test_Attributes expectedAttributes[] = {
   2256             {UNUM_SIGN_FIELD, 0, 2},
   2257             {UNUM_GROUPING_SEPARATOR_FIELD, 3, 4},
   2258             {UNUM_INTEGER_FIELD, 2, 7},
   2259             {UNUM_DECIMAL_SEPARATOR_FIELD, 7, 8},
   2260             {UNUM_FRACTION_FIELD, 8, 9},
   2261             {UNUM_SIGN_FIELD, 9, 11},
   2262             {0, -1, 0}};
   2263         verifyAffixesAndPadding(
   2264                 "(-1,234.5-)",
   2265                 aap,
   2266                 digits,
   2267                 vf,
   2268                 NULL,
   2269                 expectedAttributes);
   2270     }
   2271     assertFalse("", aap.needsPluralRules());
   2272 
   2273     aap.fWidth = 0;
   2274     aap.fPositivePrefix.remove();
   2275     aap.fPositiveSuffix.remove();
   2276     aap.fNegativePrefix.remove();
   2277     aap.fNegativeSuffix.remove();
   2278 
   2279     // Set up for plural currencies.
   2280     aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
   2281     {
   2282         PluralAffix part;
   2283         part.setVariant("one", " Dollar", status);
   2284         part.setVariant("other", " Dollars", status);
   2285         aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status);
   2286     }
   2287     aap.fNegativeSuffix = aap.fPositiveSuffix;
   2288 
   2289     LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
   2290     if (!assertSuccess("", status)) {
   2291         return;
   2292     }
   2293 
   2294     // Exercise the fastrack path
   2295     {
   2296         options.fAlwaysShowDecimal = FALSE;
   2297         NumberFormat2Test_Attributes expectedAttributes[] = {
   2298             {UNUM_SIGN_FIELD, 0, 1},
   2299             {UNUM_INTEGER_FIELD, 1, 3},
   2300             {UNUM_CURRENCY_FIELD, 3, 11},
   2301             {0, -1, 0}};
   2302         verifyAffixesAndPaddingInt32(
   2303                 "-45 Dollars",
   2304                 aap,
   2305                 -45,
   2306                 vf,
   2307                 NULL,
   2308                 expectedAttributes);
   2309         options.fAlwaysShowDecimal = TRUE;
   2310     }
   2311 
   2312     // Now test plurals
   2313     assertTrue("", aap.needsPluralRules());
   2314     {
   2315         NumberFormat2Test_Attributes expectedAttributes[] = {
   2316             {UNUM_INTEGER_FIELD, 0, 1},
   2317             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2318             {UNUM_CURRENCY_FIELD, 2, 9},
   2319             {0, -1, 0}};
   2320         verifyAffixesAndPaddingInt32(
   2321                 "1. Dollar",
   2322                 aap,
   2323                 1,
   2324                 vf,
   2325                 rules.getAlias(),
   2326                 expectedAttributes);
   2327     }
   2328     {
   2329         NumberFormat2Test_Attributes expectedAttributes[] = {
   2330             {UNUM_SIGN_FIELD, 0, 1},
   2331             {UNUM_INTEGER_FIELD, 1, 2},
   2332             {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
   2333             {UNUM_CURRENCY_FIELD, 3, 10},
   2334             {0, -1, 0}};
   2335         verifyAffixesAndPaddingInt32(
   2336                 "-1. Dollar",
   2337                 aap,
   2338                 -1,
   2339                 vf,
   2340                 rules.getAlias(),
   2341                 expectedAttributes);
   2342     }
   2343     precision.fMin.setFracDigitCount(2);
   2344     {
   2345         NumberFormat2Test_Attributes expectedAttributes[] = {
   2346             {UNUM_INTEGER_FIELD, 0, 1},
   2347             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2348             {UNUM_FRACTION_FIELD, 2, 4},
   2349             {UNUM_CURRENCY_FIELD, 4, 12},
   2350             {0, -1, 0}};
   2351         verifyAffixesAndPaddingInt32(
   2352                 "1.00 Dollars",
   2353                 aap,
   2354                 1,
   2355                 vf,
   2356                 rules.getAlias(),
   2357                 expectedAttributes);
   2358     }
   2359 }
   2360 
   2361 void NumberFormat2Test::TestPluralsAndRounding() {
   2362     UErrorCode status = U_ZERO_ERROR;
   2363     DecimalFormatSymbols symbols("en", status);
   2364     if (!assertSuccess("", status)) {
   2365         return;
   2366     }
   2367     DigitFormatter formatter(symbols);
   2368     DigitGrouping grouping;
   2369     FixedPrecision precision;
   2370     precision.fSignificant.setMax(3);
   2371     DigitFormatterOptions options;
   2372     ValueFormatter vf;
   2373     vf.prepareFixedDecimalFormatting(
   2374             formatter,
   2375             grouping,
   2376             precision,
   2377             options);
   2378     DigitList digits;
   2379     DigitAffixesAndPadding aap;
   2380     // Set up for plural currencies.
   2381     aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
   2382     {
   2383         PluralAffix part;
   2384         part.setVariant("one", " Dollar", status);
   2385         part.setVariant("other", " Dollars", status);
   2386         aap.fPositiveSuffix.append(part, UNUM_CURRENCY_FIELD, status);
   2387     }
   2388     aap.fNegativeSuffix = aap.fPositiveSuffix;
   2389     aap.fWidth = 14;
   2390     LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
   2391     if (!assertSuccess("", status)) {
   2392         return;
   2393     }
   2394     {
   2395         digits.set(0.999);
   2396         verifyAffixesAndPadding(
   2397                 "*0.999 Dollars",
   2398                 aap,
   2399                 digits,
   2400                 vf,
   2401                 rules.getAlias(),
   2402                 NULL);
   2403     }
   2404     {
   2405         digits.set(0.9996);
   2406         verifyAffixesAndPadding(
   2407                 "******1 Dollar",
   2408                 aap,
   2409                 digits,
   2410                 vf,
   2411                 rules.getAlias(),
   2412                 NULL);
   2413     }
   2414     {
   2415         digits.set(1.004);
   2416         verifyAffixesAndPadding(
   2417                 "******1 Dollar",
   2418                 aap,
   2419                 digits,
   2420                 vf,
   2421                 rules.getAlias(),
   2422                 NULL);
   2423     }
   2424     precision.fSignificant.setMin(2);
   2425     {
   2426         digits.set(0.9996);
   2427         verifyAffixesAndPadding(
   2428                 "***1.0 Dollars",
   2429                 aap,
   2430                 digits,
   2431                 vf,
   2432                 rules.getAlias(),
   2433                 NULL);
   2434     }
   2435     {
   2436         digits.set(1.004);
   2437         verifyAffixesAndPadding(
   2438                 "***1.0 Dollars",
   2439                 aap,
   2440                 digits,
   2441                 vf,
   2442                 rules.getAlias(),
   2443                 NULL);
   2444     }
   2445     precision.fSignificant.setMin(0);
   2446     {
   2447         digits.set(-79.214);
   2448         verifyAffixesAndPadding(
   2449                 "*-79.2 Dollars",
   2450                 aap,
   2451                 digits,
   2452                 vf,
   2453                 rules.getAlias(),
   2454                 NULL);
   2455     }
   2456     // No more sig digits just max fractions
   2457     precision.fSignificant.setMax(0);
   2458     precision.fMax.setFracDigitCount(4);
   2459     {
   2460         digits.set(79.213562);
   2461         verifyAffixesAndPadding(
   2462                 "79.2136 Dollars",
   2463                 aap,
   2464                 digits,
   2465                 vf,
   2466                 rules.getAlias(),
   2467                 NULL);
   2468     }
   2469 
   2470 }
   2471 
   2472 
   2473 void NumberFormat2Test::TestPluralsAndRoundingScientific() {
   2474     UErrorCode status = U_ZERO_ERROR;
   2475     DecimalFormatSymbols symbols("en", status);
   2476     if (!assertSuccess("", status)) {
   2477         return;
   2478     }
   2479     DigitFormatter formatter(symbols);
   2480     ScientificPrecision precision;
   2481     precision.fMantissa.fSignificant.setMax(4);
   2482     SciFormatterOptions options;
   2483     ValueFormatter vf;
   2484     vf.prepareScientificFormatting(
   2485             formatter,
   2486             precision,
   2487             options);
   2488     DigitList digits;
   2489     DigitAffixesAndPadding aap;
   2490     aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
   2491     {
   2492         PluralAffix part;
   2493         part.setVariant("one", " Meter", status);
   2494         part.setVariant("other", " Meters", status);
   2495         aap.fPositiveSuffix.append(part, UNUM_FIELD_COUNT, status);
   2496     }
   2497     aap.fNegativeSuffix = aap.fPositiveSuffix;
   2498     LocalPointer<PluralRules> rules(PluralRules::forLocale("en", status));
   2499     if (!assertSuccess("", status)) {
   2500         return;
   2501     }
   2502     {
   2503         digits.set(0.99996);
   2504         NumberFormat2Test_Attributes expectedAttributes[] = {
   2505             {UNUM_INTEGER_FIELD, 0, 1},
   2506             {UNUM_EXPONENT_SYMBOL_FIELD, 1, 2},
   2507             {UNUM_EXPONENT_FIELD, 2, 3},
   2508             {0, -1, 0}};
   2509         verifyAffixesAndPadding(
   2510                 "1E0 Meters",
   2511                 aap,
   2512                 digits,
   2513                 vf,
   2514                 rules.getAlias(),
   2515                 expectedAttributes);
   2516     }
   2517     options.fMantissa.fAlwaysShowDecimal = TRUE;
   2518     {
   2519         digits.set(0.99996);
   2520         NumberFormat2Test_Attributes expectedAttributes[] = {
   2521             {UNUM_INTEGER_FIELD, 0, 1},
   2522             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2523             {UNUM_EXPONENT_SYMBOL_FIELD, 2, 3},
   2524             {UNUM_EXPONENT_FIELD, 3, 4},
   2525             {0, -1, 0}};
   2526         verifyAffixesAndPadding(
   2527                 "1.E0 Meters",
   2528                 aap,
   2529                 digits,
   2530                 vf,
   2531                 rules.getAlias(),
   2532                 expectedAttributes);
   2533     }
   2534     {
   2535         digits.set(-299792458);
   2536         NumberFormat2Test_Attributes expectedAttributes[] = {
   2537             {UNUM_SIGN_FIELD, 0, 1},
   2538             {UNUM_INTEGER_FIELD, 1, 2},
   2539             {UNUM_DECIMAL_SEPARATOR_FIELD, 2, 3},
   2540             {UNUM_FRACTION_FIELD, 3, 6},
   2541             {UNUM_EXPONENT_SYMBOL_FIELD, 6, 7},
   2542             {UNUM_EXPONENT_FIELD, 7, 8},
   2543             {0, -1, 0}};
   2544         verifyAffixesAndPadding(
   2545                 "-2.998E8 Meters",
   2546                 aap,
   2547                 digits,
   2548                 vf,
   2549                 rules.getAlias(),
   2550                 expectedAttributes);
   2551     }
   2552     precision.fMantissa.fSignificant.setMin(4);
   2553     options.fExponent.fAlwaysShowSign = TRUE;
   2554     precision.fMinExponentDigits = 3;
   2555     {
   2556         digits.set(3);
   2557         NumberFormat2Test_Attributes expectedAttributes[] = {
   2558             {UNUM_INTEGER_FIELD, 0, 1},
   2559             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2560             {UNUM_FRACTION_FIELD, 2, 5},
   2561             {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
   2562             {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
   2563             {UNUM_EXPONENT_FIELD, 7, 10},
   2564             {0, -1, 0}};
   2565         verifyAffixesAndPadding(
   2566                 "3.000E+000 Meters",
   2567                 aap,
   2568                 digits,
   2569                 vf,
   2570                 rules.getAlias(),
   2571                 expectedAttributes);
   2572     }
   2573     precision.fMantissa.fMax.setIntDigitCount(3);
   2574     {
   2575         digits.set(0.00025001);
   2576         NumberFormat2Test_Attributes expectedAttributes[] = {
   2577             {UNUM_INTEGER_FIELD, 0, 3},
   2578             {UNUM_DECIMAL_SEPARATOR_FIELD, 3, 4},
   2579             {UNUM_FRACTION_FIELD, 4, 5},
   2580             {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
   2581             {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
   2582             {UNUM_EXPONENT_FIELD, 7, 10},
   2583             {0, -1, 0}};
   2584         verifyAffixesAndPadding(
   2585                 "250.0E-006 Meters",
   2586                 aap,
   2587                 digits,
   2588                 vf,
   2589                 rules.getAlias(),
   2590                 expectedAttributes);
   2591     }
   2592     {
   2593         digits.set(0.0000025001);
   2594         NumberFormat2Test_Attributes expectedAttributes[] = {
   2595             {UNUM_INTEGER_FIELD, 0, 1},
   2596             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2597             {UNUM_FRACTION_FIELD, 2, 5},
   2598             {UNUM_EXPONENT_SYMBOL_FIELD, 5, 6},
   2599             {UNUM_EXPONENT_SIGN_FIELD, 6, 7},
   2600             {UNUM_EXPONENT_FIELD, 7, 10},
   2601             {0, -1, 0}};
   2602         verifyAffixesAndPadding(
   2603                 "2.500E-006 Meters",
   2604                 aap,
   2605                 digits,
   2606                 vf,
   2607                 rules.getAlias(),
   2608                 expectedAttributes);
   2609     }
   2610     precision.fMantissa.fMax.setFracDigitCount(1);
   2611     {
   2612         digits.set(0.0000025499);
   2613         NumberFormat2Test_Attributes expectedAttributes[] = {
   2614             {UNUM_INTEGER_FIELD, 0, 1},
   2615             {UNUM_DECIMAL_SEPARATOR_FIELD, 1, 2},
   2616             {UNUM_FRACTION_FIELD, 2, 3},
   2617             {UNUM_EXPONENT_SYMBOL_FIELD, 3, 4},
   2618             {UNUM_EXPONENT_SIGN_FIELD, 4, 5},
   2619             {UNUM_EXPONENT_FIELD, 5, 8},
   2620             {0, -1, 0}};
   2621         verifyAffixesAndPadding(
   2622                 "2.5E-006 Meters",
   2623                 aap,
   2624                 digits,
   2625                 vf,
   2626                 rules.getAlias(),
   2627                 expectedAttributes);
   2628     }
   2629     precision.fMantissa.fMax.setIntDigitCount(1);
   2630     precision.fMantissa.fMax.setFracDigitCount(2);
   2631     {
   2632         digits.set(299792458);
   2633         verifyAffixesAndPadding(
   2634                 "3.00E+008 Meters",
   2635                 aap,
   2636                 digits,
   2637                 vf,
   2638                 rules.getAlias(),
   2639                 NULL);
   2640     }
   2641     // clear significant digits
   2642     precision.fMantissa.fSignificant.setMin(0);
   2643     precision.fMantissa.fSignificant.setMax(0);
   2644 
   2645     // set int and fraction digits
   2646     precision.fMantissa.fMin.setFracDigitCount(2);
   2647     precision.fMantissa.fMax.setFracDigitCount(4);
   2648     precision.fMantissa.fMin.setIntDigitCount(2);
   2649     precision.fMantissa.fMax.setIntDigitCount(3);
   2650     {
   2651         digits.set(-0.0000025300001);
   2652         verifyAffixesAndPadding(
   2653                 "-253.00E-008 Meters",
   2654                 aap,
   2655                 digits,
   2656                 vf,
   2657                 rules.getAlias(),
   2658                 NULL);
   2659     }
   2660     {
   2661         digits.set(-0.0000025300006);
   2662         verifyAffixesAndPadding(
   2663                 "-253.0001E-008 Meters",
   2664                 aap,
   2665                 digits,
   2666                 vf,
   2667                 rules.getAlias(),
   2668                 NULL);
   2669     }
   2670     {
   2671         digits.set(-0.000025300006);
   2672         verifyAffixesAndPadding(
   2673                 "-25.30E-006 Meters",
   2674                 aap,
   2675                 digits,
   2676                 vf,
   2677                 rules.getAlias(),
   2678                 NULL);
   2679     }
   2680 }
   2681 
   2682 
   2683 void NumberFormat2Test::TestRoundingIncrement() {
   2684     UErrorCode status = U_ZERO_ERROR;
   2685     DecimalFormatSymbols symbols("en", status);
   2686     if (U_FAILURE(status)) {
   2687         dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status));
   2688         return;
   2689     }
   2690     DigitFormatter formatter(symbols);
   2691     ScientificPrecision precision;
   2692     SciFormatterOptions options;
   2693     precision.fMantissa.fRoundingIncrement.set(0.25);
   2694     precision.fMantissa.fSignificant.setMax(4);
   2695     DigitGrouping grouping;
   2696     ValueFormatter vf;
   2697 
   2698     // fixed
   2699     vf.prepareFixedDecimalFormatting(
   2700             formatter,
   2701             grouping,
   2702             precision.fMantissa,
   2703             options.fMantissa);
   2704     DigitList digits;
   2705     DigitAffixesAndPadding aap;
   2706     aap.fNegativePrefix.append("-", UNUM_SIGN_FIELD);
   2707     {
   2708         digits.set(3.7);
   2709         verifyAffixesAndPadding(
   2710                 "3.75",
   2711                 aap,
   2712                 digits,
   2713                 vf,
   2714                 NULL, NULL);
   2715     }
   2716     {
   2717         digits.set(-7.4);
   2718         verifyAffixesAndPadding(
   2719                 "-7.5",
   2720                 aap,
   2721                 digits,
   2722                 vf,
   2723                 NULL, NULL);
   2724     }
   2725     {
   2726         digits.set(99.8);
   2727         verifyAffixesAndPadding(
   2728                 "99.75",
   2729                 aap,
   2730                 digits,
   2731                 vf,
   2732                 NULL, NULL);
   2733     }
   2734     precision.fMantissa.fMin.setFracDigitCount(2);
   2735     {
   2736         digits.set(99.1);
   2737         verifyAffixesAndPadding(
   2738                 "99.00",
   2739                 aap,
   2740                 digits,
   2741                 vf,
   2742                 NULL, NULL);
   2743     }
   2744     {
   2745         digits.set(-639.65);
   2746         verifyAffixesAndPadding(
   2747                 "-639.80",
   2748                 aap,
   2749                 digits,
   2750                 vf,
   2751                 NULL, NULL);
   2752     }
   2753 
   2754     precision.fMantissa.fMin.setIntDigitCount(2);
   2755     // Scientific notation
   2756     vf.prepareScientificFormatting(
   2757             formatter,
   2758             precision,
   2759             options);
   2760     {
   2761         digits.set(-6396.5);
   2762         verifyAffixesAndPadding(
   2763                 "-64.00E2",
   2764                 aap,
   2765                 digits,
   2766                 vf,
   2767                 NULL, NULL);
   2768     }
   2769     {
   2770         digits.set(-0.00092374);
   2771         verifyAffixesAndPadding(
   2772                 "-92.25E-5",
   2773                 aap,
   2774                 digits,
   2775                 vf,
   2776                 NULL, NULL);
   2777     }
   2778     precision.fMantissa.fMax.setIntDigitCount(3);
   2779     {
   2780         digits.set(-0.00092374);
   2781         verifyAffixesAndPadding(
   2782                 "-923.80E-6",
   2783                 aap,
   2784                 digits,
   2785                 vf,
   2786                 NULL, NULL);
   2787     }
   2788 }
   2789 
   2790 void NumberFormat2Test::TestToPatternScientific11648() {
   2791 /*
   2792     UErrorCode status = U_ZERO_ERROR;
   2793     Locale en("en");
   2794     DecimalFormat2 fmt(en, "0.00", status);
   2795     fmt.setScientificNotation(TRUE);
   2796     UnicodeString pattern;
   2797     // Fails, produces "0.00E"
   2798     assertEquals("", "0.00E0", fmt.toPattern(pattern));
   2799     DecimalFormat fmt2(pattern, status);
   2800     // Fails, bad pattern.
   2801     assertSuccess("", status);
   2802 */
   2803 }
   2804 
   2805 void NumberFormat2Test::verifyAffixesAndPadding(
   2806         const UnicodeString &expected,
   2807         const DigitAffixesAndPadding &aaf,
   2808         DigitList &digits,
   2809         const ValueFormatter &vf,
   2810         const PluralRules *optPluralRules,
   2811         const NumberFormat2Test_Attributes *expectedAttributes) {
   2812     UnicodeString appendTo;
   2813     NumberFormat2Test_FieldPositionHandler handler;
   2814     UErrorCode status = U_ZERO_ERROR;
   2815     assertEquals(
   2816             "",
   2817             expected,
   2818             aaf.format(
   2819                     digits,
   2820                     vf,
   2821                     handler,
   2822                     optPluralRules,
   2823                     appendTo,
   2824                     status));
   2825     if (!assertSuccess("", status)) {
   2826         return;
   2827     }
   2828     if (expectedAttributes != NULL) {
   2829         verifyAttributes(expectedAttributes, handler.attributes);
   2830     }
   2831 }
   2832 
   2833 void NumberFormat2Test::verifyAffixesAndPaddingInt32(
   2834         const UnicodeString &expected,
   2835         const DigitAffixesAndPadding &aaf,
   2836         int32_t value,
   2837         const ValueFormatter &vf,
   2838         const PluralRules *optPluralRules,
   2839         const NumberFormat2Test_Attributes *expectedAttributes) {
   2840     UnicodeString appendTo;
   2841     NumberFormat2Test_FieldPositionHandler handler;
   2842     UErrorCode status = U_ZERO_ERROR;
   2843     assertEquals(
   2844             "",
   2845             expected,
   2846             aaf.formatInt32(
   2847                     value,
   2848                     vf,
   2849                     handler,
   2850                     optPluralRules,
   2851                     appendTo,
   2852                     status));
   2853     if (!assertSuccess("", status)) {
   2854         return;
   2855     }
   2856     if (expectedAttributes != NULL) {
   2857         verifyAttributes(expectedAttributes, handler.attributes);
   2858     }
   2859     DigitList digits;
   2860     digits.set(value);
   2861     verifyAffixesAndPadding(
   2862             expected, aaf, digits, vf, optPluralRules, expectedAttributes);
   2863 }
   2864 
   2865 void NumberFormat2Test::verifyAffix(
   2866         const UnicodeString &expected,
   2867         const DigitAffix &affix,
   2868         const NumberFormat2Test_Attributes *expectedAttributes) {
   2869     UnicodeString appendTo;
   2870     NumberFormat2Test_FieldPositionHandler handler;
   2871     assertEquals(
   2872             "",
   2873             expected.unescape(),
   2874             affix.format(handler, appendTo));
   2875     if (expectedAttributes != NULL) {
   2876         verifyAttributes(expectedAttributes, handler.attributes);
   2877     }
   2878 }
   2879 
   2880 // Right now only works for positive values.
   2881 void NumberFormat2Test::verifyDigitList(
   2882         const UnicodeString &expected,
   2883         const DigitList &digits) {
   2884     DigitFormatter formatter;
   2885     DigitGrouping grouping;
   2886     VisibleDigits visibleDigits;
   2887     FixedPrecision precision;
   2888     precision.fMin.setIntDigitCount(0);
   2889     DigitFormatterOptions options;
   2890     UErrorCode status = U_ZERO_ERROR;
   2891     DigitList dlCopy(digits);
   2892     precision.initVisibleDigits(
   2893             dlCopy, visibleDigits, status);
   2894     if (!assertSuccess("", status)) {
   2895         return;
   2896     }
   2897     verifyDigitFormatter(
   2898             expected,
   2899             formatter,
   2900             visibleDigits,
   2901             grouping,
   2902             options,
   2903             NULL);
   2904 }
   2905 
   2906 void NumberFormat2Test::verifyVisibleDigits(
   2907         const UnicodeString &expected,
   2908         UBool bNegative,
   2909         const VisibleDigits &digits) {
   2910     DigitFormatter formatter;
   2911     DigitGrouping grouping;
   2912     DigitFormatterOptions options;
   2913     verifyDigitFormatter(
   2914             expected,
   2915             formatter,
   2916             digits,
   2917             grouping,
   2918             options,
   2919             NULL);
   2920     if (digits.isNegative() != bNegative) {
   2921         errln(expected + ": Wrong sign.");
   2922     }
   2923     if (digits.isNaN() || digits.isInfinite()) {
   2924         errln(expected + ": Require real value.");
   2925     }
   2926 }
   2927 
   2928 void NumberFormat2Test::verifyVisibleDigitsWithExponent(
   2929         const UnicodeString &expected,
   2930         UBool bNegative,
   2931         const VisibleDigitsWithExponent &digits) {
   2932     DigitFormatter formatter;
   2933     SciFormatterOptions options;
   2934     verifySciFormatter(
   2935             expected,
   2936             formatter,
   2937             digits,
   2938             options,
   2939             NULL);
   2940     if (digits.isNegative() != bNegative) {
   2941         errln(expected + ": Wrong sign.");
   2942     }
   2943     if (digits.isNaN() || digits.isInfinite()) {
   2944         errln(expected + ": Require real value.");
   2945     }
   2946 }
   2947 
   2948 void NumberFormat2Test::verifySciFormatter(
   2949         const UnicodeString &expected,
   2950         const DigitFormatter &formatter,
   2951         const VisibleDigitsWithExponent &digits,
   2952         const SciFormatterOptions &options,
   2953         const NumberFormat2Test_Attributes *expectedAttributes) {
   2954     assertEquals(
   2955             "",
   2956             expected.countChar32(),
   2957             formatter.countChar32(digits, options));
   2958     UnicodeString appendTo;
   2959     NumberFormat2Test_FieldPositionHandler handler;
   2960     assertEquals(
   2961             "",
   2962             expected,
   2963             formatter.format(
   2964                     digits,
   2965                     options,
   2966                     handler,
   2967                     appendTo));
   2968     if (expectedAttributes != NULL) {
   2969         verifyAttributes(expectedAttributes, handler.attributes);
   2970     }
   2971 }
   2972 
   2973 void NumberFormat2Test::verifyPositiveIntDigitFormatter(
   2974         const UnicodeString &expected,
   2975         const DigitFormatter &formatter,
   2976         int32_t value,
   2977         int32_t minDigits,
   2978         int32_t maxDigits,
   2979         const NumberFormat2Test_Attributes *expectedAttributes) {
   2980     IntDigitCountRange range(minDigits, maxDigits);
   2981     UnicodeString appendTo;
   2982     NumberFormat2Test_FieldPositionHandler handler;
   2983     assertEquals(
   2984             "",
   2985             expected,
   2986             formatter.formatPositiveInt32(
   2987                     value,
   2988                     range,
   2989                     handler,
   2990                     appendTo));
   2991     if (expectedAttributes != NULL) {
   2992         verifyAttributes(expectedAttributes, handler.attributes);
   2993     }
   2994 }
   2995 
   2996 void NumberFormat2Test::verifyDigitFormatter(
   2997         const UnicodeString &expected,
   2998         const DigitFormatter &formatter,
   2999         const VisibleDigits &digits,
   3000         const DigitGrouping &grouping,
   3001         const DigitFormatterOptions &options,
   3002         const NumberFormat2Test_Attributes *expectedAttributes) {
   3003     assertEquals(
   3004             "",
   3005             expected.countChar32(),
   3006             formatter.countChar32(digits, grouping, options));
   3007     UnicodeString appendTo;
   3008     NumberFormat2Test_FieldPositionHandler handler;
   3009     assertEquals(
   3010             "",
   3011             expected,
   3012             formatter.format(
   3013                     digits,
   3014                     grouping,
   3015                     options,
   3016                     handler,
   3017                     appendTo));
   3018     if (expectedAttributes != NULL) {
   3019         verifyAttributes(expectedAttributes, handler.attributes);
   3020     }
   3021 }
   3022 
   3023 void NumberFormat2Test::verifySmallIntFormatter(
   3024         const UnicodeString &expected,
   3025         int32_t positiveValue,
   3026         int32_t minDigits,
   3027         int32_t maxDigits) {
   3028     IntDigitCountRange range(minDigits, maxDigits);
   3029     if (!SmallIntFormatter::canFormat(positiveValue, range)) {
   3030         UnicodeString actual;
   3031         assertEquals("", expected, actual);
   3032         return;
   3033     }
   3034     UnicodeString actual;
   3035     assertEquals("", expected, SmallIntFormatter::format(positiveValue, range, actual));
   3036 }
   3037 
   3038 void NumberFormat2Test::verifyAttributes(
   3039         const NumberFormat2Test_Attributes *expected,
   3040         const NumberFormat2Test_Attributes *actual) {
   3041     int32_t idx = 0;
   3042     while (expected[idx].spos != -1 && actual[idx].spos != -1) {
   3043         assertEquals("id", expected[idx].id, actual[idx].id);
   3044         assertEquals("spos", expected[idx].spos, actual[idx].spos);
   3045         assertEquals("epos", expected[idx].epos, actual[idx].epos);
   3046         ++idx;
   3047     }
   3048     assertEquals(
   3049             "expected and actual not same length",
   3050             expected[idx].spos,
   3051             actual[idx].spos);
   3052 }
   3053 
   3054 void NumberFormat2Test::verifyIntValue(
   3055         int64_t expected, const VisibleDigits &digits) {
   3056     double unusedSource;
   3057     int64_t intValue;
   3058     int64_t unusedF;
   3059     int64_t unusedT;
   3060     int32_t unusedV;
   3061     UBool unusedHasIntValue;
   3062     digits.getFixedDecimal(
   3063             unusedSource, intValue, unusedF,
   3064             unusedT, unusedV, unusedHasIntValue);
   3065     assertEquals("", expected, intValue);
   3066 }
   3067 
   3068 void NumberFormat2Test::verifySource(
   3069         double expected, const VisibleDigits &digits) {
   3070     double source;
   3071     int64_t unusedIntValue;
   3072     int64_t unusedF;
   3073     int64_t unusedT;
   3074     int32_t unusedV;
   3075     UBool unusedHasIntValue;
   3076     digits.getFixedDecimal(
   3077             source, unusedIntValue, unusedF,
   3078             unusedT, unusedV, unusedHasIntValue);
   3079     if (expected != source) {
   3080         errln("Expected %f, got %f instead", expected, source);
   3081     }
   3082 }
   3083 
   3084 extern IntlTest *createNumberFormat2Test() {
   3085     return new NumberFormat2Test();
   3086 }
   3087 
   3088 #endif /* !UCONFIG_NO_FORMATTING */
   3089