1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 1996-2015, International Business Machines Corporation and    *
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.                                                *
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.format;
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.math.BigInteger;
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.text.ParseException;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Random;
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
17f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
1805fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runner.RunWith;
1905fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runners.JUnit4;
20f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.math.BigDecimal;
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DecimalFormat;
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DecimalFormatSymbols;
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DisplayContext;
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.NumberFormat;
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.RuleBasedNumberFormat;
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.ULocale;
292e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard;
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * This does not test lenient parse mode, since testing the default implementation
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * introduces a dependency on collation.  See RbnfLenientScannerTest.
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
352e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard
3605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert@RunWith(JUnit4.class)
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class RbnfTest extends TestFmwk {
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static String fracRules =
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "%main:\n" +
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // this rule formats the number if it's 1 or more.  It formats
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // the integral part using a DecimalFormat ("#,##0" puts
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // thousands separators in the right places) and the fractional
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // part using %%frac.  If there is no fractional part, it
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // just shows the integral part.
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    x.0: <#,##0<[ >%%frac>];\n" +
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // this rule formats the number if it's between 0 and 1.  It
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // shows only the fractional part (0.5 shows up as "1/2," not
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // "0 1/2")
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    0.x: >%%frac>;\n" +
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // the fraction rule set.  This works the same way as the one in the
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // preceding example: We multiply the fractional part of the number
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // being formatted by each rule's base value and use the rule that
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // produces the result closest to 0 (or the first rule that produces 0).
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Since we only provide rules for the numbers from 2 to 10, we know
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // we'll get a fraction with a denominator between 2 and 10.
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // "<0<" causes the numerator of the fraction to be formatted
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // using numerals
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "%%frac:\n" +
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    2: 1/2;\n" +
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    3: <0</3;\n" +
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    4: <0</4;\n" +
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    5: <0</5;\n" +
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    6: <0</6;\n" +
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    7: <0</7;\n" +
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    8: <0</8;\n" +
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "    9: <0</9;\n" +
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "   10: <0</10;\n";
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
69f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCoverage() {
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String durationInSecondsRules =
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                // main rule set for formatting with words
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "%with-words:\n"
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // take care of singular and plural forms of "second"
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0 seconds; 1 second; =0= seconds;\n"
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // use %%min to format values greater than 60 seconds
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60/60: <%%min<[, >>];\n"
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // use %%hr to format values greater than 3,600 seconds
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // (the ">>>" below causes us to see the number of minutes
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // when when there are zero minutes)
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    3600/60: <%%hr<[, >>>];\n"
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // this rule set takes care of the singular and plural forms
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // of "minute"
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%min:\n"
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0 minutes; 1 minute; =0= minutes;\n"
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // this rule set takes care of the singular and plural forms
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // of "hour"
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%hr:\n"
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0 hours; 1 hour; =0= hours;\n"
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // main rule set for formatting in numerals
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%in-numerals:\n"
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // values below 60 seconds are shown with "sec."
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    =0= sec.;\n"
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // higher values are shown with colons: %%min-sec is used for
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // values below 3,600 seconds...
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60: =%%min-sec=;\n"
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // ...and %%hr-min-sec is used for values of 3,600 seconds
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // and above
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    3600: =%%hr-min-sec=;\n"
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // this rule causes values of less than 10 minutes to show without
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // a leading zero
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%min-sec:\n"
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0: :=00=;\n"
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60/60: <0<>>;\n"
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // this rule set is used for values of 3,600 or more.  Minutes are always
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // shown, and always shown with two digits
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%hr-min-sec:\n"
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0: :=00=;\n"
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60/60: <00<>>;\n"
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    3600/60: <#,##0<:>>>;\n"
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // the lenient-parse rules allow several different characters to be used
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // as delimiters between hours, minutes, and seconds
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%lenient-parse:\n"
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    & : = . = ' ' = -;\n";
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // extra calls to boost coverage numbers
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt0 = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT);
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt1 = (RuleBasedNumberFormat)fmt0.clone();
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt2 = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT);
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!fmt0.equals(fmt0)) {
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("self equality fails");
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!fmt0.equals(fmt1)) {
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("clone equality fails");
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!fmt0.equals(fmt2)) {
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("duplicate equality fails");
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String str = fmt0.toString();
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt3 =  new RuleBasedNumberFormat(durationInSecondsRules);
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (fmt0.equals(fmt3)) {
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("nonequal fails");
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!fmt3.equals(fmt3)) {
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("self equal 2 fails");
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        str = fmt3.toString();
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] names = fmt3.getRuleSetNames();
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            fmt3.setDefaultRuleSet(null);
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            fmt3.setDefaultRuleSet("%%foo");
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("sdrf %%foo didn't fail");
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Got the expected exception");
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            fmt3.setDefaultRuleSet("%bogus");
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("sdrf %bogus didn't fail");
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Got the expected exception");
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str = fmt3.format(2.3, names[0]);
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(str);
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str = fmt3.format(2.3, "%%foo");
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("format double %%foo didn't fail");
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Got the expected exception");
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str = fmt3.format(123L, names[0]);
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(str);
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            str = fmt3.format(123L, "%%foo");
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("format double %%foo didn't fail");
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Got the expected exception");
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt4 = new RuleBasedNumberFormat(fracRules, Locale.ENGLISH);
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt5 = new RuleBasedNumberFormat(fracRules, Locale.ENGLISH);
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        str = fmt4.toString();
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!fmt4.equals(fmt5)) {
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("duplicate 2 equality failed");
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        str = fmt4.format(123L);
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Number num = fmt4.parse(str);
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(num.toString());
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("parse caught exception");
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        str = fmt4.format(.000123);
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Number num = fmt4.parse(str);
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(num.toString());
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("parse caught exception");
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        str = fmt4.format(456.000123);
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln(str);
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Number num = fmt4.parse(str);
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(num.toString());
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Exception e) {
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("parse caught exception");
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
221f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestUndefinedSpellout() {
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale greek = new Locale("el", "", "");
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat[] formatters = {
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.SPELLOUT),
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.ORDINAL),
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.DURATION),
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] data = {
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "0",
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "1",
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "15",
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "20",
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "23",
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "73",
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "88",
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "100",
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "106",
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "127",
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "200",
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "579",
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "1,000",
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "2,000",
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "3,004",
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "4,567",
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "15,943",
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "105,000",
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "2,345,678",
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "-36",
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "-36.91215",
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "234.56789"
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        NumberFormat decFormat = NumberFormat.getInstance(Locale.US);
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int j = 0; j < formatters.length; ++j) {
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            android.icu.text.NumberFormat formatter = formatters[j];
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("formatter[" + j + "]");
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < data.length; ++i) {
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                try {
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String result = formatter.format(decFormat.parse(data[i]));
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    logln("[" + i + "] " + data[i] + " ==> " + result);
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                catch (Exception e) {
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("formatter[" + j + "], data[" + i + "] " + data[i] + " threw exception " + e.getMessage());
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the English spellout rules
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
274f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestEnglishSpellout() {
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US,
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "one" },
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15", "fifteen" },
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "twenty" },
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "twenty-three" },
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "seventy-three" },
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "eighty-eight" },
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "one hundred" },
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "one hundred six" },
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "one hundred twenty-seven" },
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "two hundred" },
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "five hundred seventy-nine" },
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "one thousand" },
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "two thousand" },
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "three thousand four" },
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "four thousand five hundred sixty-seven" },
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "fifteen thousand nine hundred forty-three" },
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,345,678", "two million three hundred forty-five "
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "thousand six hundred seventy-eight" },
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-36", "minus thirty-six" },
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "234.567", "two hundred thirty-four point five six seven" }
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the English ordinal-abbreviation rules
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
307f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestOrdinalAbbreviations() {
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter= new RuleBasedNumberFormat(Locale.US,
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.ORDINAL);
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "1st" },
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2", "2nd" },
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3", "3rd" },
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4", "4th" },
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "7", "7th" },
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10", "10th" },
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "11", "11th" },
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "13", "13th" },
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "20th" },
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21", "21st" },
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "22", "22nd" },
323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "23rd" },
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "24", "24th" },
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "33", "33rd" },
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "102", "102nd" },
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "312", "312th" },
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,345", "12,345th" }
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, false);
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the duration-formatting rules
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
337f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestDurations() {
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US,
340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.DURATION);
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,600", "1:00:00" },             //move me and I fail
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0", "0 sec." },
344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "1 sec." },
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "24", "24 sec." },
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "60", "1:00" },
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "1:13" },
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "145", "2:25" },
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "666", "11:06" },
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                //            { "3,600", "1:00:00" },
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,740", "1:02:20" },
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,293", "2:51:33" }
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the Spanish spellout rules
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
361f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSpanishSpellout() {
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("es", "es",
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ""), RuleBasedNumberFormat.SPELLOUT);
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "uno" },
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "6", "seis" },
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "16", "diecis\u00e9is" },
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "veinte" },
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "24", "veinticuatro" },
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "26", "veintis\u00e9is" },
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "setenta y tres" },
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "ochenta y ocho" },
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "cien" },
375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "ciento seis" },
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "ciento veintisiete" },
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "doscientos" },
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "quinientos setenta y nueve" },
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "mil" },
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "dos mil" },
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "tres mil cuatro" },
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "cuatro mil quinientos sesenta y siete" },
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "quince mil novecientos cuarenta y tres" },
384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,345,678", "dos millones trescientos cuarenta y cinco mil "
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "seiscientos setenta y ocho"},
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-36", "menos treinta y seis" },
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "234.567", "doscientos treinta y cuatro coma cinco seis siete" }
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the French spellout rules
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
396f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestFrenchSpellout() {
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.FRANCE,
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "un" },
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15", "quinze" },
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "vingt" },
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21", "vingt-et-un" },
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "vingt-trois" },
406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "62", "soixante-deux" },
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "70", "soixante-dix" },
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "71", "soixante-et-onze" },
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "soixante-treize" },
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "80", "quatre-vingts" },
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "quatre-vingt-huit" },
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "cent" },
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "cent six" },
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "cent vingt-sept" },
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "deux cents" },
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "cinq cent soixante-dix-neuf" },
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "mille" },
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,123", "mille cent vingt-trois" },
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,594", "mille cinq cent quatre-vingt-quatorze" },
420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "deux mille" },
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "trois mille quatre" },
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "quatre mille cinq cent soixante-sept" },
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "quinze mille neuf cent quarante-trois" },
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,345,678", "deux millions trois cent quarante-cinq mille "
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "six cent soixante-dix-huit" },
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-36", "moins trente-six" },
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "234.567", "deux cent trente-quatre virgule cinq six sept" }
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the Swiss French spellout rules
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
436f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSwissFrenchSpellout() {
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("fr", "CH"),
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "un" },
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15", "quinze" },
443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "vingt" },
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21", "vingt-et-un" },
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "vingt-trois" },
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "62", "soixante-deux" },
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "70", "septante" },
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "71", "septante-et-un" },
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "septante-trois" },
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "80", "huitante" },
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "huitante-huit" },
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "cent" },
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "cent six" },
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "cent vingt-sept" },
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "deux cents" },
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "cinq cent septante-neuf" },
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "mille" },
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,123", "mille cent vingt-trois" },
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,594", "mille cinq cent nonante-quatre" },
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "deux mille" },
461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "trois mille quatre" },
462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "quatre mille cinq cent soixante-sept" },
463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "quinze mille neuf cent quarante-trois" },
464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,345,678", "deux millions trois cent quarante-cinq mille "
465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "six cent septante-huit" },
466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-36", "moins trente-six" },
467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "234.567", "deux cent trente-quatre virgule cinq six sept" }
468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the Italian spellout rules
475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
476f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestItalianSpellout() {
478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.ITALIAN,
479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "uno" },
482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15", "quindici" },
483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "venti" },
484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "venti\u00ADtr\u00E9" },
485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "settanta\u00ADtr\u00E9" },
486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "ottant\u00ADotto" },
487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "cento" },
488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "cento\u00ADsei" },
489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "108", "cent\u00ADotto" },
490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "cento\u00ADventi\u00ADsette" },
491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "181", "cent\u00ADottant\u00ADuno" },
492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "due\u00ADcento" },
493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "cinque\u00ADcento\u00ADsettanta\u00ADnove" },
494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "mille" },
495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "due\u00ADmila" },
496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "tre\u00ADmila\u00ADquattro" },
497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "quattro\u00ADmila\u00ADcinque\u00ADcento\u00ADsessanta\u00ADsette" },
498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "quindici\u00ADmila\u00ADnove\u00ADcento\u00ADquaranta\u00ADtr\u00E9" },
499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-36", "meno trenta\u00ADsei" },
500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "234.567", "due\u00ADcento\u00ADtrenta\u00ADquattro virgola cinque sei sette" }
501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the German spellout rules
508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
509f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGermanSpellout() {
511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.GERMANY,
512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "eins" },
515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15", "f\u00fcnfzehn" },
516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20", "zwanzig" },
517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "drei\u00ADund\u00ADzwanzig" },
518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "73", "drei\u00ADund\u00ADsiebzig" },
519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "88", "acht\u00ADund\u00ADachtzig" },
520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "ein\u00ADhundert" },
521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "106", "ein\u00ADhundert\u00ADsechs" },
522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "127", "ein\u00ADhundert\u00ADsieben\u00ADund\u00ADzwanzig" },
523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200", "zwei\u00ADhundert" },
524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "579", "f\u00fcnf\u00ADhundert\u00ADneun\u00ADund\u00ADsiebzig" },
525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "ein\u00ADtausend" },
526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "zwei\u00ADtausend" },
527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,004", "drei\u00ADtausend\u00ADvier" },
528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4,567", "vier\u00ADtausend\u00ADf\u00fcnf\u00ADhundert\u00ADsieben\u00ADund\u00ADsechzig" },
529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "15,943", "f\u00fcnfzehn\u00ADtausend\u00ADneun\u00ADhundert\u00ADdrei\u00ADund\u00ADvierzig" },
530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,345,678", "zwei Millionen drei\u00ADhundert\u00ADf\u00fcnf\u00ADund\u00ADvierzig\u00ADtausend\u00AD"
531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "sechs\u00ADhundert\u00ADacht\u00ADund\u00ADsiebzig" }
532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the Thai spellout rules
539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
540f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestThaiSpellout() {
542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("th", "TH"),
543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0", "\u0e28\u0e39\u0e19\u0e22\u0e4c" },
546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "\u0e2b\u0e19\u0e36\u0e48\u0e07" },
547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10", "\u0e2a\u0e34\u0e1a" },
548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "11", "\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14" },
549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14" },
550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "101", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e23\u0e49\u0e2d\u0e22\u200b\u0e2b\u0e19\u0e36\u0e48\u0e07" },
551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1.234", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e2d\u0e07\u0e2a\u0e32\u0e21\u0e2a\u0e35\u0e48" },
552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" },
553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "22.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e2d\u0e07\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" },
554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e32\u0e21\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" },
555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123.45", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e23\u0e49\u0e2d\u0e22\u200b\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e32\u0e21\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" },
556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,345.678", "\u0E2B\u0E19\u0E36\u0E48\u0E07\u200b\u0E2B\u0E21\u0E37\u0E48\u0E19\u200b\u0E2A\u0E2D\u0E07\u200b\u0E1E\u0E31\u0E19\u200b\u0E2A\u0E32\u0E21\u200b\u0E23\u0E49\u0E2D\u0E22\u200b\u0E2A\u0E35\u0E48\u200b\u0E2A\u0E34\u0E1A\u200b\u0E2B\u0E49\u0E32\u200b\u0E08\u0E38\u0E14\u200b\u0E2B\u0E01\u0E40\u0E08\u0E47\u0E14\u0E41\u0E1B\u0E14" },
557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
558aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the ordinal spellout rules
564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
565f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestPluralRules() {
567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String enRules = "%digits-ordinal:"
568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: −>>;"
569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: =#,##0=$(ordinal,one{st}two{nd}few{rd}other{th})$;";
570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH);
571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestData = {
572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "1st" },
573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2", "2nd" },
574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3", "3rd" },
575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4", "4th" },
576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "11", "11th" },
577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12", "12th" },
578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "13", "13th" },
579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "14", "14th" },
580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21", "21st" },
581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "22", "22nd" },
582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "23", "23rd" },
583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "24", "24th" },
584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestData, true);
587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // This is trying to model the feminine form, but don't worry about the details too much.
589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // We're trying to test the plural rules.
590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String ruRules = "%spellout-numbering:"
591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: минус >>;"
592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "x.x: [<< $(cardinal,one{целый}other{целых})$ ]>%%fractions-feminine>;"
593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: ноль;"
594aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1: один;"
595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "2: два;"
596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "3: три;"
597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "4: четыре;"
598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "5: пять;"
599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "6: шесть;"
600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "7: семь;"
601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "8: восемь;"
602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "9: девять;"
603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "10: десять;"
604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "11: одиннадцать;"
605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "12: двенадцать;"
606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "13: тринадцать;"
607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "14: четырнадцать;"
608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "15: пятнадцать;"
609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "16: шестнадцать;"
610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "17: семнадцать;"
611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "18: восемнадцать;"
612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "19: девятнадцать;"
613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "20: двадцать[ >>];"
614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "30: тридцать[ >>];"
615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "40: сорок[ >>];"
616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "50: пятьдесят[ >>];"
617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "60: шестьдесят[ >>];"
618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "70: семьдесят[ >>];"
619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "80: восемьдесят[ >>];"
620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "90: девяносто[ >>];"
621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "100: сто[ >>];"
622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "200: <<сти[ >>];"
623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "300: <<ста[ >>];"
624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "500: <<сот[ >>];"
625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];"
626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000000: << $(cardinal,one{миллион}few{миллионы}other{миллионов})$[ >>];"
627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "%%fractions-feminine:"
628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "10: <%spellout-numbering< $(cardinal,one{десятая}other{десятых})$;"
629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "100: <%spellout-numbering< $(cardinal,one{сотая}other{сотых})$;";
630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat ruFormatter = new RuleBasedNumberFormat(ruRules, new ULocale("ru"));
631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] ruTestData = {
632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "один" },
633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "100", "сто" },
634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "125", "сто двадцать пять" },
635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "399", "триста девяносто девять" },
636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,000", "один тысяча" },
637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,001", "один тысяча один" },
638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,000", "два тысячи" },
639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,001", "два тысячи один" },
640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,002", "два тысячи два" },
641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3,333", "три тысячи триста тридцать три" },
642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "5,000", "пять тысяч" },
643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "11,000", "одиннадцать тысяч" },
644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21,000", "двадцать один тысяча" },
645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "22,000", "двадцать два тысячи" },
646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "25,001", "двадцать пять тысяч один" },
647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.1", "один десятая" },
648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.2", "два десятых" },
649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.21", "двадцать один сотая" },
650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.22", "двадцать два сотых" },
651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21.1", "двадцать один целый один десятая" },
652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "22.2", "двадцать два целых два десятых" },
653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
654aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
655aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(ruFormatter, ruTestData, true);
656aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
657aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Make sure there are no divide by 0 errors.
658aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String result = new RuleBasedNumberFormat(ruRules, new ULocale("ru")).format(21000);
659aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!"двадцать один тысяча".equals(result)) {
660aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Got " + result + " for 21000");
661aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
662aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
663aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
664aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
665aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Perform a simple spot check on the parsing going into an infinite loop for alternate rules.
666aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
667f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
668aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestMultiplePluralRules() {
669aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // This is trying to model the feminine form, but don't worry about the details too much.
670aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // We're trying to test the plural rules where there are different prefixes.
671aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String ruRules = "%spellout-cardinal-feminine-genitive:"
672aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: минус >>;"
673aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "x.x: << запятая >>;"
674aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: ноля;"
675aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1: одной;"
676aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "2: двух;"
677aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "3: трех;"
678aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "4: четырех;"
679aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "5: пяти;"
680aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "6: шести;"
681aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "7: семи;"
682aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "8: восьми;"
683aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "9: девяти;"
684aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "10: десяти;"
685aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "11: одиннадцати;"
686aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "12: двенадцати;"
687aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "13: тринадцати;"
688aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "14: четырнадцати;"
689aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "15: пятнадцати;"
690aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "16: шестнадцати;"
691aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "17: семнадцати;"
692aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "18: восемнадцати;"
693aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "19: девятнадцати;"
694aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "20: двадцати[ >>];"
695aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "30: тридцати[ >>];"
696aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "40: сорока[ >>];"
697aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "50: пятидесяти[ >>];"
698aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "60: шестидесяти[ >>];"
699aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "70: семидесяти[ >>];"
700aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "80: восемидесяти[ >>];"
701aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "90: девяноста[ >>];"
702aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "100: ста[ >>];"
703aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "200: <<сот[ >>];"
704aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];"
705aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000000: =#,##0=;"
706aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "%spellout-cardinal-feminine:"
707aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: минус >>;"
708aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "x.x: << запятая >>;"
709aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: ноль;"
710aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1: одна;"
711aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "2: две;"
712aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "3: три;"
713aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "4: четыре;"
714aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "5: пять;"
715aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "6: шесть;"
716aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "7: семь;"
717aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "8: восемь;"
718aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "9: девять;"
719aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "10: десять;"
720aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "11: одиннадцать;"
721aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "12: двенадцать;"
722aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "13: тринадцать;"
723aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "14: четырнадцать;"
724aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "15: пятнадцать;"
725aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "16: шестнадцать;"
726aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "17: семнадцать;"
727aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "18: восемнадцать;"
728aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "19: девятнадцать;"
729aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "20: двадцать[ >>];"
730aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "30: тридцать[ >>];"
731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "40: сорок[ >>];"
732aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "50: пятьдесят[ >>];"
733aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "60: шестьдесят[ >>];"
734aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "70: семьдесят[ >>];"
735aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "80: восемьдесят[ >>];"
736aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "90: девяносто[ >>];"
737aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "100: сто[ >>];"
738aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "200: <<сти[ >>];"
739aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "300: <<ста[ >>];"
740aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "500: <<сот[ >>];"
741aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];"
742aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1000000: =#,##0=;";
743aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat ruFormatter = new RuleBasedNumberFormat(ruRules, new ULocale("ru"));
744aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
745aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Number result;
746aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000))).doubleValue()) {
747aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("RuleBasedNumberFormat did not return the correct value. Got: " + result);
748aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
749aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000, "%spellout-cardinal-feminine-genitive"))).doubleValue()) {
750aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("RuleBasedNumberFormat did not return the correct value. Got: " + result);
751aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
752aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000, "%spellout-cardinal-feminine"))).doubleValue()) {
753aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("RuleBasedNumberFormat did not return the correct value. Got: " + result);
754aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
755aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
756aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (ParseException e) {
757aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(e.toString());
758aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
759aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
760aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
761f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
762aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestFractionalRuleSet() {
763aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(fracRules,
764aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                Locale.ENGLISH);
765aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
766aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
767aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0", "0" },
768aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "1" },
769aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10", "10" },
770aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".1", "1/10" },
771aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".11", "1/9" },
772aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".125", "1/8" },
773aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".1428", "1/7" },
774aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".1667", "1/6" },
775aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".2", "1/5" },
776aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".25", "1/4" },
777aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".333", "1/3" },
778aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".5", "1/2" },
779aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1.1", "1 1/10" },
780aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2.11", "2 1/9" },
781aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "3.125", "3 1/8" },
782aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "4.1428", "4 1/7" },
783aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "5.1667", "5 1/6" },
784aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "6.2", "6 1/5" },
785aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "7.25", "7 1/4" },
786aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "8.333", "8 1/3" },
787aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "9.5", "9 1/2" },
788aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".2222", "2/9" },
789aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".4444", "4/9" },
790aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { ".5555", "5/9" },
791aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1.2856", "1 2/7" }
792aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
793aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, false); // exact values aren't parsable from fractions
794aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
795aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
796f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
797aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSwedishSpellout()
798aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
799aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale locale = new Locale("sv", "", "");
800aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(locale,
801aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat.SPELLOUT);
802aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
803aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testDataDefault = {
804aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "101", "ett\u00ADhundra\u00ADett" },
805aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123", "ett\u00ADhundra\u00ADtjugo\u00ADtre" },
806aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,001", "et\u00ADtusen ett" },
807aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,100", "et\u00ADtusen ett\u00ADhundra" },
808aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,101", "et\u00ADtusen ett\u00ADhundra\u00ADett" },
809aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,234", "et\u00ADtusen tv\u00e5\u00ADhundra\u00ADtrettio\u00ADfyra" },
810aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,001", "tio\u00ADtusen ett" },
811aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "11,000", "elva\u00ADtusen" },
812aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,000", "tolv\u00ADtusen" },
813aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "20,000", "tjugo\u00ADtusen" },
814aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21,000", "tjugo\u00ADet\u00ADtusen" },
815aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21,001", "tjugo\u00ADet\u00ADtusen ett" },
816aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200,000", "tv\u00e5\u00ADhundra\u00ADtusen" },
817aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "201,000", "tv\u00e5\u00ADhundra\u00ADet\u00ADtusen" },
818aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "200,200", "tv\u00e5\u00ADhundra\u00ADtusen tv\u00e5\u00ADhundra" },
819aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,002,000", "tv\u00e5 miljoner tv\u00e5\u00ADtusen" },
820aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,345,678", "tolv miljoner tre\u00ADhundra\u00ADfyrtio\u00ADfem\u00ADtusen sex\u00ADhundra\u00ADsjuttio\u00AD\u00e5tta" },
821aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123,456.789", "ett\u00ADhundra\u00ADtjugo\u00ADtre\u00ADtusen fyra\u00ADhundra\u00ADfemtio\u00ADsex komma sju \u00e5tta nio" },
822aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "-12,345.678", "minus tolv\u00ADtusen tre\u00ADhundra\u00ADfyrtio\u00ADfem komma sex sju \u00e5tta" },
823aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
824aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
825aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("testing default rules");
826aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testDataDefault, true);
827aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
828aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testDataNeutrum = {
829aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "101", "ett\u00adhundra\u00adett" },
830aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,001", "et\u00adtusen ett" },
831aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,101", "et\u00adtusen ett\u00adhundra\u00adett" },
832aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,001", "tio\u00adtusen ett" },
833aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "21,001", "tjugo\u00adet\u00adtusen ett" }
834aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
835aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
836aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        formatter.setDefaultRuleSet("%spellout-cardinal-neuter");
837aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("testing neutrum rules");
838aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testDataNeutrum, true);
839aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
840aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testDataYear = {
841aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "101", "ett\u00adhundra\u00adett" },
842aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "900", "nio\u00adhundra" },
843aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,001", "et\u00adtusen ett" },
844aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,100", "elva\u00adhundra" },
845aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,101", "elva\u00adhundra\u00adett" },
846aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,234", "tolv\u00adhundra\u00adtrettio\u00adfyra" },
847aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "2,001", "tjugo\u00adhundra\u00adett" },
848aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,001", "tio\u00adtusen ett" }
849aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
850aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
851aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        formatter.setDefaultRuleSet("%spellout-numbering-year");
852aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("testing year rules");
853aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testDataYear, true);
854aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
855aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
856f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
857aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestBigNumbers() {
858aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BigInteger bigI = new BigInteger("1234567890", 10);
859aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringBuffer buf = new StringBuffer();
860aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat fmt = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT);
861aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        fmt.format(bigI, buf, null);
862aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("big int: " + buf.toString());
863aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
864aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        buf.setLength(0);
865aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        java.math.BigDecimal bigD = new java.math.BigDecimal(bigI);
866aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        fmt.format(bigD, buf, null);
867aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("big dec: " + buf.toString());
868aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
869aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
870f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
871aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestTrailingSemicolon() {
872aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String thaiRules =
873aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "%default:\n" +
874aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  -x: \u0e25\u0e1a>>;\n" +
875aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  x.x: <<\u0e08\u0e38\u0e14>>>;\n" +
876aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e28\u0e39\u0e19\u0e22\u0e4c; \u0e2b\u0e19\u0e36\u0e48\u0e07; \u0e2a\u0e2d\u0e07; \u0e2a\u0e32\u0e21;\n" +
877aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e2a\u0e35\u0e48; \u0e2b\u0e49\u0e32; \u0e2b\u0e01; \u0e40\u0e08\u0e47\u0e14; \u0e41\u0e1b\u0e14;\n" +
878aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e40\u0e01\u0e49\u0e32; \u0e2a\u0e34\u0e1a; \u0e2a\u0e34\u0e1a\u0e40\u0e2d\u0e47\u0e14;\n" +
879aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e2a\u0e34\u0e1a\u0e2a\u0e2d\u0e07; \u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21;\n" +
880aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e2a\u0e34\u0e1a\u0e2a\u0e35\u0e48; \u0e2a\u0e34\u0e1a\u0e2b\u0e49\u0e32;\n" +
881aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e2a\u0e34\u0e1a\u0e2b\u0e01; \u0e2a\u0e34\u0e1a\u0e40\u0e08\u0e47\u0e14;\n" +
882aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e2a\u0e34\u0e1a\u0e41\u0e1b\u0e14; \u0e2a\u0e34\u0e1a\u0e40\u0e01\u0e49\u0e32;\n" +
883aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  20: \u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
884aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  30: \u0e2a\u0e32\u0e21\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
885aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  40: \u0e2a\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
886aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  50: \u0e2b\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
887aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  60: \u0e2b\u0e01\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
888aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  70: \u0e40\u0e08\u0e47\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
889aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  80: \u0e41\u0e1b\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
890aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  90: \u0e40\u0e01\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" +
891aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  100: <<\u0e23\u0e49\u0e2d\u0e22[>>];\n" +
892aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  1000: <<\u0e1e\u0e31\u0e19[>>];\n" +
893aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  10000: <<\u0e2b\u0e21\u0e37\u0e48\u0e19[>>];\n" +
894aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  100000: <<\u0e41\u0e2a\u0e19[>>];\n" +
895aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  1,000,000: <<\u0e25\u0e49\u0e32\u0e19[>>];\n" +
896aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  1,000,000,000: <<\u0e1e\u0e31\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" +
897aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  1,000,000,000,000: <<\u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" +
898aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  1,000,000,000,000,000: =#,##0=;\n" +
899aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "%%alt-ones:\n" +
900aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e28\u0e39\u0e19\u0e22\u0e4c;\n" +
901aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  \u0e40\u0e2d\u0e47\u0e14;\n" +
902aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "  =%default=;\n ; ;; ";
903aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
904aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(thaiRules, new Locale("th", "TH", ""));
905aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
906aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
907aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0", "\u0e28\u0e39\u0e19\u0e22\u0e4c" },
908aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1", "\u0e2b\u0e19\u0e36\u0e48\u0e07" },
909aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123.45", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e23\u0e49\u0e2d\u0e22\u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21\u0e08\u0e38\u0e14\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" }
910aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
911aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
912aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
913aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
914aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
915f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
916aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSmallValues() {
917aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] testData = {
918aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.001", "zero point zero zero one" },
919aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.0001", "zero point zero zero zero one" },
920aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.00001", "zero point zero zero zero zero one" },
921aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.000001", "zero point zero zero zero zero zero one" },
922aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.0000001", "zero point zero zero zero zero zero zero one" },
923aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.00000001", "zero point zero zero zero zero zero zero zero one" },
924aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.000000001", "zero point zero zero zero zero zero zero zero zero one" },
925aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.0000000001", "zero point zero zero zero zero zero zero zero zero zero one" },
926aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.00000000001", "zero point zero zero zero zero zero zero zero zero zero zero one" },
927aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero one" },
928aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.0000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero one" },
929aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.00000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero one" },
930aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.000000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero zero one" },
931aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.001", "ten million point zero zero one" },
932aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.0001", "ten million point zero zero zero one" },
933aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.00001", "ten million point zero zero zero zero one" },
934aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.000001", "ten million point zero zero zero zero zero one" },
935aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.0000001", "ten million point zero zero zero zero zero zero one" },
936aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.00000001", "ten million point zero zero zero zero zero zero zero one" },
937aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000.000000002", "ten million point zero zero zero zero zero zero zero zero two" },
938aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "10,000,000", "ten million" },
939aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,234,567,890.0987654", "one billion two hundred thirty-four million five hundred sixty-seven thousand eight hundred ninety point zero nine eight seven six five four" },
940aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123,456,789.9876543", "one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine point nine eight seven six five four three" },
941aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,345,678.87654321", "twelve million three hundred forty-five thousand six hundred seventy-eight point eight seven six five four three two one" },
942aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,234,567.7654321", "one million two hundred thirty-four thousand five hundred sixty-seven point seven six five four three two one" },
943aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123,456.654321", "one hundred twenty-three thousand four hundred fifty-six point six five four three two one" },
944aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "12,345.54321", "twelve thousand three hundred forty-five point five four three two one" },
945aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "1,234.4321", "one thousand two hundred thirty-four point four three two one" },
946aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "123.321", "one hundred twenty-three point three two one" },
947aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.0000000011754944", "zero point zero zero zero zero zero zero zero zero one one seven five four nine four four" },
948aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                { "0.000001175494351", "zero point zero zero zero zero zero one one seven five four nine four three five one" },
949aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
950aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
951aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US, RuleBasedNumberFormat.SPELLOUT);
952aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(formatter, testData, true);
953aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
954aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
955f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
956aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestRuleSetDisplayName() {
957495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        /*
958aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * Spellout rules for U.K. English.
959495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert         * This was borrowed from the rule sets for TestRuleSetDisplayName()
960aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
961aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final String ukEnglish =
962aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "%simplified:\n"
963aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    -x: minus >>;\n"
964aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    x.x: << point >>;\n"
965aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    zero; one; two; three; four; five; six; seven; eight; nine;\n"
966aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n"
967aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "        seventeen; eighteen; nineteen;\n"
968aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    20: twenty[->>];\n"
969aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    30: thirty[->>];\n"
970aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    40: forty[->>];\n"
971aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    50: fifty[->>];\n"
972aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60: sixty[->>];\n"
973aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    70: seventy[->>];\n"
974aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    80: eighty[->>];\n"
975aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    90: ninety[->>];\n"
976aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100: << hundred[ >>];\n"
977aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1000: << thousand[ >>];\n"
978aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000: << million[ >>];\n"
979aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000: << billion[ >>];\n"
980aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000,000: =#,##0=;\n"
981aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%alt-teens:\n"
982aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    =%simplified=;\n"
983aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1000>: <%%alt-hundreds<[ >>];\n"
984aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    10,000: =%simplified=;\n"
985aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000: << million[ >%simplified>];\n"
986aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000: << billion[ >%simplified>];\n"
987aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000,000: =#,##0=;\n"
988aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%alt-hundreds:\n"
989aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0: SHOULD NEVER GET HERE!;\n"
990aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    10: <%simplified< thousand;\n"
991aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    11: =%simplified= hundred>%%empty>;\n"
992aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%empty:\n"
993aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    0:;"
994aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%ordinal:\n"
995aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    zeroth; first; second; third; fourth; fifth; sixth; seventh;\n"
996aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "        eighth; ninth;\n"
997aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    tenth; eleventh; twelfth; thirteenth; fourteenth;\n"
998aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "        fifteenth; sixteenth; seventeenth; eighteenth;\n"
999aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "        nineteenth;\n"
1000aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    twentieth; twenty->>;\n"
1001aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    30: thirtieth; thirty->>;\n"
1002aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    40: fortieth; forty->>;\n"
1003aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    50: fiftieth; fifty->>;\n"
1004aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    60: sixtieth; sixty->>;\n"
1005aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    70: seventieth; seventy->>;\n"
1006aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    80: eightieth; eighty->>;\n"
1007aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    90: ninetieth; ninety->>;\n"
1008aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100: <%simplified< hundredth; <%simplified< hundred >>;\n"
1009aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1000: <%simplified< thousandth; <%simplified< thousand >>;\n"
1010aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000: <%simplified< millionth; <%simplified< million >>;\n"
1011aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000: <%simplified< billionth;\n"
1012aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "        <%simplified< billion >>;\n"
1013aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000,000: =#,##0=;"
1014aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%default:\n"
1015aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    -x: minus >>;\n"
1016aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    x.x: << point >>;\n"
1017aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    =%simplified=;\n"
1018aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100: << hundred[ >%%and>];\n"
1019aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1000: << thousand[ >%%and>];\n"
1020aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100,000>>: << thousand[>%%commas>];\n"
1021aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000: << million[>%%commas>];\n"
1022aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000: << billion[>%%commas>];\n"
1023aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000,000,000,000: =#,##0=;\n"
1024aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%and:\n"
1025aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    and =%default=;\n"
1026aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100: =%default=;\n"
1027aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%commas:\n"
1028aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    ' and =%default=;\n"
1029aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    100: , =%default=;\n"
1030aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1000: , <%default< thousand, >%default>;\n"
1031aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    1,000,000: , =%default=;"
1032aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "%%lenient-parse:\n"
1033aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        + "    & ' ' , ',' ;\n";
1034aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale.setDefault(ULocale.US);
1035aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] localizations = new String[][] {
1036aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /* public rule sets*/
1037aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"%simplified", "%default", "%ordinal"},
1038aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /* display names in "en_US" locale*/
1039aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"en_US", "Simplified", "Default", "Ordinal"},
1040aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /* display names in "zh_Hans" locale*/
1041aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"zh_Hans", "\u7B80\u5316", "\u7F3A\u7701",  "\u5E8F\u5217"},
1042aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /* display names in a fake locale*/
1043aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"foo_Bar_BAZ", "Simplified", "Default", "Ordinal"}
1044aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1045aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1046aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //Construct RuleBasedNumberFormat by rule sets and localizations list
1047aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat formatter
1048aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                = new RuleBasedNumberFormat(ukEnglish, localizations, ULocale.US);
1049aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat f2= new RuleBasedNumberFormat(ukEnglish, localizations);
1050aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("Check the two formatters' equality", formatter.equals(f2));
1051aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1052aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //get displayName by name
1053aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] ruleSetNames = formatter.getRuleSetNames();
1054aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<ruleSetNames.length; i++) {
1055aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("Rule set name: " + ruleSetNames[i]);
1056aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String RSName_defLoc = formatter.getRuleSetDisplayName(ruleSetNames[i]);
1057aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("Display name in default locale", localizations[1][i+1], RSName_defLoc);
1058aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String RSName_loc = formatter.getRuleSetDisplayName(ruleSetNames[i], ULocale.CHINA);
1059aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("Display name in Chinese", localizations[2][i+1], RSName_loc);
1060aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1061aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1062aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // getDefaultRuleSetName
1063aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String defaultRS = formatter.getDefaultRuleSetName();
1064aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //you know that the default rule set is %simplified according to rule sets string ukEnglish
1065aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEquals("getDefaultRuleSetName", "%simplified", defaultRS);
1066aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1067aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //get locales of localizations
1068aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ULocale[] locales = formatter.getRuleSetDisplayNameLocales();
1069aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<locales.length; i++) {
1070aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln(locales[i].getName());
1071aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1072aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1073aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //get displayNames
1074aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] RSNames_defLoc = formatter.getRuleSetDisplayNames();
1075aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<RSNames_defLoc.length; i++) {
1076aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getRuleSetDisplayNames in default locale", localizations[1][i+1], RSNames_defLoc[i]);
1077aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1078aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1079aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] RSNames_loc = formatter.getRuleSetDisplayNames(ULocale.UK);
1080aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<RSNames_loc.length; i++) {
1081aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getRuleSetDisplayNames in English", localizations[1][i+1], RSNames_loc[i]);
1082aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1083aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1084aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RSNames_loc = formatter.getRuleSetDisplayNames(ULocale.CHINA);
1085aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<RSNames_loc.length; i++) {
1086aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getRuleSetDisplayNames in Chinese", localizations[2][i+1], RSNames_loc[i]);
1087aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1088aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1089aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RSNames_loc = formatter.getRuleSetDisplayNames(new ULocale("foo_Bar_BAZ"));
1090aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i=0; i<RSNames_loc.length; i++) {
1091aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            assertEquals("getRuleSetDisplayNames in fake locale", localizations[3][i+1], RSNames_loc[i]);
1092aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1093aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1094aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1095f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1096aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestAllLocales() {
1097aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringBuilder errors = new StringBuilder();
1098aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] names = {
1099aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                " (spellout) ",
1100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                " (ordinal) "
1101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                //" (duration) " // English only
1102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        double[] numbers = {45.678, 1, 2, 10, 11, 100, 110, 200, 1000, 1111, -1111};
1104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count = numbers.length;
1105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Random r = (count <= numbers.length ? null : createRandom());
1106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (ULocale loc : NumberFormat.getAvailableULocales()) {
1108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int j = 0; j < names.length; ++j) {
1109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                RuleBasedNumberFormat fmt = new RuleBasedNumberFormat(loc, j+1);
1110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!loc.equals(fmt.getLocale(ULocale.ACTUAL_LOCALE))) {
1111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    // Skip the redundancy
1112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    break;
1113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int c = 0; c < count; c++) {
1116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    double n;
1117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (c < numbers.length) {
1118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        n = numbers[c];
1119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } else {
1120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        n = (r.nextInt(10000) - 3000) / 16d;
1121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String s = fmt.format(n);
1124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (isVerbose()) {
1125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        logln(loc.getName() + names[j] + "success format: " + n + " -> " + s);
1126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    try {
1129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // RBNF parse is extremely slow when lenient option is enabled.
1130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        // non-lenient parse
1131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        fmt.setLenientParseMode(false);
1132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        Number num = fmt.parse(s);
1133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (isVerbose()) {
1134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            logln(loc.getName() + names[j] + "success parse: " + s + " -> " + num);
1135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
1136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (j != 0) {
1137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            // TODO: Fix the ordinal rules.
1138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            continue;
1139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
1140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (n != num.doubleValue()) {
1141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            errors.append("\n" + loc + names[j] + "got " + num + " expected " + n);
1142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
1143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } catch (ParseException pe) {
1144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        String msg = loc.getName() + names[j] + "ERROR:" + pe.getMessage();
1145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        logln(msg);
1146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errors.append("\n" + msg);
1147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (errors.length() > 0) {
1152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln(errors.toString());
1153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    void doTest(RuleBasedNumberFormat formatter, String[][] testData,
1157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                boolean testParsing) {
1158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //        NumberFormat decFmt = NumberFormat.getInstance(Locale.US);
1159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        NumberFormat decFmt = new DecimalFormat("#,###.################");
1160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < testData.length; i++) {
1162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String number = testData[i][0];
1163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String expectedWords = testData[i][1];
1164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (isVerbose()) {
1165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    logln("test[" + i + "] number: " + number + " target: " + expectedWords);
1166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                Number num = decFmt.parse(number);
1168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String actualWords = formatter.format(num);
1169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!actualWords.equals(expectedWords)) {
1171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Spot check format failed: for " + number + ", expected\n    "
1172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            + expectedWords + ", but got\n    " +
1173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            actualWords);
1174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                else if (testParsing) {
1176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String actualNumber = decFmt.format(formatter
1177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            .parse(actualWords));
1178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (!actualNumber.equals(number)) {
1180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Spot check parse failed: for " + actualWords +
1181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                ", expected " + number + ", but got " +
1182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                actualNumber);
1183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        catch (Throwable e) {
1188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            e.printStackTrace();
1189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Test failed with exception: " + e.toString());
1190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* Tests the method
1194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      public boolean equals(Object that)
1195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1196f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestEquals(){
1198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when "if (!(that instanceof RuleBasedNumberFormat))" is true
1199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy");
1200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (rbnf.equals("dummy") ||
1201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(new Character('a')) ||
1202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(new Object()) ||
1203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(-1) ||
1204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(0) ||
1205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(1) ||
1206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(-1.0) ||
1207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(0.0) ||
1208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.equals(1.0))
1209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
1210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was suppose to " +
1211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when
1215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // "if (!locale.equals(that2.locale) || lenientParse != that2.lenientParse)"
1216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // is true
1217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf1 = new RuleBasedNumberFormat("dummy", new Locale("en"));
1218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf2 = new RuleBasedNumberFormat("dummy", new Locale("jp"));
1219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf3 = new RuleBasedNumberFormat("dummy", new Locale("sp"));
1220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf4 = new RuleBasedNumberFormat("dummy", new Locale("fr"));
1221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(rbnf1.equals(rbnf2) || rbnf1.equals(rbnf3) ||
1223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf1.equals(rbnf4) || rbnf2.equals(rbnf3) ||
1224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf2.equals(rbnf4) || rbnf3.equals(rbnf4)){
1225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was suppose to " +
1226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(!rbnf1.equals(rbnf1)){
1230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " +
1231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(!rbnf2.equals(rbnf2)){
1235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " +
1236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(!rbnf3.equals(rbnf3)){
1240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " +
1241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(!rbnf4.equals(rbnf4)){
1245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " +
1246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf5 = new RuleBasedNumberFormat("dummy", new Locale("en"));
1250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf6 = new RuleBasedNumberFormat("dummy", new Locale("en"));
1251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(!rbnf5.equals(rbnf6)){
1253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " +
1254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        rbnf6.setLenientParseMode(true);
1257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(rbnf5.equals(rbnf6)){
1259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was suppose to " +
1260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when "if (!ruleSets[i].equals(that2.ruleSets[i]))" is true
1264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf7 = new RuleBasedNumberFormat("not_dummy", new Locale("en"));
1265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(rbnf5.equals(rbnf7)){
1266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.equals(Object that) was suppose to " +
1267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "be false for an invalid object.");
1268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* Tests the method
1272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      public ULocale[] getRuleSetDisplayNameLocales()
1273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1274f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetRuleDisplayNameLocales(){
1276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when "if (ruleSetDisplayNames != null" is false
1277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy");
1278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        rbnf.getRuleSetDisplayNameLocales();
1279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if(rbnf.getRuleSetDisplayNameLocales() != null){
1280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.getRuleDisplayNameLocales() was suppose to " +
1281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "return null.");
1282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* Tests the method
1286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      private String[] getNameListForLocale(ULocale loc)
1287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      public String[] getRuleSetDisplayNames(ULocale loc)
1288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1289f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetNameListForLocale(){
1291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when "if (names != null)" is false and
1292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //  "if (loc != null && ruleSetDisplayNames != null)" is false
1293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy");
1294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        rbnf.getRuleSetDisplayNames(null);
1295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
1296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbnf.getRuleSetDisplayNames(null);
1297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch(Exception e){
1298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.getRuleSetDisplayNames(ULocale loc) " +
1299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "was not suppose to have an exception.");
1300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* Tests the method
1304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      public String getRuleSetDisplayName(String ruleSetName, ULocale loc)
1305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1306f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetRulesSetDisplayName(){
1308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy");
1309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //rbnf.getRuleSetDisplayName("dummy", new ULocale("en_US"));
1310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when "if (names != null) " is true
1312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Tests when the method throws an exception
1314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
1315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbnf.getRuleSetDisplayName("", new ULocale("en_US"));
1316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.getRuleSetDisplayName(String ruleSetName, ULocale loc) " +
1317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "was suppose to have an exception.");
1318495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        } catch(Exception ignored){}
1319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
1321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbnf.getRuleSetDisplayName("dummy", new ULocale("en_US"));
1322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("RuleBasedNumberFormat.getRuleSetDisplayName(String ruleSetName, ULocale loc) " +
1323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    "was suppose to have an exception.");
1324495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        } catch(Exception ignored){}
1325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /* Test the method
1328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *      public void process(StringBuffer buf, NFRuleSet ruleSet)
1329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
1330f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestChineseProcess(){
1332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String ruleWithChinese =
1333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "%simplified:\n"
1334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    -x: minus >>;\n"
1335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    x.x: << point >>;\n"
1336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    zero; one; two; three; four; five; six; seven; eight; nine;\n"
1337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n"
1338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        seventeen; eighteen; nineteen;\n"
1339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    20: twenty[->>];\n"
1340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    30: thirty[->>];\n"
1341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    40: forty[->>];\n"
1342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    50: fifty[->>];\n"
1343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60: sixty[->>];\n"
1344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    70: seventy[->>];\n"
1345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    80: eighty[->>];\n"
1346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    90: ninety[->>];\n"
1347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: << hundred[ >>];\n"
1348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000: << thousand[ >>];\n"
1349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: << million[ >>];\n"
1350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000: << billion[ >>];\n"
1351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000,000: =#,##0=;\n"
1352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%alt-teens:\n"
1353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    =%simplified=;\n"
1354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000>: <%%alt-hundreds<[ >>];\n"
1355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    10,000: =%simplified=;\n"
1356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: << million[ >%simplified>];\n"
1357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000: << billion[ >%simplified>];\n"
1358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000,000: =#,##0=;\n"
1359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%alt-hundreds:\n"
1360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    0: SHOULD NEVER GET HERE!;\n"
1361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    10: <%simplified< thousand;\n"
1362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    11: =%simplified= hundred>%%empty>;\n"
1363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%empty:\n"
1364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    0:;"
1365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%accounting:\n"
1366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n"
1367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        \u842c; \u842c;\n"
1368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    \u842c; \u842c; \u842c; \u842c; \u842c;\n"
1369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        \u842c; \u842c; \u842c; \u842c;\n"
1370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        \u842c;\n"
1371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    twentieth; \u96f6|>>;\n"
1372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    30: \u96f6; \u96f6|>>;\n"
1373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    40: \u96f6; \u96f6|>>;\n"
1374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    50: \u96f6; \u96f6|>>;\n"
1375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60: \u96f6; \u96f6|>>;\n"
1376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    70: \u96f6; \u96f6|>>;\n"
1377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    80: \u96f6; \u96f6|>>;\n"
1378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    90: \u96f6; \u96f6|>>;\n"
1379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n"
1380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n"
1381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n"
1382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000: <%simplified< \u96f6;\n"
1383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        <%simplified< \u96f6 >>;\n"
1384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000,000: =#,##0=;"
1385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%default:\n"
1386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    -x: minus >>;\n"
1387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    x.x: << point >>;\n"
1388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    =%simplified=;\n"
1389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: << hundred[ >%%and>];\n"
1390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000: << thousand[ >%%and>];\n"
1391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100,000>>: << thousand[>%%commas>];\n"
1392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: << million[>%%commas>];\n"
1393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000: << billion[>%%commas>];\n"
1394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000,000: =#,##0=;\n"
1395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%and:\n"
1396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    and =%default=;\n"
1397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: =%default=;\n"
1398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%commas:\n"
1399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    ' and =%default=;\n"
1400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: , =%default=;\n"
1401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000: , <%default< thousand, >%default>;\n"
1402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: , =%default=;"
1403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%traditional:\n"
1404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    -x: \u3007| >>;\n"
1405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    x.x: << \u9ede >>;\n"
1406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n"
1407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n"
1408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "        \u842c; \u842c; \u842c;\n"
1409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    20: \u842c[->>];\n"
1410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    30: \u842c[->>];\n"
1411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    40: \u842c[->>];\n"
1412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    50: \u842c[->>];\n"
1413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60: \u842c[->>];\n"
1414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    70: \u842c[->>];\n"
1415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    80: \u842c[->>];\n"
1416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    90: \u842c[->>];\n"
1417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    100: << \u842c[ >>];\n"
1418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1000: << \u842c[ >>];\n"
1419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000: << \u842c[ >>];\n"
1420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000: << \u842c[ >>];\n"
1421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    1,000,000,000,000,000: =#,##0=;\n"
1422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%time:\n"
1423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    =0= sec.;\n"
1424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60: =%%min-sec=;\n"
1425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    3600: =%%hr-min-sec=;\n"
1426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%min-sec:\n"
1427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    0: *=00=;\n"
1428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60/60: <0<>>;\n"
1429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%hr-min-sec:\n"
1430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    0: *=00=;\n"
1431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    60/60: <00<>>;\n"
1432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "    3600/60: <#,##0<:>>>;\n"
1433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            + "%%post-process:android.icu.text.RBNFChinesePostProcessor\n";
1434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf =  new RuleBasedNumberFormat(ruleWithChinese, ULocale.CHINESE);
1436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] ruleNames = rbnf.getRuleSetNames();
1437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
1438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // Test with "null" rules
1439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbnf.format(0.0, null);
1440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("This was suppose to return an exception for a null format");
1441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch(Exception e){}
1442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for(int i=0; i<ruleNames.length; i++){
1443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try{
1444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                rbnf.format(-123450.6789,ruleNames[i]);
1445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch(Exception e){
1446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("RBNFChinesePostProcessor was not suppose to return an exception " +
1447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        "when being formatted with parameters 0.0 and " + ruleNames[i]);
1448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1452f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSetDecimalFormatSymbols() {
1454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(Locale.ENGLISH, RuleBasedNumberFormat.ORDINAL);
1455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.ENGLISH);
1457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        double number = 1001;
1459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[] expected = { "1,001st", "1&001st" };
1461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String result = rbnf.format(number);
1463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!result.equals(expected[0])) {
1464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Format Error - Got: " + result + " Expected: " + expected[0]);
1465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* Set new symbol for testing */
1468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        dfs.setGroupingSeparator('&');
1469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        rbnf.setDecimalFormatSymbols(dfs);
1470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        result = rbnf.format(number);
1472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!result.equals(expected[1])) {
1473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Format Error - Got: " + result + " Expected: " + expected[1]);
1474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1477f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestContext() {
1479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class TextContextItem {
1480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String locale;
1481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public int format;
1482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public DisplayContext context;
1483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public double value;
1484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String expectedResult;
1485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // Simple constructor
1486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public TextContextItem(String loc, int fmt, DisplayContext ctxt, double val, String expRes) {
1487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                locale = loc;
1488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                format = fmt;
1489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                context = ctxt;
1490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                value = val;
1491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                expectedResult = expRes;
1492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        final TextContextItem[] items = {
1495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,    123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ),
1496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, 123.45, "Ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ),
1497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU,       123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ),
1498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_STANDALONE,            123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ),
1499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,    123.45, "one hundred twenty-three point four five" ),
1500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, 123.45, "One hundred twenty-three point four five" ),
1501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU,       123.45, "One hundred twenty-three point four five" ),
1502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_STANDALONE,            123.45, "One hundred twenty-three point four five" ),
1503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (TextContextItem item: items) {
1505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale locale = new ULocale(item.locale);
1506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(locale, item.format);
1507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            rbnf.setContext(item.context);
1508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String result = rbnf.format(item.value, rbnf.getDefaultRuleSetName());
1509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!result.equals(item.expectedResult)) {
1510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error for locale " + item.locale + ", context " + item.context + ", expected " + item.expectedResult + ", got " + result);
1511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedNumberFormat rbnfClone = (RuleBasedNumberFormat)rbnf.clone();
1513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!rbnfClone.equals(rbnf)) {
1514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error for locale " + item.locale + ", context " + item.context + ", rbnf.clone() != rbnf");
1515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
1516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result = rbnfClone.format(item.value, rbnfClone.getDefaultRuleSetName());
1517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!result.equals(item.expectedResult)) {
1518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Error with clone for locale " + item.locale + ", context " + item.context + ", expected " + item.expectedResult + ", got " + result);
1519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1524f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestInfinityNaN() {
1526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String enRules = "%default:"
1527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: minus >>;"
1528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "Inf: infinite;"
1529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "NaN: not a number;"
1530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: =#,##0=;";
1531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH);
1532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestData = {
1533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1", "1"},
1534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"\u221E", "infinite"},
1535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"-\u221E", "minus infinite"},
1536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"NaN", "not a number"},
1537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestData, true);
1541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // Test the default behavior when the rules are undefined.
1543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enRules = "%default:"
1544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: ->>;"
1545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: =#,##0=;";
1546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH);
1547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enDefaultTestData = {
1548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1", "1"},
1549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"\u221E", "∞"},
1550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"-\u221E", "-∞"},
1551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"NaN", "NaN"},
1552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enDefaultTestData, true);
1556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1558f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestVariableDecimalPoint() {
1560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String enRules = "%spellout-numbering:"
1561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "-x: minus >>;"
1562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "x.x: << point >>;"
1563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "x,x: << comma >>;"
1564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0.x: xpoint >>;"
1565aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0,x: xcomma >>;"
1566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "0: zero;"
1567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "1: one;"
1568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "2: two;"
1569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "3: three;"
1570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "4: four;"
1571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "5: five;"
1572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "6: six;"
1573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "7: seven;"
1574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "8: eight;"
1575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                + "9: nine;";
1576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH);
1577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestPointData = {
1578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.1", "one point one"},
1579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.23", "one point two three"},
1580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.4", "xpoint four"},
1581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestPointData, true);
1583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(ULocale.ENGLISH);
1584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        decimalFormatSymbols.setDecimalSeparator(',');
1585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setDecimalFormatSymbols(decimalFormatSymbols);
1586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestCommaData = {
1587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.1", "one comma one"},
1588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.23", "one comma two three"},
1589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.4", "xcomma four"},
1590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestCommaData, true);
1592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1594f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestRounding() {
1596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT);
1597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestFullData = {
1598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0", "zero"},
1599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.4", "zero point four"},
1600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.49", "zero point four nine"},
1601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.5", "zero point five"},
1602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.51", "zero point five one"},
1603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.99", "zero point nine nine"},
1604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1", "one"},
1605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.01", "one point zero one"},
1606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.49", "one point four nine"},
1607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.5", "one point five"},
1608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.51", "one point five one"},
1609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"450359962737049.6", "four hundred fifty trillion three hundred fifty-nine billion nine hundred sixty-two million seven hundred thirty-seven thousand forty-nine point six"}, // 2^52 / 10
1610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"450359962737049.7", "four hundred fifty trillion three hundred fifty-nine billion nine hundred sixty-two million seven hundred thirty-seven thousand forty-nine point seven"}, // 2^52 + 1 / 10
1611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestFullData, false);
1613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setMaximumFractionDigits(0);
1615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setRoundingMode(BigDecimal.ROUND_HALF_EVEN);
1616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestIntegerData = {
1617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0", "zero"},
1618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.4", "zero"},
1619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.49", "zero"},
1620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.5", "zero"},
1621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.51", "one"},
1622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.99", "one"},
1623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1", "one"},
1624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.01", "one"},
1625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.49", "one"},
1626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.5", "two"},
1627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"1.51", "two"},
1628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestIntegerData, false);
1630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setMaximumFractionDigits(1);
1632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setRoundingMode(BigDecimal.ROUND_HALF_EVEN);
1633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestTwoDigitsData = {
1634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0", "zero"},
1635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.04", "zero"},
1636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.049", "zero"},
1637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.05", "zero"},
1638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.051", "zero point one"},
1639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"0.099", "zero point one"},
1640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"10.11", "ten point one"},
1641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"10.149", "ten point one"},
1642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"10.15", "ten point two"},
1643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"10.151", "ten point two"},
1644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestTwoDigitsData, false);
1646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setMaximumFractionDigits(3);
1648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        enFormatter.setRoundingMode(BigDecimal.ROUND_DOWN);
1649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String[][] enTestThreeDigitsDownData = {
1650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {"4.3", "four point three"}, // Not 4.299!
1651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        doTest(enFormatter, enTestThreeDigitsDownData, false);
1653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1654f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1655f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1656f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    public void testLargeNumbers() {
1657f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(ULocale.US, RuleBasedNumberFormat.SPELLOUT);
1658f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1659f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        String[][] enTestFullData = {
1660495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"-9007199254740991", "minus nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-one"}, // Maximum precision in both a double and a long
1661495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9007199254740991", "nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-one"}, // Maximum precision in both a double and a long
1662495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"-9007199254740992", "minus nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-two"}, // Only precisely contained in a long
1663495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9007199254740992", "nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-two"}, // Only precisely contained in a long
1664f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9999999999999998", "nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-eight"},
1665f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9999999999999999", "nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine"},
1666f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"999999999999999999", "nine hundred ninety-nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine"},
1667f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"1000000000000000000", "1,000,000,000,000,000,000"}, // The rules don't go to 1 quintillion yet
1668f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"-9223372036854775809", "-9,223,372,036,854,775,809"}, // We've gone beyond 64-bit precision
1669f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"-9223372036854775808", "-9,223,372,036,854,775,808"}, // We've gone beyond +64-bit precision
1670f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"-9223372036854775807", "minus 9,223,372,036,854,775,807"}, // Minimum 64-bit precision
1671f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"-9223372036854775806", "minus 9,223,372,036,854,775,806"}, // Minimum 64-bit precision + 1
1672f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9223372036854774111", "9,223,372,036,854,774,111"}, // Below 64-bit precision
1673f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9223372036854774999", "9,223,372,036,854,774,999"}, // Below 64-bit precision
1674f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9223372036854775000", "9,223,372,036,854,775,000"}, // Below 64-bit precision
1675f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9223372036854775806", "9,223,372,036,854,775,806"}, // Maximum 64-bit precision - 1
1676f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert                {"9223372036854775807", "9,223,372,036,854,775,807"}, // Maximum 64-bit precision
1677495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9223372036854775808", "9,223,372,036,854,775,808"}, // We've gone beyond 64-bit precision. This can only be represented with BigDecimal.
1678495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        };
1679495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        doTest(rbnf, enTestFullData, false);
1680495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    }
1681495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert
1682495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    @Test
1683495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    public void testCompactDecimalFormatStyle() {
1684495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        // This is not a common use case, but we're testing it anyway.
1685495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        final String numberPattern = "=###0.#####=;"
1686495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                + "1000: <###0.00< K;"
1687495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                + "1000000: <###0.00< M;"
1688495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                + "1000000000: <###0.00< B;"
1689495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                + "1000000000000: <###0.00< T;"
1690495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                + "1000000000000000: <###0.00< Q;";
1691495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(numberPattern, ULocale.US);
1692495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert
1693495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        String[][] enTestFullData = {
1694495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1000", "1.00 K"},
1695495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1234", "1.23 K"},
1696495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"999994", "999.99 K"},
1697495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"999995", "1000.00 K"},
1698495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1000000", "1.00 M"},
1699495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1200000", "1.20 M"},
1700495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1200000000", "1.20 B"},
1701495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1200000000000", "1.20 T"},
1702495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"1200000000000000", "1.20 Q"},
1703495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"4503599627370495", "4.50 Q"},
1704495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"4503599627370496", "4.50 Q"},
1705495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"8990000000000000", "8.99 Q"},
1706495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9008000000000000", "9.00 Q"}, // Number doesn't precisely fit into a double
1707495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9456000000000000", "9.00 Q"},  // Number doesn't precisely fit into a double
1708495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"10000000000000000", "10.00 Q"},  // Number doesn't precisely fit into a double
1709495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9223372036854775807", "9223.00 Q"}, // Maximum 64-bit precision
1710495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert                {"9223372036854775808", "9,223,372,036,854,775,808"}, // We've gone beyond 64-bit precision. This can only be represented with BigDecimal.
1711f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        };
1712f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        doTest(rbnf, enTestFullData, false);
1713f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    }
171405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert
171505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert    private void assertEquals(String expected, String result) {
171605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        if (!expected.equals(result)) {
171705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert            errln("Expected: " + expected + " Got: " + result);
171805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        }
171905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert    }
172005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert
172105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert    @Test
172205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert    public void testRoundingUnrealNumbers() {
172305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(ULocale.US, RuleBasedNumberFormat.SPELLOUT);
172405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        rbnf.setRoundingMode(BigDecimal.ROUND_HALF_UP);
172505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        rbnf.setMaximumFractionDigits(3);
172605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        assertEquals("zero point one", rbnf.format(0.1));
172705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        assertEquals("zero point zero zero one", rbnf.format(0.0005));
172805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        assertEquals("infinity", rbnf.format(Double.POSITIVE_INFINITY));
172905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert        assertEquals("not a number", rbnf.format(Double.NaN));
173005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert    }
1731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
1732