NumberFormatTest.java revision b040d2280dfc88dfb44693d28c9029e7b8dbae1c
17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (C) 2001-2016, International Business Machines Corporation and
4aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v1.8.1 : format : NumberFormatTest
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Source File: $ICU4oot/source/test/intltest/numfmtst.cpp
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubertimport java.io.IOException;
16e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport java.lang.reflect.Array;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigInteger;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Corneliusimport java.text.Format;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList;
24e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport java.util.Arrays;
2587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.Iterator;
2687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.List;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
3187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC.FieldContainer;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUConfig;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.LocaleUtility;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.ResourceReader;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.TokenIterator;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.MathContext;
38b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.CompactDecimalFormat;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DisplayContext;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.NumberFormatFactory;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory;
46e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport com.ibm.icu.text.NumberingSystem;
47b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.RuleBasedNumberFormat;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.CurrencyAmount;
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static ULocale EN = new ULocale("en");
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static Number toNumber(String s) {
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (s.equals("NaN")) {
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.NaN;
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (s.equals("-Inf")) {
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.NEGATIVE_INFINITY;
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (s.equals("Inf")) {
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.POSITIVE_INFINITY;
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new BigDecimal(s);
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private DataDrivenNumberFormatTestSuite.CodeUnderTest ICU =
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            new DataDrivenNumberFormatTestSuite.CodeUnderTest() {
70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public Character Id() { return 'J'; }
72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String format(NumberFormatTestTuple tuple) {
75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String actual = fmt.format(toNumber(tuple.format));
77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String expected = tuple.output;
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!expected.equals(actual)) {
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected " + expected + ", got " + actual;
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String toPattern(NumberFormatTestTuple tuple) {
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    StringBuilder result = new StringBuilder();
88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toPattern != null) {
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toPattern;
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toPattern();
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toPattern=" + expected + ", got " + actual);
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toLocalizedPattern != null) {
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toLocalizedPattern;
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toLocalizedPattern();
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toLocalizedPattern=" + expected + ", got " + actual);
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return result.length() == 0 ? null : result.toString();
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String parse(NumberFormatTestTuple tuple) {
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = fmt.parse(tuple.parse, ppos);
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+actual+", but was expected to fail.";
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != (actual.doubleValue())) {
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String parseCurrency(NumberFormatTestTuple tuple) {
129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    CurrencyAmount currAmt = fmt.parseCurrency(tuple.parse, ppos);
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+currAmt+", but was expected to fail.";
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = currAmt.getNumber();
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != (actual.doubleValue())) {
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
14787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!tuple.outputCurrency.equals(currAmt.getCurrency().toString())) {
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected currency: " + tuple.outputCurrency + ", got: " + currAmt.getCurrency();
150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @return
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                private DecimalFormat newDecimalFormat(NumberFormatTestTuple tuple) {
15987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = new DecimalFormat(
161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            tuple.pattern == null ? "0" : tuple.pattern,
162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            new DecimalFormatSymbols(tuple.locale == null ? EN : tuple.locale));
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjustDecimalFormat(tuple, fmt);
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return fmt;
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param fmt
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                private void adjustDecimalFormat(NumberFormatTestTuple tuple, DecimalFormat fmt) {
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minIntegerDigits != null) {
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxIntegerDigits != null) {
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minFractionDigits != null) {
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumFractionDigits(tuple.minFractionDigits);
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxFractionDigits != null) {
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currency != null) {
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrency(tuple.currency);
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minGroupingDigits != null) {
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this.
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useSigDigits != null) {
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setSignificantDigitsUsed(
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.useSigDigits != 0);
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minSigDigits != null) {
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumSignificantDigits(tuple.minSigDigits);
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxSigDigits != null) {
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumSignificantDigits(tuple.maxSigDigits);
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useGrouping != null) {
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingUsed(tuple.useGrouping != 0);
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.multiplier != null) {
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMultiplier(tuple.multiplier);
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingIncrement != null) {
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setRoundingIncrement(tuple.roundingIncrement.doubleValue());
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.formatWidth != null) {
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setFormatWidth(tuple.formatWidth);
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) {
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPadCharacter(tuple.padCharacter.charAt(0));
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useScientific != null) {
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setScientificNotation(tuple.useScientific != 0);
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping != null) {
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingSize(tuple.grouping);
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping2 != null) {
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setSecondaryGroupingSize(tuple.grouping2);
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingMode != null) {
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setRoundingMode(tuple.roundingMode);
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currencyUsage != null) {
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrencyUsage(tuple.currencyUsage);
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }                    if (tuple.minimumExponentDigits != null) {
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumExponentDigits(
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.minimumExponentDigits.byteValue());
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.exponentSignAlwaysShown != null) {
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setExponentSignAlwaysShown(
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.exponentSignAlwaysShown != 0);
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalSeparatorAlwaysShown != null) {
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalSeparatorAlwaysShown(
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.decimalSeparatorAlwaysShown != 0);
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padPosition != null) {
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPadPosition(tuple.padPosition);
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positivePrefix != null) {
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositivePrefix(tuple.positivePrefix);
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positiveSuffix != null) {
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositiveSuffix(tuple.positiveSuffix);
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativePrefix != null) {
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativePrefix(tuple.negativePrefix);
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativeSuffix != null) {
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativeSuffix(tuple.negativeSuffix);
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.localizedPattern != null) {
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.applyLocalizedPattern(tuple.localizedPattern);
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int lenient = tuple.lenient == null ? 1 : tuple.lenient.intValue();
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    fmt.setParseStrict(lenient == 0);
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseIntegerOnly != null) {
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalPatternMatchRequired != null) {
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalPatternMatchRequired(tuple.decimalPatternMatchRequired != 0);
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseNoExponent != null) {
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops, not supported for now
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    };
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private DataDrivenNumberFormatTestSuite.CodeUnderTest JDK =
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            new DataDrivenNumberFormatTestSuite.CodeUnderTest() {
275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public Character Id() { return 'K'; }
277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String format(NumberFormatTestTuple tuple) {
280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String actual = fmt.format(toNumber(tuple.format));
282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String expected = tuple.output;
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!expected.equals(actual)) {
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected " + expected + ", got " + actual;
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String toPattern(NumberFormatTestTuple tuple) {
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    StringBuilder result = new StringBuilder();
293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toPattern != null) {
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toPattern;
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toPattern();
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toPattern=" + expected + ", got " + actual);
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toLocalizedPattern != null) {
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toLocalizedPattern;
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toLocalizedPattern();
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toLocalizedPattern=" + expected + ", got " + actual);
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return result.length() == 0 ? null : result.toString();
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public String parse(NumberFormatTestTuple tuple) {
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = fmt.parse(tuple.parse, ppos);
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+actual+", but was expected to fail.";
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != actual.doubleValue()) {
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @return
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                private java.text.DecimalFormat newDecimalFormat(NumberFormatTestTuple tuple) {
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = new java.text.DecimalFormat(
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            tuple.pattern == null ? "0" : tuple.pattern,
341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            new java.text.DecimalFormatSymbols(
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                    (tuple.locale == null ? EN : tuple.locale).toLocale()));
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjustDecimalFormat(tuple, fmt);
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return fmt;
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param fmt
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                private void adjustDecimalFormat(NumberFormatTestTuple tuple, java.text.DecimalFormat fmt) {
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minIntegerDigits != null) {
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxIntegerDigits != null) {
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minFractionDigits != null) {
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumFractionDigits(tuple.minFractionDigits);
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxFractionDigits != null) {
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currency != null) {
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrency(java.util.Currency.getInstance(tuple.currency.toString()));
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minGroupingDigits != null) {
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this.
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useSigDigits != null) {
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minSigDigits != null) {
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxSigDigits != null) {
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useGrouping != null) {
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingUsed(tuple.useGrouping != 0);
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.multiplier != null) {
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMultiplier(tuple.multiplier);
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingIncrement != null) {
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.formatWidth != null) {
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) {
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useScientific != null) {
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping != null) {
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingSize(tuple.grouping);
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping2 != null) {
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingMode != null) {
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currencyUsage != null) {
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minimumExponentDigits != null) {
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.exponentSignAlwaysShown != null) {
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalSeparatorAlwaysShown != null) {
416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalSeparatorAlwaysShown(
417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.decimalSeparatorAlwaysShown != 0);
418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padPosition != null) {
420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positivePrefix != null) {
423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositivePrefix(tuple.positivePrefix);
424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positiveSuffix != null) {
426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositiveSuffix(tuple.positiveSuffix);
427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativePrefix != null) {
429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativePrefix(tuple.negativePrefix);
430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativeSuffix != null) {
432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativeSuffix(tuple.negativeSuffix);
433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.localizedPattern != null) {
435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.applyLocalizedPattern(tuple.localizedPattern);
436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // lenient parsing not supported by JDK
439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseIntegerOnly != null) {
440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalPatternMatchRequired != null) {
443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                       // Oops, not supported
444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseNoExponent != null) {
446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops, not supported for now
447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    };
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new NumberFormatTest().run(args);
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingScientific10542() {
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format =
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("0.00E0");
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] roundingModes = {
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_CEILING,
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_DOWN,
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_FLOOR,
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_HALF_DOWN,
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_HALF_EVEN,
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_HALF_UP,
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              BigDecimal.ROUND_UP};
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] descriptions = {
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round Ceiling",
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round Down",
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round Floor",
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round half down",
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round half even",
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round half up",
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Round up"};
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] values = {-0.003006, -0.003005, -0.003004, 0.003014, 0.003015, 0.003016};
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] expected = {
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.00E-3", "-3.00E-3", "-3.00E-3", "3.02E-3", "3.02E-3", "3.02E-3"},
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.00E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.01E-3"},
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E-3", "-3.01E-3", "-3.01E-3", "3.01E-3", "3.01E-3", "3.01E-3"},
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.02E-3"},
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3"},
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E-3", "-3.01E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3"},
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E-3", "-3.01E-3", "-3.01E-3", "3.02E-3", "3.02E-3", "3.02E-3"}};
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{-3006.0, -3005, -3004, 3014, 3015, 3016};
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.00E3", "-3.00E3", "-3.00E3", "3.02E3", "3.02E3", "3.02E3"},
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.00E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.01E3"},
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E3", "-3.01E3", "-3.01E3", "3.01E3", "3.01E3", "3.01E3"},
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.02E3"},
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3"},
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E3", "-3.01E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3"},
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-3.01E3", "-3.01E3", "-3.01E3", "3.02E3", "3.02E3", "3.02E3"}};
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{0.0, -0.0};
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"},
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"0.00E0", "-0.00E0"}};
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{1e25, 1e25 + 1e15, 1e25 - 1e15};
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.01E25", "1.00E25"},
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.00E25", "9.99E24"},
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.00E25", "9.99E24"},
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.00E25", "1.00E25"},
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.00E25", "1.00E25"},
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.00E25", "1.00E25"},
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E25", "1.01E25", "1.00E25"}};
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{-1e25, -1e25 + 1e15, -1e25 - 1e15};
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-9.99E24", "-1.00E25"},
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-9.99E24", "-1.00E25"},
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-1.00E25", "-1.01E25"},
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-1.00E25", "-1.00E25"},
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-1.00E25", "-1.00E25"},
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-1.00E25", "-1.00E25"},
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E25", "-1.00E25", "-1.01E25"}};
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{1e-25, 1e-25 + 1e-35, 1e-25 - 1e-35};
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.01E-25", "1.00E-25"},
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.00E-25", "9.99E-26"},
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.00E-25", "9.99E-26"},
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.00E-25", "1.00E-25"},
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.00E-25", "1.00E-25"},
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.00E-25", "1.00E-25"},
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00E-25", "1.01E-25", "1.00E-25"}};
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        values = new double[]{-1e-25, -1e-25 + 1e-35, -1e-25 - 1e-35};
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The order of these expected values correspond to the order of roundingModes and the order of values.
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expected = new String[][]{
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-9.99E-26", "-1.00E-25"},
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-9.99E-26", "-1.00E-25"},
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-1.00E-25", "-1.01E-25"},
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-1.00E-25", "-1.00E-25"},
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-1.00E-25", "-1.00E-25"},
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-1.00E-25", "-1.00E-25"},
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"-1.00E-25", "-1.00E-25", "-1.01E-25"}};
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyRounding(format, values, expected, roundingModes, descriptions);
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void verifyRounding(DecimalFormat format, double[] values, String[][] expected, int[] roundingModes,
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] descriptions) {
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < roundingModes.length; i++) {
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format.setRoundingMode(roundingModes[i]);
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int j = 0; j < values.length; j++) {
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals(descriptions[i]+" " +values[j], expected[i][j], format.format(values[j]));
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test10419RoundingWith0FractionDigits() {
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][]{
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_CEILING, 1.488, "2"},
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_DOWN, 1.588, "1"},
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_FLOOR, 1.588, "1"},
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_DOWN, 1.5, "1"},
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_EVEN, 2.5, "2"},
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_UP, 2.5, "3"},
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_UP, 1.5, "2"},
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nff = NumberFormat.getNumberInstance(ULocale.ENGLISH);
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nff.setMaximumFractionDigits(0);
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] item : data) {
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          nff.setRoundingMode(((Integer) item[0]).intValue());
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertEquals("Test10419", item[2], nff.format(item[1]));
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseNegativeWithFaLocale() {
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("fa"));
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value = parser.parse("-0,5").doubleValue();
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Expect -0.5", -0.5, value);
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.errln("Parsing -0.5 should have succeeded.");
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseNegativeWithAlternativeMinusSign() {
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("en"));
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value = parser.parse("\u208B0.5").doubleValue();
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Expect -0.5", -0.5, value);
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.errln("Parsing -0.5 should have succeeded.");
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test various patterns
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatterns() {
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String pat[]    = { "#.#", "#.", ".#", "#" };
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int pat_length = pat.length;
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String newpat[] = { "#0.#", "#0.", "#.0", "#" };
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String num[]    = { "0",   "0.", ".0", "0" };
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<pat_length; ++i)
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pat[i], sym);
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String newp = fmt.toPattern();
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!newp.equals(newpat[i]))
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] +
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + newp + " seen instead");
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = ((NumberFormat)fmt).format(0);
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!s.equals(num[i]))
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should format zero as " + num[i] +
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + s + " seen instead");
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Min integer digits = " + fmt.getMinimumIntegerDigits());
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // BigInteger 0 - ticket#4731
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = ((NumberFormat)fmt).format(BigInteger.ZERO);
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!s.equals(num[i]))
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should format BigInteger zero as " + num[i] +
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + s + " seen instead");
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Min integer digits = " + fmt.getMinimumIntegerDigits());
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test exponential pattern
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponential() {
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" };
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int pat_length = pat.length;
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 };
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val_length = val.length;
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String valFormat[] = {
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.####E0
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271",
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 00.000E00
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272",
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // ##0.######E000
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273",
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.###E0;[0.###E0]
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" };
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*double valParse[] =
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123460000, 1.23E300, -3.1416E-271,
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123460000, 1.23E300, -3.1416E-271,
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123456800, 1.23E300, -3.141593E-271,
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123500000, 1.23E300, -3.142E-271,
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };*/ //The variable is never used
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lval[] = { 0, -1, 1, 123456789 };
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lval_length = lval.length;
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String lvalFormat[] = {
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.####E0
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E0", "-1E0", "1E0", "1.2346E8",
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 00.000E00
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07",
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // ##0.######E000
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E000", "-1E000", "1E000", "123.4568E006",
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.###E0;[0.###E0]
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E0", "[1E0]", "1E0", "1.235E8" };
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lvalParse[] =
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123460000,
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123460000,
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123456800,
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123500000,
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int ival = 0, ilval = 0;
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int p = 0; p < pat_length; ++p) {
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pat[p], sym);
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Pattern \"" + pat[p] + "\" -toPattern-> \"" + fmt.toPattern() + "\"");
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int v;
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (v = 0; v < val_length; ++v) {
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s;
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = ((NumberFormat) fmt).format(val[v]);
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" " + val[v] + " -format-> " + s);
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(valFormat[v + ival]))
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: Expected " + valFormat[v + ival]);
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition pos = new ParsePosition(0);
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                double a = fmt.parse(s, pos).doubleValue();
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (pos.getIndex() == s.length()) {
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("  -parse-> " + Double.toString(a));
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Use epsilon comparison as necessary
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a);
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (v = 0; v < lval_length; ++v) {
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s;
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = ((NumberFormat) fmt).format(lval[v]);
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" " + lval[v] + "L -format-> " + s);
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(lvalFormat[v + ilval]))
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("ERROR: Expected " + lvalFormat[v + ilval] + " Got: " + s);
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition pos = new ParsePosition(0);
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                long a = 0;
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number A = fmt.parse(s, pos);
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (A != null) {
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    a = A.longValue();
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (pos.getIndex() == s.length()) {
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("  -parse-> " + a);
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (a != lvalParse[v + ilval])
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAIL: Expected " + lvalParse[v + ilval]);
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + Long.toString(a));
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail to parse the string: " + s);
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ival += val_length;
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ilval += lval_length;
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test the handling of quotes
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestQuotes() {
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat;
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer("a'fo''o'b#");
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = ((NumberFormat)fmt).format(123);
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + pat + "\"");
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format 123 . " + s);
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("afo'ob123"))
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected afo'ob123");
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s ="";
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer("a''b#");
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new DecimalFormat(pat.toString(), sym);
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat)fmt).format(123);
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + pat + "\"");
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format 123 . " + s);
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("a'b123"))
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected a'b123");
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseCurrencyTrailingSymbol() {
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // see sun bug 4709840
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY);
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        float val = 12345.67f;
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = fmt.format(val);
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("val: " + val + " str: " + str);
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number num = fmt.parse(str);
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("num: " + num);
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse of '" + str + "' threw exception: " + e);
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the handling of the currency symbol in patterns.
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencySign() {
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat = new StringBuffer("");
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char currency = 0x00A4;
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4#,##0.00;-\xA4#,##0.00"
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append("#,##0.00;-").append(currency).append("#,##0.00");
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = ((NumberFormat) fmt).format(1234.56);
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer();
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + fmt.toPattern() + "\"");
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + 1234.56 + " . " + s);
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("symbol, pos", "$1,234.56", s);
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(-1234.56);
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(-1234.56) + " . " + s);
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("symbol, neg", "-$1,234.56", s);
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.setLength(0);
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00"
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append(currency).append(" #,##0.00;").append(currency).append(currency).append(" -#,##0.00");
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new DecimalFormat(pat.toString(), sym);
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(1234.56);
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + fmt.toPattern() + "\"");
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(1234.56) + " . " + s);
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("name, pos", "USD 1,234.56", s);
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(-1234.56);
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(-1234.56) + " . " + s);
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("name, neg", "USD -1,234.56", s);
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSpaceParsing() {
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the data are:
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the string to be parsed, parsed position, parsed error index
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124", "4", "-1"},
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124 $124", "4", "-1"},
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124 ", "4", "-1"},
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$ 124 ", "5", "-1"},
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$\u00A0124 ", "5", "-1"},
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"124$", "0", "3"}, // TODO: need to handle space correctly
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // {"124 $", "5", "-1"}, TODO: OK or NOT?
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"124 $", "0", "3"},
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat foo = NumberFormat.getCurrencyInstance();
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < DATA.length; ++i) {
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePosition = new ParsePosition(0);
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String stringToBeParsed = DATA[i][0];
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int parsedPosition = Integer.parseInt(DATA[i][1]);
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int errorIndex = Integer.parseInt(DATA[i][2]);
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number result = foo.parse(stringToBeParsed, parsePosition);
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (parsePosition.getIndex() != parsedPosition ||
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        parsePosition.getErrorIndex() != errorIndex) {
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED parse " + stringToBeParsed + "; parse position: " + parsePosition.getIndex() + "; error position: " + parsePosition.getErrorIndex());
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (parsePosition.getErrorIndex() == -1 &&
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result.doubleValue() != 124) {
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED parse " + stringToBeParsed + "; value " + result.doubleValue());
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAILED " + e.toString());
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMultiCurrencySign() {
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the fields in the following test are:
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale,
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency pattern (with negative pattern),
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency number to be formatted,
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using currency symbol name, such as "$" for USD,
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using currency ISO name, such as "USD",
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using plural name, such as "US dollars".
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // for US locale
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"},
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"},
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"},
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // for CHINA locale
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1234.56", "\uFFE51,234.56", "CNY1,234.56", "\u4EBA\u6C11\u5E011,234.56"},
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "-1234.56", "(\uFFE51,234.56)", "(CNY1,234.56)", "(\u4EBA\u6C11\u5E011,234.56)"},
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1", "\uFFE51.00", "CNY1.00", "\u4EBA\u6C11\u5E011.00"}
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String doubleCurrencyStr = "\u00A4\u00A4";
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String tripleCurrencyStr = "\u00A4\u00A4\u00A4";
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String locale = DATA[i][0];
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat = DATA[i][1];
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Double numberToBeFormat = new Double(DATA[i][2]);
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormatSymbols sym = new DecimalFormatSymbols(new ULocale(locale));
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int j=1; j<=3; ++j) {
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // j represents the number of currency sign in the pattern.
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (j == 2) {
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = pat.replaceAll("\u00A4", doubleCurrencyStr);
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (j == 3) {
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = pat.replaceAll("\u00A4\u00A4", tripleCurrencyStr);
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                DecimalFormat fmt = new DecimalFormat(pat, sym);
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s = ((NumberFormat) fmt).format(numberToBeFormat);
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][3] is the currency format result using a
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // single currency sign.
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][4] is the currency format result using
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // double currency sign.
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][5] is the currency format result using
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // triple currency sign.
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][j+2] is the currency format result using
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 'j' number of currency sign.
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String currencyFormatResult = DATA[i][2+j];
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(currencyFormatResult)) {
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL format: Expected " + currencyFormatResult);
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // mix style parsing
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int k=3; k<=5; ++k) {
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][3] is the currency format result using a
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // single currency sign.
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][4] is the currency format result using
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // double currency sign.
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][5] is the currency format result using
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // triple currency sign.
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String oneCurrencyFormat = DATA[i][k];
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (fmt.parse(oneCurrencyFormat).doubleValue() !=
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                numberToBeFormat.doubleValue()) {
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAILED parse " + oneCurrencyFormat);
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED, DecimalFormat parse currency: " + e.toString());
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyFormatForMixParsing() {
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(new ULocale("en_US"));
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] formats = {
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "$1,234.56",  // string to be parsed
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "USD1,234.56",
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "US dollars1,234.56",
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234.56 US dollars"
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < formats.length; ++i) {
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String stringToBeParsed = formats[i];
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(stringToBeParsed);
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number val = parsedVal.getNumber();
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!val.equals(new BigDecimal("1234.56"))) {
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val);
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) {
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency");
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse FAILED: " + e.toString());
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDecimalFormatCurrencyParse() {
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Locale.US
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat = new StringBuffer("");
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char currency = 0x00A4;
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4#,##0.00;-\xA4#,##0.00"
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00");
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the data are:
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // string to be parsed, the parsed result (number)
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$1.00", "1"},
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"USD1.00", "1"},
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 US dollar", "1"},
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$1,234.56", "1234.56"},
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"USD1,234.56", "1234.56"},
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1,234.56 US dollar", "1234.56"},
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < DATA.length; ++i) {
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String stringToBeParsed = DATA[i][0];
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                double parsedResult = Double.parseDouble(DATA[i][1]);
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number num = fmt.parse(stringToBeParsed);
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (num.doubleValue() != parsedResult) {
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL parse: Expected " + parsedResult);
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAILED, DecimalFormat parse currency: " + e.toString());
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test localized currency patterns.
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrency() {
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "CA", "", "1,50\u00a0$",
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "de", "DE", "", "1,50\u00a0\u20AC",
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "de", "DE", "PREEURO", "1,50\u00a0DM",
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "FR", "", "1,50\u00a0\u20AC",
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "FR", "PREEURO", "1,50\u00a0F",
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=4) {
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]);
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = fmt.format(1.50);
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (s.equals(DATA[i+3])) {
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1.50 x " + locale + " => " + s);
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("FAIL: 1.50 x " + locale + " => " + s +
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // format currency with CurrencyAmount
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=4) {
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]);
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency curr = Currency.getInstance(locale);
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false}));
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount cAmt = new CurrencyAmount(1.5, curr);
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String sCurr = fmt.format(cAmt);
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (sCurr.equals(DATA[i+3])) {
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1.50 x " + locale + " => " + sCurr);
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: 1.50 x " + locale + " => " + sCurr +
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Cover MeasureFormat.getCurrencyFormat()
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale save = ULocale.getDefault();
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(ULocale.US);
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat curFmt = MeasureFormat.getCurrencyFormat();
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strBuf = curFmt.format(new CurrencyAmount(new Float(1234.56), Currency.getInstance("USD")));
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(strBuf);
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number val = parsedVal.getNumber();
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!val.equals(new BigDecimal("1234.56"))) {
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val);
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) {
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency");
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (ParseException e) {
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + e.getMessage());
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(save);
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyIsoPluralFormat() {
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the data are:
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale,
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency amount to be formatted,
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency ISO code to be formatted,
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using CURRENCYSTYLE,
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using ISOCURRENCYSTYLE,
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using PLURALCURRENCYSTYLE,
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
1040bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00美元"},
1041bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56美元"},
1042bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"zh_CN", "1", "CNY", "¥1.00", "CNY1.00", "1.00人民币"},
1043bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"zh_CN", "1234.56", "CNY", "¥1,234.56", "CNY1,234.56", "1,234.56人民币"},
1044bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ru_RU", "1", "RUB", "1,00 \u20BD", "1,00 RUB", "1,00 российского рубля"},
1045bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ru_RU", "2", "RUB", "2,00 \u20BD", "2,00 RUB", "2,00 российского рубля"},
1046bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ru_RU", "5", "RUB", "5,00 \u20BD", "5,00 RUB", "5,00 российского рубля"},
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // test locale without currency information
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"root", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"},
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"root@numbers=latn", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"}, // ensure that the root locale is still used with modifiers
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"root@numbers=arab", "-1.23", "USD", "\u200F-US$ ١٫٢٣", "\u200F-USD ١٫٢٣", "\u200F-١٫٢٣ USD"}, // ensure that the root locale is still used with modifiers
1051bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"es_AR", "1", "INR", "INR\u00A01,00", "INR\u00A01,00", "1,00 rupia india"},
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ar_EG", "1", "USD", "US$ ١٫٠٠", "USD ١٫٠٠", "١٫٠٠ دولار أمريكي"},
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int k = NumberFormat.CURRENCYSTYLE;
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    k <= NumberFormat.PLURALCURRENCYSTYLE;
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ++k) {
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // k represents currency format style.
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( k != NumberFormat.CURRENCYSTYLE &&
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        k != NumberFormat.ISOCURRENCYSTYLE &&
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        k != NumberFormat.PLURALCURRENCYSTYLE ) {
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String localeString = DATA[i][0];
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double numberToBeFormat = new Double(DATA[i][1]);
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String currencyISOCode = DATA[i][2];
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale locale = new ULocale(localeString);
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat numFmt = NumberFormat.getInstance(locale, k);
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numFmt.setCurrency(Currency.getInstance(currencyISOCode));
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String strBuf = numFmt.format(numberToBeFormat);
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int resultDataIndex = k-1;
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( k == NumberFormat.CURRENCYSTYLE ) {
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    resultDataIndex = k+2;
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][resultDataIndex] is the currency format result
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // using 'k' currency style.
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String formatResult = DATA[i][resultDataIndex];
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!strBuf.equals(formatResult)) {
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: Expected " + formatResult + " actual: " + strBuf);
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // test parsing, and test parsing for all currency formats.
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int j = 3; j < 6; ++j) {
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][3] is the currency format result using
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // CURRENCYSTYLE formatter.
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][4] is the currency format result using
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // ISOCURRENCYSTYLE formatter.
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][5] is the currency format result using
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // PLURALCURRENCYSTYLE formatter.
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String oneCurrencyFormatResult = DATA[i][j];
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Number val = numFmt.parse(oneCurrencyFormatResult);
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (val.doubleValue() != numberToBeFormat.doubleValue()) {
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAIL: getCurrencyFormat of locale " + localeString + " failed roundtripping the number. val=" + val + "; expected: " + numberToBeFormat);
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                catch (ParseException e) {
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: " + e.getMessage());
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMiscCurrencyParsing() {
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // each has: string to be parsed, parsed position, error position
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 ", "0", "4"},
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 UAE dirha", "0", "4"},
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 us dollar", "14", "-1"},
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 US DOLLAR", "14", "-1"},
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 usd", "0", "4"},
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("en_US");
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String stringToBeParsed = DATA[i][0];
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int parsedPosition = Integer.parseInt(DATA[i][1]);
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int errorIndex = Integer.parseInt(DATA[i][2]);
11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat numFmt = NumberFormat.getInstance(locale, NumberFormat.CURRENCYSTYLE);
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePosition = new ParsePosition(0);
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number val = numFmt.parse(stringToBeParsed, parsePosition);
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (parsePosition.getIndex() != parsedPosition ||
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    parsePosition.getErrorIndex() != errorIndex) {
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected error position: " + errorIndex + "; actual: " + parsePosition.getErrorIndex());
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected position: " + parsedPosition +"; actual: " + parsePosition.getIndex());
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (parsePosition.getErrorIndex() == -1 &&
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    val.doubleValue() != 1.00) {
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected 1.00, actual:" + val);
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseCurrency() {
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class ParseCurrencyItem {
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String localeString;
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String descrip;
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String currStr;
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    numExpectPos;
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    numExpectVal;
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    curExpectPos;
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    curExpectVal;
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String curExpectCurr;
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) {
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                localeString  = locStr;
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                descrip       = desc;
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                currStr       = curr;
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numExpectPos  = numExPos;
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numExpectVal  = numExVal;
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectPos  = curExPos;
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectVal  = curExVal;
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectCurr = curExCurr;
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getLocaleString()  { return localeString; }
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getDescrip()       { return descrip; }
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getCurrStr()       { return currStr; }
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getNumExpectPos()  { return numExpectPos; }
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getNumExpectVal()  { return numExpectVal; }
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getCurExpectPos()  { return curExpectPos; }
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getCurExpectVal()  { return curExpectVal; }
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getCurExpectCurr() { return curExpectCurr; }
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ParseCurrencyItem[] parseCurrencyItems = {
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  5,  2,  "USD" ),
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  2,  4,  "USD" ),
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         0,  0,  0,  0,  ""    ),
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       0,  0,  5,  3,  "GBP" ),
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          0,  0,  2,  5,  "GBP" ),
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    0,  0,  0,  0,  ""    ),
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  5,  3,  "GBP" ),
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  2,  5,  "GBP" ),
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    0,  0,  0,  0,  ""    ),
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 0,  0,  0,  0,  ""    ),
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    0,  0,  0,  0,  ""    ),
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "dollars4", "$4",               0,  0,  2,  4,  "USD" ),
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  6,  4,  "EUR" ),
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  3,  6,  "EUR" ),
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          0,  0,  0,  0,  ""    ),
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  0,  0,  ""    ),
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  0,  0,  ""    ),
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (ParseCurrencyItem item: parseCurrencyItems) {
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String localeString = item.getLocaleString();
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale uloc = new ULocale(localeString);
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = null;
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = NumberFormat.getCurrencyInstance(uloc);
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getCurrencyInstance fails for locale " + localeString);
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String currStr = item.getCurrStr();
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePos = new ParsePosition(0);
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number numVal = fmt.parse(currStr, parsePos);
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) {
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (numVal != null) {
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/" + numVal.intValue() );
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/(NULL)" );
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parsePos.setIndex(0);
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount currAmt = fmt.parseCurrency(currStr, parsePos);
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( parsePos.getIndex() != item.getCurExpectPos() || (currAmt != null && (currAmt.getNumber().intValue() != item.getCurExpectVal() ||
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    currAmt.getCurrency().getCurrencyCode().compareTo(item.getCurExpectCurr()) != 0)) ) {
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (currAmt != null) {
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() +
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() +
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/" + currAmt.getNumber().intValue() + "/" + currAmt.getCurrency().getCurrencyCode() );
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() +
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() +
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/(NULL)" );
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the Currency object handling, new as of ICU 2.2.
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyObject() {
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt =
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getCurrencyInstance(Locale.US);
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, null, 1234.56, "$1,234.56");
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.FRANCE),
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "\u20AC1,234.56"); // Euro
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.JAPAN),
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "\u00A51,235"); // Yen
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")),
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.US),
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "$1,234.56");
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = NumberFormat.getCurrencyInstance(Locale.FRANCE);
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, null, 1234.56, "1 234,56 \u20AC");
12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.JAPAN),
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 235 JPY"); // Yen
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")),
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 CHF"); // no more rounding here, see cldrbug 5548
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.US),
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 $US");
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.FRANCE),
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 \u20AC"); // Euro
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatibleCurrencies() {
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt =
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getCurrencyInstance(Locale.US);
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\u00A51,235"); // Yen half-width
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\uFFE51,235"); // Yen full-wdith
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyPatterns() {
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i;
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] locs = NumberFormat.getAvailableLocales();
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (i=0; i<locs.length; ++i) {
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat nf = NumberFormat.getCurrencyInstance(locs[i]);
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure currency formats do not have a variable number
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // of fraction digits
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int min = nf.getMinimumFractionDigits();
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int max = nf.getMaximumFractionDigits();
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (min != max) {
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String a = nf.format(1.0);
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String b = nf.format(1.125);
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: " + locs[i] +
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " min fraction digits != max fraction digits; "+
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "x 1.0 => " + a +
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; x 1.125 => " + b);
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure EURO currency formats have exactly 2 fraction digits
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (nf instanceof DecimalFormat) {
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Currency curr = ((DecimalFormat) nf).getCurrency();
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (curr != null && "EUR".equals(curr.getCurrencyCode())) {
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (min != 2 || max != 2) {
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String a = nf.format(1.0);
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: " + locs[i] +
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                " is a EURO format but it does not have 2 fraction digits; "+
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "x 1.0 => " +
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                a);
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Do rudimentary testing of parsing.
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParse() {
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String arg = "0.0";
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format = new DecimalFormat("00");
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double aNumber = 0l;
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            aNumber = format.parse(arg).doubleValue();
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(e);
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("parse(" + arg + ") = " + aNumber);
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test proper rounding by the format method.
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRounding487() {
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 0.00159999, 4, "0.0016");
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 0.00995, 4, "0.01");
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 12.3995, 3, "12.4");
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 12.4999, 0, "12");
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, - 19.5, 0, "-20");
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the functioning of the secondary grouping value.
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSecondaryGrouping() {
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat f = new DecimalFormat("#,##,###", US);
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, 123456789L, "12,34,56,789");
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,##,###");
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.applyPattern("#,###");
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setSecondaryGroupingSize(4);
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, 123456789L, "12,3456,789");
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,####,###");
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat g = NumberFormat.getInstance(new Locale("hi", "IN"));
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = "";
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long l = 1876543210L;
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = g.format(l);
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // expect "1,87,65,43,210", but with Hindi digits
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //         01234567890123
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean ok = true;
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (out.length() != 14) {
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ok = false;
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < out.length(); ++i) {
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean expectGroup = false;
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                switch (i) {
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 1 :
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 4 :
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 7 :
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 10 :
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expectGroup = true;
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Later -- fix this to get the actual grouping
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // character from the resource bundle.
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean isGroup = (out.charAt(i) == 0x002C);
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isGroup != expectGroup) {
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ok = false;
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!ok) {
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL  Expected "+ l + " x hi_IN . \"1,87,65,43,210\" (with Hindi digits), got \""
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + out + "\"");
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    " + l + " x hi_IN . \"" + out + "\"");
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void roundingTest(NumberFormat nf, double x, int maxFractionDigits, final String expected) {
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(maxFractionDigits);
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = nf.format(x);
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(x + " formats with " + maxFractionDigits + " fractional digits to " + out);
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!out.equals(expected))
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected " + expected);
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponent() {
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt1 = new DecimalFormat("0.###E0", US);
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US);
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 1234;
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt1, n, "1.234E3");
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt2, n, "1.234E+3");
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt1, "1.234E+3", n); // Either format should parse "E+3"
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientific() {
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test pattern round-trip
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", "0.###E0;[0.###E0]" };
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int PAT_length = PAT.length;
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int DIGITS[] = {
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // min int, max int, min frac, max frac
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, 1, 0, 0, // "#E0"
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 1, 0, 4, // "0.####E0"
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                2, 2, 3, 3, // "00.000E00"
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 3, 0, 4, // "##0.####E000"
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 1, 0, 3, // "0.###E0;[0.###E0]"
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < PAT_length; ++i) {
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat = PAT[i];
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat df = new DecimalFormat(pat, US);
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat2 = df.toPattern();
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (pat.equals(pat2)) {
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok   Pattern rt \"" + pat + "\" . \"" + pat2 + "\"");
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL Pattern rt \"" + pat + "\" . \"" + pat2 + "\"");
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure digit counts match what we expect
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (df.getMinimumIntegerDigits() != DIGITS[4 * i]
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    || df.getMaximumIntegerDigits() != DIGITS[4 * i + 1]
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            || df.getMinimumFractionDigits() != DIGITS[4 * i + 2]
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    || df.getMaximumFractionDigits() != DIGITS[4 * i + 3]) {
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \""+ pat+ "\" min/max int; min/max frac = "
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMinimumIntegerDigits() + "/"
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMaximumIntegerDigits() + ";"
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMinimumFractionDigits() + "/"
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMaximumFractionDigits() + ", expect "
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i] + "/"
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 1] + ";"
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 2] + "/"
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 3]);
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("#E0", US), 12345.0, "1.2345E4");
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0E0", US), 12345.0, "1E4");
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0"
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // so result = 1.234568E4 not 1.2345678901E4
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //when the pattern problem is finalized, delete comment mark'//'
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //of the following code
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(Locale.US), 12345.678901, "1.2345678901E4");
14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing NumberFormat.getScientificInstance(ULocale) ...");
14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(ULocale.US), 12345.678901, "1.2345678901E4");
14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US), 12345.0, "12.34E3");
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US), 12345.00001, "12.35E3");
14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.####E0", US), 12345, "12.345E3");
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0"
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // so result = 1.234568E4 not 1.2345678901E4
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(Locale.FRANCE), 12345.678901, "1,2345678901E4");
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing NumberFormat.getScientificInstance(ULocale) ...");
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(ULocale.FRANCE), 12345.678901, "1,2345678901E4");
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US), 789.12345e-9, "789.12E-9");
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.####E0", US), 780.e-9, "780E-9");
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat(".###E0", US), 45678.0, ".457E5");
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(".###E0", US), 0, ".0E0");
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat[] { new DecimalFormat("#E0", US),
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("##E0", US),
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("####E0", US),
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("0E0", US),
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("00E0", US),
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("000E0", US),
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   },
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Long(45678000),
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new String[] { "4.5678E7",
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "45.678E6",
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "4567.8E4",
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "5E7",
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "46E6",
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "457E5",
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("#E0", US), 45678000, "4.5678E7");
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##E0", US), 45678000, "45.678E6");
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("####E0", US), 45678000, "4567.8E4");
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0E0", US), 45678000, "5E7");
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("00E0", US), 45678000, "46E6");
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("000E0", US), 45678000, "457E5");
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("###E0", US, status),
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.0000123), "12.3E-6",
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.000123), "123E-6",
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.00123), "1.23E-3",
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.0123), "12.3E-3",
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.123), "123E-3",
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1.23), "1.23E0",
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(12.3), "12.3E0",
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(123), "123E0",
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1230), "1.23E3",
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.0000123, "12.3E-6");
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.000123, "123E-6");
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.00123, "1.23E-3");
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.0123, "12.3E-3");
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.123, "123E-3");
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 1.23, "1.23E0");
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 12.3, "12.3E0");
15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 123.0, "123E0");
15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 1230.0, "1.23E3");
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0.#E+00", US, status),
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.00012), "1.2E-04",
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Long(12000),     "1.2E+04",
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("0.#E+00", US), 0.00012, "1.2E-04");
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("0.#E+00", US), 12000, "1.2E+04");
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPad() {
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0");
15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3");
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(
15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0,
15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0E0______ g-m/s^2");
15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(
15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.0 / 3,
15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "333.333E-3_ g-m/s^2");
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 0, "0.0______ g-m/s^2");
15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(
15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####*_ 'g-m/s^2'", US),
15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.0 / 3,
15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.33333__ g-m/s^2");
15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test padding before a sign
15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)";
15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -10, "xxxxxxxxxx(10.0)");
15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1000, "xxxxxxx(1,000.0)");
15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1000000, "xxx(1,000,000.0)");
15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -100.37, "xxxxxxxx(100.37)");
15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -10456.37, "xxxxx(10,456.37)");
15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1120456.37, "xx(1,120,456.37)");
15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -112045600.37, "(112,045,600.37)");
15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1252045600.37, "(1,252,045,600.37)");
15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10, "xxxxxxxxxxxx10.0");
15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1000, "xxxxxxxxx1,000.0");
15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1000000, "xxxxx1,000,000.0");
15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 100.37, "xxxxxxxxxx100.37");
15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10456.37, "xxxxxxx10,456.37");
15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1120456.37, "xxxx1,120,456.37");
15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 112045600.37, "xx112,045,600.37");
15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10252045600.37, "10,252,045,600.37");
15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test padding between a sign and a number
15947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)";
15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -10, "(10.0xxxxxxxxxx)");
15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1000, "(1,000.0xxxxxxx)");
15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1000000, "(1,000,000.0xxx)");
15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -100.37, "(100.37xxxxxxxx)");
15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -10456.37, "(10,456.37xxxxx)");
16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1120456.37, "(1,120,456.37xx)");
16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -112045600.37, "(112,045,600.37)");
16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1252045600.37, "(1,252,045,600.37)");
16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10, "10.0xxxxxxxxxxxx");
16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1000, "1,000.0xxxxxxxxx");
16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1000000, "1,000,000.0xxxxx");
16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 100.37, "100.37xxxxxxxxxx");
16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10456.37, "10,456.37xxxxxxx");
16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1120456.37, "1,120,456.37xxxx");
16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 112045600.37, "112,045,600.37xx");
16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10252045600.37, "10,252,045,600.37");
16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //testing the setPadCharacter(UnicodeString) and getPadCharacterString()
16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#", US);
16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char padString = 'P';
16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter(padString);
16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*P##.##", DecimalFormat.PAD_BEFORE_PREFIX, 5, padString);
16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter('^');
16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, '^');
16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //commented untill implementation is complete
16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  fmt.setPadCharacter((UnicodeString)"^^^");
16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          expectPad(fmt, "*^^^#", DecimalFormat.kPadBeforePrefix, 3, (UnicodeString)"^^^");
16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.remove();
16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.append((UChar)0x0061);
16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.append((UChar)0x0302);
16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          fmt.setPadCharacter(padString);
16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000};
16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          UnicodeString pattern(patternChars);
16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          expectPad(fmt, pattern , DecimalFormat.kPadBeforePrefix, 4, padString);
16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatterns2() {
16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#", US);
16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char hat = 0x005E; /*^*/
16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, hat);
16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^#", DecimalFormat.PAD_AFTER_PREFIX, 2, hat);
16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#*^", DecimalFormat.PAD_BEFORE_SUFFIX, 1, hat);
16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^", DecimalFormat.PAD_AFTER_SUFFIX, 2, hat);
16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^$#", -1);
16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^$", -1);
16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat.PAD_BEFORE_SUFFIX, 12, (char) 0x0078 /*x*/);
16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "''#0*x", DecimalFormat.PAD_BEFORE_SUFFIX, 3, (char) 0x0078 /*x*/);
16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'I''ll'*a###.##", DecimalFormat.PAD_AFTER_PREFIX, 10, (char) 0x0061 /*a*/);
16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.applyPattern("AA#,##0.00ZZ");
16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter(hat);
16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(10);
16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_PREFIX);
16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "*^AA#,##0.00ZZ");
16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_SUFFIX);
16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00*^ZZ");
16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_SUFFIX);
16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00ZZ*^");
16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //            12  3456789012
16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String exp = "AA*^#,##0.00ZZ";
16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(12);
16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_PREFIX);
16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, exp);
16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(13);
16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123
16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^##,##0.00ZZ");
16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(14);
16777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  345678901234
16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^###,##0.00ZZ");
16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(15);
16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  3456789012345
16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case
16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(16);
16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123456
16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^#,###,##0.00ZZ");
16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRegistration() {
16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ULocale SRC_LOC = ULocale.FRANCE;
16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ULocale SWAP_LOC = ULocale.US;
16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory extends SimpleNumberFormatFactory {
16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat currencyStyle;
16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestFactory() {
16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                super(SRC_LOC, true);
16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                currencyStyle = NumberFormat.getIntegerInstance(SWAP_LOC);
16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(ULocale loc, int formatType) {
17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (formatType == FORMAT_CURRENCY) {
17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return currencyStyle;
17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f0 = NumberFormat.getIntegerInstance(SWAP_LOC);
17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f1 = NumberFormat.getIntegerInstance(SRC_LOC);
17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f2 = NumberFormat.getCurrencyInstance(SRC_LOC);
17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key = NumberFormat.registerFactory(new TestFactory());
17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f3 = NumberFormat.getCurrencyInstance(SRC_LOC);
17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f4 = NumberFormat.getIntegerInstance(SRC_LOC);
17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat.unregister(key); // restore for other tests
17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f5 = NumberFormat.getCurrencyInstance(SRC_LOC);
17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        float n = 1234.567f;
17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f0 swap int: " + f0.format(n));
17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f1 src int: " + f1.format(n));
17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f2 src cur: " + f2.format(n));
17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f3 reg cur: " + f3.format(n));
17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f4 reg int: " + f4.format(n));
17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f5 unreg cur: " + f5.format(n));
17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f3.format(n).equals(f0.format(n))) {
17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("registered service did not match");
17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f4.format(n).equals(f1.format(n))) {
17317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("registered service did not inherit");
17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f5.format(n).equals(f2.format(n))) {
17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unregistered service did not match original");
17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientific2() {
17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // jb 2552
17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = (DecimalFormat)NumberFormat.getCurrencyInstance();
17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = new Double(12.34);
17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$12.34");
17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setScientificNotation(true);
17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$1.23E1");
17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setScientificNotation(false);
17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$12.34");
17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientificGrouping() {
17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // jb 2552
17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("###.##E0");
17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, .01234, "12.3E-3");
17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, .1234, "123E-3");
17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 1.234, "1.23E0");
17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 12.34, "12.3E0");
17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 123.4, "123E0");
17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 1234, "1.23E3");
17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // additional coverage tests
17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // sigh, can't have static inner classes, why not?
17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final class PI extends Number {
17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * For serialization
17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final long serialVersionUID = -305601227915602172L;
17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private PI() {}
17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int intValue() { return (int)Math.PI; }
17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public long longValue() { return (long)Math.PI; }
17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public float  floatValue() { return (float)Math.PI; }
17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public double doubleValue() { return Math.PI; }
17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public byte byteValue() { return (byte)Math.PI; }
17817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public short shortValue() { return (short)Math.PI; }
17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final Number INSTANCE = new PI();
17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage() {
17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getNumberInstance(); // default locale
17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(fmt.format(new BigInteger("1234567890987654321234567890987654321", 10)));
17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = NumberFormat.getScientificInstance(); // default locale
17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(fmt.format(PI.INSTANCE));
17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(fmt.format("12345"));
17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("numberformat of string did not throw exception");
17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: numberformat of string failed as expected");
18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int hash = fmt.hashCode();
18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("hash code " + hash);
18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("compare to string returns: " + fmt.equals(""));
18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // For ICU 2.6 - alan
18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = new DecimalFormat("'*&'' '\u00A4' ''&*' #,##0.00", US);
18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setCurrency(Currency.getInstance("INR"));
18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 1.0, "*&' \u20B9 '&* 1.00");
18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, -2.0, "-*&' \u20B9 '&* 2.00");
18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.applyPattern("#,##0.00 '*&'' '\u00A4' ''&*'");
18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 2.0, "2.00 *&' \u20B9 '&*");
18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, -1.0, "-1.00 *&' \u20B9 '&*");
18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.math.BigDecimal r;
18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        r = df.getRoundingIncrement();
18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (r != null) {
18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: rounding = " + r + ", expect null");
18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.isScientificNotation()) {
18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isScientificNotation = true, expect false");
18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.applyPattern("0.00000");
18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setScientificNotation(true);
18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!df.isScientificNotation()) {
18327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isScientificNotation = false, expect true");
18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMinimumExponentDigits((byte)2);
18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.getMinimumExponentDigits() != 2) {
18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: getMinimumExponentDigits = " +
18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    df.getMinimumExponentDigits() + ", expect 2");
18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setExponentSignAlwaysShown(true);
18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!df.isExponentSignAlwaysShown()) {
18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isExponentSignAlwaysShown = false, expect true");
18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setSecondaryGroupingSize(0);
18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.getSecondaryGroupingSize() != 0) {
18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: getSecondaryGroupingSize = " +
18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    df.getSecondaryGroupingSize() + ", expect 0");
18477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 3.14159, "3.14159E+00");
18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // DecimalFormatSymbols#getInstance
18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym1 = DecimalFormatSymbols.getInstance();
18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym2 = new DecimalFormatSymbols();
18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!decsym1.equals(decsym2)) {
18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: DecimalFormatSymbols returned by getInstance()" +
18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "does not match new DecimalFormatSymbols().");
18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decsym1 = DecimalFormatSymbols.getInstance(Locale.JAPAN);
18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decsym2 = DecimalFormatSymbols.getInstance(ULocale.JAPAN);
18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!decsym1.equals(decsym2)) {
18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: DecimalFormatSymbols returned by getInstance(Locale.JAPAN)" +
18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "does not match the one returned by getInstance(ULocale.JAPAN).");
18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // DecimalFormatSymbols#getAvailableLocales/#getAvailableULocales
18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] allLocales = DecimalFormatSymbols.getAvailableLocales();
18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (allLocales.length == 0) {
18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales");
18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: " + allLocales.length +
18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " available locales returned by DecimalFormatSymbols.getAvailableLocales");
18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale[] allULocales = DecimalFormatSymbols.getAvailableULocales();
18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (allULocales.length == 0) {
18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales");
18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: " + allULocales.length +
18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " available locales returned by DecimalFormatSymbols.getAvailableULocales");
18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestWhiteSpaceParsing() {
18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("a  b#0c  ", US);
18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 1234;
18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "a b1234c ", n);
18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "a   b1234c   ", n);
18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test currencies whose display name is a ChoiceFormat.
18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestComplexCurrency() {
18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  CLDR No Longer uses complex currency symbols.
18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  Skipping this test.
18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        Locale loc = new Locale("kn", "IN", "");
18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        NumberFormat fmt = NumberFormat.getCurrencyInstance(loc);
18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 1.0, "Re.\u00a01.00");
18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect(fmt, 1.001, "Re.\u00a01.00"); // tricky
19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 12345678.0, "Rs.\u00a01,23,45,678.00");
19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 0.5, "Rs.\u00a00.50");
19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, -1.0, "-Re.\u00a01.00");
19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, -10.0, "-Rs.\u00a010.00");
19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyKeyword() {
19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("th_TH@currency=QQQ");
19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat format = NumberFormat.getCurrencyInstance(locale);
19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = format.format(12.34f);
19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!"QQQ12.34".equals(result)) {
19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("got unexpected currency: " + result);
19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test alternate numbering systems
19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumberingSystems() {
19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestNumberingSystemItem {
19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String localeName;
19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final double value;
19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final boolean isRBNF;
19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String expectedResult;
19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestNumberingSystemItem(String loc, double val, boolean rbnf, String exp) {
19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                localeName  = loc;
19277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                value = val;
19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                isRBNF = rbnf;
19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedResult = exp;
19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final TestNumberingSystemItem[] DATA = {
19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=thai",        1234.567, false, "\u0e51,\u0e52\u0e53\u0e54.\u0e55\u0e56\u0e57" ),
19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=thai",        1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ),
19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=hebr",        5678.0,   true,  "\u05D4\u05F3\u05EA\u05E8\u05E2\u05F4\u05D7" ),
19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=arabext",     1234.567, false, "\u06F1\u066c\u06F2\u06F3\u06F4\u066b\u06F5\u06F6\u06F7" ),
19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "de_DE@numbers=foobar",      1234.567, false, "1.234,567" ),
19397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ar_EG",                     1234.567, false, "\u0661\u066c\u0662\u0663\u0664\u066b\u0665\u0666\u0667" ),
19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "th_TH@numbers=traditional", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), // fall back to native per TR35
19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ar_MA",                     1234.567, false, "1.234,567" ),
19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=hanidec",     1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ),
19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=native",      1234.567, false, "\u0BE7,\u0BE8\u0BE9\u0BEA.\u0BEB\u0BEC\u0BED" ),
19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=traditional", 1235.0,   true,  "\u0BF2\u0BE8\u0BF1\u0BE9\u0BF0\u0BEB" ),
19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=finance",     1234.567, false, "1,234.567" ), // fall back to default per TR35
19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=native",      1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ),
19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=traditional", 1234.567, true,  "\u4E00\u5343\u4E8C\u767E\u4E09\u5341\u56DB\u9EDE\u4E94\u516D\u4E03" ),
19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=finance",     1234.567, true,  "\u58F9\u4EDF\u8CB3\u4F70\u53C3\u62FE\u8086\u9EDE\u4F0D\u9678\u67D2" )
19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (TestNumberingSystemItem item : DATA) {
19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(item.localeName);
19547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getInstance(loc);
19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (item.isRBNF) {
19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expect3(fmt,item.value,item.expectedResult);
19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expect2(fmt,item.value,item.expectedResult);
19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1962e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín
1963e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    // Coverage tests for methods not being called otherwise.
1964e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    public void TestNumberingSystemCoverage() {
1965e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test getAvaliableNames
1966e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        String[] availableNames = NumberingSystem.getAvailableNames();
1967e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (availableNames == null || availableNames.length <= 0) {
1968e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getAvailableNames() returned a null or empty array.");
1969e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        } else {
1970e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            boolean latnFound = false;
1971e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            for (String name : availableNames){
1972e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                if ("latn".equals(name)) {
1973e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                    latnFound = true;
1974e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                    break;
1975e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                }
1976e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            }
1977e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín
1978e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            if (!latnFound) {
1979e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                errln("ERROR: 'latn' numbering system not found on NumberingSystem.getAvailableNames().");
1980e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            }
1981e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
1982e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín
1983e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance()
1984e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns1 = NumberingSystem.getInstance();
1985e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns1 == null || ns1.isAlgorithmic()) {
1986e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance() returned a null or invalid NumberingSystem");
1987e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
1988e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín
1989e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance(int,boolean,String)
1990e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        /* Parameters used: the ones used in the default constructor
1991e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * radix = 10;
1992e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * algorithmic = false;
1993e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * desc = "0123456789";
1994e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         */
1995e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns2 = NumberingSystem.getInstance(10, false, "0123456789");
1996e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns2 == null || ns2.isAlgorithmic()) {
1997e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance(int,boolean,String) returned a null or invalid NumberingSystem");
1998e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
1999e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín
2000e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance(Locale)
2001e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns3 = NumberingSystem.getInstance(Locale.ENGLISH);
2002e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns3 == null || ns3.isAlgorithmic()) {
2003e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance(Locale) returned a null or invalid NumberingSystem");
2004e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
2005e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    }
20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test6816() {
20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency cur1 = Currency.getInstance(new Locale("und", "PH"));
20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getCurrencyInstance(new Locale("und", "PH"));
20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym = ((DecimalFormat)nfmt).getDecimalFormatSymbols();
20127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency cur2 = decsym.getCurrency();
20137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ( !cur1.getCurrencyCode().equals("PHP") || !cur2.getCurrencyCode().equals("PHP")) {
20157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Currencies should match PHP: cur1 = "+cur1.getCurrencyCode()+"; cur2 = "+cur2.getCurrencyCode());
20167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestThreadedFormat() {
20217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class FormatTask implements Runnable {
20237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt;
20247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buf;
20257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean inc;
20267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            float num;
20277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            FormatTask(DecimalFormat fmt, int index) {
20297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.fmt = fmt;
20307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.buf = new StringBuffer();
20317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.inc = (index & 0x1) == 0;
20327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.num = inc ? 0 : 10000;
20337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public void run() {
20367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (inc) {
20377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    while (num < 10000) {
20387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        buf.append(fmt.format(num) + "\n");
20397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        num += 3.14159;
20407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
20417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
20427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    while (num > 0) {
20437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        buf.append(fmt.format(num) + "\n");
20447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        num -= 3.14159;
20457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
20467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
20477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String result() {
20507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return buf.toString();
20517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("0.####");
20557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatTask[] tasks = new FormatTask[8];
20567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tasks.length; ++i) {
20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tasks[i] = new FormatTask(fmt, i);
20587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestUtil.runUntilDone(tasks);
20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 2; i < tasks.length; i++) {
20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str1 = tasks[i].result();
20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str2 = tasks[i-2].result();
20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!str1.equals(str2)) {
20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("mismatch at " + i);
20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(str1);
20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(str2);
20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("decimal format thread mismatch");
20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
20727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            str1 = str2;
20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPerMill() {
20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("###.###\u2030");
20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("0.4857 x ###.###\u2030",
20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "485.7\u2030", fmt.format(0.4857));
20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.ENGLISH);
20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setPerMill('m');
20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("", sym);
20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt2.applyLocalizedPattern("###.###m");
20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("0.4857 x ###.###m",
20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "485.7m", fmt2.format(0.4857));
20887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIllegalPatterns() {
20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test cases:
20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Prefix with "-:" for illegal patterns
20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Prefix with "+:" for legal patterns
20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String DATA[] = {
20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Unquoted special characters in the suffix are illegal
20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-:000.000|###",
20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "+:000.000'|###'",
20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat=DATA[i];
21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean valid = pat.charAt(0) == '+';
21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pat = pat.substring(2);
21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception e = null;
21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale doesn't matter here
21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat(pat);
21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (IllegalArgumentException e1) {
21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                e = e1;
21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (IndexOutOfBoundsException e1) {
21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                e = e1;
21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String msg = (e==null) ? "success" : e.getMessage();
21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((e==null) == valid) {
21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: pattern \"" + pat + "\": " + msg);
21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: pattern \"" + pat + "\" should have " +
21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        (valid?"succeeded":"failed") + "; got " + msg);
21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Parse a CurrencyAmount using the given NumberFormat, with
21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the 'delim' character separating the number and the currency.
21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static CurrencyAmount parseCurrencyAmount(String str, NumberFormat fmt,
21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char delim)
21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    throws ParseException {
21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i = str.indexOf(delim);
21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new CurrencyAmount(fmt.parse(str.substring(0,i)),
21317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Currency.getInstance(str.substring(i+1)));
21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return an integer representing the next token from this
21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * iterator.  The integer will be an index into the given list, or
21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * -1 if there are no more tokens, or -2 if the token is not on
21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the list.
21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static int keywordIndex(String tok) {
21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<KEYWORDS.length; ++i) {
21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (tok.equals(KEYWORDS[i])) {
21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return i;
21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return -1;
21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String KEYWORDS[] = {
21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*0*/ "ref=", // <reference pattern to parse numbers>
21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*1*/ "loc=", // <locale for formats>
21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*2*/ "f:",   // <pattern or '-'> <number> <exp. string>
21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*3*/ "fp:",  // <pattern or '-'> <number> <exp. string> <exp. number>
21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*4*/ "rt:",  // <pattern or '-'> <(exp.) number> <(exp.) string>
21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*5*/ "p:",   // <pattern or '-'> <string> <exp. number>
21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*6*/ "perr:", // <pattern or '-'> <invalid string>
21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'>
21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*8*/ "fpc:", // <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt>
21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*9*/ "strict=", // true or false
21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2162aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert    @SuppressWarnings("resource")  // InputStream is will be closed by the ResourceReader.
21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCases() {
21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String caseFileName = "NumberFormatTestCases.txt";
21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.io.InputStream is = NumberFormatTest.class.getResourceAsStream(caseFileName);
21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ResourceReader reader = new ResourceReader(is, caseFileName, "utf-8");
21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TokenIterator tokens = new TokenIterator(reader);
21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale loc = new Locale("en", "US", "");
21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat ref = null, fmt = null;
21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfmt = null;
21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = null, str = null, mloc = null;
21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean strict = false;
21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (;;) {
21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String tok = tokens.next();
21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (tok == null) {
21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String where = "(" + tokens.getLineNumber() + ") ";
21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int cmd = keywordIndex(tok);
21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                switch (cmd) {
21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 0:
21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // ref= <reference pattern>
21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ref = new DecimalFormat(tokens.next(),
21887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new DecimalFormatSymbols(Locale.US));
21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ref.setParseStrict(strict);
21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting reference pattern to:\t" + ref);
21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 1:
21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // loc= <locale>
21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    loc = LocaleUtility.getLocaleFromName(tokens.next());
21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = ((DecimalFormat) NumberFormat.getInstance(loc)).toPattern();
21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting locale to:\t" + loc + ", \tand pattern to:\t" + pat);
21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 2: // f:
21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 3: // fp:
22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 4: // rt:
22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 5: // p:
22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tok = tokens.next();
22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!tok.equals("-")) {
22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        pat = tok;
22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc));
22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        fmt.setParseStrict(strict);
22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (IllegalArgumentException iae) {
22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + "Pattern \"" + pat + '"');
22117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        iae.printStackTrace();
22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        tokens.next(); // consume remaining tokens
22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        //tokens.next();
22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (cmd == 3) tokens.next();
22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        continue;
22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    str = null;
22187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
22197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (cmd == 2 || cmd == 3 || cmd == 4) {
22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // f: <pattern or '-'> <number> <exp. string>
22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // fp: <pattern or '-'> <number> <exp. string> <exp. number>
22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // rt: <pattern or '-'> <number> <string>
22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String num = tokens.next();
22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            str = tokens.next();
22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number n = ref.parse(num);
22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + pat + "\".format(" + num + ")",
22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    str, fmt.format(n));
22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (cmd == 3) { // fp:
22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                n = ref.parse(tokens.next());
22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (cmd != 2) { // != f:
22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")",
22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        n, fmt.parse(str));
22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // p: <pattern or '-'> <string to parse> <exp. number>
22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        else {
22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            str = tokens.next();
22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String expstr = tokens.next();
22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number parsed = fmt.parse(str);
22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number exp = ref.parse(expstr);
22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")",
22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    exp, parsed);
22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (ParseException e) {
22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + '"' + pat + "\".parse(\"" + str +
22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "\") threw an exception");
22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        e.printStackTrace();
22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 6:
22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // perr: <pattern or '-'> <invalid string>
22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Under construction");
22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 7:
22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // pat: <pattern> <exp. toPattern, or '-' or 'err'>
22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String testpat = tokens.next();
22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String exppat  = tokens.next();
22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    boolean err    = exppat.equals("err");
22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (testpat.equals("-")) {
22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("Invalid command \"pat: - err\" at " +  tokens.describePosition());
22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            continue;
22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        testpat = pat;
22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (exppat.equals("-")) exppat = testpat;
22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat f = null;
22707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (testpat == pat) { // [sic]
22717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f = fmt;
22727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
22737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f = new DecimalFormat(testpat);
22747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f.setParseStrict(strict);
22757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
22777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Invalid pattern \"" + testpat +
22787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" was accepted");
22797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + testpat + "\".toPattern()",
22817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    exppat, f.toPattern());
22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (IllegalArgumentException iae2) {
22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            logln("Ok: " + where + "Invalid pattern \"" + testpat +
22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" threw an exception");
22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Valid pattern \"" + testpat +
22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" threw an exception");
22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            iae2.printStackTrace();
22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 8: // fpc:
22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tok = tokens.next();
22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!tok.equals("-")) {
22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        mloc = tok;
22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ULocale l = new ULocale(mloc);
22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        try {
23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            mfmt = MeasureFormat.getCurrencyFormat(l);
23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } catch (IllegalArgumentException iae) {
23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Loc \"" + tok + '"');
23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            iae.printStackTrace();
23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next(); // consume remaining tokens
23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next();
23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next();
23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            continue;
23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    str = null;
23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt>
23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String currAmt = tokens.next();
23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str = tokens.next();
23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        CurrencyAmount target = parseCurrencyAmount(currAmt, ref, '/');
23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String formatResult = mfmt.format(target);
23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")",
23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                str, formatResult);
23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        target = parseCurrencyAmount(tokens.next(), ref, '/');
23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        CurrencyAmount parseResult = (CurrencyAmount) mfmt.parseObject(str);
23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")",
23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                target, parseResult);
23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (ParseException e) {
23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + '"' + pat + "\".parse(\"" + str +
23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "\") threw an exception");
23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        e.printStackTrace();
23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 9: // strict= true or false
23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    strict = "true".equalsIgnoreCase(tokens.next());
23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting strict to:\t" + strict);
23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case -1:
23347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Unknown command \"" + tok + "\" at " + tokens.describePosition());
23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (java.io.IOException e) {
23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException(e);
2340aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        } finally {
2341aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            try {
2342aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                reader.close();
2343aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            } catch (IOException ignored) {
2344aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            }
23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionDecimal() {
23497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
23547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 5, fp.getBeginIndex());
23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 6, fp.getEndIndex());
23587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionInteger() {
23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.INTEGER);
23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
23677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
23687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 3, fp.getBeginIndex());
23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 5, fp.getEndIndex());
23707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionFractionButInteger() {
23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION);
23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35, buffer, fp);
23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35", "FOO35BA", buffer.toString());
23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 5, fp.getBeginIndex());
23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 5, fp.getEndIndex());
23827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionFraction() {
23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION);
23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 6, fp.getBeginIndex());
23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 8, fp.getEndIndex());
23947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2396ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius    public void TestFieldPositionCurrency() {
2397ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.US);
2398ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        double amount = 35.47;
2399ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        double negAmount = -34.567;
2400ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        FieldPosition cp = new FieldPosition(NumberFormat.Field.CURRENCY);
2401ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2402ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer0 = new StringBuffer();
2403ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer0, cp);
2404ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("$35.47", "$35.47", buffer0.toString());
2405ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2406ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 1, cp.getEndIndex());
2407ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2408ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer01 = new StringBuffer();
2409ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer01, cp);
2410ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-$34.57", "-$34.57", buffer01.toString());
2411ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
2412ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 2, cp.getEndIndex());
2413ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2414ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(Locale.FRANCE));
2415ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer1 = new StringBuffer();
2416ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer1, cp);
2417ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("€35.47", "€35.47", buffer1.toString());
2418ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2419ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 1, cp.getEndIndex());
2420ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2421ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("fr", "ch", "")));
2422ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer2 = new StringBuffer();
2423ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer2, cp);
2424ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("CHF35.47", "CHF35.47", buffer2.toString());
2425ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2426ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 3, cp.getEndIndex());
2427ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2428ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer20 = new StringBuffer();
2429ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer20, cp);
2430ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-CHF34.57", "-CHF34.57", buffer20.toString());
2431ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
2432ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 4, cp.getEndIndex());
2433ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2434ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.FRANCE);
2435ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer3 = new StringBuffer();
2436ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer3, cp);
2437ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("35,47 €", "35,47 €", buffer3.toString());
2438ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2439ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 7, cp.getEndIndex());
2440ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2441ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer4 = new StringBuffer();
2442ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer4, cp);
2443ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34,57 €", "-34,57 €", buffer4.toString());
2444ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
2445ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 8, cp.getEndIndex());
2446ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2447ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("fr", "ch")));
2448ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer5 = new StringBuffer();
2449ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer5, cp);
2450ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34,57 CHF", "-34,57 CHF", buffer5.toString());
2451ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
2452ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 10, cp.getEndIndex());
2453ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2454ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        NumberFormat plCurrencyFmt = NumberFormat.getInstance(new Locale("fr", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2455ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer6 = new StringBuffer();
2456ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer6, cp);
2457ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57 francs suisses", "-34.57 francs suisses", buffer6.toString());
2458ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
2459ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 21, cp.getEndIndex());
2460ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2461ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Positive value with PLURALCURRENCYSTYLE.
2462ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2463ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer7 = new StringBuffer();
2464ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(amount, buffer7, cp);
2465ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("35.47スイス フラン", "35.47スイス フラン", buffer7.toString());
2466ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 5, cp.getBeginIndex());
2467ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 12, cp.getEndIndex());
2468ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2469ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // PLURALCURRENCYSTYLE for non-ASCII.
2470ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "de"), NumberFormat.PLURALCURRENCYSTYLE);
2471ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer8 = new StringBuffer();
2472ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer8, cp);
2473ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57ユーロ", "-34.57ユーロ", buffer8.toString());
2474ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2475ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 9, cp.getEndIndex());
2476ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2477ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.JAPAN);
2478ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("ja", "jp")));
2479ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer9 = new StringBuffer();
2480ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer9, cp);
2481ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-¥35", "-¥35", buffer9.toString());
2482ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
2483ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 2, cp.getEndIndex());
2484ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2485ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Negative value with PLURALCURRENCYSTYLE.
2486ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2487ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer10 = new StringBuffer();
2488ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer10, cp);
2489ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57スイス フラン", "-34.57スイス フラン", buffer10.toString());
2490ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2491ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 13, cp.getEndIndex());
2492ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2493ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Nagative value with PLURALCURRENCYSTYLE, Arabic digits.
2494ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("ar", "eg"));
2495ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ar", "eg"), NumberFormat.PLURALCURRENCYSTYLE);
2496ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer11 = new StringBuffer();
2497ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer11, cp);
2498ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("‏-٣٤٫٥٧ جنيه مصري", "‏-٣٤٫٥٧ جنيه مصري", buffer11.toString());
2499ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 8, cp.getBeginIndex());
2500ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 17, cp.getEndIndex());
2501ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius    }
2502ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
25037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRounding() {
25047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
25057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (false) { // for debugging specific value
25067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.setRoundingMode(BigDecimal.ROUND_HALF_UP);
25077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            checkRounding(nf, new BigDecimal("300.0300000000"), 0, new BigDecimal("0.020000000"));
25087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // full tests
25107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] roundingIncrements = {1, 2, 5, 20, 50, 100};
25117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] testValues = {0, 300};
25127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < testValues.length; ++j) {
25137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int mode = BigDecimal.ROUND_UP; mode < BigDecimal.ROUND_HALF_EVEN; ++mode) {
25147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setRoundingMode(mode);
25157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int increment = 0; increment < roundingIncrements.length; ++increment) {
25167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    BigDecimal base = new BigDecimal(testValues[j]);
25177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    BigDecimal rInc = new BigDecimal(roundingIncrements[increment]);
25187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    checkRounding(nf,  base, 20, rInc);
25197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rInc = new BigDecimal("1.000000000").divide(rInc);
25207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    checkRounding(nf,  base, 20, rInc);
25217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
25227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingPattern() {
25277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestRoundingPatternItem {
25287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String     pattern;
25297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double     roundingIncrement;
25307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double     testCase;
25317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String     expected;
25327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestRoundingPatternItem(String pattern, double roundingIncrement, double testCase, String expected) {
25347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.pattern = pattern;
25357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.roundingIncrement = roundingIncrement;
25367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.testCase = testCase;
25377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.expected = expected;
25387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
25407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestRoundingPatternItem []tests = {
25427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestRoundingPatternItem("##0.65", 0.65, 1.234, "1.30"),
25437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestRoundingPatternItem("#50", 50.0, 1230, "1250")
25447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
25457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
25477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result;
25487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal bd;
25497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tests.length; i++) {
25507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.applyPattern(tests[i].pattern);
25517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = df.format(tests[i].testCase);
25537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tests[i].expected.equals(result)) {
25557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected);
25567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bd = new BigDecimal(tests[i].roundingIncrement);
25597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setRoundingIncrement(bd);
25617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = df.format(tests[i].testCase);
25637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tests[i].expected.equals(result)) {
25657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("BigDecimal Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected);
25667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBigDecimalRounding() {
25717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String figure = "50.000000004";
25727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Double dbl = new Double(figure);
25737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal dec = new BigDecimal(figure);
25747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat f = (DecimalFormat) NumberFormat.getInstance();
25767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.applyPattern("00.00######");
25777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("double format", "50.00", f.format(dbl));
25797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("bigdec format", "50.00", f.format(dec));
25807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int maxFracDigits = f.getMaximumFractionDigits();
25827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal roundingIncrement = new BigDecimal("1").movePointLeft(maxFracDigits);
25837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingIncrement(roundingIncrement);
25857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingMode(BigDecimal.ROUND_DOWN);
25867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Rounding down", f.format(dbl), f.format(dec));
25877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingIncrement(roundingIncrement);
25897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingMode(BigDecimal.ROUND_HALF_UP);
25907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Rounding half up", f.format(dbl), f.format(dec));
25917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void checkRounding(DecimalFormat nf, BigDecimal base, int iterations, BigDecimal increment) {
25947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setRoundingIncrement(increment.toBigDecimal());
25957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal lastParsed = new BigDecimal(Integer.MIN_VALUE); // used to make sure that rounding is monotonic
25967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = -iterations; i <= iterations; ++i) {
25977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal iValue = base.add(increment.multiply(new BigDecimal(i)).movePointLeft(1));
25987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal smallIncrement = new BigDecimal("0.00000001");
25997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (iValue.signum() != 0) {
26007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                smallIncrement.multiply(iValue); // scale unless zero
26017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // we not only test the value, but some values in a small range around it.
26037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue.subtract(smallIncrement), lastParsed);
26047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue, lastParsed);
26057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue.add(smallIncrement), lastParsed);
26067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private BigDecimal checkRound(DecimalFormat nf, BigDecimal iValue, BigDecimal lastParsed) {
26107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formatedBigDecimal = nf.format(iValue);
26117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formattedDouble = nf.format(iValue.doubleValue());
26127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!equalButForTrailingZeros(formatedBigDecimal, formattedDouble)) {
26137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Failure at: " + iValue + " (" + iValue.doubleValue() + ")"
26157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()]
26167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tRounding-increment: " + nf.getRoundingIncrement()
26177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tdouble: " + formattedDouble
26187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tBigDecimal: " + formatedBigDecimal);
26197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
26217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Value: " + iValue
26227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()]
26237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tRounding-increment: " + nf.getRoundingIncrement()
26247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tdouble: " + formattedDouble
26257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tBigDecimal: " + formatedBigDecimal);
26267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
26287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Number should have compareTo(...)
26297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal parsed = toBigDecimal(nf.parse(formatedBigDecimal));
26307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (lastParsed.compareTo(parsed) > 0) {
26317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Rounding wrong direction!: " + lastParsed + " > " + parsed);
26327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = parsed;
26347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
26357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse Failure with: " + formatedBigDecimal);
26367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return lastParsed;
26387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static BigDecimal toBigDecimal(Number number) {
26417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return number instanceof BigDecimal ? (BigDecimal) number
26427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : number instanceof BigInteger ? new BigDecimal((BigInteger)number)
26437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        : number instanceof java.math.BigDecimal ? new BigDecimal((java.math.BigDecimal)number)
26447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : number instanceof Double ? new BigDecimal(number.doubleValue())
26457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        : number instanceof Float ? new BigDecimal(number.floatValue())
26467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : new BigDecimal(number.longValue());
26477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static String[] roundingModeNames = {
26507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_UP", "ROUND_DOWN", "ROUND_CEILING", "ROUND_FLOOR",
26517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_HALF_UP", "ROUND_HALF_DOWN", "ROUND_HALF_EVEN",
26527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_UNNECESSARY"
26537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
26547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static boolean equalButForTrailingZeros(String formatted1, String formatted2) {
26567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (formatted1.length() == formatted2.length()) return formatted1.equals(formatted2);
26577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return stripFinalZeros(formatted1).equals(stripFinalZeros(formatted2));
26587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String stripFinalZeros(String formatted) {
26617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len1 = formatted.length();
26627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char ch;
26637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (len1 > 0 && ((ch = formatted.charAt(len1-1)) == '0' || ch == '.')) --len1;
26647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (len1==1 && ((ch = formatted.charAt(len1-1)) == '-')) --len1;
26657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return formatted.substring(0,len1);
26667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //------------------------------------------------------------------
26697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Support methods
26707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //------------------------------------------------------------------
26717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test
26737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, Number n, String exp) {
26747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Don't round-trip format test, since we explicitly do it
26757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, n, exp, false);
26767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, exp, n);
26777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test
26797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, Number n, String exp) {
26807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Don't round-trip format test, since we explicitly do it
26817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect_rbnf(fmt, n, exp, false);
26827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect_rbnf(fmt, exp, n);
26837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
26867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, double n, String exp) {
26877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, new Double(n), exp);
26887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
26907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, double n, String exp) {
26917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect3(fmt, new Double(n), exp);
26927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
26957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, long n, String exp) {
26967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, new Long(n), exp);
26977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
26997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, long n, String exp) {
27007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect3(fmt, new Long(n), exp);
27017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test
27047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, Number n, String exp, boolean rt) {
27057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer saw = new StringBuffer();
27067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
27077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(n, saw, pos);
27087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat)fmt).toPattern();
27097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.toString().equals(exp)) {
27107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   " + n + " x " +
27117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat + " = \"" +
27127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    saw + "\"");
27137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // We should be able to round-trip the formatted string =>
27147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // number => string (but not the other way around: number
27157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // => string => number2, might have number2 != number):
27167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rt) {
27177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
27187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n2 = fmt.parse(exp);
27197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    StringBuffer saw2 = new StringBuffer();
27207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.format(n2, saw2, pos);
27217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!saw2.toString().equals(exp)) {
27227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"');
27247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
27257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
27267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", " + e.getMessage());
27287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
27297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
27307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
27327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL " + n + " x " + pat + " = \"" + saw + "\", expected \"" + exp + "\"");
27347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test
27377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect_rbnf(NumberFormat fmt, Number n, String exp, boolean rt) {
27387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer saw = new StringBuffer();
27397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
27407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(n, saw, pos);
27417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.toString().equals(exp)) {
27427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   " + n + " = \"" +
27437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    saw + "\"");
27447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // We should be able to round-trip the formatted string =>
27457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // number => string (but not the other way around: number
27467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // => string => number2, might have number2 != number):
27477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rt) {
27487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
27497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n2 = fmt.parse(exp);
27507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    StringBuffer saw2 = new StringBuffer();
27517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.format(n2, saw2, pos);
27527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!saw2.toString().equals(exp)) {
27537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"');
27557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
27567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
27577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", " + e.getMessage());
27597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
27607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
27617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
27637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect_rbnf() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL " + n + " = \"" + saw + "\", expected \"" + exp + "\"");
27657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
27697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, Number n, String exp) {
27707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, n, exp, true);
27717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
27747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, double n, String exp) {
27757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, new Double(n), exp);
27767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
27797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, long n, String exp) {
27807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, new Long(n), exp);
27817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test
27847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, Number n) {
27857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = null;
27867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
27877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            num = fmt.parse(str);
27887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
27897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(e.getMessage());
27907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
27917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat)fmt).toPattern();
27937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // A little tricky here -- make sure Double(12345.0) and
27947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Long(12345) match.
27957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (num.equals(n) || num.doubleValue() == n.doubleValue()) {
27967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + str + "\" x " +
27977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat + " = " +
27987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    num);
27997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL \"" + str + "\" x " + pat + " = " + num + ", expected " + n);
28027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test
28067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect_rbnf(NumberFormat fmt, String str, Number n) {
28077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = null;
28087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
28097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            num = fmt.parse(str);
28107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
28117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(e.getMessage());
28127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
28137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // A little tricky here -- make sure Double(12345.0) and
28157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Long(12345) match.
28167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (num.equals(n) || num.doubleValue() == n.doubleValue()) {
28177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + str + " = " +
28187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    num);
28197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect_rbnf() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL \"" + str + " = " + num + ", expected " + n);
28227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test (convenience)
28267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, double n) {
28277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, str, new Double(n));
28287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test (convenience)
28317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, long n) {
28327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, str, new Long(n));
28337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectCurrency(NumberFormat nf, Currency curr,
28367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value, String string) {
28377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = (DecimalFormat) nf;
28387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (curr != null) {
28397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.setCurrency(curr);
28407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = fmt.format(value).replace('\u00A0', ' ');
28427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (s.equals(string)) {
28447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok: " + value + " x " + curr + " => " + s);
28457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + value + " x " + curr + " => " + s +
28477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", expected " + string);
28487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPad(DecimalFormat fmt, String pat, int pos) {
28527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, pat, pos, 0, (char)0);
28537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPad(DecimalFormat fmt, final String pat, int pos, int width, final char pad) {
28567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int apos = 0, awidth = 0;
28577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char apadStr;
28587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
28597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.applyPattern(pat);
28607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = fmt.getPadPosition();
28617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = fmt.getFormatWidth();
28627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apadStr = fmt.getPadCharacter();
28637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
28647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = -1;
28657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = width;
28667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apadStr = pad;
28677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (apos == pos && awidth == width && apadStr == pad) {
28707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + "\" pos="
28717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + apos + ((pos == -1) ? "" : " width=" + awidth + " pad=" + apadStr));
28727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + pat + "\" pos=" + apos + " width="
28747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + awidth + " pad=" + apadStr + ", expected "
28757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + pos + " " + width + " " + pad);
28767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPat(DecimalFormat fmt, final String exp) {
28807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = fmt.toPattern();
28817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pat.equals(exp)) {
28827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + "\"");
28837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + pat + "\", expected \"" + exp + "\"");
28857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectParseCurrency(NumberFormat fmt, Currency expected, String text) {
28907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
28917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount currencyAmount = fmt.parseCurrency(text, pos);
28927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("Parse of " + text + " should have succeeded.", pos.getIndex() > 0);
28937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Currency should be correct.", expected, currencyAmount.getCurrency());
28947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB3832(){
28977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("pt_PT@currency=PTE");
28987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat format = NumberFormat.getCurrencyInstance(locale);
28997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency curr = Currency.getInstance(locale);
29007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false}));
29017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount cAmt = new CurrencyAmount(1150.50, curr);
29027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode
29037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = format.format(cAmt);
29047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected = "1,150$50\u00a0\u200b";
29057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!expected.equals(str)){
29067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Did not get the expected output Expected: "+expected+" Got: "+ str);
29077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStrictParse() {
29117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] pass = {
29127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0",           // single zero before end of text is not leading
29137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0 ",          // single zero at end of number is not leading
29147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.",          // single zero before period (or decimal, it's ambiguous) is not leading
29157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0,",          // single zero before comma (not group separator) is not leading
29167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0",         // single zero before decimal followed by digit is not leading
29177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0. ",         // same as above before period (or decimal) is not leading
29187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.100,5",     // comma stops parse of decimal (no grouping)
29197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".00",         // leading decimal is ok, even with zeros
29207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234567",     // group separators are not required
29217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345, ",     // comma not followed by digit is not a group separator, but end of number
29227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234, ",     // if group separator is present, group sizes must be appropriate
29237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,567",   // ...secondary too
29247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E",          // an exponent not followed by zero or digits is not an exponent
29257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00",          // leading zero before zero - used to be error - see ticket #7913
29267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "012",         // leading zero before digit - used to be error - see ticket #7913
29277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0,456",       // leading zero before group separator - used to be error - see ticket #7913
29287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] fail = {
29307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,2",       // wrong number of digits after group separator
29317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",0",        // leading group separator before zero
29327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",1",        // leading group separator before digit
29337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",.02",      // leading group separator before decimal
29347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,.02",     // group separator before decimal
29357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,,200",    // multiple group separators
29367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45",      // wrong number of digits in primary group
29377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45 that", // wrong number of digits in primary group
29387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45.34",   // wrong number of digits in primary group
29397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234,567",  // wrong number of digits in secondary group
29407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567", // wrong number of digits in secondary group
29417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,23,456,7890", // wrong number of digits in primary and secondary groups
29427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
29457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, pass, fail);
29467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] scientificPass = {
29487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E2",      // single zero before exponent is ok
29497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234E2",   // any number of digits before exponent is ok
29507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234E",   // an exponent string not followed by zero or digits is not an exponent
29517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00E2",     // leading zeroes now allowed in strict mode - see ticket #
29527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] scientificFail = {
29547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234E2",  // group separators with exponent fail
29557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
29587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, scientificPass, scientificFail);
29597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] mixedPass = {
29617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567",
29627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567,",
29637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567, that",
29647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567 that",
29657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] mixedFail = {
29677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56",
29687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56,",
29697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56, that ",
29707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56 that",
29717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = new DecimalFormat("#,##,##0.#");
29747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, mixedPass, mixedFail);
29757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void runStrictParseBatch(DecimalFormat nf, String[] pass, String[] fail) {
29787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseStrict(false);
29797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should pass", nf, pass, true);
29807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should also pass", nf, fail, true);
29817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseStrict(true);
29827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should still pass", nf, pass, true);
29837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should fail", nf, fail, false);
29847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void runStrictParseTests(String msg, DecimalFormat nf, String[] tests, boolean pass) {
29877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("");
29887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: '" + nf.toPattern() + "'");
29897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(msg);
29907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tests.length; ++i) {
29917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = tests[i];
29927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition pp = new ParsePosition(0);
29937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number n = nf.parse(str, pp);
29947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String formatted = n != null ? nf.format(n) : "null";
29957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String err = pp.getErrorIndex() == -1 ? "" : "(error at " + pp.getErrorIndex() + ")";
29967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((err.length() == 0) != pass) {
29977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("'" + str + "' parsed '" +
29987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str.substring(0, pp.getIndex()) +
29997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "' returned " + n + " formats to '" +
30007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted + "' " + err);
30017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
30027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (err.length() > 0) {
30037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    err = "got expected " + err;
30047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("'" + str + "' parsed '" +
30067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str.substring(0, pp.getIndex()) +
30077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "' returned " + n + " formats to '" +
30087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted + "' " + err);
30097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB5251(){
30137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //save default locale
30147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale defaultLocale = ULocale.getDefault();
30157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(new ULocale("qr_QR"));
30167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
30177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat.getInstance();
30187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
30207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Numberformat threw exception for non-existent locale. It should use the default.");
30217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //reset default locale
30237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(defaultLocale);
30247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseReturnType() {
30277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] defaultNonBigDecimals = {
30287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123",      // Long
30297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.0",    // Long
30307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0",      // Long
30317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345678901234567890"      // BigInteger
30327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] doubles = {
30357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-0.0",
30367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "NaN",
30377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\u221E"    // Infinity
30387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
30417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = new DecimalFormat("#.#", sym);
30427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (nf.isParseBigDecimal()) {
30447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isParseDecimal() must return false by default");
30457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // isParseBigDecimal() is false
30487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < defaultNonBigDecimals.length; i++) {
30497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
30507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(defaultNonBigDecimals[i]);
30517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (n instanceof BigDecimal) {
30527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse returns BigDecimal instance");
30537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
30557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e);
30567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // parse results for doubls must be always Double
30597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < doubles.length; i++) {
30607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
30617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(doubles[i]);
30627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof Double)) {
30637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return Double instance");
30647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
30667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + doubles[i] + "' threw exception: " + e);
30677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // force this DecimalFormat to return BigDecimal
30717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseBigDecimal(true);
30727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nf.isParseBigDecimal()) {
30737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isParseBigDecimal() must return true");
30747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // isParseBigDecimal() is true
30777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < defaultNonBigDecimals.length; i++) {
30787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
30797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(defaultNonBigDecimals[i]);
30807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof BigDecimal)) {
30817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return BigDecimal instance");
30827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
30847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e);
30857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // parse results for doubls must be always Double
30887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < doubles.length; i++) {
30897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
30907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(doubles[i]);
30917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof Double)) {
30927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return Double instance");
30937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
30957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + doubles[i] + "' threw exception: " + e);
30967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNonpositiveMultiplier() {
31017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = new DecimalFormat("0");
31027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test zero multiplier
31047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
31067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setMultiplier(0);
31077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // bad
31097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("DecimalFormat.setMultiplier(0) did not throw an IllegalArgumentException");
31107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException ex) {
31117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // good
31127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test negative multiplier
31157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
31177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setMultiplier(-1);
31187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (df.getMultiplier() != -1) {
31207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("DecimalFormat.setMultiplier(-1) did not change the multiplier to -1");
31217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
31227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // good
31257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException ex) {
31267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // bad
31277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("DecimalFormat.setMultiplier(-1) threw an IllegalArgumentException");
31287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
31297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "1122.123", -1122.123);
31327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "-1122.123", 1122.123);
31337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "1.2", -1.2);
31347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "-1.2", 1.2);
31357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MAX_VALUE, BigInteger.valueOf(Long.MAX_VALUE).negate().toString());
31377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MIN_VALUE, BigInteger.valueOf(Long.MIN_VALUE).negate().toString());
31387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MAX_VALUE / 2, BigInteger.valueOf(Long.MAX_VALUE / 2).negate().toString());
31397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MIN_VALUE / 2, BigInteger.valueOf(Long.MIN_VALUE / 2).negate().toString());
31407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
31427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
31437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
31457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
31467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
31477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB5358() {
31497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int numThreads = 10;
31507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String numstr = "12345";
31517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double expected = 12345;
31527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
31537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#.#", sym);
31547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArrayList errors = new ArrayList();
31557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads];
31577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < numThreads; i++) {
31587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            threads[i] = new ParseThreadJB5358((DecimalFormat)fmt.clone(), numstr, expected, errors);
31597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            threads[i].start();
31607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < numThreads; i++) {
31627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
31637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                threads[i].join();
31647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (InterruptedException ie) {
31657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ie.printStackTrace();
31667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (errors.size() != 0) {
31697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer errBuf = new StringBuffer();
31707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < errors.size(); i++) {
31717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errBuf.append((String)errors.get(i));
31727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errBuf.append("\n");
31737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + errBuf);
31757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
31777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static private class ParseThreadJB5358 extends Thread {
31797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final DecimalFormat decfmt;
31807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final String numstr;
31817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final double expect;
31827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final ArrayList errors;
31837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) {
31857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.decfmt = decfmt;
31867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.numstr = numstr;
31877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.expect = expect;
31887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.errors = errors;
31897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
31927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public void run() {
31937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < 10000; i++) {
31947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
31957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n = decfmt.parse(numstr);
31967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (n.doubleValue() != expect) {
31977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        synchronized(errors) {
31987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errors.add(new String("Bad parse result - expected:" + expect + " actual:" + n.doubleValue()));
31997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
32007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
32017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Throwable t) {
32027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    synchronized(errors) {
32037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errors.add(new String(t.getClass().getName() + " - " + t.getMessage()));
32047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
32057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
32067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetCurrency() {
32117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decf1 = DecimalFormatSymbols.getInstance(ULocale.US);
32127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decf2 = DecimalFormatSymbols.getInstance(ULocale.US);
32137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decf2.setCurrencySymbol("UKD");
32147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format1 = new DecimalFormat("000.000", decf1);
32157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format2 = new DecimalFormat("000.000", decf2);
32167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency euro = Currency.getInstance("EUR");
32177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1.setCurrency(euro);
32187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format2.setCurrency(euro);
32197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Reset with currency symbol", format1, format2);
32207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
32237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing the method public StringBuffer format(Object number, ...)
32247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
32257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormat() {
32267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
32277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer sb = new StringBuffer("dummy");
32287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(0);
32297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (number instanceof Long)" is true
32317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new Long("0"), sb, fp);
32337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a Long object. Error: " + e);
32367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof BigInteger)" is true
32397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new BigInteger("0"), sb, fp);
32417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a BigInteger object. Error: " + e);
32447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof java.math.BigDecimal)" is true
32477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new java.math.BigDecimal("0"), sb, fp);
32497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a java.math.BigDecimal object. Error: " + e);
32527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof com.ibm.icu.math.BigDecimal)" is true
32557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new com.ibm.icu.math.BigDecimal("0"), sb, fp);
32577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a com.ibm.icu.math.BigDecimal object. Error: " + e);
32607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof CurrencyAmount)" is true
32637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount ca = new CurrencyAmount(0.0, Currency.getInstance(new ULocale("en_US")));
32657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)ca, sb, fp);
32667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a CurrencyAmount object. Error: " + e);
32697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof Number)" is true
32727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(0.0, sb, fp);
32747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
32767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "to return an exception for a Number object. Error: " + e);
32777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else" is true
32807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new Object(), sb, fp);
32827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was suppose to "
32837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for an invalid object.");
32847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
32887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new String("dummy"), sb, fp);
32897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was suppose to "
32907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for an invalid object.");
32917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
32927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
3296b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín     * Coverage tests for the implementation of abstract format methods not being called otherwise
3297b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín     */
3298b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    public void TestFormatAbstractImplCoverage() {
3299b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat df = DecimalFormat.getInstance(Locale.ENGLISH);
3300b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat cdf = CompactDecimalFormat.getInstance(Locale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT);
3301b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat rbf = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT);
3302b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3303b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        /*
3304b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín         *  Test  NumberFormat.format(BigDecimal,StringBuffer,FieldPosition)
3305b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín         */
3306b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        StringBuffer sb = new StringBuffer();
3307b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        String result = df.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3308b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"2,000.43".equals(result)) {
3309b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 2,000.43 - Actual: " + result);
3310b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        }
3311b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3312b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        sb.delete(0, sb.length());
3313b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        result = cdf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3314b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"2K".equals(result)) {
3315b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 2K - Actual: " + result);
3316b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        }
3317b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3318b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        sb.delete(0, sb.length());
3319b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        result = rbf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3320b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"two thousand point four three".equals(result)) {
3321b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 'two thousand point four three' - Actual: '" + result + "'");
3322b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        }
3323b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    }
3324b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3325b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    /*
33267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public final static NumberFormat getInstance(int style) public static NumberFormat
33277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * getInstance(Locale inLocale, int style) public static NumberFormat getInstance(ULocale desiredLocale, int choice)
33287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
33297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetInstance() {
33307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public final static NumberFormat getInstance(int style)"
3331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int maxStyle = NumberFormat.STANDARDCURRENCYSTYLE;
33327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_cases = { NumberFormat.NUMBERSTYLE - 1, NumberFormat.NUMBERSTYLE - 2,
33347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                maxStyle + 1, maxStyle + 2 };
33357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) {
33377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
33387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance(i);
33397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
33407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(int style) was not suppose to "
33417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + i);
33427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < invalid_cases.length; i++) {
33467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
33477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance(invalid_cases[i]);
33487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(int style) was suppose to "
33497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + invalid_cases[i]);
33507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
33517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public static NumberFormat getInstance(Locale inLocale, int style)"
33557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] localeCases = { "en_US", "fr_FR", "de_DE", "jp_JP" };
33567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) {
33587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int j = 0; j < localeCases.length; j++) {
33597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
33607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    NumberFormat.getInstance(new Locale(localeCases[j]), i);
33617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
33627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getInstance(Locale inLocale, int style) was not suppose to "
33637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + "return an exception for passing value of " + localeCases[j] + ", " + i);
33647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
33657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public static NumberFormat getInstance(ULocale desiredLocale, int choice)"
33697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (choice < NUMBERSTYLE || choice > PLURALCURRENCYSTYLE)" is true
33707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < invalid_cases.length; i++) {
33717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
33727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance((ULocale) null, invalid_cases[i]);
33737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(ULocale inLocale, int choice) was not suppose to "
33747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + invalid_cases[i]);
33757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
33767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
33797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
33817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the class public static abstract class NumberFormatFactory
33827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
33837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumberFormatFactory() {
33847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
33857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The following class allows the method public NumberFormat createFormat(Locale loc, int formatType) to be
33867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * tested.
33877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
33887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory extends NumberFormatFactory {
33897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
33907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Set<String> getSupportedLocaleNames() {
33917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
33927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
33957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(ULocale loc, int formatType) {
33967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
33977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The following class allows the method public NumberFormat createFormat(ULocale loc, int formatType) to be
34027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * tested.
34037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory1 extends NumberFormatFactory {
34057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Set<String> getSupportedLocaleNames() {
34077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(Locale loc, int formatType) {
34127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestFactory tf = new TestFactory();
34177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestFactory1 tf1 = new TestFactory1();
34187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public boolean visible()
34217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf.visible() != true) {
3423b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.visible() was suppose to return true.");
34247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public NumberFormat createFormat(Locale loc, int formatType)
34287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf.createFormat(new Locale(""), 0) != null) {
3430b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.createFormat(Locale loc, int formatType) " + "was suppose to return null");
34317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public NumberFormat createFormat(ULocale loc, int formatType)
34357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf1.createFormat(new ULocale(""), 0) != null) {
3437b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.createFormat(ULocale loc, int formatType) " + "was suppose to return null");
34387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
34427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the class public static abstract class SimpleNumberFormatFactory extends NumberFormatFactory
34437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSimpleNumberFormatFactory() {
34457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestSimpleNumberFormatFactory extends SimpleNumberFormatFactory {
34467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*
34477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Tests the method public SimpleNumberFormatFactory(Locale locale)
34487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             */
34497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestSimpleNumberFormatFactory() {
34507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                super(new Locale(""));
34517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("unused")
34547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestSimpleNumberFormatFactory tsnff = new TestSimpleNumberFormatFactory();
34557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
34587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public static ULocale[] getAvailableLocales()
34597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @SuppressWarnings("static-access")
34617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetAvailableLocales() {
34627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (shim == null)" is true
34637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("serial")
34647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestGetAvailableLocales extends NumberFormat {
34657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
34677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
34727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
34777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
34827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
34877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Number parse(String text, ParsePosition parsePosition) {
34927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
34977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestGetAvailableLocales test = new TestGetAvailableLocales();
34987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            test.getAvailableLocales();
34997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
35007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.getAvailableLocales() was not suppose to "
35017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception when getting getting available locales.");
35027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public void setMinimumIntegerDigits(int newValue)
35077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetMinimumIntegerDigits() {
35097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
35107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // For valid array, it is displayed as {min value, max value}
35117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (minimumIntegerDigits > maximumIntegerDigits)" is true
35127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[][] cases = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 2, 0 }, { 2, 1 }, { 10, 0 } };
35137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] expectedMax = { 0, 1, 1, 2, 2, 10 };
35147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cases.length != expectedMax.length) {
35157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Can't continue test case method TestSetMinimumIntegerDigits "
35167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "since the test case arrays are unequal.");
35177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
35187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < cases.length; i++) {
35197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMaximumIntegerDigits(cases[i][1]);
35207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMinimumIntegerDigits(cases[i][0]);
35217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (nf.getMaximumIntegerDigits() != expectedMax[i]) {
35227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.setMinimumIntegerDigits(int newValue "
35237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + "did not return an expected result for parameter " + cases[i][1] + " and " + cases[i][0]
35247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    + " and expected " + expectedMax[i] + " but got " + nf.getMaximumIntegerDigits());
35257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
35267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public int getRoundingMode() public void setRoundingMode(int roundingMode)
35327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingMode() {
35347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("serial")
35357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestRoundingMode extends NumberFormat {
35367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
35387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
35437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
35487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
35537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
35587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Number parse(String text, ParsePosition parsePosition) {
35637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestRoundingMode tgrm = new TestRoundingMode();
35677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests the function 'public void setRoundingMode(int roundingMode)'
35697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
35707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tgrm.setRoundingMode(0);
35717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.setRoundingMode(int) was suppose to return an exception");
35727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
35737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests the function 'public int getRoundingMode()'
35767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
35777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tgrm.getRoundingMode();
35787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.getRoundingMode() was suppose to return an exception");
35797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
35807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing lenient decimal/grouping separator parsing
35857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestLenientSymbolParsing() {
35877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat();
35887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols();
35897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "12\u300234", 12.34);
35917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7345 - case 1
35937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Even strict parsing, the decimal separator set in the symbols
35947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // should be successfully parsed.
35957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setDecimalSeparator('\u3002');
35977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // non-strict
35997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // strict - failed before the fix for #7345
36027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseStrict(true);
36037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "23\u300245", 23.45);
36047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseStrict(false);
36057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7345 - case 2
36087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Decimal separator variants other than DecimalFormatSymbols.decimalSeparator
36097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // should not hide the grouping separator DecimalFormatSymbols.groupingSeparator.
36107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setDecimalSeparator('.');
36117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator(',');
36127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "1,234.56", 1234.56);
36157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator('\uFF61');
36177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "2\uFF61345.67", 2345.67);
36207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7128
36227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //
36237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator(',');
36247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String skipExtSepParse = ICUConfig.get("com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "false");
36277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (skipExtSepParse.equals("true")) {
36287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // When the property SkipExtendedSeparatorParsing is true,
36297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // DecimalFormat does not use the extended equivalent separator
36307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // data and only uses the one in DecimalFormatSymbols.
36317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmt, "23 456", 23);
36327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
36337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Lenient separator parsing is enabled by default.
36347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // A space character below is interpreted as a
36357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // group separator, even ',' is used as grouping
36367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // separator in the symbols.
36377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmt, "12 345", 12345);
36387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
36407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
36427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing currency driven max/min fraction digits problem
36437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * reported by ticket#7282
36447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
36457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyFractionDigits() {
36467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double value = 99.12345;
36477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Create currency instance
36497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat cfmt  = NumberFormat.getCurrencyInstance(new ULocale("ja_JP"));
36507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text1 = cfmt.format(value);
36517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Reset the same currency and format the test value again
36537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cfmt.setCurrency(cfmt.getCurrency());
36547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text2 = cfmt.format(value);
36557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // output1 and output2 must be identical
36577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!text1.equals(text2)) {
36587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format() should return the same result - text1="
36597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + text1 + " text2=" + text2);
36607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
36627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
36647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing rounding to negative zero problem
36657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * reported by ticket#7609
36667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
36677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNegZeroRounding() {
36687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
36707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setRoundingMode(MathContext.ROUND_HALF_UP);
36717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMinimumFractionDigits(1);
36727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMaximumFractionDigits(1);
36737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text1 = df.format(-0.01);
36747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setRoundingIncrement(0.1);
36767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text2 = df.format(-0.01);
36777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // output1 and output2 must be identical
36797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!text1.equals(text2)) {
36807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format() should return the same result - text1="
36817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + text1 + " text2=" + text2);
36827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
36857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyAmountCoverage() {
36877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount ca, cb;
36887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
36907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ca = new CurrencyAmount(null, null);
36917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NullPointerException should have been thrown.");
36927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (NullPointerException ex) {
36937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
36957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ca = new CurrencyAmount(new Integer(0), null);
36967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NullPointerException should have been thrown.");
36977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (NullPointerException ex) {
36987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ca = new CurrencyAmount(new Integer(0), Currency.getInstance(new ULocale("ja_JP")));
37017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cb = new CurrencyAmount(new Integer(1), Currency.getInstance(new ULocale("ja_JP")));
37027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ca.equals(null)) {
37037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparison should return false.");
37047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!ca.equals(ca)) {
37067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparision should return true.");
37077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ca.equals(cb)) {
37097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparison should return false.");
37107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponentParse() {
37147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition parsePos = new ParsePosition(0);
37157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
37167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#####", symbols);
37177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number result = fmt.parse("5.06e-27", parsePos);
37187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ( result.doubleValue() != 5.06E-27 || parsePos.getIndex() != 8) {
37197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: ERROR: parse failed - expected 5.06E-27, 8; got " + result.doubleValue() + ", " + parsePos.getIndex());
37207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExplicitParents() {
37247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // We use these for testing because decimal and grouping separators will be inherited from es_419
37257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // starting with CLDR 2.0
37267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
37277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "CO", "", "1.250,75",
37287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "ES", "", "1.250,75",
37297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "GQ", "", "1.250,75",
37307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "MX", "", "1,250.75",
37317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "US", "", "1,250.75",
37327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "VE", "", "1.250,75",
37337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
37357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=4) {
37377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]);
37387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getInstance(locale);
37397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = fmt.format(1250.75);
37407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (s.equals(DATA[i+3])) {
37417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1250.75 x " + locale + " => " + s);
37427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
37437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: 1250.75 x " + locale + " => " + s +
37447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
37457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
37467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
37507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for #9240
37517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ICU4J 49.1 DecimalFormat did not clone the internal object holding
37527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * formatted text attribute information properly. Therefore, DecimalFormat
37537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * created by cloning may return incorrect results or may throw an exception
37547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * when formatToCharacterIterator is invoked from multiple threads.
37557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
37567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormatToCharacterIteratorThread() {
37577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final int COUNT = 10;
37587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt1 = new DecimalFormat("#0");
37607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = (DecimalFormat)fmt1.clone();
37617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] res1 = new int[COUNT];
37637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] res2 = new int[COUNT];
37647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Thread t1 = new Thread(new FormatCharItrTestThread(fmt1, 1, res1));
37667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Thread t2 = new Thread(new FormatCharItrTestThread(fmt2, 100, res2));
37677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t1.start();
37697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t2.start();
37707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
37727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t1.join();
37737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t2.join();
37747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (InterruptedException e) {
37757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //TODO
37767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val1 = res1[0];
37797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val2 = res2[0];
37807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < COUNT; i++) {
37827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (res1[i] != val1) {
37837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Inconsistent first run limit in test thread 1");
37847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
37857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (res2[i] != val2) {
37867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Inconsistent first run limit in test thread 2");
37877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
37887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseMaxDigits() {
37927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat();
37937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String number = "100000000000";
37947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int newParseMax = number.length() - 1;
37957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseMaxDigits(-1);
37977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Default value is 1000 */
37997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (fmt.getParseMaxDigits() != 1000) {
38007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail valid value checking in setParseMaxDigits.");
38017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
38047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (fmt.parse(number).doubleValue() == Float.POSITIVE_INFINITY) {
38057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Got Infinity but should NOT when parsing number: " + number);
38067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.setParseMaxDigits(newParseMax);
38097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (fmt.parse(number).doubleValue() != Float.POSITIVE_INFINITY) {
38117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Did not get Infinity but should when parsing number: " + number);
38127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException ex) {
38147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
38177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static class FormatCharItrTestThread implements Runnable {
38197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final NumberFormat fmt;
38207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final int num;
38217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final int[] result;
38227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatCharItrTestThread(NumberFormat fmt, int num, int[] result) {
38247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.fmt = fmt;
38257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.num = num;
38267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.result = result;
38277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public void run() {
38307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < result.length; i++) {
38317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                AttributedCharacterIterator acitr = fmt.formatToCharacterIterator(num);
38327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                acitr.first();
38337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result[i] = acitr.getRunLimit();
38347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
38377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingBehavior() {
38397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Object[][] TEST_CASES = {
38407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
38417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,                             // ULocale - null for default locale
38427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",                                 // Pattern
38437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN), // Rounding Mode or null (implicit)
38447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.0d),                   // Rounding increment, Double or BigDecimal, or null (implicit)
38457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),              // Input value, Long, Double, BigInteger or BigDecimal
38467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.45"                                // Expected result, null for exception
38477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
38487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
38497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
38507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
38517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
38527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.1d),
38537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
38547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.5"
38557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
38567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
38577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
38587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
38597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN),
38607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.1d),
38617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
38627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.4"
38637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
38647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
38657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
38667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
38677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_UNNECESSARY),
38687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
38697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
38707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null
38717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
38727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
38737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
38747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
38757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN),
38767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
38777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Long.valueOf(1234),
38787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "1234"
38797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
38807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
38817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int testNum = 1;
38837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] testCase : TEST_CASES) {
38857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 0: locale
38867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 1: pattern
38877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = testCase[0] == null ? ULocale.getDefault() : (ULocale)testCase[0];
38887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = (String)testCase[1];
38897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(locale));
38917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 2: rounding mode
38937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Integer roundingMode = null;
38947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (testCase[2] != null) {
38957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                roundingMode = (Integer)testCase[2];
38967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt.setRoundingMode(roundingMode);
38977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 3: rounding increment
39007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (testCase[3] != null) {
39017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[3] instanceof Double) {
39027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((Double)testCase[3]);
39037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (testCase[3] instanceof BigDecimal) {
39047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((BigDecimal)testCase[3]);
39057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (testCase[3] instanceof java.math.BigDecimal) {
39067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((java.math.BigDecimal)testCase[3]);
39077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
39087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 4: input number
39117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = null;
39127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean bException = false;
39137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
39147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = fmt.format(testCase[4]);
39157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ArithmeticException e) {
39167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                bException = true;
39177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bException) {
39207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[5] != null) {
39217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Test case #" + testNum + ": ArithmeticException was thrown.");
39227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
39237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
39247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[5] == null) {
39257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Test case #" + testNum +
39267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ": ArithmeticException must be thrown, but got formatted result: " +
39277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            s);
39287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
39297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    assertEquals("Test case #" + testNum, (String)testCase[5], s);
39307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
39317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            testNum++;
39347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
39357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
39367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSignificantDigits() {
39387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double input[] = {
39397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, 0,
39407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123, -123,
39417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12345, -12345,
39427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123.45, -123.45,
39437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123.44501, -123.44501,
39447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.001234, -0.001234,
39457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.00000000123, -0.00000000123,
39467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0000000000000000000123, -0.0000000000000000000123,
39477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.2, -1.2,
39487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0000000012344501, -0.0000000012344501,
39497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123445.01, -123445.01,
39507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0,
39517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
39527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] expected = {
39537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.00", "0.00",
39547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123", "-123",
39557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345", "-12345",
39567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.45", "-123.45",
39577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.45", "-123.45",
39587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.001234", "-0.001234",
39597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.00000000123", "-0.00000000123",
39607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0000000000000000000123", "-0.0000000000000000000123",
39617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.20", "-1.20",
39627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0000000012345", "-0.0000000012345",
39637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123450", "-123450",
39647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345000000000000000000000000000000", "-12345000000000000000000000000000000",
39657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
39667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
39677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
39687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
39697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMinimumSignificantDigits(3);
39707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(5);
39717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setGroupingUsed(false);
39727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < input.length; i++) {
39737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("TestSignificantDigits", expected[i], numberFormat.format(input[i]));
39747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
39757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
39767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBug9936() {
39787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
39797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
39807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("", numberFormat.areSignificantDigitsUsed());
39817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
39837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
39847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(false);
39867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("", numberFormat.areSignificantDigitsUsed());
39877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMinimumSignificantDigits(3);
39897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
39907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(false);
39927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(6);
39937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
39947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
39957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestShowZero() {
39977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
39987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
39997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
40007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(3);
40017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("TestShowZero", "0", numberFormat.format(0.0));
40027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyPlurals() {
40057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
40067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1", "1 US dollar"},
40077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.0", "1.0 US dollars"},
40087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.00", "1.00 US dollars"},
40097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.99", "1.99 US dollars"},
40107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "AUD", "1", "1 Australian dollar"},
40117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "AUD", "1.00", "1.00 Australian dollars"},
40127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "1", "1 ameri\u0161ki dolar"},
40137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "2", "2 ameri\u0161ka dolarja"},
40147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "3", "3 ameri\u0161ki dolarji"},
40157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "5", "5 ameriških dolarjev"},
40167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"fr", "USD", "1.99", "1,99 dollar des États-Unis"},
40177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "1", "1 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0440\u0443\u0431\u043B\u044C"},
40187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "2", "2 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u044F"},
40197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "5", "5 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u0435\u0439"},
40207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
40217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String test[] : tests) {
40227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(new ULocale(test[0]), NumberFormat.PLURALCURRENCYSTYLE);
40237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setCurrency(Currency.getInstance(test[1]));
40247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double number = Double.parseDouble(test[2]);
40257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int dotPos = test[2].indexOf('.');
40267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int decimals = dotPos < 0 ? 0 : test[2].length() - dotPos - 1;
40277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int digits = dotPos < 0 ? test[2].length() : test[2].length() - 1;
40287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMaximumFractionDigits(decimals);
40297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMinimumFractionDigits(decimals);
40307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String actual = numberFormat.format(number);
40317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual);
40327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMaximumSignificantDigits(digits);
40337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMinimumSignificantDigits(digits);
40347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            actual = numberFormat.format(number);
40357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual);
40367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
40377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCustomCurrencySignAndSeparator() {
40407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols custom = new DecimalFormatSymbols(ULocale.US);
40417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setCurrencySymbol("*");
40437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setMonetaryGroupingSeparator('^');
40447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setMonetaryDecimalSeparator(':');
40457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("\u00A4 #,##0.00", custom);
40477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String numstr = "* 1^234:56";
40497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, 1234.56, numstr);
40507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseSignsAndMarks() {
40537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class SignsAndMarksItem {
40547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String locale;
40557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public boolean lenient;
40567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String numString;
40577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public double value;
40587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             // Simple constructor
40597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public SignsAndMarksItem(String loc, boolean lnt, String numStr, double val) {
40607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                locale = loc;
40617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                lenient = lnt;
40627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numString = numStr;
40637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                value = val;
40647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
40657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
40667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final SignsAndMarksItem[] items = {
40677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // *** Note, ICU4J lenient number parsing does not handle arbitrary whitespace, but can
40687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // treat some whitespace as a grouping separator. The cases marked *** below depend
40697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // on isGroupingUsed() being set for the locale, which in turn depends on grouping
40707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // separators being present in the decimalFormat pattern for the locale (& num sys).
40717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //
40727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //                    locale                lenient numString                               value
40737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "12",                                    12 ),
40747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "12",                                    12 ),
40757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "-23",                                  -23 ),
40767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "-23",                                  -23 ),
40777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "- 23",                                 -23 ), // ***
40787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "\u200E-23",                            -23 ),
40797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "\u200E-23",                            -23 ),
40807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "\u200E- 23",                           -23 ), // ***
40817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "\u0663\u0664",                          34 ),
40837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u0663\u0664",                          34 ),
40847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "-\u0664\u0665",                        -45 ),
40857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "-\u0664\u0665",                        -45 ),
40867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "- \u0664\u0665",                       -45 ), // ***
40877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "\u200F-\u0664\u0665",                  -45 ),
40887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u200F-\u0664\u0665",                  -45 ),
40897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u200F- \u0664\u0665",                 -45 ), // ***
40907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "\u06F5\u06F6",                          56 ),
40927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u06F5\u06F6",                          56 ),
40937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "-\u06F6\u06F7",                        -67 ),
40947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "-\u06F6\u06F7",                        -67 ),
40957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "- \u06F6\u06F7",                       -67 ), // ***
40967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "\u200E-\u200E\u06F6\u06F7",            -67 ),
40977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u200E-\u200E\u06F6\u06F7",            -67 ),
40987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u200E-\u200E \u06F6\u06F7",           -67 ), // ***
40997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "12",                                    12 ),
41017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "12",                                    12 ),
41027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "-23",                                  -23 ),
41037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "-23",                                  -23 ),
41047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "- 23",                                 -23 ), // ***
41057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "\u200E-23",                            -23 ),
41067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "\u200E-23",                            -23 ),
41077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "\u200E- 23",                           -23 ), // ***
41087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "\u0663\u0664",                          34 ),
41107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u0663\u0664",                          34 ),
41117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "-\u0664\u0665",                        -45 ),
41127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "-\u0664\u0665",                        -45 ),
41137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "- \u0664\u0665",                       -45 ), // ***
41147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "\u200F-\u0664\u0665",                  -45 ),
41157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u200F-\u0664\u0665",                  -45 ),
41167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u200F- \u0664\u0665",                 -45 ), // ***
41177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "12",                                    12 ),
41197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "12",                                    12 ),
41207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "-23",                                  -23 ),
41217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "-23",                                  -23 ),
41227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "- 23",                                 -23 ), // ***
41237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "\u200E-23",                            -23 ),
41247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "\u200E-23",                            -23 ),
41257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "\u200E- 23",                           -23 ), // ***
41267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u06F5\u06F6",                          56 ),
41287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u06F5\u06F6",                          56 ),
41297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u2212\u06F6\u06F7",                   -67 ),
41307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u2212\u06F6\u06F7",                   -67 ),
41317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u2212 \u06F6\u06F7",                  -67 ), // ***
41327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u200E\u2212\u200E\u06F6\u06F7",       -67 ),
41337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u200E\u2212\u200E\u06F6\u06F7",       -67 ),
41347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u200E\u2212\u200E \u06F6\u06F7",      -67 ), // ***
41357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "\u06F5\u06F6",                          56 ),
41377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u06F5\u06F6",                          56 ),
41387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "-\u06F6\u06F7",                        -67 ),
41397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u06F6\u06F7",                        -67 ),
41407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "- \u06F6\u06F7",                       -67 ), // ***
41417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "\u200E-\u200E\u06F6\u06F7",            -67 ),
41427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u200E-\u200E\u06F6\u06F7",            -67 ),
41437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u200E-\u200E \u06F6\u06F7",           -67 ), // ***
41447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "-\u200E\u06F6\u06F7",                  -67 ),
41457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u200E\u06F6\u06F7",                  -67 ),
41467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u200E \u06F6\u06F7",                 -67 ), // ***
41477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
41487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (SignsAndMarksItem item: items) {
41497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = new ULocale(item.locale);
41507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat numfmt = NumberFormat.getInstance(locale);
41517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (numfmt != null) {
41527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numfmt.setParseStrict(!item.lenient);
41537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition ppos = new ParsePosition(0);
41547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number num = numfmt.parse(item.numString, ppos);
41557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (num != null && ppos.getIndex() == item.numString.length()) {
41567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    double parsedValue = num.doubleValue();
41577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (parsedValue != item.value) {
41587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives value " + parsedValue);
41597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
41607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
41617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives position " + ppos.getIndex());
41627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
41637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
41647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: NumberFormat.getInstance for locale " + item.locale);
41657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
41667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
41677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
41687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestContext() {
41707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // just a minimal sanity check for now
41717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getInstance();
41727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DisplayContext context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION);
41737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (context != DisplayContext.CAPITALIZATION_NONE) {
41747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Initial NumberFormat.getContext() is not CAPITALIZATION_NONE");
41757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
41767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nfmt.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE);
41777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION);
41787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (context != DisplayContext.CAPITALIZATION_FOR_STANDALONE) {
41797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: NumberFormat.getContext() does not return the value set, CAPITALIZATION_FOR_STANDALONE");
41807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
41817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
41827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAccountingCurrency() {
41847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
4185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                //locale              num         curr fmt per loc     curr std fmt         curr acct fmt        rt
4186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "1234.5",   "$1,234.50",         "$1,234.50",         "$1,234.50",         "true"},
4187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "1234.5",   "$1,234.50",         "$1,234.50",         "$1,234.50",         "true"},
4188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "-1234.5",  "-$1,234.50",        "-$1,234.50",        "($1,234.50)",       "true"},
4189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=standard", "-1234.5",  "-$1,234.50",        "-$1,234.50",        "($1,234.50)",       "true"},
4190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "-1234.5",  "($1,234.50)",       "-$1,234.50",        "($1,234.50)",       "true"},
4191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "0",        "$0.00",             "$0.00",             "$0.00",             "true"},
4192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "-0.2",     "-$0.20",            "-$0.20",            "($0.20)",           "true"},
4193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=standard", "-0.2",     "-$0.20",            "-$0.20",            "($0.20)",           "true"},
4194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "-0.2",     "($0.20)",           "-$0.20",            "($0.20)",           "true"},
4195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP",             "10000",    "¥10,000",          "¥10,000",          "¥10,000",          "true" },
4196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP",             "-1000.5",  "-¥1,000",          "-¥1,000",          "(¥1,000)",         "false"},
4197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP@cf=account",  "-1000.5",  "(¥1,000)",         "-¥1,000",          "(¥1,000)",         "false"},
4198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"de_DE",             "-23456.7", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "true" },
41997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
42007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] data : tests) {
42017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(data[0]);
42027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double num = Double.parseDouble(data[1]);
4203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtPerLocExpected   = data[2];
4204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtStandardExpected = data[3];
4205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtAccountExpected  = data[4];
4206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            boolean rt = Boolean.parseBoolean(data[5]);
4207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtPerLoc = NumberFormat.getInstance(loc, NumberFormat.CURRENCYSTYLE);
4209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtPerLoc, num, fmtPerLocExpected, rt);
4210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtStandard = NumberFormat.getInstance(loc, NumberFormat.STANDARDCURRENCYSTYLE);
4212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtStandard, num, fmtStandardExpected, rt);
42137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtAccount = NumberFormat.getInstance(loc, NumberFormat.ACCOUNTINGCURRENCYSTYLE);
4215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtAccount, num, fmtAccountExpected, rt);
42167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
42187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyUsage() {
42207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
42217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // compare the Currency and Currency Cash Digits
42227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Note that as of CLDR 26:
42237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that
422487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // * CAD rounds to .05 in the cash style only.
42257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
42267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String original_expected = "PKR124";
42277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat custom = null;
42287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 0) {
42297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"),
42307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CURRENCYSTYLE);
42317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String original = custom.format(123.567);
42337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context", original_expected, original);
42347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // test the getter
42367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(),
42377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Currency.CurrencyUsage.STANDARD);
42387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom.setCurrencyUsage(Currency.CurrencyUsage.CASH);
42397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH);
42407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
42417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"),
42427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CASHCURRENCYSTYLE);
42437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // test the getter
42457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH);
42467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
42477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_currency = custom.format(123.567);
42497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_currency_expected = "PKR124";
42507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", cash_currency_expected, cash_currency);
42517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
42547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // compare the Currency and Currency Cash Rounding
42557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
42567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String original_rounding_expected = "CA$123.57";
42577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = null;
42587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 0) {
42597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"),
42607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CURRENCYSTYLE);
42617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String original_rounding = fmt.format(123.566);
42637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context", original_rounding_expected, original_rounding);
42647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt.setCurrencyUsage(Currency.CurrencyUsage.CASH);
42667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
42677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"),
42687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CASHCURRENCYSTYLE);
42697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
42707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_rounding_currency = fmt.format(123.567);
427287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            String cash__rounding_currency_expected = "CA$123.55";
42737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", cash__rounding_currency_expected, cash_rounding_currency);
42747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
42777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test the currency change
42787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
42797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt2 = null;
42807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 1) {
42817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"),
42827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        NumberFormat.CURRENCYSTYLE);
42837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2.setCurrencyUsage(Currency.CurrencyUsage.CASH);
42847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
42857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"),
42867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        NumberFormat.CASHCURRENCYSTYLE);
42877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
42887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt2.setCurrency(Currency.getInstance("PKR"));
42907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String PKR_changed = fmt2.format(123.567);
42917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String PKR_changed_expected = "PKR124";
42927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", PKR_changed_expected, PKR_changed);
42937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
42957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseRequiredDecimalPoint() {
42977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] testPattern = { "00.####", "00.0", "00" };
42997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String value2Parse = "99";
43017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double parseValue  =  99;
43027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = new DecimalFormat();
43037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double result;
43047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean hasDecimalPoint;
43057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < testPattern.length; i++) {
43067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.applyPattern(testPattern[i]);
43077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            hasDecimalPoint = testPattern[i].contains(".");
43087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.setDecimalPatternMatchRequired(false);
43107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
43117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = parser.parse(value2Parse).doubleValue();
43127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("wrong parsed value", parseValue, result);
43137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
43147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               this.errln("Parsing " + value2Parse + " should have succeeded with " + testPattern[i] +
43157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
43167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
43177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.setDecimalPatternMatchRequired(true);
43197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
43207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = parser.parse(value2Parse).doubleValue();
43217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(hasDecimalPoint){
43227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    this.errln("Parsing " + value2Parse + " should NOT have succeeded with " + testPattern[i] +
43237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
43247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
43257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
43267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // OK, should fail
43277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
43287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestDataDrivenICU() {
4333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        DataDrivenNumberFormatTestSuite.runSuite(
4334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                this.params, "numberformattestspecification.txt", ICU);
4335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestDataDrivenJDK() {
4338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        DataDrivenNumberFormatTestSuite.runSuite(
4339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                this.params, "numberformattestspecification.txt", JDK);
4340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
43427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrFmtNegSameAsPositive() {
43447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decfmtsym = DecimalFormatSymbols.getInstance(Locale.US);
43457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decfmtsym.setMinusSign('\u200B'); // ZERO WIDTH SPACE, in ICU4J cannot set to empty string
43467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat decfmt = new DecimalFormat("\u00A4#,##0.00;\u00A4#,##0.00", decfmtsym);
43477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String currFmtResult = decfmt.format(-100.0);
43487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!currFmtResult.equals("\u200B$100.00")) {
43497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("decfmt.toPattern results wrong, expected \u200B$100.00, got " + currFmtResult);
43507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
43527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestNumberFormatTestTupleToString() {
4354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        new NumberFormatTestTuple().toString();
4355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4357ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius   // Testing for Issue 11805.
4358ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius    public void TestFormatToCharacterIteratorIssue11805 () {
4359ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        final double number = -350.76;
4360ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfUS = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.US);
4361ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strUS = dfUS.format(number);
4362ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultUS  = dfUS.formatToCharacterIterator(number).getAllAttributeKeys();
4363ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative US Results: " + strUS, 5, resultUS.size());
4364ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4365ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // For each test, add assert that all the fields are present and in the right spot.
4366ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // TODO: Add tests for identify and position of each field, as in IntlTestDecimalFormatAPIC.
4367ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4368ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfDE = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.GERMANY);
4369ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strDE = dfDE.format(number);
4370ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultDE  = dfDE.formatToCharacterIterator(number).getAllAttributeKeys();
4371ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative DE Results: " + strDE, 5, resultDE.size());
4372ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4373ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfIN = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("hi", "in"));
4374ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strIN = dfIN.format(number);
4375ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultIN  = dfIN.formatToCharacterIterator(number).getAllAttributeKeys();
4376ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative IN Results: " + strIN, 5, resultIN.size());
4377ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4378ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfJP = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.JAPAN);
4379ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strJP = dfJP.format(number);
4380ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultJP  = dfJP.formatToCharacterIterator(number).getAllAttributeKeys();
4381ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative JA Results: " + strJP, 3, resultJP.size());
4382ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4383ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfGB = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("en", "gb"));
4384ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strGB = dfGB.format(number);
4385ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultGB  = dfGB.formatToCharacterIterator(number).getAllAttributeKeys();
4386ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 5, resultGB.size());
4387ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4388ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "gb"),
4389ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius            NumberFormat.PLURALCURRENCYSTYLE);
4390ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPlural.format(number);
4391ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPlural.formatToCharacterIterator(number).getAllAttributeKeys();
4392ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 5, resultGB.size());
4393ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4394ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPlural.format(1);
4395ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPlural.formatToCharacterIterator(1).getAllAttributeKeys();
4396ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 4, resultGB.size());
4397ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4398ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // Test output with unit value.
4399ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat auPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "au"),
4400ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius                NumberFormat.PLURALCURRENCYSTYLE);
4401ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strAU = auPlural.format(1L);
4402ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultAU  =
4403ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius                auPlural.formatToCharacterIterator(1L).getAllAttributeKeys();
4404ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Unit AU Result: " + strAU , 4, resultAU.size());
4405ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4406ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // Verify Permille fields.
4407ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormatSymbols sym = new DecimalFormatSymbols(new Locale("en", "gb"));
4408ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfPermille = new DecimalFormat("####0.##\u2030", sym);
4409ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPermille.format(number);
4410ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPermille.formatToCharacterIterator(number).getAllAttributeKeys();
4411ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Permille Results: " + strGB , 3, resultGB.size());
4412ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius    }
4413ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
44142391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    // Testing for Issue 11808.
44152391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    public void TestRoundUnnecessarytIssue11808 () {
44162391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();
44172391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        StringBuffer result = new StringBuffer("");
44182391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        df.setRoundingMode(BigDecimal.ROUND_UNNECESSARY);
44192391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        df.applyPattern("00.0#E0");
44202391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
44212391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
44222391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            df.format(99999.0, result, new FieldPosition(0));
44232391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for double: " + result);
44242391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
44252391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
44262391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
44272391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
44282391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
44292391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(99999, result, new FieldPosition(0));
44302391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for int: " + result);
44312391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius       } catch (ArithmeticException expected) {
44322391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius           // The exception should be thrown, since rounding is needed.
44332391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
44342391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
44352391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
44362391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigInteger("999999"), result, new FieldPosition(0));
44372391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigInteger: " + result);
44382391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
44392391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
44402391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
44412391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
44422391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
44432391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigDecimal("99999"), result, new FieldPosition(0));
44442391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigDecimal: " + result);
44452391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
44462391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
44472391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
44482391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
44492391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
44502391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigDecimal("-99999"), result, new FieldPosition(0));
44512391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigDecimal: " + result);
44522391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
44532391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
44542391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
44552391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    }
445687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
445787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    // Testing for Issue 11735.
445887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void TestNPEIssue11735() {
445987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormat fmt = new DecimalFormat("0", new DecimalFormatSymbols(new ULocale("en")));
446087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        ParsePosition ppos = new ParsePosition(0);
446187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("Currency symbol missing in parse. Expect null result.",
446287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                fmt.parseCurrency("53.45", ppos), null);
446387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
446487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
446587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    private void CompareAttributedCharacterFormatOutput(AttributedCharacterIterator iterator,
446687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> expected, String formattedOutput) {
446787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
446887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> result = new ArrayList<FieldContainer>();
446987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        while (iterator.getIndex() != iterator.getEndIndex()) {
447087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            int start = iterator.getRunStart();
447187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            int end = iterator.getRunLimit();
447287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            Iterator it = iterator.getAttributes().keySet().iterator();
447387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            while (it.hasNext()) {
447487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next();
447587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                Object value = iterator.getAttribute(attribute);
447687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
447787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.add(new FieldContainer(start, end, attribute, value));
447887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            }
447987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            iterator.setIndex(end);
448087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        }
448187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("Comparing vector length for " + formattedOutput,
448287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            expected.size(), result.size());
448387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
448487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        if (!expected.containsAll(result) || !result.containsAll(expected)) {
448587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          // Print information on the differences.
448687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          System.out.println(" ");
448787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          for (int i = 0; i < expected.size(); i++) {
448887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            System.out.println(" expected[" + i + "] = " +
448987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).start + " " +
449087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).end + " " +
449187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).value);
449287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          }
449387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          for (int i = 0; i < result.size(); i++) {
449487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            System.out.println("   result[" + i + "] = " +
449587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).start + " " +
449687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).end + " " +
449787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).value);
449887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          }
449987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        }
450087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertTrue("Comparing vector results for " + formattedOutput,
450187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            expected.containsAll(result));
450287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
450387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
450487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    // Testing for Issue 11914, missing FieldPositions for some field types.
450587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void TestNPEIssue11914() {
450687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // First test: Double value with grouping separators.
450787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v1 = new ArrayList<FieldContainer>(7);
450887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(0, 3, NumberFormat.Field.INTEGER));
450987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(3, 4, NumberFormat.Field.GROUPING_SEPARATOR));
451087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(3, 4, NumberFormat.Field.INTEGER));
451187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(4, 7, NumberFormat.Field.INTEGER));
451287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(7, 8, NumberFormat.Field.GROUPING_SEPARATOR));
451387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(7, 8, NumberFormat.Field.INTEGER));
451487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(8, 11, NumberFormat.Field.INTEGER));
451587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(11, 12, NumberFormat.Field.DECIMAL_SEPARATOR));
451687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(12, 15, NumberFormat.Field.FRACTION));
451787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
451887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        Number number = new Double(123456789.9753);
451987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        ULocale usLoc = new ULocale("en-US");
452087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(usLoc);
452187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
452287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        NumberFormat outFmt = NumberFormat.getNumberInstance(usLoc);
452387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String numFmtted = outFmt.format(number);
452487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        AttributedCharacterIterator iterator =
452587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                outFmt.formatToCharacterIterator(number);
452687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v1, numFmtted);
452787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
452887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Second test: Double with scientific notation formatting.
452987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v2 = new ArrayList<FieldContainer>(7);
453087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(0, 1, NumberFormat.Field.INTEGER));
453187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(1, 2, NumberFormat.Field.DECIMAL_SEPARATOR));
453287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(2, 5, NumberFormat.Field.FRACTION));
453387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(5, 6, NumberFormat.Field.EXPONENT_SYMBOL));
453487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SIGN));
453587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT));
453687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US);
453787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
453887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        numFmtted = fmt2.format(number);
453987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = fmt2.formatToCharacterIterator(number);
454087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v2, numFmtted);
454187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
454287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Third test. BigInteger with grouping separators.
454387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v3 = new ArrayList<FieldContainer>(7);
454487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN));
454587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER));
454687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(2, 3, NumberFormat.Field.GROUPING_SEPARATOR));
454787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(3, 6, NumberFormat.Field.INTEGER));
454887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(2, 3, NumberFormat.Field.INTEGER));
454987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(6, 7, NumberFormat.Field.GROUPING_SEPARATOR));
455087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(6, 7, NumberFormat.Field.INTEGER));
455187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(7, 10, NumberFormat.Field.INTEGER));
455287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(10, 11, NumberFormat.Field.INTEGER));
455387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(10, 11, NumberFormat.Field.GROUPING_SEPARATOR));
455487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(11, 14, NumberFormat.Field.INTEGER));
455587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(14, 15, NumberFormat.Field.INTEGER));
455687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(14, 15, NumberFormat.Field.GROUPING_SEPARATOR));
455787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(15, 18, NumberFormat.Field.INTEGER));
455887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
455987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(18, 19, NumberFormat.Field.INTEGER));
456087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(18, 19, NumberFormat.Field.GROUPING_SEPARATOR));
456187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(19, 22, NumberFormat.Field.INTEGER));
456287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(22, 23, NumberFormat.Field.INTEGER));
456387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(22, 23, NumberFormat.Field.GROUPING_SEPARATOR));
456487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(23, 26, NumberFormat.Field.INTEGER));
456587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        BigInteger bigNumberInt = new BigInteger("-1234567890246813579");
456687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String fmtNumberBigInt = outFmt.format(bigNumberInt);
456787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
456887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = outFmt.formatToCharacterIterator(bigNumberInt);
456987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v3, fmtNumberBigInt);
457087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
457187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Fourth test: BigDecimal with exponential formatting.
457287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v4 = new ArrayList<FieldContainer>(7);
457387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN));
457487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER));
457587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(2, 3, NumberFormat.Field.DECIMAL_SEPARATOR));
457687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(3, 6, NumberFormat.Field.FRACTION));
457787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SYMBOL));
457887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT_SIGN));
457987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(8, 9, NumberFormat.Field.EXPONENT));
458087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
458187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        java.math.BigDecimal numberBigD = new java.math.BigDecimal(-123456789);
458287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String fmtNumberBigDExp = fmt2.format(numberBigD);
458387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
458487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = fmt2.formatToCharacterIterator(numberBigD);
458587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v4, fmtNumberBigDExp);
458687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
458787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
458887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void test_formatToCharacterIterator() throws Exception {
458987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        AttributedCharacterIterator iterator;
459087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        int[] runStarts;
459187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        int[] runLimits;
459287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String result;
459387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        char current;
459487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // BigInteger.
459587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = new DecimalFormat().formatToCharacterIterator(new BigInteger("123456789"));
459687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        runStarts = new int[] { 0, 0, 0, 3, 4, 4, 4, 7, 8, 8, 8 };
459787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        runLimits = new int[] { 3, 3, 3, 4, 7, 7, 7, 8, 11, 11, 11 };
459887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        result = "123,456,789";
459987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        current = iterator.current();
460087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        for (int i = 0; i < runStarts.length; i++) {
460187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart());
460287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit());
460387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            assertEquals("wrong char @" + i, result.charAt(i), current);
460487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            current = iterator.next();
460587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        }
460687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("Begin index:", 0, iterator.getBeginIndex());
460787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("End index:  ", 11, iterator.getEndIndex());
460887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
460987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
46106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    private void checkFormatWithField(String testInfo, Format format, Object object,
46116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            String expected, Format.Field field, int begin, int end) {
46126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        StringBuffer buffer = new StringBuffer();
46136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        FieldPosition pos = new FieldPosition(field);
46146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        format.format(object, buffer, pos);
46156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        assertEquals("Test " + testInfo + ": incorrect formatted text", expected, buffer.toString());
46176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        if (begin != pos.getBeginIndex() || end != pos.getEndIndex()) {
46196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            assertEquals("Index mismatch", field + " " + begin + ".." + end,
46206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius                pos.getFieldAttribute() + " " + pos.getBeginIndex() + ".." + pos.getEndIndex());
46216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        }
46226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
46236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsCurrency() {
46256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(ULocale.US);
46266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(92314587.66);
46276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String result = "$92,314,587.66";
46286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("currency", formatter, number, result,
46306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.CURRENCY, 0, 1);
46316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, result,
46326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 11);
46336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("grouping separator", formatter, number, result,
46346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.GROUPING_SEPARATOR, 3, 4);
46356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, result,
46366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 11, 12);
46376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", formatter, number, result,
46386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 12, 14);
46396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
46406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeDouble() {
46426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // test for exponential fields with double
46436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
46446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-12345678.90123);
46456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+00", us_symbols);
46466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = formatter.format(number);
46476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, numFmtted,
46496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
46506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, numFmtted,
46516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
46526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, numFmtted,
46536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
46546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, numFmtted,
46556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
46566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, numFmtted,
46576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
46586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, numFmtted,
46596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
46606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
46616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerCent() {
46636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERCENT
46646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat percentFormat = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.US);
46656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-0.986);
46666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numberFormatted = percentFormat.format(number);
46676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", percentFormat, number, numberFormatted,
46686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
46696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", percentFormat, number, numberFormatted,
46706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 3);
46716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("percent", percentFormat, number, numberFormatted,
46726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERCENT, 3, 4);
46736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
46746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerCentPattern() {
46766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERCENT with more digits
46776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
46786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPercent = new DecimalFormat("0.#####%", us_symbols);
46796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-0.986);
46806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = fmtPercent.format(number);
46816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPercent, number, numFmtted,
46836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
46846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPercent, number, numFmtted,
46856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 3);
46866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPercent, number, numFmtted,
46876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 3, 4);
46886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPercent, number, numFmtted,
46896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 4, 5);
46906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("percent", fmtPercent, number, numFmtted,
46916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERCENT, 5, 6);
46926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
46936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
46946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerMille() {
46956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERMILLE
46966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
46976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPerMille = new DecimalFormat("0.######‰", us_symbols);
46986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number numberPermille = new Double(-0.98654);
46996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = fmtPerMille.format(numberPermille);
47006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPerMille, numberPermille, numFmtted,
47026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPerMille, numberPermille, numFmtted,
47046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 4);
47056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPerMille, numberPermille, numFmtted,
47066bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 4, 5);
47076bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPerMille, numberPermille, numFmtted,
47086bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 5, 7);
47096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("permille", fmtPerMille, numberPermille, numFmtted,
47106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERMILLE, 7, 8);
47116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeBigInt() {
47146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius      DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols);
47166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new BigDecimal("-123456789987654321");
47176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String bigDecFmtted = formatter.format(number);
47186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, bigDecFmtted,
47206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, bigDecFmtted,
47226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
47236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, bigDecFmtted,
47246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
47256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, bigDecFmtted,
47266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
47276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, bigDecFmtted,
47286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
47296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, bigDecFmtted,
47306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
47316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeLong() {
47346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Long("-123456789987654321");
47356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols);
47376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String longFmtted = formatter.format(number);
47386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, longFmtted,
47406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, longFmtted,
47426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
47436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, longFmtted,
47446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
47456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, longFmtted,
47466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
47476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, longFmtted,
47486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
47496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, longFmtted,
47506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
47516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPositiveBigDec() {
47546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check complex positive;negative pattern.
47556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols);
47576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number positiveExp = new Double("9876543210");
47586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String posExpFormatted = fmtPosNegSign.format(positiveExp);
47596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPosNegSign, positiveExp, posExpFormatted,
47616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPosNegSign, positiveExp, posExpFormatted,
47636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
47646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPosNegSign, positiveExp, posExpFormatted,
47656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
47666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPosNegSign, positiveExp, posExpFormatted,
47676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 3, 7);
47686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", fmtPosNegSign, positiveExp, posExpFormatted,
47696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 7, 8);
47706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", fmtPosNegSign, positiveExp, posExpFormatted,
47716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 8, 9);
47726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", fmtPosNegSign, positiveExp, posExpFormatted,
47736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 9, 11);
47746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeBigDec() {
47776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check complex positive;negative pattern.
47786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius      DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols);
47806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number negativeExp = new BigDecimal("-0.000000987654321083");
47816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String negExpFormatted = fmtPosNegSign.format(negativeExp);
47826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPosNegSign, negativeExp, negExpFormatted,
47846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPosNegSign, negativeExp, negExpFormatted,
47866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
47876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPosNegSign, negativeExp, negExpFormatted,
47886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
47896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPosNegSign, negativeExp, negExpFormatted,
47906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 3, 7);
47916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", fmtPosNegSign, negativeExp, negExpFormatted,
47926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 7, 8);
47936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", fmtPosNegSign, negativeExp, negExpFormatted,
47946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 8, 9);
47956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", fmtPosNegSign, negativeExp, negExpFormatted,
47966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 9, 11);
47976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
4799