164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (C) 1996-2016, International Business Machines Corporation and
68de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * others. All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itrbnf.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/umachine.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coleitr.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h"
248de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h"
25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "putilimp.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testutil.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import com.ibm.text.RuleBasedNumberFormat;
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import com.ibm.test.TestFmwk;
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import java.util.Locale;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import java.text.NumberFormat;
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// current macro not in icu1.8.1
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(id,test)             \
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case id:                          \
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = #test;                 \
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (exec) {                   \
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(#test "---");       \
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            logln();                  \
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            test();                   \
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }                             \
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/)
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite RuleBasedNumberFormat");
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(0, TestEnglishSpellout);
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(1, TestOrdinalAbbreviations);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(2, TestDurations);
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(3, TestSpanishSpellout);
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(4, TestFrenchSpellout);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(5, TestSwissFrenchSpellout);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(6, TestItalianSpellout);
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(7, TestGermanSpellout);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(8, TestThaiSpellout);
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(9, TestAPI);
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(10, TestFractionalRuleSet);
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(11, TestSwedishSpellout);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(12, TestBelgianFrenchSpellout);
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(13, TestSmallValues);
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(14, TestLocalizations);
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(15, TestAllLocales);
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(16, TestHebrewFraction);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(17, TestPortugueseSpellout);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(18, TestMultiplierSubstitution);
71103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TESTCASE(19, TestSetDecimalFormatSymbols);
72f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        TESTCASE(20, TestPluralRules);
731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        TESTCASE(21, TestMultiplePluralRules);
74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        TESTCASE(22, TestInfinityNaN);
75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        TESTCASE(23, TestVariableDecimalPoint);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TESTCASE(0, TestRBNFDisabled);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = "";
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestHebrewFraction() {
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // this is the expected output for 123.45, with no '<' in it.
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text1[] = {
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05de, 0x05d0, 0x05d4, 0x0020,
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05e2, 0x05e9, 0x05e8, 0x05d9, 0x05dd, 0x0020,
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05d5, 0x05e9, 0x05dc, 0x05d5, 0x05e9, 0x0020,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05e0, 0x05e7, 0x05d5, 0x05d3, 0x05d4, 0x0020,
95b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        0x05d0, 0x05e8, 0x05d1, 0x05e2, 0x0020,
96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        0x05d7, 0x05de, 0x05e9, 0x0000,
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text2[] = {
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05DE, 0x05D0, 0x05D4, 0x0020,
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05E2, 0x05E9, 0x05E8, 0x05D9, 0x05DD, 0x0020,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05D5, 0x05E9, 0x05DC, 0x05D5, 0x05E9, 0x0020,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05E0, 0x05E7, 0x05D5, 0x05D3, 0x05D4, 0x0020,
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05D0, 0x05E4, 0x05E1, 0x0020,
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x05D0, 0x05E4, 0x05E1, 0x0020,
105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        0x05D0, 0x05E8, 0x05D1, 0x05E2, 0x0020,
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        0x05D7, 0x05DE, 0x05E9, 0x0000,
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter = new RuleBasedNumberFormat(URBNF_SPELLOUT, "he_IL", status);
1106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_MISSING_RESOURCE_ERROR || status == U_FILE_ACCESS_ERROR) {
1116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failed in constructing RuleBasedNumberFormat - %s", u_errorName(status));
1126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete formatter;
1136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
1146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString result;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable parseResult;
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pp(0);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected(text1);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formatter->format(123.45, result);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != expected) {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"expected '" + TestUtility::hex(expected) + "'\nbut got: '" + TestUtility::hex(result) + "'");
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            formatter->parse(result, parseResult, pp);
125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            if (parseResult.getDouble() != 123.45) {
126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//                errln("expected 123.45 but got: %g", parseResult.getDouble());
127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            }
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected(text2);
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result.remove();
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formatter->format(123.0045, result);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (result != expected) {
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln((UnicodeString)"expected '" + TestUtility::hex(expected) + "'\nbut got: '" + TestUtility::hex(result) + "'");
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pp.setIndex(0);
138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            formatter->parse(result, parseResult, pp);
139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            if (parseResult.getDouble() != 123.0045) {
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//                errln("expected 123.0045 but got: %g", parseResult.getDouble());
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//            }
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestAPI() {
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // This test goes through the APIs that were not tested before.
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // These tests are too small to have separate test classes/functions
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  RuleBasedNumberFormat* formatter
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getUS(), status);
1556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  if (status == U_MISSING_RESOURCE_ERROR || status == U_FILE_ACCESS_ERROR) {
1566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    dataerrln("Unable to create formatter. - %s", u_errorName(status));
1576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    delete formatter;
1586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    return;
1596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  }
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("RBNF API test starting");
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test clone
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing Clone");
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* rbnfClone = (RuleBasedNumberFormat *)formatter->clone();
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(rbnfClone != NULL) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(!(*rbnfClone == *formatter)) {
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Clone should be semantically equivalent to the original!");
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete rbnfClone;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Cloning failed!");
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test assignment
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing assignment operator");
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat assignResult(URBNF_SPELLOUT, Locale("es", "ES", ""), status);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assignResult = *formatter;
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(assignResult == *formatter)) {
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Assignment result should be semantically equivalent to the original!");
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test rule constructor
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing rule constructor");
18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUResourceBundlePointer en(ures_open(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "rbnf", "en", &status));
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Unable to access resource bundle with data!");
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      int32_t ruleLen = 0;
194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      int32_t len = 0;
19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      LocalUResourceBundlePointer rbnfRules(ures_getByKey(en.getAlias(), "RBNFRules", NULL, &status));
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      LocalUResourceBundlePointer ruleSets(ures_getByKey(rbnfRules.getAlias(), "SpelloutRules", NULL, &status));
197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      UnicodeString desc;
19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      while (ures_hasNext(ruleSets.getAlias())) {
19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho           const UChar* currentString = ures_getNextString(ruleSets.getAlias(), &len, NULL, &status);
200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           ruleLen += len;
201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           desc.append(currentString);
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      }
203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      const UChar *spelloutRules = desc.getTerminatedBuffer();
205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(status) || ruleLen == 0 || spelloutRules == NULL) {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Unable to access the rules string!");
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UParseError perror;
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RuleBasedNumberFormat ruleCtorResult(spelloutRules, Locale::getUS(), perror, status);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(ruleCtorResult == *formatter)) {
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          errln("Formatter constructed from the original rules should be semantically equivalent to the original!");
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Jitterbug 4452, for coverage
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RuleBasedNumberFormat nf(spelloutRules, (UnicodeString)"", Locale::getUS(), perror, status);
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(nf == *formatter)) {
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          errln("Formatter constructed from the original rules should be semantically equivalent to the original!");
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test getRules
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getRules function");
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules = formatter->getRules();
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError perror;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat fromRulesResult(rules, Locale::getUS(), perror, status);
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(fromRulesResult == *formatter)) {
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Formatter constructed from rules obtained by getRules should be semantically equivalent to the original!");
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing copy constructor");
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat copyCtorResult(*formatter);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(copyCtorResult == *formatter)) {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Copy constructor result result should be semantically equivalent to the original!");
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test ruleset names
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing getNumberOfRuleSetNames, getRuleSetName and format using rule set names");
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t noOfRuleSetNames = formatter->getNumberOfRuleSetNames();
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(noOfRuleSetNames == 0) {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Number of rule set names should be more than zero");
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString ruleSetName;
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t intFormatNum = 34567;
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double doubleFormatNum = 893411.234;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("number of rule set names is %i", noOfRuleSetNames);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < noOfRuleSetNames; i++) {
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FieldPosition pos1, pos2;
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UnicodeString intFormatResult, doubleFormatResult;
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      Formattable intParseResult, doubleParseResult;
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ruleSetName = formatter->getRuleSetName(i);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log("Rule set name %i is ", i);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log(ruleSetName);
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(". Format results are: ");
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      intFormatResult = formatter->format(intFormatNum, ruleSetName, intFormatResult, pos1, status);
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doubleFormatResult = formatter->format(doubleFormatNum, ruleSetName, doubleFormatResult, pos2, status);
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(status)) {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Format using a rule set failed");
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(intFormatResult);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(doubleFormatResult);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->setLenient(TRUE);
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->parse(intFormatResult, intParseResult, status);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->parse(doubleFormatResult, doubleParseResult, status);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Parse results for lenient = TRUE, %i, %f", intParseResult.getLong(), doubleParseResult.getDouble());
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->setLenient(FALSE);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->parse(intFormatResult, intParseResult, status);
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      formatter->parse(doubleFormatResult, doubleParseResult, status);
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Parse results for lenient = FALSE, %i, %f", intParseResult.getLong(), doubleParseResult.getDouble());
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(status)) {
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error during parsing");
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      intFormatResult = formatter->format(intFormatNum, "BLABLA", intFormatResult, pos1, status);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_SUCCESS(status)) {
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Using invalid rule set name should have failed");
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_ZERO_ERROR;
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      doubleFormatResult = formatter->format(doubleFormatNum, "TRUC", doubleFormatResult, pos2, status);
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_SUCCESS(status)) {
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Using invalid rule set name should have failed");
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_ZERO_ERROR;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // test API
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString expected("four point five","");
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("Testing format(double)");
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString result;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  formatter->format(4.5,result);
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(result != expected) {
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Formatted 4.5, expected " + expected + " got " + result);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Formatted 4.5, expected " + expected + " got " + result);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  result.remove();
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  expected = "four";
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  formatter->format((int32_t)4,result);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(result != expected) {
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Formatted 4, expected " + expected + " got " + result);
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Formatted 4, expected " + expected + " got " + result);
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  result.remove();
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  FieldPosition pos;
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  formatter->format((int64_t)4, result, pos, status = U_ZERO_ERROR);
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(result != expected) {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Formatted 4 int64_t, expected " + expected + " got " + result);
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Formatted 4 int64_t, expected " + expected + " got " + result);
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //Jitterbug 4452, for coverage
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  result.remove();
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  FieldPosition pos2;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  formatter->format((int64_t)4, formatter->getRuleSetName(0), result, pos2, status = U_ZERO_ERROR);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(result != expected) {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Formatted 4 int64_t, expected " + expected + " got " + result);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Formatted 4 int64_t, expected " + expected + " got " + result);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // clean up
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("Cleaning up");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete formatter;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/**
3521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Perform a simple spot check on the parsing going into an infinite loop for alternate rules.
3531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */
3541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid IntlTestRBNF::TestMultiplePluralRules() {
3551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // This is trying to model the feminine form, but don't worry about the details too much.
3561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // We're trying to test the plural rules where there are different prefixes.
3571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UnicodeString rules("%spellout-cardinal-feminine-genitive:"
3581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "0: zero;"
3591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "1: ono;"
360c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "2: two;"
3611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "1000: << $(cardinal,one{thousand}few{thousanF}other{thousanO})$[ >>];"
3621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "%spellout-cardinal-feminine:"
363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "x.x: [<< $(cardinal,one{singleton}other{plurality})$ ]>%%fractions>;"
3641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "0: zero;"
3651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                "1: one;"
366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "2: two;"
367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "1000: << $(cardinal,one{thousand}few{thousanF}other{thousanO})$[ >>];"
368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "%%fractions:"
369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "10: <%spellout-cardinal-feminine< $(cardinal,one{oneth}other{tenth})$;"
370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                "100: <%spellout-cardinal-feminine< $(cardinal,one{1hundredth}other{hundredth})$;");
3711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UErrorCode status = U_ZERO_ERROR;
3721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UParseError pError;
3731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    RuleBasedNumberFormat formatter(rules, Locale("ru"), pError, status);
3741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Formattable result;
3751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    UnicodeString resultStr;
3761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    FieldPosition pos;
3771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
3781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (U_FAILURE(status)) {
3791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        dataerrln("Unable to create formatter - %s", u_errorName(status));
3801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return;
3811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
3821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
3831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    formatter.parse(formatter.format(1000.0, resultStr, pos, status), result, status);
3841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("one thousand")) {
3851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("RuleBasedNumberFormat did not return the correct value. Got: %d", result.getLong());
3861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln(resultStr);
3871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
3881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    resultStr.remove();
3891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    formatter.parse(formatter.format(1000.0, UnicodeString("%spellout-cardinal-feminine-genitive"), resultStr, pos, status), result, status);
3901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("ono thousand")) {
3911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("RuleBasedNumberFormat(cardinal-feminine-genitive) did not return the correct value. Got: %d", result.getLong());
3921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln(resultStr);
3931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
3941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    resultStr.remove();
3951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    formatter.parse(formatter.format(1000.0, UnicodeString("%spellout-cardinal-feminine"), resultStr, pos, status), result, status);
3961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("one thousand")) {
3971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln("RuleBasedNumberFormat(spellout-cardinal-feminine) did not return the correct value. Got: %d", result.getLong());
3981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        errln(resultStr);
3991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static const char* const testData[][2] = {
401c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "0", "zero" },
402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "1", "one" },
403c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "2", "two" },
404c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "0.1", "one oneth" },
405c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "0.2", "two tenth" },
406c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "1.1", "one singleton one oneth" },
407c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "1.2", "one singleton two tenth" },
408c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "2.1", "two plurality one oneth" },
409c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "2.2", "two plurality two tenth" },
410c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "0.01", "one 1hundredth" },
411c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { "0.02", "two hundredth" },
412c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        { NULL, NULL }
413c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
414c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    doTest(&formatter, testData, TRUE);
4151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
4161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestFractionalRuleSet()
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString fracRules(
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%main:\n"
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // this rule formats the number if it's 1 or more.  It formats
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // the integral part using a DecimalFormat ("#,##0" puts
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // thousands separators in the right places) and the fractional
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // part using %%frac.  If there is no fractional part, it
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // just shows the integral part.
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    x.0: <#,##0<[ >%%frac>];\n"
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // this rule formats the number if it's between 0 and 1.  It
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // shows only the fractional part (0.5 shows up as "1/2," not
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               // "0 1/2")
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    0.x: >%%frac>;\n"
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // the fraction rule set.  This works the same way as the one in the
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // preceding example: We multiply the fractional part of the number
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // being formatted by each rule's base value and use the rule that
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // produces the result closest to 0 (or the first rule that produces 0).
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Since we only provide rules for the numbers from 2 to 10, we know
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // we'll get a fraction with a denominator between 2 and 10.
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // "<0<" causes the numerator of the fraction to be formatted
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // using numerals
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%%frac:\n"
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    2: 1/2;\n"
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    3: <0</3;\n"
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    4: <0</4;\n"
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    5: <0</5;\n"
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    6: <0</6;\n"
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    7: <0</7;\n"
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    8: <0</8;\n"
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "    9: <0</9;\n"
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "   10: <0</10;\n");
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // mondo hack
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int len = fracRules.length();
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int change = 2;
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 0; i < len; ++i) {
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ch = fracRules.charAt(i);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ch == '\n') {
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            change = 2; // change ok
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (ch == ':') {
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            change = 1; // change, but once we hit a non-space char, don't change
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (ch == ' ') {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (change != 0) {
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fracRules.setCharAt(i, (UChar)0x200e);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (change == 1) {
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                change = 0;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError perror;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat formatter(fracRules, Locale::getEnglish(), perror, status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
4746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "0", "0" },
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".1", "1/10" },
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".11", "1/9" },
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".125", "1/8" },
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".1428", "1/7" },
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".1667", "1/6" },
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".2", "1/5" },
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".25", "1/4" },
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".333", "1/3" },
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".5", "1/2" },
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1.1", "1 1/10" },
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2.11", "2 1/9" },
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "3.125", "3 1/8" },
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "4.1428", "4 1/7" },
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "5.1667", "5 1/6" },
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "6.2", "6 1/5" },
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "7.25", "7 1/4" },
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "8.333", "8 1/3" },
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "9.5", "9 1/2" },
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".2222", "2/9" },
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".4444", "4/9" },
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { ".5555", "5/9" },
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1.2856", "1 2/7" },
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
502c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        doTest(&formatter, testData, FALSE); // exact values aren't parsable from fractions
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LLAssert(a) \
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (!(a)) errln("FAIL: " #a)
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLongConstructors()
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing constructors");
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // constant (shouldn't really be public)
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(llong::kD32).asDouble() == llong::kD32);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // internal constructor (shouldn't really be public)
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 1).asDouble() == 1);
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0).asDouble() == llong::kD32);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)-1, (uint32_t)-1).asDouble() == -1);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public empty constructor
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong().asDouble() == 0);
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public int32_t constructor
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)0).asInt() == (int32_t)0);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)1).asInt() == (int32_t)1);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).asInt() == (int32_t)-1);
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)0x7fffffff).asInt() == (int32_t)0x7fffffff);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)0xffffffff).asInt() == (int32_t)-1);
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)0x80000000).asInt() == (int32_t)0x80000000);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public int16_t constructor
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)0).asInt() == (int16_t)0);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)1).asInt() == (int16_t)1);
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)-1).asInt() == (int16_t)-1);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)0x7fff).asInt() == (int16_t)0x7fff);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)0xffff).asInt() == (int16_t)0xffff);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int16_t)0x8000).asInt() == (int16_t)0x8000);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public int8_t constructor
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)0).asInt() == (int8_t)0);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)1).asInt() == (int8_t)1);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)-1).asInt() == (int8_t)-1);
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)0x7f).asInt() == (int8_t)0x7f);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)0xff).asInt() == (int8_t)0xff);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int8_t)0x80).asInt() == (int8_t)0x80);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public uint16_t constructor
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)0).asUInt() == (uint16_t)0);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)1).asUInt() == (uint16_t)1);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)-1).asUInt() == (uint16_t)-1);
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)0x7fff).asUInt() == (uint16_t)0x7fff);
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)0xffff).asUInt() == (uint16_t)0xffff);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint16_t)0x8000).asUInt() == (uint16_t)0x8000);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public uint32_t constructor
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)0).asUInt() == (uint32_t)0);
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)1).asUInt() == (uint32_t)1);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)-1).asUInt() == (uint32_t)-1);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)0x7fffffff).asUInt() == (uint32_t)0x7fffffff);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)0xffffffff).asUInt() == (uint32_t)-1);
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)0x80000000).asUInt() == (uint32_t)0x80000000);
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // public double constructor
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((double)0).asDouble() == (double)0);
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((double)1).asDouble() == (double)1);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((double)0x7fffffff).asDouble() == (double)0x7fffffff);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((double)0x80000000).asDouble() == (double)0x80000000);
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((double)0x80000001).asDouble() == (double)0x80000001);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // can't access uprv_maxmantissa, so fake it
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double maxmantissa = (llong((int32_t)1) << 40).asDouble();
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(maxmantissa).asDouble() == maxmantissa);
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(-maxmantissa).asDouble() == -maxmantissa);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // copy constructor
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(llong(0, 1)).asDouble() == 1);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(llong(1, 0)).asDouble() == llong::kD32);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(llong(-1, (uint32_t)-1)).asDouble() == -1);
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // asInt - test unsigned to signed narrowing conversion
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((uint32_t)-1).asInt() == (int32_t)0x7fffffff);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(-1, 0).asInt() == (int32_t)0x80000000);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // asUInt - test signed to unsigned narrowing conversion
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).asUInt() == (uint32_t)-1);
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)0x80000000).asUInt() == (uint32_t)0x80000000);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // asDouble already tested
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLongSimpleOperators()
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing simple operators");
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator==
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() == llong(0, 0));
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1,0) == llong(1, 0));
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) == llong(0, 1));
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator!=
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1,0) != llong(1,1));
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) != llong(1,1));
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0xffffffff,0xffffffff) != llong(0x7fffffff, 0xffffffff));
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // unsigned >
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).ugt(llong(0x7fffffff, 0xffffffff)));
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // unsigned <
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x7fffffff, 0xffffffff).ult(llong((int32_t)-1)));
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // unsigned >=
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).uge(llong(0x7fffffff, 0xffffffff)));
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).uge(llong((int32_t)-1)));
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // unsigned <=
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x7fffffff, 0xffffffff).ule(llong((int32_t)-1)));
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong((int32_t)-1).ule(llong((int32_t)-1)));
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator>
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 1) > llong(1, 0));
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x80000000) > llong(0, 0x7fffffff));
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 1) > llong(0x80000000, 0));
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) > llong(0, 0x7fffffff));
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) > llong(0, 0xffffffff));
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0) > llong(0x80000000, 1));
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator<
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) < llong(1, 1));
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7fffffff) < llong(0, 0x80000000));
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0) < llong(0x80000000, 1));
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7fffffff) < llong(1, 0));
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0xffffffff) < llong(1, 0));
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 1) < llong(0, 0));
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator>=
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 1) >= llong(1, 0));
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x80000000) >= llong(0, 0x7fffffff));
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 1) >= llong(0x80000000, 0));
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) >= llong(0, 0x7fffffff));
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) >= llong(0, 0xffffffff));
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0) >= llong(0x80000000, 1));
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() >= llong(0, 0));
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1,0) >= llong(1, 0));
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) >= llong(0, 1));
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator<=
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) <= llong(1, 1));
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7fffffff) <= llong(0, 0x80000000));
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0) <= llong(0x80000000, 1));
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7fffffff) <= llong(1, 0));
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0xffffffff) <= llong(1, 0));
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 1) <= llong(0, 0));
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() <= llong(0, 0));
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1,0) <= llong(1, 0));
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) <= llong(0, 1));
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator==(int32)
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() == (int32_t)0);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) == (int32_t)1);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator!=(int32)
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1,0) != (int32_t)0);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) != (int32_t)2);
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,0xffffffff) != (int32_t)-1);
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    llong negOne(0xffffffff, 0xffffffff);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator>(int32)
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x80000000) > (int32_t)0x7fffffff);
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(negOne > (int32_t)-2);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) > (int32_t)0x7fffffff);
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0) > (int32_t)-1);
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator<(int32)
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7ffffffe) < (int32_t)0x7fffffff);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0xffffffff, 0xfffffffe) < (int32_t)-1);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator>=(int32)
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x80000000) >= (int32_t)0x7fffffff);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(negOne >= (int32_t)-2);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) >= (int32_t)0x7fffffff);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0) >= (int32_t)-1);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() >= (int32_t)0);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) >= (int32_t)1);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator<=(int32)
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0x7ffffffe) <= (int32_t)0x7fffffff);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0xffffffff, 0xfffffffe) <= (int32_t)-1);
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong() <= (int32_t)0);
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,1) <= (int32_t)1);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator=
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(2,3) = llong((uint32_t)-1)).asUInt() == (uint32_t)-1);
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator <<=
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= 0) ==  llong(1, 1));
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= 31) == llong(0x80000000, 0x80000000));
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= 32) == llong(1, 0));
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= 63) == llong(0x80000000, 0));
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= 64) == llong(1, 1)); // only lower 6 bits are used
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(1, 1) <<= -1) == llong(0x80000000, 0)); // only lower 6 bits are used
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator <<
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong((int32_t)1) << 5).asUInt() == 32);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator >>= (sign extended)
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x7fffa0a0, 0xbcbcdfdf) >>= 16) == llong(0x7fff,0xa0a0bcbc));
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x8000789a, 0xbcde0000) >>= 16) == llong(0xffff8000,0x789abcde));
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x80000000, 0) >>= 63) == llong(0xffffffff, 0xffffffff));
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x80000000, 0) >>= 47) == llong(0xffffffff, 0xffff0000));
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x80000000, 0x80000000) >> 64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x80000000, 0) >>= -1) == llong(0xffffffff, 0xffffffff)); // only lower 6 bits are used
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator >> sign extended)
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x8000789a, 0xbcde0000) >> 16) == llong(0xffff8000,0x789abcde));
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ushr (right shift without sign extension)
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x7fffa0a0, 0xbcbcdfdf).ushr(16) == llong(0x7fff,0xa0a0bcbc));
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x8000789a, 0xbcde0000).ushr(16) == llong(0x00008000,0x789abcde));
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0).ushr(63) == llong(0, 1));
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0).ushr(47) == llong(0, 0x10000));
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0x80000000).ushr(64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0).ushr(-1) == llong(0, 1)); // only lower 6 bits are used
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator&(llong)
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) & llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000));
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator|(llong)
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) | llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff));
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator^(llong)
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) ^ llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff));
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator&(uint32)
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) & (uint32_t)0xffffaaaa) == llong(0, 0x55550000));
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator|(uint32)
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) | (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff));
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator^(uint32)
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) ^ (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff));
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator~
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(~llong(0x55555555, 0x55555555) == llong(0xaaaaaaaa, 0xaaaaaaaa));
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator&=(llong)
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) &= llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000));
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator|=(llong)
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) |= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff));
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator^=(llong)
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) ^= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff));
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator&=(uint32)
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) &= (uint32_t)0xffffaaaa) == llong(0, 0x55550000));
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator|=(uint32)
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) |= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff));
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator^=(uint32)
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert((llong(0x55555555, 0x55555555) ^= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff));
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // prefix inc
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(1, 0) == ++llong(0,0xffffffff));
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // prefix dec
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0,0xffffffff) == --llong(1, 0));
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // postfix inc
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n(0, 0xffffffff);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(llong(0, 0xffffffff) == n++);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(llong(1, 0) == n);
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // postfix dec
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n(1, 0);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(llong(1, 0) == n--);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(llong(0, 0xffffffff) == n);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // unary minus
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0) == -llong(0, 0));
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0xffffffff, 0xffffffff) == -llong(0, 1));
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 1) == -llong(0xffffffff, 0xffffffff));
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x7fffffff, 0xffffffff) == -llong(0x80000000, 1));
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0x80000000, 0) == -llong(0x80000000, 0)); // !!! we don't handle overflow
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator-=
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n -= llong(0, 1)) == llong(0xffffffff, 0xffffffff));
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0xffffffff, 0xffffffff));
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n = llong(1, 0);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n -= llong(0, 1)) == llong(0, 0xffffffff));
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0, 0xffffffff));
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator-
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n - llong(0, 1)) == llong(0xffffffff, 0xffffffff));
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0, 0));
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n = llong(1, 0);
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n - llong(0, 1)) == llong(0, 0xffffffff));
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(1, 0));
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator+=
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n(0xffffffff, 0xffffffff);
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n += llong(0, 1)) == llong(0, 0));
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0, 0));
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n = llong(0, 0xffffffff);
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n += llong(0, 1)) == llong(1, 0));
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(1, 0));
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator+
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        llong n(0xffffffff, 0xffffffff);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n + llong(0, 1)) == llong(0, 0));
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0xffffffff, 0xffffffff));
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        n = llong(0, 0xffffffff);
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((n + llong(0, 1)) == llong(1, 0));
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n == llong(0, 0xffffffff));
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLong()
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Starting TestLLong");
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestLLongConstructors();
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestLLongSimpleOperators();
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing operator*=, operator*");
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator*=, operator*
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // small and large values, positive, &NEGative, zero
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // also test commutivity
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ZERO;
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ONE(0, 1);
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_ONE((int32_t)-1);
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong THREE(0, 3);
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_THREE((int32_t)-3);
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_16(0, 0x10000);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_16 = -TWO_TO_16;
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_32(1, 0);
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_32 = -TWO_TO_32;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NINE(0, 9);
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_NINE = -NINE;
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_16X3(0, 0x00030000);
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_16X3 = -TWO_TO_16X3;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_32X3(3, 0);
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_32X3 = -TWO_TO_32X3;
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_48(0x10000, 0);
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_48 = -TWO_TO_48;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const int32_t VALUE_WIDTH = 9;
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong* values[VALUE_WIDTH] = {
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &ONE, &NEG_ONE, &THREE, &NEG_THREE, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong* answers[VALUE_WIDTH*VALUE_WIDTH] = {
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO,
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &ONE,  &NEG_ONE, &THREE, &NEG_THREE,  &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32,
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &NEG_ONE, &ONE, &NEG_THREE, &THREE, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_32, &TWO_TO_32,
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &THREE, &NEG_THREE, &NINE, &NEG_NINE, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32X3, &NEG_TWO_TO_32X3,
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &NEG_THREE, &THREE, &NEG_NINE, &NINE, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32X3, &TWO_TO_32X3,
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_48, &NEG_TWO_TO_48,
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_48, &TWO_TO_48,
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_32X3, &NEG_TWO_TO_32X3, &TWO_TO_48, &NEG_TWO_TO_48, &ZERO, &ZERO,
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_32X3, &TWO_TO_32X3, &NEG_TWO_TO_48, &TWO_TO_48, &ZERO, &ZERO
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 0; i < VALUE_WIDTH; ++i) {
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int j = 0; j < VALUE_WIDTH; ++j) {
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                llong lhs = *values[i];
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                llong rhs = *values[j];
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                llong ans = *answers[i*VALUE_WIDTH + j];
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                llong n = lhs;
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LLAssert((n *= rhs) == ans);
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LLAssert(n == ans);
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                n = lhs;
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LLAssert((n * rhs) == ans);
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LLAssert(n == lhs);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing operator/=, operator/");
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // operator/=, operator/
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test num = 0, div = 0, pos/neg, > 2^32, div > num
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ZERO;
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ONE(0, 1);
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_ONE = -ONE;
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong MAX(0x7fffffff, 0xffffffff);
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong MIN(0x80000000, 0);
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO(0, 2);
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO = -TWO;
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong FIVE(0, 5);
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_FIVE = -FIVE;
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_32(1, 0);
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_32 = -TWO_TO_32;
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_32d5 = llong(TWO_TO_32.asDouble()/5.0);
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_32d5 = -TWO_TO_32d5;
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO_TO_32X5 = TWO_TO_32 * FIVE;
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO_TO_32X5 = -TWO_TO_32X5;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong* tuples[] = { // lhs, rhs, ans
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &ZERO, &ZERO,
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ONE, &ZERO,&MAX,
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_ONE, &ZERO, &MIN,
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ONE, &ONE, &ONE,
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ONE, &NEG_ONE, &NEG_ONE,
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_ONE, &ONE, &NEG_ONE,
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_ONE, &NEG_ONE, &ONE,
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FIVE, &TWO, &TWO,
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FIVE, &NEG_TWO, &NEG_TWO,
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FIVE, &TWO, &NEG_TWO,
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FIVE, &NEG_TWO, &TWO,
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO, &FIVE, &ZERO,
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO, &NEG_FIVE, &ZERO,
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO, &FIVE, &ZERO,
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO, &NEG_FIVE, &ZERO,
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32, &TWO_TO_32, &ONE,
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32, &NEG_TWO_TO_32, &NEG_ONE,
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32, &TWO_TO_32, &NEG_ONE,
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32, &NEG_TWO_TO_32, &ONE,
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32, &FIVE, &TWO_TO_32d5,
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32, &NEG_FIVE, &NEG_TWO_TO_32d5,
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32, &FIVE, &NEG_TWO_TO_32d5,
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32, &NEG_FIVE, &TWO_TO_32d5,
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32X5, &FIVE, &TWO_TO_32,
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32X5, &NEG_FIVE, &NEG_TWO_TO_32,
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32X5, &FIVE, &NEG_TWO_TO_32,
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32X5, &NEG_FIVE, &TWO_TO_32,
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32X5, &TWO_TO_32, &FIVE,
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO_TO_32X5, &NEG_TWO_TO_32, &NEG_FIVE,
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32X5, &NEG_TWO_TO_32, &FIVE,
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO_TO_32X5, &TWO_TO_32, &NEG_FIVE
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const int TUPLE_WIDTH = 3;
9658de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        const int TUPLE_COUNT = UPRV_LENGTHOF(tuples)/TUPLE_WIDTH;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 0; i < TUPLE_COUNT; ++i) {
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong lhs = *tuples[i*TUPLE_WIDTH+0];
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong rhs = *tuples[i*TUPLE_WIDTH+1];
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong ans = *tuples[i*TUPLE_WIDTH+2];
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            llong n = lhs;
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!((n /= rhs) == ans)) {
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("fail: (n /= rhs) == ans");
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert(n == ans);
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            n = lhs;
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert((n / rhs) == ans);
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert(n == lhs);
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing operator%%=, operator%%");
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //operator%=, operator%
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ZERO;
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong ONE(0, 1);
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong TWO(0, 2);
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong THREE(0,3);
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong FOUR(0, 4);
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong FIVE(0, 5);
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong SIX(0, 6);
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_ONE = -ONE;
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_TWO = -TWO;
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_THREE = -THREE;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_FOUR = -FOUR;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_FIVE = -FIVE;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NEG_SIX = -SIX;
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong NINETY_NINE(0, 99);
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong HUNDRED(0, 100);
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong HUNDRED_ONE(0, 101);
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong BIG(0x12345678, 0x9abcdef0);
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong BIG_FIVE(BIG * FIVE);
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong BIG_FIVEm1 = BIG_FIVE - ONE;
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong BIG_FIVEp1 = BIG_FIVE + ONE;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong* tuples[] = {
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &FIVE, &ZERO,
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ONE, &FIVE, &ONE,
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO, &FIVE, &TWO,
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &THREE, &FIVE, &THREE,
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FOUR, &FIVE, &FOUR,
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FIVE, &FIVE, &ZERO,
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &SIX, &FIVE, &ONE,
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ZERO, &NEG_FIVE, &ZERO,
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &ONE, &NEG_FIVE, &ONE,
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &TWO, &NEG_FIVE, &TWO,
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &THREE, &NEG_FIVE, &THREE,
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FOUR, &NEG_FIVE, &FOUR,
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &FIVE, &NEG_FIVE, &ZERO,
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &SIX, &NEG_FIVE, &ONE,
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_ONE, &FIVE, &NEG_ONE,
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO, &FIVE, &NEG_TWO,
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_THREE, &FIVE, &NEG_THREE,
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FOUR, &FIVE, &NEG_FOUR,
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FIVE, &FIVE, &ZERO,
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_SIX, &FIVE, &NEG_ONE,
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_ONE, &NEG_FIVE, &NEG_ONE,
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_TWO, &NEG_FIVE, &NEG_TWO,
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_THREE, &NEG_FIVE, &NEG_THREE,
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FOUR, &NEG_FIVE, &NEG_FOUR,
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_FIVE, &NEG_FIVE, &ZERO,
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NEG_SIX, &NEG_FIVE, &NEG_ONE,
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &NINETY_NINE, &FIVE, &FOUR,
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &HUNDRED, &FIVE, &ZERO,
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &HUNDRED_ONE, &FIVE, &ONE,
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &BIG_FIVEm1, &FIVE, &FOUR,
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &BIG_FIVE, &FIVE, &ZERO,
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &BIG_FIVEp1, &FIVE, &ONE
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const int TUPLE_WIDTH = 3;
10458de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        const int TUPLE_COUNT = UPRV_LENGTHOF(tuples)/TUPLE_WIDTH;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 0; i < TUPLE_COUNT; ++i) {
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong lhs = *tuples[i*TUPLE_WIDTH+0];
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong rhs = *tuples[i*TUPLE_WIDTH+1];
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const llong ans = *tuples[i*TUPLE_WIDTH+2];
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            llong n = lhs;
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!((n %= rhs) == ans)) {
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("fail: (n %= rhs) == ans");
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert(n == ans);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            n = lhs;
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert((n % rhs) == ans);
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LLAssert(n == lhs);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing pow");
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // pow
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0).pow(0) == llong(0, 0));
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 0).pow(2) == llong(0, 0));
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 2).pow(0) == llong(0, 1));
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 2).pow(2) == llong(0, 4));
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 2).pow(32) == llong(1, 0));
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong(0, 5).pow(10) == llong((double)5.0 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5));
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // absolute value
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const llong n(0xffffffff,0xffffffff);
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(n.abs() == llong(0, 1));
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef RBNF_DEBUG
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing atoll");
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // atoll
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char empty[] = "";
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char zero[] = "0";
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char neg_one[] = "-1";
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char neg_12345[] = "-12345";
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char big1[] = "123456789abcdef0";
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char big2[] = "fFfFfFfFfFfFfFfF";
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(empty) == llong(0, 0));
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(zero) == llong(0, 0));
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(neg_one) == llong(0xffffffff, 0xffffffff));
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(neg_12345) == -llong(0, 12345));
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(big1, 16) == llong(0x12345678, 0x9abcdef0));
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::atoll(big2, 16) == llong(0xffffffff, 0xffffffff));
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // u_atoll
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar uempty[] = { 0 };
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar uzero[] = { 0x30, 0 };
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar uneg_one[] = { 0x2d, 0x31, 0 };
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar uneg_12345[] = { 0x2d, 0x31, 0x32, 0x33, 0x34, 0x35, 0 };
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar ubig1[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0 };
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar ubig2[] = { 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0 };
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(uempty) == llong(0, 0));
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(uzero) == llong(0, 0));
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(uneg_one) == llong(0xffffffff, 0xffffffff));
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(uneg_12345) == -llong(0, 12345));
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(ubig1, 16) == llong(0x12345678, 0x9abcdef0));
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LLAssert(llong::utoll(ubig2, 16) == llong(0xffffffff, 0xffffffff));
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef RBNF_DEBUG
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing lltoa");
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // lltoa
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char buf[64]; // ascii
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0, 0).lltoa(buf, (uint32_t)sizeof(buf)) == 1) && (strcmp(buf, zero) == 0));
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0xffffffff, 0xffffffff).lltoa(buf, (uint32_t)sizeof(buf)) == 2) && (strcmp(buf, neg_one) == 0));
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(((-llong(0, 12345)).lltoa(buf, (uint32_t)sizeof(buf)) == 6) && (strcmp(buf, neg_12345) == 0));
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0x12345678, 0x9abcdef0).lltoa(buf, (uint32_t)sizeof(buf), 16) == 16) && (strcmp(buf, big1) == 0));
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing u_lltoa");
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // u_lltoa
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar buf[64];
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0, 0).lltou(buf, (uint32_t)sizeof(buf)) == 1) && (u_strcmp(buf, uzero) == 0));
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0xffffffff, 0xffffffff).lltou(buf, (uint32_t)sizeof(buf)) == 2) && (u_strcmp(buf, uneg_one) == 0));
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert(((-llong(0, 12345)).lltou(buf, (uint32_t)sizeof(buf)) == 6) && (u_strcmp(buf, uneg_12345) == 0));
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LLAssert((llong(0x12345678, 0x9abcdef0).lltou(buf, (uint32_t)sizeof(buf), 16) == 16) && (u_strcmp(buf, ubig1) == 0));
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* if 0 */
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestEnglishSpellout()
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getUS(), status);
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
11426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "one" },
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2", "two" },
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15", "fifteen" },
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "twenty" },
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "23", "twenty-three" },
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "73", "seventy-three" },
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "88", "eighty-eight" },
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "100", "one hundred" },
1153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "106", "one hundred six" },
1154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "127", "one hundred twenty-seven" },
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "200", "two hundred" },
1156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "579", "five hundred seventy-nine" },
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1,000", "one thousand" },
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2,000", "two thousand" },
1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "3,004", "three thousand four" },
1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "4,567", "four thousand five hundred sixty-seven" },
1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "15,943", "fifteen thousand nine hundred forty-three" },
1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,345,678", "two million three hundred forty-five thousand six hundred seventy-eight" },
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "-36", "minus thirty-six" },
1164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "234.567", "two hundred thirty-four point five six seven" },
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
11718de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        formatter->setLenient(TRUE);
11728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        static const char* lpTestData[][2] = {
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "fifty-7", "57" },
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { " fifty-7", "57" },
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "  fifty-7", "57" },
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2 thousand six    HUNDRED fifty-7", "2,657" },
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "fifteen hundred and zero", "1,500" },
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "FOurhundred     thiRTY six", "436" },
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
11808de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        };
11818de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        doLenientParseTest(formatter, lpTestData);
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestOrdinalAbbreviations()
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_ORDINAL, Locale::getUS(), status);
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
11956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "1", "1st" },
1199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "2", "2nd" },
1200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "3", "3rd" },
1201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "4", "4th" },
1202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "7", "7th" },
1203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "10", "10th" },
1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "11", "11th" },
1205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "13", "13th" },
1206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "20", "20th" },
1207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "21", "21st" },
1208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "22", "22nd" },
1209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "23", "23rd" },
1210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "24", "24th" },
1211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "33", "33rd" },
1212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "102", "102nd" },
1213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "312", "312th" },
1214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            { "12,345", "12,345th" },
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, FALSE);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestDurations()
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_DURATION, Locale::getUS(), status);
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
12316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "3,600", "1:00:00" },     //move me and I fail
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "0", "0 sec." },
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "1 sec." },
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "24", "24 sec." },
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "60", "1:00" },
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "73", "1:13" },
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "145", "2:25" },
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "666", "11:06" },
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //            { "3,600", "1:00:00" },
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "3,740", "1:02:20" },
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "10,293", "2:51:33" },
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formatter->setLenient(TRUE);
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* lpTestData[][2] = {
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2-51-33", "10,293" },
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doLenientParseTest(formatter, lpTestData);
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSpanishSpellout()
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("es", "ES", ""), status);
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
12706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "uno" },
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "6", "seis" },
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "16", "diecis\\u00e9is" },
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "veinte" },
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "24", "veinticuatro" },
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "26", "veintis\\u00e9is" },
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "73", "setenta y tres" },
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "88", "ochenta y ocho" },
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "100", "cien" },
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "106", "ciento seis" },
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "127", "ciento veintisiete" },
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "200", "doscientos" },
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "579", "quinientos setenta y nueve" },
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1,000", "mil" },
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2,000", "dos mil" },
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "3,004", "tres mil cuatro" },
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "4,567", "cuatro mil quinientos sesenta y siete" },
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15,943", "quince mil novecientos cuarenta y tres" },
1291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,345,678", "dos millones trescientos cuarenta y cinco mil seiscientos setenta y ocho"},
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "-36", "menos treinta y seis" },
1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "234.567", "doscientos treinta y cuatro coma cinco seis siete" },
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestFrenchSpellout()
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getFrance(), status);
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
13106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "un" },
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15", "quinze" },
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "vingt" },
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "21", "vingt-et-un" },
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "23", "vingt-trois" },
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "62", "soixante-deux" },
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "70", "soixante-dix" },
1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "71", "soixante-et-onze" },
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "73", "soixante-treize" },
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "80", "quatre-vingts" },
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "88", "quatre-vingt-huit" },
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "100", "cent" },
132559d709d503bab6e2b61931737e662dd293b40578ccornelius            { "106", "cent six" },
132659d709d503bab6e2b61931737e662dd293b40578ccornelius            { "127", "cent vingt-sept" },
132759d709d503bab6e2b61931737e662dd293b40578ccornelius            { "200", "deux cents" },
132859d709d503bab6e2b61931737e662dd293b40578ccornelius            { "579", "cinq cent soixante-dix-neuf" },
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1,000", "mille" },
133059d709d503bab6e2b61931737e662dd293b40578ccornelius            { "1,123", "mille cent vingt-trois" },
133159d709d503bab6e2b61931737e662dd293b40578ccornelius            { "1,594", "mille cinq cent quatre-vingt-quatorze" },
133259d709d503bab6e2b61931737e662dd293b40578ccornelius            { "2,000", "deux mille" },
133359d709d503bab6e2b61931737e662dd293b40578ccornelius            { "3,004", "trois mille quatre" },
133459d709d503bab6e2b61931737e662dd293b40578ccornelius            { "4,567", "quatre mille cinq cent soixante-sept" },
133559d709d503bab6e2b61931737e662dd293b40578ccornelius            { "15,943", "quinze mille neuf cent quarante-trois" },
133659d709d503bab6e2b61931737e662dd293b40578ccornelius            { "2,345,678", "deux millions trois cent quarante-cinq mille six cent soixante-dix-huit" },
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "-36", "moins trente-six" },
133859d709d503bab6e2b61931737e662dd293b40578ccornelius            { "234.567", "deux cent trente-quatre virgule cinq six sept" },
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formatter->setLenient(TRUE);
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* lpTestData[][2] = {
1347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "trente-et-un", "31" },
1348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "un cent quatre vingt dix huit", "198" },
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doLenientParseTest(formatter, lpTestData);
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const swissFrenchTestData[][2] = {
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "1", "un" },
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "15", "quinze" },
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "20", "vingt" },
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "21", "vingt-et-un" },
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "23", "vingt-trois" },
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "62", "soixante-deux" },
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "70", "septante" },
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "71", "septante-et-un" },
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "73", "septante-trois" },
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "80", "huitante" },
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "88", "huitante-huit" },
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "100", "cent" },
137059d709d503bab6e2b61931737e662dd293b40578ccornelius    { "106", "cent six" },
137159d709d503bab6e2b61931737e662dd293b40578ccornelius    { "127", "cent vingt-sept" },
137259d709d503bab6e2b61931737e662dd293b40578ccornelius    { "200", "deux cents" },
137359d709d503bab6e2b61931737e662dd293b40578ccornelius    { "579", "cinq cent septante-neuf" },
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "1,000", "mille" },
137559d709d503bab6e2b61931737e662dd293b40578ccornelius    { "1,123", "mille cent vingt-trois" },
137659d709d503bab6e2b61931737e662dd293b40578ccornelius    { "1,594", "mille cinq cent nonante-quatre" },
137759d709d503bab6e2b61931737e662dd293b40578ccornelius    { "2,000", "deux mille" },
137859d709d503bab6e2b61931737e662dd293b40578ccornelius    { "3,004", "trois mille quatre" },
137959d709d503bab6e2b61931737e662dd293b40578ccornelius    { "4,567", "quatre mille cinq cent soixante-sept" },
138059d709d503bab6e2b61931737e662dd293b40578ccornelius    { "15,943", "quinze mille neuf cent quarante-trois" },
138159d709d503bab6e2b61931737e662dd293b40578ccornelius    { "2,345,678", "deux millions trois cent quarante-cinq mille six cent septante-huit" },
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "-36", "moins trente-six" },
138359d709d503bab6e2b61931737e662dd293b40578ccornelius    { "234.567", "deux cent trente-quatre virgule cinq six sept" },
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { NULL, NULL}
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSwissFrenchSpellout()
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "CH", ""), status);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
13956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, swissFrenchTestData, TRUE);
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char* const belgianFrenchTestData[][2] = {
1403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "1", "un" },
1404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "15", "quinze" },
1405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "20", "vingt" },
1406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "21", "vingt-et-un" },
1407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "23", "vingt-trois" },
1408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "62", "soixante-deux" },
1409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "70", "septante" },
1410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "71", "septante-et-un" },
1411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "73", "septante-trois" },
1412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "80", "quatre-vingts" },
141359d709d503bab6e2b61931737e662dd293b40578ccornelius    { "88", "quatre-vingt huit" },
1414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "90", "nonante" },
1415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "91", "nonante-et-un" },
1416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "95", "nonante-cinq" },
1417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "100", "cent" },
141859d709d503bab6e2b61931737e662dd293b40578ccornelius    { "106", "cent six" },
141959d709d503bab6e2b61931737e662dd293b40578ccornelius    { "127", "cent vingt-sept" },
142059d709d503bab6e2b61931737e662dd293b40578ccornelius    { "200", "deux cents" },
142159d709d503bab6e2b61931737e662dd293b40578ccornelius    { "579", "cinq cent septante-neuf" },
1422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "1,000", "mille" },
142359d709d503bab6e2b61931737e662dd293b40578ccornelius    { "1,123", "mille cent vingt-trois" },
142459d709d503bab6e2b61931737e662dd293b40578ccornelius    { "1,594", "mille cinq cent nonante-quatre" },
142559d709d503bab6e2b61931737e662dd293b40578ccornelius    { "2,000", "deux mille" },
142659d709d503bab6e2b61931737e662dd293b40578ccornelius    { "3,004", "trois mille quatre" },
142759d709d503bab6e2b61931737e662dd293b40578ccornelius    { "4,567", "quatre mille cinq cent soixante-sept" },
142859d709d503bab6e2b61931737e662dd293b40578ccornelius    { "15,943", "quinze mille neuf cent quarante-trois" },
142959d709d503bab6e2b61931737e662dd293b40578ccornelius    { "2,345,678", "deux millions trois cent quarante-cinq mille six cent septante-huit" },
1430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "-36", "moins trente-six" },
143159d709d503bab6e2b61931737e662dd293b40578ccornelius    { "234.567", "deux cent trente-quatre virgule cinq six sept" },
1432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { NULL, NULL}
1433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
1434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestBelgianFrenchSpellout()
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "BE", ""), status);
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
14446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "rbnf status: 0x%x (%s)\n", status, u_errorName(status));
14456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Belgian french should match Swiss french.
1448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        doTest(formatter, belgianFrenchTestData, TRUE);
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestItalianSpellout()
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getItalian(), status);
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
14616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "uno" },
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15", "quindici" },
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "venti" },
1467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "23", "venti\\u00ADtr\\u00E9" },
1468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "73", "settanta\\u00ADtr\\u00E9" },
1469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "88", "ottant\\u00ADotto" },
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "100", "cento" },
147154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            { "101", "cento\\u00ADuno" },
1472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "103", "cento\\u00ADtr\\u00E9" },
1473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "106", "cento\\u00ADsei" },
1474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "108", "cent\\u00ADotto" },
1475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "127", "cento\\u00ADventi\\u00ADsette" },
1476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "181", "cent\\u00ADottant\\u00ADuno" },
1477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "200", "due\\u00ADcento" },
1478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "579", "cinque\\u00ADcento\\u00ADsettanta\\u00ADnove" },
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1,000", "mille" },
1480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,000", "due\\u00ADmila" },
1481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "3,004", "tre\\u00ADmila\\u00ADquattro" },
1482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "4,567", "quattro\\u00ADmila\\u00ADcinque\\u00ADcento\\u00ADsessanta\\u00ADsette" },
1483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "15,943", "quindici\\u00ADmila\\u00ADnove\\u00ADcento\\u00ADquaranta\\u00ADtr\\u00E9" },
1484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "-36", "meno trenta\\u00ADsei" },
1485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "234.567", "due\\u00ADcento\\u00ADtrenta\\u00ADquattro virgola cinque sei sette" },
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestPortugueseSpellout()
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("pt","BR",""), status);
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
15026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "um" },
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15", "quinze" },
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "vinte" },
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "23", "vinte e tr\\u00EAs" },
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "73", "setenta e tr\\u00EAs" },
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "88", "oitenta e oito" },
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "100", "cem" },
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "106", "cento e seis" },
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "108", "cento e oito" },
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "127", "cento e vinte e sete" },
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "181", "cento e oitenta e um" },
151654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            { "200", "duzentos" },
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "579", "quinhentos e setenta e nove" },
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1,000", "mil" },
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2,000", "dois mil" },
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "3,004", "tr\\u00EAs mil e quatro" },
1521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "4,567", "quatro mil e quinhentos e sessenta e sete" },
1522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "15,943", "quinze mil e novecentos e quarenta e tr\\u00EAs" },
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "-36", "menos trinta e seis" },
152454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            { "234.567", "duzentos e trinta e quatro v\\u00EDrgula cinco seis sete" },
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestGermanSpellout()
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getGermany(), status);
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
15406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "eins" },
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "15", "f\\u00fcnfzehn" },
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "20", "zwanzig" },
1546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "23", "drei\\u00ADund\\u00ADzwanzig" },
1547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "73", "drei\\u00ADund\\u00ADsiebzig" },
1548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "88", "acht\\u00ADund\\u00ADachtzig" },
1549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "100", "ein\\u00ADhundert" },
1550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "106", "ein\\u00ADhundert\\u00ADsechs" },
1551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "127", "ein\\u00ADhundert\\u00ADsieben\\u00ADund\\u00ADzwanzig" },
1552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "200", "zwei\\u00ADhundert" },
1553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "579", "f\\u00fcnf\\u00ADhundert\\u00ADneun\\u00ADund\\u00ADsiebzig" },
1554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "1,000", "ein\\u00ADtausend" },
1555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,000", "zwei\\u00ADtausend" },
1556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "3,004", "drei\\u00ADtausend\\u00ADvier" },
1557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "4,567", "vier\\u00ADtausend\\u00ADf\\u00fcnf\\u00ADhundert\\u00ADsieben\\u00ADund\\u00ADsechzig" },
1558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "15,943", "f\\u00fcnfzehn\\u00ADtausend\\u00ADneun\\u00ADhundert\\u00ADdrei\\u00ADund\\u00ADvierzig" },
1559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,345,678", "zwei Millionen drei\\u00ADhundert\\u00ADf\\u00fcnf\\u00ADund\\u00ADvierzig\\u00ADtausend\\u00ADsechs\\u00ADhundert\\u00ADacht\\u00ADund\\u00ADsiebzig" },
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formatter->setLenient(TRUE);
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* lpTestData[][2] = {
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "ein Tausend sechs Hundert fuenfunddreissig", "1,635" },
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doLenientParseTest(formatter, lpTestData);
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestThaiSpellout()
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("th"), status);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
15856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testData[][2] = {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "0", "\\u0e28\\u0e39\\u0e19\\u0e22\\u0e4c" },
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "1", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07" },
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "10", "\\u0e2a\\u0e34\\u0e1a" },
1591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "11", "\\u0e2a\\u0e34\\u0e1a\\u200b\\u0e40\\u0e2d\\u0e47\\u0e14" },
1592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "21", "\\u0e22\\u0e35\\u0e48\\u200b\\u0e2a\\u0e34\\u0e1a\\u200b\\u0e40\\u0e2d\\u0e47\\u0e14" },
1593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "101", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07\\u200b\\u0e23\\u0e49\\u0e2d\\u0e22\\u200b\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07" },
1594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "1.234", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07\\u200b\\u0e08\\u0e38\\u0e14\\u200b\\u0e2a\\u0e2d\\u0e07\\u0e2a\\u0e32\\u0e21\\u0e2a\\u0e35\\u0e48" },
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL}
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testData, TRUE);
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSwedishSpellout()
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("sv"), status);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* testDataDefault[][2] = {
1614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "101", "ett\\u00adhundra\\u00adett" },
1615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "123", "ett\\u00adhundra\\u00adtjugo\\u00adtre" },
161627f654740f2a26ad62a5c155af9199af9e69b889claireho            { "1,001", "et\\u00adtusen ett" },
161727f654740f2a26ad62a5c155af9199af9e69b889claireho            { "1,100", "et\\u00adtusen ett\\u00adhundra" },
161827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "1,101", "et\\u00adtusen ett\\u00adhundra\\u00adett" },
161927f654740f2a26ad62a5c155af9199af9e69b889claireho            { "1,234", "et\\u00adtusen tv\\u00e5\\u00adhundra\\u00adtrettio\\u00adfyra" },
1620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "10,001", "tio\\u00adtusen ett" },
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "11,000", "elva\\u00adtusen" },
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "12,000", "tolv\\u00adtusen" },
162327f654740f2a26ad62a5c155af9199af9e69b889claireho            { "20,000", "tjugo\\u00adtusen" },
162427f654740f2a26ad62a5c155af9199af9e69b889claireho            { "21,000", "tjugo\\u00adet\\u00adtusen" },
162527f654740f2a26ad62a5c155af9199af9e69b889claireho            { "21,001", "tjugo\\u00adet\\u00adtusen ett" },
162627f654740f2a26ad62a5c155af9199af9e69b889claireho            { "200,000", "tv\\u00e5\\u00adhundra\\u00adtusen" },
162727f654740f2a26ad62a5c155af9199af9e69b889claireho            { "201,000", "tv\\u00e5\\u00adhundra\\u00adet\\u00adtusen" },
162827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "200,200", "tv\\u00e5\\u00adhundra\\u00adtusen tv\\u00e5\\u00adhundra" },
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "2,002,000", "tv\\u00e5 miljoner tv\\u00e5\\u00adtusen" },
163027f654740f2a26ad62a5c155af9199af9e69b889claireho            { "12,345,678", "tolv miljoner tre\\u00adhundra\\u00adfyrtio\\u00adfem\\u00adtusen sex\\u00adhundra\\u00adsjuttio\\u00ad\\u00e5tta" },
163127f654740f2a26ad62a5c155af9199af9e69b889claireho            { "123,456.789", "ett\\u00adhundra\\u00adtjugo\\u00adtre\\u00adtusen fyra\\u00adhundra\\u00adfemtio\\u00adsex komma sju \\u00e5tta nio" },
1632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "-12,345.678", "minus tolv\\u00adtusen tre\\u00adhundra\\u00adfyrtio\\u00adfem komma sex sju \\u00e5tta" },
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL }
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testDataDefault, TRUE);
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          static const char* testDataNeutrum[][2] = {
163854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              { "101", "ett\\u00adhundra\\u00adett" },
163954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              { "1,001", "et\\u00adtusen ett" },
164054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              { "1,101", "et\\u00adtusen ett\\u00adhundra\\u00adett" },
164154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              { "10,001", "tio\\u00adtusen ett" },
164254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              { "21,001", "tjugo\\u00adet\\u00adtusen ett" },
1643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru              { NULL, NULL }
1644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          };
1645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
164654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          formatter->setDefaultRuleSet("%spellout-cardinal-neuter", status);
1647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          if (U_SUCCESS(status)) {
164854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          logln("        testing spellout-cardinal-neuter rules");
1649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          doTest(formatter, testDataNeutrum, TRUE);
1650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          }
1651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          else {
165254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          errln("Can't test spellout-cardinal-neuter rules");
1653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          }
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* testDataYear[][2] = {
1656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "101", "ett\\u00adhundra\\u00adett" },
1657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "900", "nio\\u00adhundra" },
165827f654740f2a26ad62a5c155af9199af9e69b889claireho            { "1,001", "et\\u00adtusen ett" },
1659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "1,100", "elva\\u00adhundra" },
1660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "1,101", "elva\\u00adhundra\\u00adett" },
1661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "1,234", "tolv\\u00adhundra\\u00adtrettio\\u00adfyra" },
1662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            { "2,001", "tjugo\\u00adhundra\\u00adett" },
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { "10,001", "tio\\u00adtusen ett" },
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            { NULL, NULL }
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        status = U_ZERO_ERROR;
1668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        formatter->setDefaultRuleSet("%spellout-numbering-year", status);
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("testing year rules");
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTest(formatter, testDataYear, TRUE);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Can't test year rules");
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSmallValues()
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat* formatter
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("en_US"), status);
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char* const testDataDefault[][2] = {
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.001", "zero point zero zero one" },
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.0001", "zero point zero zero zero one" },
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.00001", "zero point zero zero zero zero one" },
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.000001", "zero point zero zero zero zero zero one" },
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.0000001", "zero point zero zero zero zero zero zero one" },
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.00000001", "zero point zero zero zero zero zero zero zero one" },
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.000000001", "zero point zero zero zero zero zero zero zero zero one" },
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.0000000001", "zero point zero zero zero zero zero zero zero zero zero one" },
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.00000000001", "zero point zero zero zero zero zero zero zero zero zero zero one" },
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero one" },
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.0000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero one" },
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.00000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero one" },
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.000000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero zero one" },
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000.001", "ten million point zero zero one" },
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000.0001", "ten million point zero zero zero one" },
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000.00001", "ten million point zero zero zero zero one" },
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000.000001", "ten million point zero zero zero zero zero one" },
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000.0000001", "ten million point zero zero zero zero zero zero one" },
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//        { "10,000,000.00000001", "ten million point zero zero zero zero zero zero zero one" },
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//        { "10,000,000.000000002", "ten million point zero zero zero zero zero zero zero zero two" },
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "10,000,000", "ten million" },
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//        { "1,234,567,890.0987654", "one billion, two hundred and thirty-four million, five hundred and sixty-seven thousand, eight hundred and ninety point zero nine eight seven six five four" },
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//        { "123,456,789.9876543", "one hundred and twenty-three million, four hundred and fifty-six thousand, seven hundred and eighty-nine point nine eight seven six five four three" },
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//        { "12,345,678.87654321", "twelve million, three hundred and forty-five thousand, six hundred and seventy-eight point eight seven six five four three two one" },
1716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "1,234,567.7654321", "one million two hundred thirty-four thousand five hundred sixty-seven point seven six five four three two one" },
1717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "123,456.654321", "one hundred twenty-three thousand four hundred fifty-six point six five four three two one" },
1718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "12,345.54321", "twelve thousand three hundred forty-five point five four three two one" },
1719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "1,234.4321", "one thousand two hundred thirty-four point four three two one" },
1720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { "123.321", "one hundred twenty-three point three two one" },
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.0000000011754944", "zero point zero zero zero zero zero zero zero zero one one seven five four nine four four" },
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "0.000001175494351", "zero point zero zero zero zero zero one one seven five four nine four three five one" },
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { NULL, NULL }
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        };
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        doTest(formatter, testDataDefault, TRUE);
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete formatter;
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestLocalizations(void)
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules("%main:0:no;1:some;100:a lot;1000:tons;\n"
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%other:0:nada;1:yah, some;100:plenty;1000:more'n you'll ever need");
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError perror;
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedNumberFormat formatter(rules, perror, status);
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
17436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status));
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            static const char* const testData[][2] = {
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "0", "nada" },
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "5", "yah, some" },
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "423", "plenty" },
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "12345", "more'n you'll ever need" },
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { NULL, NULL }
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            };
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTest(&formatter, testData, FALSE);
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString loc("<<%main, %other>,<en, Main, Other>,<fr, leMain, leOther>,<de, 'das Main', 'etwas anderes'>>");
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            static const char* const testData[][2] = {
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "0", "no" },
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "5", "some" },
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "423", "a lot" },
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { "12345", "tons" },
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                { NULL, NULL }
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            };
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            RuleBasedNumberFormat formatter0(rules, loc, perror, status);
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("failed to build second formatter");
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                doTest(&formatter0, testData, FALSE);
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                {
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // exercise localization info
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale locale0("en__VALLEY@turkey=gobblegobble");
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale locale1("de_DE_FOO");
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale locale2("ja_JP");
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString name = formatter0.getRuleSetName(0);
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if ( formatter0.getRuleSetDisplayName(0, locale0) == "Main"
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      && formatter0.getRuleSetDisplayName(0, locale1) == "das Main"
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      && formatter0.getRuleSetDisplayName(0, locale2) == "%main"
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      && formatter0.getRuleSetDisplayName(name, locale0) == "Main"
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      && formatter0.getRuleSetDisplayName(name, locale1) == "das Main"
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      && formatter0.getRuleSetDisplayName(name, locale2) == "%main"){
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          logln("getRuleSetDisplayName tested");
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }else {
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln("failed to getRuleSetDisplayName");
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (i = 0; i < formatter0.getNumberOfRuleSetDisplayNameLocales(); ++i) {
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    Locale locale = formatter0.getRuleSetDisplayNameLocale(i, status);
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (U_SUCCESS(status)) {
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        for (int j = 0; j < formatter0.getNumberOfRuleSetNames(); ++j) {
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            UnicodeString name = formatter0.getRuleSetName(j);
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            UnicodeString lname = formatter0.getRuleSetDisplayName(j, locale);
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            UnicodeString msg = locale.getName();
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            msg.append(": ");
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            msg.append(name);
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            msg.append(" = ");
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            msg.append(lname);
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            logln(msg);
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            static const char* goodLocs[] = {
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "", // zero-length ok, same as providing no localization data
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<>>", // no public rule sets ok
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>>", // no localizations ok
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main,>,<en, Main,>>", // comma before close angle ok
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>,<en, ',<>\" '>>", // quotes everything until next quote
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>,<'en', \"it's ok\">>", // double quotes work too
1815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "  \n <\n  <\n  %main\n  >\n  , \t <\t   en\t  ,  \tfoo \t\t > \n\n >  \n ", // Pattern_White_Space ok
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           };
18178de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            int32_t goodLocsLen = UPRV_LENGTHOF(goodLocs);
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            static const char* badLocs[] = {
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                " ", // non-zero length
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<>", // empty array
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<", // unclosed outer array
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<", // unclosed inner array
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<,>>", // unexpected comma
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<''>>", // empty string
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "  x<<%main>>", // first non space char not open angle bracket
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<%main>", // missing inner array
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main %other>>", // elements missing separating commma (spaces must be quoted)
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main><en, Main>>", // arrays missing separating comma
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>,<en, main, foo>>", // too many elements in locale data
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>,<en>>", // too few elements in locale data
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<<%main>>>", // unexpected open angle
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main<>>>", // unexpected open angle
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main, %other>,<en,,>>", // implicit empty strings
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>,<en,''>>", // empty string
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>, < en, '>>", // unterminated quote
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>, < en, \"<>>", // unterminated quote
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main\">>", // quote in string
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main'>>", // quote in string
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main<>>", // open angle in string
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "<<%main>> x", // extra non-space text at end
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            };
18448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            int32_t badLocsLen = UPRV_LENGTHOF(badLocs);
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i = 0; i < goodLocsLen; ++i) {
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("[%d] '%s'", i, goodLocs[i]);
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UErrorCode status = U_ZERO_ERROR;
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString loc(goodLocs[i]);
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                RuleBasedNumberFormat fmt(rules, loc, perror, status);
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Failed parse of good localization string: '%s'", goodLocs[i]);
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i = 0; i < badLocsLen; ++i) {
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("[%d] '%s'", i, badLocs[i]);
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UErrorCode status = U_ZERO_ERROR;
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString loc(badLocs[i]);
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                RuleBasedNumberFormat fmt(rules, loc, perror, status);
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_SUCCESS(status)) {
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Successful parse of bad localization string: '%s'", badLocs[i]);
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestAllLocales()
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* names[] = {
1873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        " (spellout) ",
1874f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        " (ordinal)  "
1875f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        // " (duration) " // This is English only, and it's not really supported in CLDR anymore.
1876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
1877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    double numbers[] = {45.678, 1, 2, 10, 11, 100, 110, 200, 1000, 1111, -1111};
1878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t count = 0;
1880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const Locale* locales = Locale::getAvailableLocales(count);
1881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int i = 0; i < count; ++i) {
1882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const Locale* loc = &locales[i];
1883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1884f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        for (int j = 0; j < 2; ++j) {
1885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
1886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            RuleBasedNumberFormat* f = new RuleBasedNumberFormat((URBNFRuleSetTag)j, *loc, status);
1887f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1888f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (status == U_USING_DEFAULT_WARNING || status == U_USING_FALLBACK_WARNING) {
1889f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                // Skip it.
1890f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                delete f;
1891f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                break;
1892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
1893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(status)) {
1894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln(UnicodeString(loc->getName()) + names[j]
1895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    + "ERROR could not instantiate -> " + u_errorName(status));
1896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                continue;
1897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
189850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_COLLATION
18998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert            for (unsigned int numidx = 0; numidx < UPRV_LENGTHOF(numbers); numidx++) {
1900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                double n = numbers[numidx];
1901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                UnicodeString str;
1902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                f->format(n, str);
1903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1904f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (verbose) {
1905f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    logln(UnicodeString(loc->getName()) + names[j]
1906f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        + "success: " + n + " -> " + str);
1907f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                }
1908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1909f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                // We do not validate the result in this test case,
1910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                // because there are cases which do not round trip by design.
1911f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                Formattable num;
1912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1913f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                // regular parse
1914f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                status = U_ZERO_ERROR;
1915f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                f->setLenient(FALSE);
1916f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                f->parse(str, num, status);
1917f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (U_FAILURE(status)) {
1918f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    errln(UnicodeString(loc->getName()) + names[j]
1919f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        + "ERROR could not parse '" + str + "' -> " + u_errorName(status));
1920f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                }
1921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                // We only check the spellout. The behavior is undefined for numbers < 1 and fractional numbers.
1922f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (j == 0) {
1923f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    if (num.getType() == Formattable::kLong && num.getLong() != n) {
1924f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        errln(UnicodeString(loc->getName()) + names[j]
1925f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            + UnicodeString("ERROR could not roundtrip ") + n
1926f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getLong());
1927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    }
1928f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    else if (num.getType() == Formattable::kDouble && (int64_t)(num.getDouble() * 1000) != (int64_t)(n*1000)) {
1929f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        // The epsilon difference is too high.
1930f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        errln(UnicodeString(loc->getName()) + names[j]
1931f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            + UnicodeString("ERROR could not roundtrip ") + n
1932f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getDouble());
1933f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    }
1934f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                }
1935f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                if (!quick && !logKnownIssue("9503") ) {
1936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    // lenient parse
1937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    status = U_ZERO_ERROR;
1938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    f->setLenient(TRUE);
1939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    f->parse(str, num, status);
1940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    if (U_FAILURE(status)) {
1941f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        errln(UnicodeString(loc->getName()) + names[j]
1942f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            + "ERROR could not parse(lenient) '" + str + "' -> " + u_errorName(status));
1943f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    }
1944f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    // We only check the spellout. The behavior is undefined for numbers < 1 and fractional numbers.
1945f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    if (j == 0) {
1946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        if (num.getType() == Formattable::kLong && num.getLong() != n) {
1947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            errln(UnicodeString(loc->getName()) + names[j]
1948f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                                + UnicodeString("ERROR could not roundtrip ") + n
1949f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                                + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getLong());
1950f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        }
1951f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        else if (num.getType() == Formattable::kDouble && (int64_t)(num.getDouble() * 1000) != (int64_t)(n*1000)) {
1952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            // The epsilon difference is too high.
1953f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                            errln(UnicodeString(loc->getName()) + names[j]
1954f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                                + UnicodeString("ERROR could not roundtrip ") + n
1955f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                                + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getDouble());
1956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        }
1957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    }
1958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
1959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
1961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete f;
1962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestMultiplierSubstitution(void) {
1968f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString rules("=#,##0=;1,000,000: <##0.###< million;");
1969f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UErrorCode status = U_ZERO_ERROR;
1970f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UParseError parse_error;
1971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    RuleBasedNumberFormat *rbnf =
1972f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        new RuleBasedNumberFormat(rules, Locale::getUS(), parse_error, status);
1973f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (U_SUCCESS(status)) {
1974f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString res;
1975f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        FieldPosition pos;
1976f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        double n = 1234000.0;
1977f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        rbnf->format(n, res, pos);
1978f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        delete rbnf;
1979f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1980f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UnicodeString expected(UNICODE_STRING_SIMPLE("1.234 million"));
1981f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (expected != res) {
1982f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            UnicodeString msg = "Expected: ";
1983f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            msg.append(expected);
1984f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            msg.append(" but got ");
1985f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            msg.append(res);
1986f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            errln(msg);
1987f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid
1992103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusIntlTestRBNF::TestSetDecimalFormatSymbols() {
1993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
1994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1995103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    RuleBasedNumberFormat rbnf(URBNF_ORDINAL, Locale::getEnglish(), status);
1996103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
1997103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
1998103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1999103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2000103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2001103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    DecimalFormatSymbols dfs(Locale::getEnglish(), status);
2002103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
2003103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Unable to create DecimalFormatSymbols - " + UnicodeString(u_errorName(status)));
2004103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
2005103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2006103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2007103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UnicodeString expected[] = {
2008103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            UnicodeString("1,001st"),
2009103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            UnicodeString("1&001st")
2010103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
2011103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2012103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    double number = 1001;
2013103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2014103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UnicodeString result;
2015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2016103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    rbnf.format(number, result);
2017103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (result != expected[0]) {
2018103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Format Error - Got: " + result + " Expected: " + expected[0]);
2019103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2020103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2021103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    result.remove();
2022103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2023103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Set new symbol for testing */
2024103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    dfs.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, UnicodeString("&"), TRUE);
2025103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    rbnf.setDecimalFormatSymbols(dfs);
2026103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    rbnf.format(number, result);
2028103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (result != expected[1]) {
2029103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Format Error - Got: " + result + " Expected: " + expected[1]);
2030103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2031103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2032103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2033f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid IntlTestRBNF::TestPluralRules() {
2034f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UErrorCode status = U_ZERO_ERROR;
2035f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString enRules("%digits-ordinal:-x: ->>;0: =#,##0=$(ordinal,one{st}two{nd}few{rd}other{th})$;");
2036f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UParseError parseError;
2037f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status);
2038f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (U_FAILURE(status)) {
2039f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
2040f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return;
2041f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
2042f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const char* const enTestData[][2] = {
2043f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "1", "1st" },
2044f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "2", "2nd" },
2045f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "3", "3rd" },
2046f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "4", "4th" },
2047f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "11", "11th" },
2048f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "12", "12th" },
2049f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "13", "13th" },
2050f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "14", "14th" },
2051f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "21", "21st" },
2052f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "22", "22nd" },
2053f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "23", "23rd" },
2054f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "24", "24th" },
2055f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { NULL, NULL }
2056f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
2057f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2058f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    doTest(&enFormatter, enTestData, TRUE);
2059f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2060f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // This is trying to model the feminine form, but don't worry about the details too much.
2061f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // We're trying to test the plural rules.
2062f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString ruRules("%spellout-numbering:"
2063f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "-x: minus >>;"
2064f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "x.x: << point >>;"
2065f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "0: zero;"
2066f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "1: one;"
2067f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "2: two;"
2068f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "3: three;"
2069f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "4: four;"
2070f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "5: five;"
2071f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "6: six;"
2072f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "7: seven;"
2073f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "8: eight;"
2074f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "9: nine;"
2075f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "10: ten;"
2076f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "11: eleven;"
2077f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "12: twelve;"
2078f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "13: thirteen;"
2079f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "14: fourteen;"
2080f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "15: fifteen;"
2081f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "16: sixteen;"
2082f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "17: seventeen;"
2083f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "18: eighteen;"
2084f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "19: nineteen;"
2085f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "20: twenty[->>];"
2086f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "30: thirty[->>];"
2087f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "40: forty[->>];"
2088f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "50: fifty[->>];"
2089f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "60: sixty[->>];"
2090f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "70: seventy[->>];"
2091f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "80: eighty[->>];"
2092f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "90: ninety[->>];"
2093f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "100: hundred[ >>];"
2094f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "200: << hundred[ >>];"
2095f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "300: << hundreds[ >>];"
2096f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "500: << hundredss[ >>];"
2097f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "1000: << $(cardinal,one{thousand}few{thousands}other{thousandss})$[ >>];"
2098f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            "1000000: << $(cardinal,one{million}few{millions}other{millionss})$[ >>];");
2099f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    RuleBasedNumberFormat ruFormatter(ruRules, Locale("ru"), parseError, status);
2100f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const char* const ruTestData[][2] = {
2101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "1", "one" },
2102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "100", "hundred" },
2103f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "125", "hundred twenty-five" },
2104f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "399", "three hundreds ninety-nine" },
2105f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "1,000", "one thousand" },
2106f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "1,001", "one thousand one" },
2107f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "2,000", "two thousands" },
2108f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "2,001", "two thousands one" },
2109f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "2,002", "two thousands two" },
2110f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "3,333", "three thousands three hundreds thirty-three" },
2111f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "5,000", "five thousandss" },
2112f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "11,000", "eleven thousandss" },
2113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "21,000", "twenty-one thousand" },
2114f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "22,000", "twenty-two thousands" },
2115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { "25,001", "twenty-five thousandss one" },
2116f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            { NULL, NULL }
2117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    };
2118f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (U_FAILURE(status)) {
2120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
2121f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return;
2122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
2123f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    doTest(&ruFormatter, ruTestData, TRUE);
2124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2125f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // Make sure there are no divide by 0 errors.
2126f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    UnicodeString result;
212764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    RuleBasedNumberFormat(ruRules, Locale("ru"), parseError, status).format((int32_t)21000, result);
2128f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (result.compare(UNICODE_STRING_SIMPLE("twenty-one thousand")) != 0) {
2129f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln("Got " + result + " for 21000");
2130f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
2131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
2132f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
2133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid IntlTestRBNF::TestInfinityNaN() {
2135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
2136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UParseError parseError;
2137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString enRules("%default:"
2138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "-x: minus >>;"
2139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "Inf: infinite;"
2140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "NaN: not a number;"
2141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "0: =#,##0=;");
2142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status);
2143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const char * const enTestData[][2] = {
2144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1", "1"},
2145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"\\u221E", "infinite"},
2146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"-\\u221E", "minus infinite"},
2147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"NaN", "not a number"},
2148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            { NULL, NULL }
2149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
2150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
2151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
2152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
2153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
2154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    doTest(&enFormatter, enTestData, true);
2156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // Test the default behavior when the rules are undefined.
2158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString enRules2("%default:"
2159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "-x: ->>;"
2160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "0: =#,##0=;");
2161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    RuleBasedNumberFormat enFormatter2(enRules2, Locale::getEnglish(), parseError, status);
2162c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
2163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
2164c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
2165c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
2166c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const char * const enDefaultTestData[][2] = {
2167c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1", "1"},
2168c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"\\u221E", "\\u221E"},
2169c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"-\\u221E", "-\\u221E"},
2170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"NaN", "NaN"},
2171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            { NULL, NULL }
2172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
2173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    doTest(&enFormatter2, enDefaultTestData, true);
2175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
2176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid IntlTestRBNF::TestVariableDecimalPoint() {
2178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UErrorCode status = U_ZERO_ERROR;
2179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UParseError parseError;
2180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString enRules("%spellout-numbering:"
2181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "-x: minus >>;"
2182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "x.x: << point >>;"
2183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "x,x: << comma >>;"
2184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "0.x: xpoint >>;"
2185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "0,x: xcomma >>;"
2186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "0: zero;"
2187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "1: one;"
2188c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "2: two;"
2189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "3: three;"
2190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "4: four;"
2191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "5: five;"
2192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "6: six;"
2193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "7: seven;"
2194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "8: eight;"
2195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            "9: nine;");
2196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status);
2197c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const char * const enTestPointData[][2] = {
2198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1.1", "one point one"},
2199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1.23", "one point two three"},
2200c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"0.4", "xpoint four"},
2201c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            { NULL, NULL }
2202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
2203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
2204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status)));
2205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return;
2206c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
2207c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    doTest(&enFormatter, enTestPointData, true);
2208c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormatSymbols decimalFormatSymbols(Locale::getEnglish(), status);
2210c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    decimalFormatSymbols.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, UNICODE_STRING_SIMPLE(","));
2211c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    enFormatter.setDecimalFormatSymbols(decimalFormatSymbols);
2212c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const char * const enTestCommaData[][2] = {
2213c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1.1", "one comma one"},
2214c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"1.23", "one comma two three"},
2215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            {"0.4", "xcomma four"},
2216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            { NULL, NULL }
2217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
2218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    doTest(&enFormatter, enTestCommaData, true);
2219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
2220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing)
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // man, error reporting would be easier with printf-style syntax for unicode string and formattable
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols dfs("en", status);
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status);
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat decFmt("#,###.################", dfs, status);
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
22316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not create NumberFormat - %s", u_errorName(status));
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 0; testData[i][0]; ++i) {
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* numString = testData[i][0];
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* expectedWords = testData[i][1];
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log("[%i] %s = ", i, numString);
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable expectedNumber;
2239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UnicodeString escapedNumString = UnicodeString(numString, -1, US_INV).unescape();
2240c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            decFmt.parse(escapedNumString, expectedNumber, status);
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: decFmt could not parse %s", numString);
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString actualString;
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FieldPosition pos;
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatter->format(expectedNumber, actualString/* , pos*/, status);
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString msg = "Fail: formatter could not format ";
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    decFmt.format(expectedNumber, msg, status);
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(msg);
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
2254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    UnicodeString expectedString = UnicodeString(expectedWords, -1, US_INV).unescape();
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (actualString != expectedString) {
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UnicodeString msg = "FAIL: check failed for ";
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        decFmt.format(expectedNumber, msg, status);
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(", expected ");
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(expectedString);
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(" but got ");
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(actualString);
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln(msg);
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        logln(actualString);
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if (testParsing) {
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            Formattable parsedNumber;
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            formatter->parse(actualString, parsedNumber, status);
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            if (U_FAILURE(status)) {
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                UnicodeString msg = "FAIL: formatter could not parse ";
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                msg.append(actualString);
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                msg.append(" status code: " );
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                msg.append(u_errorName(status));
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                errln(msg);
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                break;
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            } else {
2277c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                                if (parsedNumber != expectedNumber
2278c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                                    && (!uprv_isNaN(parsedNumber.getDouble()) || !uprv_isNaN(expectedNumber.getDouble())))
2279c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                                {
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    UnicodeString msg = "FAIL: parse failed for ";
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    msg.append(actualString);
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    msg.append(", expected ");
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    decFmt.format(expectedNumber, msg, status);
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    msg.append(", but got ");
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    decFmt.format(parsedNumber, msg, status);
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    errln(msg);
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    break;
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                }
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            }
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::doLenientParseTest(RuleBasedNumberFormat* formatter, const char* testData[][2])
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status);
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
23046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: could not create NumberFormat - %s", u_errorName(status));
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 0; testData[i][0]; ++i) {
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* spelledNumber = testData[i][0]; // spelled-out number
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* asciiUSNumber = testData[i][1]; // number as ascii digits formatted for US locale
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString spelledNumberString = UnicodeString(spelledNumber).unescape();
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable actualNumber;
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            formatter->parse(spelledNumberString, actualNumber, status);
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString msg = "FAIL: formatter could not parse ";
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                msg.append(spelledNumberString);
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(msg);
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // I changed the logic of this test somewhat from Java-- instead of comparing the
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // strings, I compare the Formattables.  Hmmm, but the Formattables don't compare,
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // so change it back.
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString asciiUSNumberString = asciiUSNumber;
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                Formattable expectedNumber;
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                decFmt->parse(asciiUSNumberString, expectedNumber, status);
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString msg = "FAIL: decFmt could not parse ";
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    msg.append(asciiUSNumberString);
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(msg);
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString actualNumberString;
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString expectedNumberString;
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    decFmt->format(actualNumber, actualNumberString, status);
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    decFmt->format(expectedNumber, expectedNumberString, status);
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (actualNumberString != expectedNumberString) {
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UnicodeString msg = "FAIL: parsing";
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(asciiUSNumberString);
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append("\n");
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append("  lenient parse failed for ");
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(spelledNumberString);
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(", expected ");
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(expectedNumberString);
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(", but got ");
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        msg.append(actualNumberString);
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        errln(msg);
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete decFmt;
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestRBNFDisabled() {
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("*** RBNF currently disabled on this platform ***\n");
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
2368