12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (C) 2001-2016, International Business Machines Corporation and
6aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v1.8.1 : format : NumberFormatTest
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Source File: $ICU4oot/source/test/intltest/numfmtst.cpp
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubertimport java.io.IOException;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigInteger;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Corneliusimport java.text.Format;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList;
2587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.Iterator;
2687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.List;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
3487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC.FieldContainer;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUConfig;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.LocaleUtility;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.ResourceReader;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.TokenIterator;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.MathContext;
41b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.CompactDecimalFormat;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DisplayContext;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.NumberFormatFactory;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory;
49e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport com.ibm.icu.text.NumberingSystem;
50b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.RuleBasedNumberFormat;
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.CurrencyAmount;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertpublic class NumberFormatTest extends TestFmwk {
562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static ULocale EN = new ULocale("en");
582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static Number toNumber(String s) {
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (s.equals("NaN")) {
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.NaN;
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (s.equals("-Inf")) {
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.NEGATIVE_INFINITY;
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (s.equals("Inf")) {
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return Double.POSITIVE_INFINITY;
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new BigDecimal(s);
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU =
722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public Character Id() { return 'J'; }
752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String format(NumberFormatTestData tuple) {
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String actual = fmt.format(toNumber(tuple.format));
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String expected = tuple.output;
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!expected.equals(actual)) {
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected " + expected + ", got " + actual;
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String toPattern(NumberFormatTestData tuple) {
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    StringBuilder result = new StringBuilder();
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toPattern != null) {
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toPattern;
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toPattern();
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toPattern=" + expected + ", got " + actual);
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toLocalizedPattern != null) {
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toLocalizedPattern;
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toLocalizedPattern();
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toLocalizedPattern=" + expected + ", got " + actual);
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return result.length() == 0 ? null : result.toString();
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
1092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String parse(NumberFormatTestData tuple) {
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = fmt.parse(tuple.parse, ppos);
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+actual+", but was expected to fail.";
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != (actual.doubleValue())) {
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
1292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
1312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String parseCurrency(NumberFormatTestData tuple) {
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = newDecimalFormat(tuple);
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    CurrencyAmount currAmt = fmt.parseCurrency(tuple.parse, ppos);
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+currAmt+", but was expected to fail.";
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = currAmt.getNumber();
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != (actual.doubleValue())) {
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
15087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!tuple.outputCurrency.equals(currAmt.getCurrency().toString())) {
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected currency: " + tuple.outputCurrency + ", got: " + currAmt.getCurrency();
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @return
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
1612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                private DecimalFormat newDecimalFormat(NumberFormatTestData tuple) {
16287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    DecimalFormat fmt = new DecimalFormat(
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            tuple.pattern == null ? "0" : tuple.pattern,
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            new DecimalFormatSymbols(tuple.locale == null ? EN : tuple.locale));
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjustDecimalFormat(tuple, fmt);
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return fmt;
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param fmt
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
1732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                private void adjustDecimalFormat(NumberFormatTestData tuple, DecimalFormat fmt) {
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minIntegerDigits != null) {
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxIntegerDigits != null) {
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minFractionDigits != null) {
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumFractionDigits(tuple.minFractionDigits);
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxFractionDigits != null) {
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currency != null) {
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrency(tuple.currency);
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minGroupingDigits != null) {
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this.
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useSigDigits != null) {
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setSignificantDigitsUsed(
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.useSigDigits != 0);
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minSigDigits != null) {
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumSignificantDigits(tuple.minSigDigits);
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxSigDigits != null) {
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumSignificantDigits(tuple.maxSigDigits);
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useGrouping != null) {
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingUsed(tuple.useGrouping != 0);
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.multiplier != null) {
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMultiplier(tuple.multiplier);
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingIncrement != null) {
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setRoundingIncrement(tuple.roundingIncrement.doubleValue());
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.formatWidth != null) {
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setFormatWidth(tuple.formatWidth);
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) {
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPadCharacter(tuple.padCharacter.charAt(0));
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useScientific != null) {
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setScientificNotation(tuple.useScientific != 0);
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping != null) {
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingSize(tuple.grouping);
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping2 != null) {
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setSecondaryGroupingSize(tuple.grouping2);
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingMode != null) {
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setRoundingMode(tuple.roundingMode);
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currencyUsage != null) {
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrencyUsage(tuple.currencyUsage);
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }                    if (tuple.minimumExponentDigits != null) {
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumExponentDigits(
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.minimumExponentDigits.byteValue());
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.exponentSignAlwaysShown != null) {
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setExponentSignAlwaysShown(
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.exponentSignAlwaysShown != 0);
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalSeparatorAlwaysShown != null) {
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalSeparatorAlwaysShown(
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.decimalSeparatorAlwaysShown != 0);
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padPosition != null) {
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPadPosition(tuple.padPosition);
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positivePrefix != null) {
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositivePrefix(tuple.positivePrefix);
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positiveSuffix != null) {
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositiveSuffix(tuple.positiveSuffix);
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativePrefix != null) {
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativePrefix(tuple.negativePrefix);
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativeSuffix != null) {
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativeSuffix(tuple.negativeSuffix);
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.localizedPattern != null) {
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.applyLocalizedPattern(tuple.localizedPattern);
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int lenient = tuple.lenient == null ? 1 : tuple.lenient.intValue();
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    fmt.setParseStrict(lenient == 0);
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseIntegerOnly != null) {
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalPatternMatchRequired != null) {
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalPatternMatchRequired(tuple.decimalPatternMatchRequired != 0);
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseNoExponent != null) {
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops, not supported for now
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    };
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private DataDrivenNumberFormatTestUtility.CodeUnderTest JDK =
2772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                public Character Id() { return 'K'; }
2802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
2822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String format(NumberFormatTestData tuple) {
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String actual = fmt.format(toNumber(tuple.format));
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    String expected = tuple.output;
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (!expected.equals(actual)) {
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected " + expected + ", got " + actual;
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
2932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String toPattern(NumberFormatTestData tuple) {
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    StringBuilder result = new StringBuilder();
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toPattern != null) {
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toPattern;
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toPattern();
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toPattern=" + expected + ", got " + actual);
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.toLocalizedPattern != null) {
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String expected = tuple.toLocalizedPattern;
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        String actual = fmt.toLocalizedPattern();
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!expected.equals(actual)) {
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            result.append("Expected toLocalizedPattern=" + expected + ", got " + actual);
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return result.length() == 0 ? null : result.toString();
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                @Override
3142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                public String parse(NumberFormatTestData tuple) {
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = newDecimalFormat(tuple);
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    ParsePosition ppos = new ParsePosition(0);
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number actual = fmt.parse(tuple.parse, ppos);
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ppos.getIndex() == 0) {
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        if (!tuple.output.equals("fail")) {
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            return "Parse error expected.";
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return null;
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.output.equals("fail")) {
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Parse succeeded: "+actual+", but was expected to fail.";
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Number expected = toNumber(tuple.output);
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // number types cannot be compared, this is the best we can do.
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (expected.doubleValue() != actual.doubleValue()) {
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        return "Expected: " + expected + ", got: " + actual;
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return null;
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
3342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @return
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
3412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                private java.text.DecimalFormat newDecimalFormat(NumberFormatTestData tuple) {
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    java.text.DecimalFormat fmt = new java.text.DecimalFormat(
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            tuple.pattern == null ? "0" : tuple.pattern,
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            new java.text.DecimalFormatSymbols(
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                    (tuple.locale == null ? EN : tuple.locale).toLocale()));
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjustDecimalFormat(tuple, fmt);
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return fmt;
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                /**
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param tuple
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 * @param fmt
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                 */
3542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                private void adjustDecimalFormat(NumberFormatTestData tuple, java.text.DecimalFormat fmt) {
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minIntegerDigits != null) {
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumIntegerDigits(tuple.minIntegerDigits);
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxIntegerDigits != null) {
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits);
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minFractionDigits != null) {
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMinimumFractionDigits(tuple.minFractionDigits);
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxFractionDigits != null) {
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMaximumFractionDigits(tuple.maxFractionDigits);
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currency != null) {
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setCurrency(java.util.Currency.getInstance(tuple.currency.toString()));
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minGroupingDigits != null) {
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this.
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useSigDigits != null) {
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minSigDigits != null) {
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.maxSigDigits != null) {
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops we don't support this
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useGrouping != null) {
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingUsed(tuple.useGrouping != 0);
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.multiplier != null) {
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setMultiplier(tuple.multiplier);
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingIncrement != null) {
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.formatWidth != null) {
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) {
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.useScientific != null) {
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping != null) {
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setGroupingSize(tuple.grouping);
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.grouping2 != null) {
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.roundingMode != null) {
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.currencyUsage != null) {
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.minimumExponentDigits != null) {
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.exponentSignAlwaysShown != null) {
416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalSeparatorAlwaysShown != null) {
419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setDecimalSeparatorAlwaysShown(
420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                tuple.decimalSeparatorAlwaysShown != 0);
421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.padPosition != null) {
423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Not supported
424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positivePrefix != null) {
426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositivePrefix(tuple.positivePrefix);
427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.positiveSuffix != null) {
429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setPositiveSuffix(tuple.positiveSuffix);
430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativePrefix != null) {
432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativePrefix(tuple.negativePrefix);
433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.negativeSuffix != null) {
435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setNegativeSuffix(tuple.negativeSuffix);
436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.localizedPattern != null) {
438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.applyLocalizedPattern(tuple.localizedPattern);
439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
4402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // lenient parsing not supported by JDK
442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseIntegerOnly != null) {
443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0);
444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.decimalPatternMatchRequired != null) {
446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                       // Oops, not supported
447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (tuple.parseNoExponent != null) {
449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Oops, not supported for now
450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    };
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingScientific10542() {
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format =
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("0.00E0");
4582d2bb24f747c65578da13d5b13b82f0669690461Fredrik 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"};
4752d2bb24f747c65578da13d5b13b82f0669690461Fredrik 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    }
5642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
5652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test10419RoundingWith0FractionDigits() {
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][]{
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_CEILING, 1.488, "2"},
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_DOWN, 1.588, "1"},
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_FLOOR, 1.588, "1"},
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_DOWN, 1.5, "1"},
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_EVEN, 2.5, "2"},
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_HALF_UP, 2.5, "3"},
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {BigDecimal.ROUND_UP, 1.5, "2"},
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nff = NumberFormat.getNumberInstance(ULocale.ENGLISH);
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nff.setMaximumFractionDigits(0);
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] item : data) {
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          nff.setRoundingMode(((Integer) item[0]).intValue());
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertEquals("Test10419", item[2], nff.format(item[1]));
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseNegativeWithFaLocale() {
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("fa"));
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value = parser.parse("-0,5").doubleValue();
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Expect -0.5", -0.5, value);
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
5912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            TestFmwk.errln("Parsing -0.5 should have succeeded.");
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseNegativeWithAlternativeMinusSign() {
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("en"));
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value = parser.parse("\u208B0.5").doubleValue();
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Expect -0.5", -0.5, value);
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
6022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            TestFmwk.errln("Parsing -0.5 should have succeeded.");
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test various patterns
6072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatterns() {
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String pat[]    = { "#.#", "#.", ".#", "#" };
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int pat_length = pat.length;
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String newpat[] = { "#0.#", "#0.", "#.0", "#" };
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String num[]    = { "0",   "0.", ".0", "0" };
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<pat_length; ++i)
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pat[i], sym);
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String newp = fmt.toPattern();
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!newp.equals(newpat[i]))
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] +
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + newp + " seen instead");
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = ((NumberFormat)fmt).format(0);
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!s.equals(num[i]))
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should format zero as " + num[i] +
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + s + " seen instead");
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Min integer digits = " + fmt.getMinimumIntegerDigits());
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // BigInteger 0 - ticket#4731
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = ((NumberFormat)fmt).format(BigInteger.ZERO);
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!s.equals(num[i]))
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: Pattern " + pat[i] + " should format BigInteger zero as " + num[i] +
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; " + s + " seen instead");
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Min integer digits = " + fmt.getMinimumIntegerDigits());
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test exponential pattern
6422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponential() {
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" };
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int pat_length = pat.length;
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 };
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val_length = val.length;
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String valFormat[] = {
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.####E0
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271",
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 00.000E00
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272",
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // ##0.######E000
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273",
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.###E0;[0.###E0]
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" };
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*double valParse[] =
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123460000, 1.23E300, -3.1416E-271,
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123460000, 1.23E300, -3.1416E-271,
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123456800, 1.23E300, -3.141593E-271,
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.01234, 123500000, 1.23E300, -3.142E-271,
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };*/ //The variable is never used
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lval[] = { 0, -1, 1, 123456789 };
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lval_length = lval.length;
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String lvalFormat[] = {
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.####E0
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E0", "-1E0", "1E0", "1.2346E8",
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 00.000E00
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07",
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // ##0.######E000
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E000", "-1E000", "1E000", "123.4568E006",
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 0.###E0;[0.###E0]
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E0", "[1E0]", "1E0", "1.235E8" };
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lvalParse[] =
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123460000,
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123460000,
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123456800,
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, -1, 1, 123500000,
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int ival = 0, ilval = 0;
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int p = 0; p < pat_length; ++p) {
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pat[p], sym);
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Pattern \"" + pat[p] + "\" -toPattern-> \"" + fmt.toPattern() + "\"");
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int v;
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (v = 0; v < val_length; ++v) {
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s;
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = ((NumberFormat) fmt).format(val[v]);
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" " + val[v] + " -format-> " + s);
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(valFormat[v + ival]))
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: Expected " + valFormat[v + ival]);
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition pos = new ParsePosition(0);
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                double a = fmt.parse(s, pos).doubleValue();
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (pos.getIndex() == s.length()) {
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("  -parse-> " + Double.toString(a));
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Use epsilon comparison as necessary
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a);
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (v = 0; v < lval_length; ++v) {
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s;
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = ((NumberFormat) fmt).format(lval[v]);
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" " + lval[v] + "L -format-> " + s);
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(lvalFormat[v + ilval]))
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("ERROR: Expected " + lvalFormat[v + ilval] + " Got: " + s);
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition pos = new ParsePosition(0);
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                long a = 0;
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number A = fmt.parse(s, pos);
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (A != null) {
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    a = A.longValue();
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (pos.getIndex() == s.length()) {
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("  -parse-> " + a);
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (a != lvalParse[v + ilval])
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAIL: Expected " + lvalParse[v + ilval]);
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + Long.toString(a));
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail to parse the string: " + s);
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ival += val_length;
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ilval += lval_length;
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Test the handling of quotes
7342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestQuotes() {
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat;
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer("a'fo''o'b#");
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = ((NumberFormat)fmt).format(123);
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + pat + "\"");
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format 123 . " + s);
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("afo'ob123"))
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected afo'ob123");
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s ="";
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer("a''b#");
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new DecimalFormat(pat.toString(), sym);
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat)fmt).format(123);
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + pat + "\"");
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format 123 . " + s);
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("a'b123"))
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected a'b123");
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseCurrencyTrailingSymbol() {
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // see sun bug 4709840
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY);
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        float val = 12345.67f;
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = fmt.format(val);
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("val: " + val + " str: " + str);
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number num = fmt.parse(str);
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("num: " + num);
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse of '" + str + "' threw exception: " + e);
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the handling of the currency symbol in patterns.
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
7752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencySign() {
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat = new StringBuffer("");
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char currency = 0x00A4;
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4#,##0.00;-\xA4#,##0.00"
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append("#,##0.00;-").append(currency).append("#,##0.00");
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = ((NumberFormat) fmt).format(1234.56);
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat = new StringBuffer();
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + fmt.toPattern() + "\"");
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + 1234.56 + " . " + s);
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("symbol, pos", "$1,234.56", s);
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(-1234.56);
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(-1234.56) + " . " + s);
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("symbol, neg", "-$1,234.56", s);
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.setLength(0);
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00"
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append(currency).append(" #,##0.00;").append(currency).append(currency).append(" -#,##0.00");
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new DecimalFormat(pat.toString(), sym);
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(1234.56);
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Pattern \"" + fmt.toPattern() + "\"");
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(1234.56) + " . " + s);
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("name, pos", "USD 1,234.56", s);
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s = ((NumberFormat) fmt).format(-1234.56);
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" Format " + Double.toString(-1234.56) + " . " + s);
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("name, neg", "USD -1,234.56", s);
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSpaceParsing() {
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the data are:
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the string to be parsed, parsed position, parsed error index
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124", "4", "-1"},
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124 $124", "4", "-1"},
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$124 ", "4", "-1"},
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$ 124 ", "5", "-1"},
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$\u00A0124 ", "5", "-1"},
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"124$", "0", "3"}, // TODO: need to handle space correctly
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // {"124 $", "5", "-1"}, TODO: OK or NOT?
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"124 $", "0", "3"},
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat foo = NumberFormat.getCurrencyInstance();
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < DATA.length; ++i) {
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePosition = new ParsePosition(0);
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String stringToBeParsed = DATA[i][0];
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int parsedPosition = Integer.parseInt(DATA[i][1]);
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int errorIndex = Integer.parseInt(DATA[i][2]);
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number result = foo.parse(stringToBeParsed, parsePosition);
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (parsePosition.getIndex() != parsedPosition ||
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        parsePosition.getErrorIndex() != errorIndex) {
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED parse " + stringToBeParsed + "; parse position: " + parsePosition.getIndex() + "; error position: " + parsePosition.getErrorIndex());
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (parsePosition.getErrorIndex() == -1 &&
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result.doubleValue() != 124) {
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED parse " + stringToBeParsed + "; value " + result.doubleValue());
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAILED " + e.toString());
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMultiCurrencySign() {
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the fields in the following test are:
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale,
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency pattern (with negative pattern),
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency number to be formatted,
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using currency symbol name, such as "$" for USD,
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using currency ISO name, such as "USD",
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency format using plural name, such as "US dollars".
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // for US locale
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"},
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"},
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"},
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // for CHINA locale
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1234.56", "\uFFE51,234.56", "CNY1,234.56", "\u4EBA\u6C11\u5E011,234.56"},
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "-1234.56", "(\uFFE51,234.56)", "(CNY1,234.56)", "(\u4EBA\u6C11\u5E011,234.56)"},
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1", "\uFFE51.00", "CNY1.00", "\u4EBA\u6C11\u5E011.00"}
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String doubleCurrencyStr = "\u00A4\u00A4";
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String tripleCurrencyStr = "\u00A4\u00A4\u00A4";
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String locale = DATA[i][0];
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat = DATA[i][1];
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Double numberToBeFormat = new Double(DATA[i][2]);
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormatSymbols sym = new DecimalFormatSymbols(new ULocale(locale));
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int j=1; j<=3; ++j) {
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // j represents the number of currency sign in the pattern.
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (j == 2) {
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = pat.replaceAll("\u00A4", doubleCurrencyStr);
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (j == 3) {
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = pat.replaceAll("\u00A4\u00A4", tripleCurrencyStr);
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                DecimalFormat fmt = new DecimalFormat(pat, sym);
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s = ((NumberFormat) fmt).format(numberToBeFormat);
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][3] is the currency format result using a
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // single currency sign.
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][4] is the currency format result using
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // double currency sign.
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][5] is the currency format result using
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // triple currency sign.
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][j+2] is the currency format result using
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 'j' number of currency sign.
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String currencyFormatResult = DATA[i][2+j];
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(currencyFormatResult)) {
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL format: Expected " + currencyFormatResult);
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // mix style parsing
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int k=3; k<=5; ++k) {
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][3] is the currency format result using a
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // single currency sign.
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][4] is the currency format result using
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // double currency sign.
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][5] is the currency format result using
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // triple currency sign.
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String oneCurrencyFormat = DATA[i][k];
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (fmt.parse(oneCurrencyFormat).doubleValue() !=
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                numberToBeFormat.doubleValue()) {
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAILED parse " + oneCurrencyFormat);
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAILED, DecimalFormat parse currency: " + e.toString());
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyFormatForMixParsing() {
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(new ULocale("en_US"));
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] formats = {
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "$1,234.56",  // string to be parsed
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "USD1,234.56",
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "US dollars1,234.56",
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234.56 US dollars"
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < formats.length; ++i) {
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String stringToBeParsed = formats[i];
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(stringToBeParsed);
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number val = parsedVal.getNumber();
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!val.equals(new BigDecimal("1234.56"))) {
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val);
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) {
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency");
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse FAILED: " + e.toString());
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDecimalFormatCurrencyParse() {
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Locale.US
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer pat = new StringBuffer("");
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char currency = 0x00A4;
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // "\xA4#,##0.00;-\xA4#,##0.00"
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00");
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat(pat.toString(), sym);
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the data are:
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // string to be parsed, the parsed result (number)
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$1.00", "1"},
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"USD1.00", "1"},
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 US dollar", "1"},
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"$1,234.56", "1234.56"},
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"USD1,234.56", "1234.56"},
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1,234.56 US dollar", "1234.56"},
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < DATA.length; ++i) {
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String stringToBeParsed = DATA[i][0];
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                double parsedResult = Double.parseDouble(DATA[i][1]);
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number num = fmt.parse(stringToBeParsed);
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (num.doubleValue() != parsedResult) {
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL parse: Expected " + parsedResult);
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAILED, DecimalFormat parse currency: " + e.toString());
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test localized currency patterns.
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrency() {
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "CA", "", "1,50\u00a0$",
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "de", "DE", "", "1,50\u00a0\u20AC",
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "de", "DE", "PREEURO", "1,50\u00a0DM",
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "FR", "", "1,50\u00a0\u20AC",
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "fr", "FR", "PREEURO", "1,50\u00a0F",
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
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            NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = fmt.format(1.50);
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (s.equals(DATA[i+3])) {
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1.50 x " + locale + " => " + s);
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("FAIL: 1.50 x " + locale + " => " + s +
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // format currency with CurrencyAmount
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=4) {
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]);
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Currency curr = Currency.getInstance(locale);
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false}));
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount cAmt = new CurrencyAmount(1.5, curr);
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String sCurr = fmt.format(cAmt);
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (sCurr.equals(DATA[i+3])) {
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1.50 x " + locale + " => " + sCurr);
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: 1.50 x " + locale + " => " + sCurr +
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Cover MeasureFormat.getCurrencyFormat()
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale save = ULocale.getDefault();
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(ULocale.US);
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat curFmt = MeasureFormat.getCurrencyFormat();
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strBuf = curFmt.format(new CurrencyAmount(new Float(1234.56), Currency.getInstance("USD")));
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(strBuf);
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number val = parsedVal.getNumber();
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!val.equals(new BigDecimal("1234.56"))) {
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val);
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) {
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency");
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (ParseException e) {
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + e.getMessage());
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(save);
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyIsoPluralFormat() {
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // the data are:
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale,
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency amount to be formatted,
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // currency ISO code to be formatted,
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using CURRENCYSTYLE,
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using ISOCURRENCYSTYLE,
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // format result using PLURALCURRENCYSTYLE,
10512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
10522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
10532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
10542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00美元"},
10552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56美元"},
10562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"zh_CN", "1", "CNY", "¥1.00", "CNY1.00", "1.00人民币"},
10572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"zh_CN", "1234.56", "CNY", "¥1,234.56", "CNY1,234.56", "1,234.56人民币"},
10582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"ru_RU", "1", "RUB", "1,00 \u20BD", "1,00 RUB", "1,00 российского рубля"},
10592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"ru_RU", "2", "RUB", "2,00 \u20BD", "2,00 RUB", "2,00 российского рубля"},
10602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"ru_RU", "5", "RUB", "5,00 \u20BD", "5,00 RUB", "5,00 российского рубля"},
10612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                // test locale without currency information
10622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"root", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"},
10632d2bb24f747c65578da13d5b13b82f0669690461Fredrik 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
10642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"root@numbers=arab", "-1.23", "USD", "\u061C-\u0661\u066B\u0662\u0663\u00A0US$", "\u061C-\u0661\u066B\u0662\u0663\u00A0USD", "\u061C-\u0661\u066B\u0662\u0663 USD"}, // ensure that the root locale is still used with modifiers
10652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"es_AR", "1", "INR", "INR\u00A01,00", "INR\u00A01,00", "1,00 rupia india"},
10662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {"ar_EG", "1", "USD", "١٫٠٠\u00A0US$", "١٫٠٠\u00A0USD", "١٫٠٠ دولار أمريكي"},
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int k = NumberFormat.CURRENCYSTYLE;
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    k <= NumberFormat.PLURALCURRENCYSTYLE;
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ++k) {
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // k represents currency format style.
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( k != NumberFormat.CURRENCYSTYLE &&
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        k != NumberFormat.ISOCURRENCYSTYLE &&
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        k != NumberFormat.PLURALCURRENCYSTYLE ) {
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String localeString = DATA[i][0];
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double numberToBeFormat = new Double(DATA[i][1]);
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String currencyISOCode = DATA[i][2];
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale locale = new ULocale(localeString);
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat numFmt = NumberFormat.getInstance(locale, k);
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numFmt.setCurrency(Currency.getInstance(currencyISOCode));
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String strBuf = numFmt.format(numberToBeFormat);
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int resultDataIndex = k-1;
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( k == NumberFormat.CURRENCYSTYLE ) {
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    resultDataIndex = k+2;
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // DATA[i][resultDataIndex] is the currency format result
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // using 'k' currency style.
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String formatResult = DATA[i][resultDataIndex];
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!strBuf.equals(formatResult)) {
10942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    errln("FAIL: localeID: " + localeString + ", expected(" + formatResult.length() + "): \"" + formatResult + "\", actual(" + strBuf.length() + "): \"" + strBuf + "\"");
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // test parsing, and test parsing for all currency formats.
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int j = 3; j < 6; ++j) {
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][3] is the currency format result using
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // CURRENCYSTYLE formatter.
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][4] is the currency format result using
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // ISOCURRENCYSTYLE formatter.
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // DATA[i][5] is the currency format result using
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // PLURALCURRENCYSTYLE formatter.
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String oneCurrencyFormatResult = DATA[i][j];
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Number val = numFmt.parse(oneCurrencyFormatResult);
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (val.doubleValue() != numberToBeFormat.doubleValue()) {
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("FAIL: getCurrencyFormat of locale " + localeString + " failed roundtripping the number. val=" + val + "; expected: " + numberToBeFormat);
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                catch (ParseException e) {
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: " + e.getMessage());
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMiscCurrencyParsing() {
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] DATA = {
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // each has: string to be parsed, parsed position, error position
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 ", "0", "4"},
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 UAE dirha", "0", "4"},
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 us dollar", "14", "-1"},
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 US DOLLAR", "14", "-1"},
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1.00 usd", "0", "4"},
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("en_US");
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String stringToBeParsed = DATA[i][0];
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int parsedPosition = Integer.parseInt(DATA[i][1]);
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int errorIndex = Integer.parseInt(DATA[i][2]);
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat numFmt = NumberFormat.getInstance(locale, NumberFormat.CURRENCYSTYLE);
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePosition = new ParsePosition(0);
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number val = numFmt.parse(stringToBeParsed, parsePosition);
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (parsePosition.getIndex() != parsedPosition ||
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    parsePosition.getErrorIndex() != errorIndex) {
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected error position: " + errorIndex + "; actual: " + parsePosition.getErrorIndex());
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected position: " + parsedPosition +"; actual: " + parsePosition.getIndex());
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (parsePosition.getErrorIndex() == -1 &&
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    val.doubleValue() != 1.00) {
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: parse failed. expected 1.00, actual:" + val);
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseCurrency() {
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class ParseCurrencyItem {
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String localeString;
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String descrip;
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String currStr;
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    numExpectPos;
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    numExpectVal;
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    curExpectPos;
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final int    curExpectVal;
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String curExpectCurr;
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) {
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                localeString  = locStr;
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                descrip       = desc;
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                currStr       = curr;
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numExpectPos  = numExPos;
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numExpectVal  = numExVal;
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectPos  = curExPos;
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectVal  = curExVal;
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                curExpectCurr = curExCurr;
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getLocaleString()  { return localeString; }
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getDescrip()       { return descrip; }
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getCurrStr()       { return currStr; }
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getNumExpectPos()  { return numExpectPos; }
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getNumExpectVal()  { return numExpectVal; }
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getCurExpectPos()  { return curExpectPos; }
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int    getCurExpectVal()  { return curExpectVal; }
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getCurExpectCurr() { return curExpectCurr; }
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ParseCurrencyItem[] parseCurrencyItems = {
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  5,  2,  "USD" ),
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  2,  4,  "USD" ),
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         0,  0,  0,  0,  ""    ),
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       0,  0,  5,  3,  "GBP" ),
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          0,  0,  2,  5,  "GBP" ),
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    0,  0,  0,  0,  ""    ),
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  5,  3,  "GBP" ),
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  2,  5,  "GBP" ),
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    0,  0,  0,  0,  ""    ),
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 0,  0,  0,  0,  ""    ),
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    0,  0,  0,  0,  ""    ),
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
11962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                new ParseCurrencyItem( "en_GB", "dollars4", "US$4",             0,  0,  4,  4,  "USD" ),
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  6,  4,  "EUR" ),
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  3,  6,  "EUR" ),
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          0,  0,  0,  0,  ""    ),
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  0,  0,  ""    ),
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  0,  0,  ""    ),
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (ParseCurrencyItem item: parseCurrencyItems) {
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String localeString = item.getLocaleString();
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale uloc = new ULocale(localeString);
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = null;
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = NumberFormat.getCurrencyInstance(uloc);
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getCurrencyInstance fails for locale " + localeString);
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String currStr = item.getCurrStr();
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition parsePos = new ParsePosition(0);
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number numVal = fmt.parse(currStr, parsePos);
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) {
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (numVal != null) {
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/" + numVal.intValue() );
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/(NULL)" );
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parsePos.setIndex(0);
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount currAmt = fmt.parseCurrency(currStr, parsePos);
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( parsePos.getIndex() != item.getCurExpectPos() || (currAmt != null && (currAmt.getNumber().intValue() != item.getCurExpectVal() ||
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    currAmt.getCurrency().getCurrencyCode().compareTo(item.getCurExpectCurr()) != 0)) ) {
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (currAmt != null) {
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() +
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() +
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/" + currAmt.getNumber().intValue() + "/" + currAmt.getCurrency().getCurrencyCode() );
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() +
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() +
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", get " + parsePos.getIndex() + "/(NULL)" );
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestParseCurrPatternWithDecStyle() {
12492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String currpat = "¤#,##0.00";
12502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String parsetxt = "x0y$";
12512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormat decfmt = (DecimalFormat)NumberFormat.getInstance(new ULocale("en_US"), NumberFormat.NUMBERSTYLE);
12522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        decfmt.applyPattern(currpat);
12532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        ParsePosition ppos = new ParsePosition(0);
12542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Number value = decfmt.parse(parsetxt, ppos);
12552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if (ppos.getIndex() != 0) {
12562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            errln("DecimalFormat.parse expected to fail but got ppos " + ppos.getIndex() + ", value " + value);
12572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
12582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
12592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the Currency object handling, new as of ICU 2.2.
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyObject() {
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt =
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getCurrencyInstance(Locale.US);
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, null, 1234.56, "$1,234.56");
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.FRANCE),
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "\u20AC1,234.56"); // Euro
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.JAPAN),
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "\u00A51,235"); // Yen
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")),
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.US),
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "$1,234.56");
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = NumberFormat.getCurrencyInstance(Locale.FRANCE);
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, null, 1234.56, "1 234,56 \u20AC");
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.JAPAN),
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 235 JPY"); // Yen
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")),
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 CHF"); // no more rounding here, see cldrbug 5548
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.US),
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 $US");
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectCurrency(fmt, Currency.getInstance(Locale.FRANCE),
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1234.56, "1 234,56 \u20AC"); // Euro
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatibleCurrencies() {
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt =
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getCurrencyInstance(Locale.US);
13032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\u00A51,235"); // Yen half-width
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\uFFE51,235"); // Yen full-wdith
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyPatterns() {
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i;
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] locs = NumberFormat.getAvailableLocales();
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (i=0; i<locs.length; ++i) {
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat nf = NumberFormat.getCurrencyInstance(locs[i]);
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure currency formats do not have a variable number
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // of fraction digits
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int min = nf.getMinimumFractionDigits();
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int max = nf.getMaximumFractionDigits();
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (min != max) {
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String a = nf.format(1.0);
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String b = nf.format(1.125);
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: " + locs[i] +
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " min fraction digits != max fraction digits; "+
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "x 1.0 => " + a +
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "; x 1.125 => " + b);
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure EURO currency formats have exactly 2 fraction digits
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (nf instanceof DecimalFormat) {
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Currency curr = ((DecimalFormat) nf).getCurrency();
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (curr != null && "EUR".equals(curr.getCurrencyCode())) {
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (min != 2 || max != 2) {
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String a = nf.format(1.0);
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: " + locs[i] +
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                " is a EURO format but it does not have 2 fraction digits; "+
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "x 1.0 => " +
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                a);
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Do rudimentary testing of parsing.
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParse() {
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String arg = "0.0";
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format = new DecimalFormat("00");
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double aNumber = 0l;
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            aNumber = format.parse(arg).doubleValue();
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(e);
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("parse(" + arg + ") = " + aNumber);
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test proper rounding by the format method.
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRounding487() {
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 0.00159999, 4, "0.0016");
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 0.00995, 4, "0.01");
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 12.3995, 3, "12.4");
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, 12.4999, 0, "12");
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        roundingTest(nf, - 19.5, 0, "-20");
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the functioning of the secondary grouping value.
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSecondaryGrouping() {
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat f = new DecimalFormat("#,##,###", US);
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, 123456789L, "12,34,56,789");
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,##,###");
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.applyPattern("#,###");
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setSecondaryGroupingSize(4);
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(f, 123456789L, "12,3456,789");
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(f, "#,####,###");
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat g = NumberFormat.getInstance(new Locale("hi", "IN"));
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = "";
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long l = 1876543210L;
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = g.format(l);
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // expect "1,87,65,43,210", but with Hindi digits
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //         01234567890123
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean ok = true;
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (out.length() != 14) {
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ok = false;
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < out.length(); ++i) {
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean expectGroup = false;
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                switch (i) {
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 1 :
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 4 :
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 7 :
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 10 :
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expectGroup = true;
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Later -- fix this to get the actual grouping
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // character from the resource bundle.
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean isGroup = (out.charAt(i) == 0x002C);
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isGroup != expectGroup) {
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ok = false;
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!ok) {
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL  Expected "+ l + " x hi_IN . \"1,87,65,43,210\" (with Hindi digits), got \""
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + out + "\"");
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    " + l + " x hi_IN . \"" + out + "\"");
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /*
14312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Internal test utility.
14322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
14332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private void roundingTest(NumberFormat nf, double x, int maxFractionDigits, final String expected) {
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(maxFractionDigits);
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = nf.format(x);
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(x + " formats with " + maxFractionDigits + " fractional digits to " + out);
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!out.equals(expected))
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Expected " + expected);
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponent() {
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt1 = new DecimalFormat("0.###E0", US);
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US);
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 1234;
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt1, n, "1.234E3");
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt2, n, "1.234E+3");
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt1, "1.234E+3", n); // Either format should parse "E+3"
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientific() {
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test pattern round-trip
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", "0.###E0;[0.###E0]" };
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int PAT_length = PAT.length;
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int DIGITS[] = {
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // min int, max int, min frac, max frac
14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, 1, 0, 0, // "#E0"
14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 1, 0, 4, // "0.####E0"
14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                2, 2, 3, 3, // "00.000E00"
14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 3, 0, 4, // "##0.####E000"
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1, 1, 0, 3, // "0.###E0;[0.###E0]"
14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < PAT_length; ++i) {
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat = PAT[i];
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat df = new DecimalFormat(pat, US);
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat2 = df.toPattern();
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (pat.equals(pat2)) {
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok   Pattern rt \"" + pat + "\" . \"" + pat2 + "\"");
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL Pattern rt \"" + pat + "\" . \"" + pat2 + "\"");
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Make sure digit counts match what we expect
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (df.getMinimumIntegerDigits() != DIGITS[4 * i]
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    || df.getMaximumIntegerDigits() != DIGITS[4 * i + 1]
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            || df.getMinimumFractionDigits() != DIGITS[4 * i + 2]
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    || df.getMaximumFractionDigits() != DIGITS[4 * i + 3]) {
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \""+ pat+ "\" min/max int; min/max frac = "
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMinimumIntegerDigits() + "/"
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMaximumIntegerDigits() + ";"
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMinimumFractionDigits() + "/"
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + df.getMaximumFractionDigits() + ", expect "
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i] + "/"
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 1] + ";"
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 2] + "/"
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + DIGITS[4 * i + 3]);
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("#E0", US), 12345.0, "1.2345E4");
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0E0", US), 12345.0, "1E4");
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0"
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // so result = 1.234568E4 not 1.2345678901E4
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //when the pattern problem is finalized, delete comment mark'//'
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //of the following code
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(Locale.US), 12345.678901, "1.2345678901E4");
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing NumberFormat.getScientificInstance(ULocale) ...");
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(ULocale.US), 12345.678901, "1.2345678901E4");
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US), 12345.0, "12.34E3");
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.###E0", US), 12345.00001, "12.35E3");
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.####E0", US), 12345, "12.345E3");
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0"
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // so result = 1.234568E4 not 1.2345678901E4
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(Locale.FRANCE), 12345.678901, "1,2345678901E4");
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing NumberFormat.getScientificInstance(ULocale) ...");
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(NumberFormat.getScientificInstance(ULocale.FRANCE), 12345.678901, "1,2345678901E4");
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("##0.####E0", US), 789.12345e-9, "789.12E-9");
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.####E0", US), 780.e-9, "780E-9");
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat(".###E0", US), 45678.0, ".457E5");
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(".###E0", US), 0, ".0E0");
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat[] { new DecimalFormat("#E0", US),
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("##E0", US),
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("####E0", US),
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("0E0", US),
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("00E0", US),
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     new DecimalFormat("000E0", US),
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   },
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Long(45678000),
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new String[] { "4.5678E7",
15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "45.678E6",
15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "4567.8E4",
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "5E7",
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "46E6",
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              "457E5",
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               );
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("#E0", US), 45678000, "4.5678E7");
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##E0", US), 45678000, "45.678E6");
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("####E0", US), 45678000, "4567.8E4");
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0E0", US), 45678000, "5E7");
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("00E0", US), 45678000, "46E6");
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("000E0", US), 45678000, "457E5");
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("###E0", US, status),
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.0000123), "12.3E-6",
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.000123), "123E-6",
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.00123), "1.23E-3",
15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.0123), "12.3E-3",
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(0.123), "123E-3",
15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1.23), "1.23E0",
15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(12.3), "12.3E0",
15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(123), "123E0",
15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Double(1230), "1.23E3",
15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.0000123, "12.3E-6");
15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.000123, "123E-6");
15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.00123, "1.23E-3");
15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.0123, "12.3E-3");
15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 0.123, "123E-3");
15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 1.23, "1.23E0");
15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 12.3, "12.3E0");
15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 123.0, "123E0");
15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("###E0", US), 1230.0, "1.23E3");
15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(new DecimalFormat("0.#E+00", US, status),
15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               new Object[] { new Double(0.00012), "1.2E-04",
15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              new Long(12000),     "1.2E+04",
15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             });
15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ! Unroll this test into individual tests below...
15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        !
15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("0.#E+00", US), 0.00012, "1.2E-04");
15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("0.#E+00", US), 12000, "1.2E+04");
15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
15942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPad() {
15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0");
15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3");
16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(
16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0,
16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0E0______ g-m/s^2");
16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(
16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.0 / 3,
16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "333.333E-3_ g-m/s^2");
16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 0, "0.0______ g-m/s^2");
16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(
16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat("##0.0####*_ 'g-m/s^2'", US),
16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.0 / 3,
16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.33333__ g-m/s^2");
16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test padding before a sign
16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)";
16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -10, "xxxxxxxxxx(10.0)");
16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1000, "xxxxxxx(1,000.0)");
16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1000000, "xxx(1,000,000.0)");
16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -100.37, "xxxxxxxx(100.37)");
16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -10456.37, "xxxxx(10,456.37)");
16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1120456.37, "xx(1,120,456.37)");
16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -112045600.37, "(112,045,600.37)");
16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), -1252045600.37, "(1,252,045,600.37)");
16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10, "xxxxxxxxxxxx10.0");
16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1000, "xxxxxxxxx1,000.0");
16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1000000, "xxxxx1,000,000.0");
16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 100.37, "xxxxxxxxxx100.37");
16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10456.37, "xxxxxxx10,456.37");
16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 1120456.37, "xxxx1,120,456.37");
16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 112045600.37, "xx112,045,600.37");
16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr, US), 10252045600.37, "10,252,045,600.37");
16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test padding between a sign and a number
16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)";
16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -10, "(10.0xxxxxxxxxx)");
16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1000, "(1,000.0xxxxxxx)");
16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1000000, "(1,000,000.0xxx)");
16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -100.37, "(100.37xxxxxxxx)");
16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -10456.37, "(10,456.37xxxxx)");
16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1120456.37, "(1,120,456.37xx)");
16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -112045600.37, "(112,045,600.37)");
16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), -1252045600.37, "(1,252,045,600.37)");
16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10, "10.0xxxxxxxxxxxx");
16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1000, "1,000.0xxxxxxxxx");
16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1000000, "1,000,000.0xxxxx");
16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 100.37, "100.37xxxxxxxxxx");
16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10456.37, "10,456.37xxxxxxx");
16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 1120456.37, "1,120,456.37xxxx");
16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 112045600.37, "112,045,600.37xx");
16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(new DecimalFormat(formatStr2, US), 10252045600.37, "10,252,045,600.37");
16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //testing the setPadCharacter(UnicodeString) and getPadCharacterString()
16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#", US);
16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char padString = 'P';
16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter(padString);
16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*P##.##", DecimalFormat.PAD_BEFORE_PREFIX, 5, padString);
16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter('^');
16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, '^');
16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //commented untill implementation is complete
16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  fmt.setPadCharacter((UnicodeString)"^^^");
16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          expectPad(fmt, "*^^^#", DecimalFormat.kPadBeforePrefix, 3, (UnicodeString)"^^^");
16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.remove();
16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.append((UChar)0x0061);
16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          padString.append((UChar)0x0302);
16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          fmt.setPadCharacter(padString);
16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000};
16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          UnicodeString pattern(patternChars);
16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          expectPad(fmt, pattern , DecimalFormat.kPadBeforePrefix, 4, padString);
16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upgrade to alphaWorks
16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
16772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatterns2() {
16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#", US);
16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char hat = 0x005E; /*^*/
16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, hat);
16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^#", DecimalFormat.PAD_AFTER_PREFIX, 2, hat);
16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#*^", DecimalFormat.PAD_BEFORE_SUFFIX, 1, hat);
16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^", DecimalFormat.PAD_AFTER_SUFFIX, 2, hat);
16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "$*^$#", -1);
16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "#$*^$", -1);
16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat.PAD_BEFORE_SUFFIX, 12, (char) 0x0078 /*x*/);
16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "''#0*x", DecimalFormat.PAD_BEFORE_SUFFIX, 3, (char) 0x0078 /*x*/);
16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, "'I''ll'*a###.##", DecimalFormat.PAD_AFTER_PREFIX, 10, (char) 0x0061 /*a*/);
16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.applyPattern("AA#,##0.00ZZ");
16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadCharacter(hat);
16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(10);
16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_PREFIX);
17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "*^AA#,##0.00ZZ");
17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_BEFORE_SUFFIX);
17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00*^ZZ");
17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_SUFFIX);
17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA#,##0.00ZZ*^");
17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //            12  3456789012
17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String exp = "AA*^#,##0.00ZZ";
17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(12);
17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setPadPosition(DecimalFormat.PAD_AFTER_PREFIX);
17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, exp);
17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(13);
17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123
17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^##,##0.00ZZ");
17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(14);
17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  345678901234
17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^###,##0.00ZZ");
17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(15);
17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  3456789012345
17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case
17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setFormatWidth(16);
17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //              12  34567890123456
17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPat(fmt, "AA*^#,###,##0.00ZZ");
17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRegistration() {
17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ULocale SRC_LOC = ULocale.FRANCE;
17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final ULocale SWAP_LOC = ULocale.US;
17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory extends SimpleNumberFormatFactory {
17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat currencyStyle;
17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestFactory() {
17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                super(SRC_LOC, true);
17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                currencyStyle = NumberFormat.getIntegerInstance(SWAP_LOC);
17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(ULocale loc, int formatType) {
17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (formatType == FORMAT_CURRENCY) {
17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return currencyStyle;
17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f0 = NumberFormat.getIntegerInstance(SWAP_LOC);
17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f1 = NumberFormat.getIntegerInstance(SRC_LOC);
17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f2 = NumberFormat.getCurrencyInstance(SRC_LOC);
17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object key = NumberFormat.registerFactory(new TestFactory());
17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f3 = NumberFormat.getCurrencyInstance(SRC_LOC);
17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f4 = NumberFormat.getIntegerInstance(SRC_LOC);
17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat.unregister(key); // restore for other tests
17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat f5 = NumberFormat.getCurrencyInstance(SRC_LOC);
17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        float n = 1234.567f;
17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f0 swap int: " + f0.format(n));
17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f1 src int: " + f1.format(n));
17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f2 src cur: " + f2.format(n));
17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f3 reg cur: " + f3.format(n));
17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f4 reg int: " + f4.format(n));
17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("f5 unreg cur: " + f5.format(n));
17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f3.format(n).equals(f0.format(n))) {
17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("registered service did not match");
17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f4.format(n).equals(f1.format(n))) {
17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("registered service did not inherit");
17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!f5.format(n).equals(f2.format(n))) {
17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unregistered service did not match original");
17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientific2() {
17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // jb 2552
17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = (DecimalFormat)NumberFormat.getCurrencyInstance();
17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = new Double(12.34);
17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$12.34");
17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setScientificNotation(true);
17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$1.23E1");
17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setScientificNotation(false);
17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, num, "$12.34");
17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestScientificGrouping() {
17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // jb 2552
17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("###.##E0");
17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, .01234, "12.3E-3");
17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, .1234, "123E-3");
17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 1.234, "1.23E0");
18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 12.34, "12.3E0");
18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 123.4, "123E0");
18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, 1234, "1.23E3");
18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // additional coverage tests
18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // sigh, can't have static inner classes, why not?
18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final class PI extends Number {
18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * For serialization
18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final long serialVersionUID = -305601227915602172L;
18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private PI() {}
18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int intValue() { return (int)Math.PI; }
18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public long longValue() { return (long)Math.PI; }
18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public float  floatValue() { return (float)Math.PI; }
18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public double doubleValue() { return Math.PI; }
18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public byte byteValue() { return (byte)Math.PI; }
18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public short shortValue() { return (short)Math.PI; }
18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final Number INSTANCE = new PI();
18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage() {
18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getNumberInstance(); // default locale
18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(fmt.format(new BigInteger("1234567890987654321234567890987654321", 10)));
18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = NumberFormat.getScientificInstance(); // default locale
18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(fmt.format(PI.INSTANCE));
18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(fmt.format("12345"));
18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("numberformat of string did not throw exception");
18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: numberformat of string failed as expected");
18477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int hash = fmt.hashCode();
18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("hash code " + hash);
18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("compare to string returns: " + fmt.equals(""));
18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // For ICU 2.6 - alan
18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = new DecimalFormat("'*&'' '\u00A4' ''&*' #,##0.00", US);
18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setCurrency(Currency.getInstance("INR"));
18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 1.0, "*&' \u20B9 '&* 1.00");
18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, -2.0, "-*&' \u20B9 '&* 2.00");
18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.applyPattern("#,##0.00 '*&'' '\u00A4' ''&*'");
18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 2.0, "2.00 *&' \u20B9 '&*");
18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, -1.0, "-1.00 *&' \u20B9 '&*");
18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.math.BigDecimal r;
18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        r = df.getRoundingIncrement();
18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (r != null) {
18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: rounding = " + r + ", expect null");
18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.isScientificNotation()) {
18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isScientificNotation = true, expect false");
18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.applyPattern("0.00000");
18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setScientificNotation(true);
18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!df.isScientificNotation()) {
18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isScientificNotation = false, expect true");
18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMinimumExponentDigits((byte)2);
18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.getMinimumExponentDigits() != 2) {
18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: getMinimumExponentDigits = " +
18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    df.getMinimumExponentDigits() + ", expect 2");
18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setExponentSignAlwaysShown(true);
18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!df.isExponentSignAlwaysShown()) {
18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isExponentSignAlwaysShown = false, expect true");
18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setSecondaryGroupingSize(0);
18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (df.getSecondaryGroupingSize() != 0) {
18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: getSecondaryGroupingSize = " +
18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    df.getSecondaryGroupingSize() + ", expect 0");
18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, 3.14159, "3.14159E+00");
18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // DecimalFormatSymbols#getInstance
18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym1 = DecimalFormatSymbols.getInstance();
18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym2 = new DecimalFormatSymbols();
18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!decsym1.equals(decsym2)) {
19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: DecimalFormatSymbols returned by getInstance()" +
19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "does not match new DecimalFormatSymbols().");
19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decsym1 = DecimalFormatSymbols.getInstance(Locale.JAPAN);
19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decsym2 = DecimalFormatSymbols.getInstance(ULocale.JAPAN);
19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!decsym1.equals(decsym2)) {
19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: DecimalFormatSymbols returned by getInstance(Locale.JAPAN)" +
19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "does not match the one returned by getInstance(ULocale.JAPAN).");
19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // DecimalFormatSymbols#getAvailableLocales/#getAvailableULocales
19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] allLocales = DecimalFormatSymbols.getAvailableLocales();
19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (allLocales.length == 0) {
19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales");
19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: " + allLocales.length +
19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " available locales returned by DecimalFormatSymbols.getAvailableLocales");
19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale[] allULocales = DecimalFormatSymbols.getAvailableULocales();
19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (allULocales.length == 0) {
19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales");
19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: " + allULocales.length +
19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " available locales returned by DecimalFormatSymbols.getAvailableULocales");
19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestWhiteSpaceParsing() {
19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US);
19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("a  b#0c  ", US);
19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 1234;
19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "a b1234c ", n);
19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "a   b1234c   ", n);
19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test currencies whose display name is a ChoiceFormat.
19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
19392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestComplexCurrency() {
19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  CLDR No Longer uses complex currency symbols.
19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  Skipping this test.
19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        Locale loc = new Locale("kn", "IN", "");
19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        NumberFormat fmt = NumberFormat.getCurrencyInstance(loc);
19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 1.0, "Re.\u00a01.00");
19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect(fmt, 1.001, "Re.\u00a01.00"); // tricky
19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 12345678.0, "Rs.\u00a01,23,45,678.00");
19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, 0.5, "Rs.\u00a00.50");
19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, -1.0, "-Re.\u00a01.00");
19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //        expect2(fmt, -10.0, "-Rs.\u00a010.00");
19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyKeyword() {
19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("th_TH@currency=QQQ");
19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat format = NumberFormat.getCurrencyInstance(locale);
19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = format.format(12.34f);
19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!"QQQ12.34".equals(result)) {
19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("got unexpected currency: " + result);
19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
19657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test alternate numbering systems
19667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
19672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
19687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumberingSystems() {
19697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestNumberingSystemItem {
19707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String localeName;
19717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final double value;
19727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final boolean isRBNF;
19737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private final String expectedResult;
19747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestNumberingSystemItem(String loc, double val, boolean rbnf, String exp) {
19767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                localeName  = loc;
19777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                value = val;
19787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                isRBNF = rbnf;
19797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedResult = exp;
19807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final TestNumberingSystemItem[] DATA = {
19847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=thai",        1234.567, false, "\u0e51,\u0e52\u0e53\u0e54.\u0e55\u0e56\u0e57" ),
19857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=thai",        1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ),
19867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=hebr",        5678.0,   true,  "\u05D4\u05F3\u05EA\u05E8\u05E2\u05F4\u05D7" ),
19877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=arabext",     1234.567, false, "\u06F1\u066c\u06F2\u06F3\u06F4\u066b\u06F5\u06F6\u06F7" ),
19887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "de_DE@numbers=foobar",      1234.567, false, "1.234,567" ),
19897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ar_EG",                     1234.567, false, "\u0661\u066c\u0662\u0663\u0664\u066b\u0665\u0666\u0667" ),
19907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "th_TH@numbers=traditional", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), // fall back to native per TR35
19917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ar_MA",                     1234.567, false, "1.234,567" ),
19927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "en_US@numbers=hanidec",     1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ),
19937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=native",      1234.567, false, "\u0BE7,\u0BE8\u0BE9\u0BEA.\u0BEB\u0BEC\u0BED" ),
19947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=traditional", 1235.0,   true,  "\u0BF2\u0BE8\u0BF1\u0BE9\u0BF0\u0BEB" ),
19957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "ta_IN@numbers=finance",     1234.567, false, "1,234.567" ), // fall back to default per TR35
19967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=native",      1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ),
19977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=traditional", 1234.567, true,  "\u4E00\u5343\u4E8C\u767E\u4E09\u5341\u56DB\u9EDE\u4E94\u516D\u4E03" ),
19987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestNumberingSystemItem( "zh_TW@numbers=finance",     1234.567, true,  "\u58F9\u4EDF\u8CB3\u4F70\u53C3\u62FE\u8086\u9EDE\u4F0D\u9678\u67D2" )
19997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
20007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (TestNumberingSystemItem item : DATA) {
20037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(item.localeName);
20047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getInstance(loc);
20057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (item.isRBNF) {
20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expect3(fmt,item.value,item.expectedResult);
20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expect2(fmt,item.value,item.expectedResult);
20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2013e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    // Coverage tests for methods not being called otherwise.
20142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2015e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    public void TestNumberingSystemCoverage() {
2016e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test getAvaliableNames
2017e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        String[] availableNames = NumberingSystem.getAvailableNames();
2018e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (availableNames == null || availableNames.length <= 0) {
2019e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getAvailableNames() returned a null or empty array.");
2020e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        } else {
2021e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            boolean latnFound = false;
2022e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            for (String name : availableNames){
2023e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                if ("latn".equals(name)) {
2024e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                    latnFound = true;
2025e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                    break;
2026e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                }
2027e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            }
20282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2029e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            if (!latnFound) {
2030e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín                errln("ERROR: 'latn' numbering system not found on NumberingSystem.getAvailableNames().");
2031e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            }
2032e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
20332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2034e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance()
2035e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns1 = NumberingSystem.getInstance();
2036e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns1 == null || ns1.isAlgorithmic()) {
2037e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance() returned a null or invalid NumberingSystem");
2038e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
20392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2040e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance(int,boolean,String)
2041e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        /* Parameters used: the ones used in the default constructor
2042e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * radix = 10;
2043e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * algorithmic = false;
2044e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         * desc = "0123456789";
2045e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín         */
2046e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns2 = NumberingSystem.getInstance(10, false, "0123456789");
2047e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns2 == null || ns2.isAlgorithmic()) {
2048e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance(int,boolean,String) returned a null or invalid NumberingSystem");
2049e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
20502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2051e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        // Test NumberingSystem.getInstance(Locale)
2052e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        NumberingSystem ns3 = NumberingSystem.getInstance(Locale.ENGLISH);
2053e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        if (ns3 == null || ns3.isAlgorithmic()) {
2054e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín            errln("ERROR: NumberingSystem.getInstance(Locale) returned a null or invalid NumberingSystem");
2055e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín        }
2056e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín    }
20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test6816() {
20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency cur1 = Currency.getInstance(new Locale("und", "PH"));
20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getCurrencyInstance(new Locale("und", "PH"));
20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decsym = ((DecimalFormat)nfmt).getDecimalFormatSymbols();
20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency cur2 = decsym.getCurrency();
20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ( !cur1.getCurrencyCode().equals("PHP") || !cur2.getCurrencyCode().equals("PHP")) {
20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Currencies should match PHP: cur1 = "+cur1.getCurrencyCode()+"; cur2 = "+cur2.getCurrencyCode());
20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestThreadedFormat() {
20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class FormatTask implements Runnable {
20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt;
20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buf;
20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean inc;
20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            float num;
20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            FormatTask(DecimalFormat fmt, int index) {
20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.fmt = fmt;
20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.buf = new StringBuffer();
20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.inc = (index & 0x1) == 0;
20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.num = inc ? 0 : 10000;
20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            @Override
20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public void run() {
20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (inc) {
20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    while (num < 10000) {
20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        buf.append(fmt.format(num) + "\n");
20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        num += 3.14159;
20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    while (num > 0) {
20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        buf.append(fmt.format(num) + "\n");
20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        num -= 3.14159;
20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String result() {
21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return buf.toString();
21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("0.####");
21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatTask[] tasks = new FormatTask[8];
21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tasks.length; ++i) {
21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tasks[i] = new FormatTask(fmt, i);
21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestUtil.runUntilDone(tasks);
21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 2; i < tasks.length; i++) {
21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str1 = tasks[i].result();
21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str2 = tasks[i-2].result();
21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!str1.equals(str2)) {
21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("mismatch at " + i);
21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(str1);
21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(str2);
21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("decimal format thread mismatch");
21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            str1 = str2;
21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPerMill() {
21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("###.###\u2030");
21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("0.4857 x ###.###\u2030",
21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "485.7\u2030", fmt.format(0.4857));
21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.ENGLISH);
21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setPerMill('m');
21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("", sym);
21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt2.applyLocalizedPattern("###.###m");
21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("0.4857 x ###.###m",
21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "485.7m", fmt2.format(0.4857));
21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIllegalPatterns() {
21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test cases:
21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Prefix with "-:" for illegal patterns
21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Prefix with "+:" for legal patterns
21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String DATA[] = {
21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Unquoted special characters in the suffix are illegal
21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-:000.000|###",
21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "+:000.000'|###'",
21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; ++i) {
21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pat=DATA[i];
21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean valid = pat.charAt(0) == '+';
21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pat = pat.substring(2);
21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception e = null;
21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // locale doesn't matter here
21627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new DecimalFormat(pat);
21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (IllegalArgumentException e1) {
21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                e = e1;
21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (IndexOutOfBoundsException e1) {
21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                e = e1;
21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String msg = (e==null) ? "success" : e.getMessage();
21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((e==null) == valid) {
21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: pattern \"" + pat + "\": " + msg);
21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: pattern \"" + pat + "\" should have " +
21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        (valid?"succeeded":"failed") + "; got " + msg);
21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Parse a CurrencyAmount using the given NumberFormat, with
21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the 'delim' character separating the number and the currency.
21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static CurrencyAmount parseCurrencyAmount(String str, NumberFormat fmt,
21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char delim)
21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    throws ParseException {
21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i = str.indexOf(delim);
21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new CurrencyAmount(fmt.parse(str.substring(0,i)),
21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Currency.getInstance(str.substring(i+1)));
21887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return an integer representing the next token from this
21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * iterator.  The integer will be an index into the given list, or
21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * -1 if there are no more tokens, or -2 if the token is not on
21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the list.
21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static int keywordIndex(String tok) {
21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<KEYWORDS.length; ++i) {
21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (tok.equals(KEYWORDS[i])) {
21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return i;
22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return -1;
22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String KEYWORDS[] = {
22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*0*/ "ref=", // <reference pattern to parse numbers>
22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*1*/ "loc=", // <locale for formats>
22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*2*/ "f:",   // <pattern or '-'> <number> <exp. string>
22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*3*/ "fp:",  // <pattern or '-'> <number> <exp. string> <exp. number>
22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*4*/ "rt:",  // <pattern or '-'> <(exp.) number> <(exp.) string>
22117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*5*/ "p:",   // <pattern or '-'> <string> <exp. number>
22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*6*/ "perr:", // <pattern or '-'> <invalid string>
22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'>
22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*8*/ "fpc:", // <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt>
22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*9*/ "strict=", // true or false
22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2218aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert    @SuppressWarnings("resource")  // InputStream is will be closed by the ResourceReader.
22192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCases() {
22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String caseFileName = "NumberFormatTestCases.txt";
22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.io.InputStream is = NumberFormatTest.class.getResourceAsStream(caseFileName);
22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ResourceReader reader = new ResourceReader(is, caseFileName, "utf-8");
22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TokenIterator tokens = new TokenIterator(reader);
22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale loc = new Locale("en", "US", "");
22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat ref = null, fmt = null;
22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfmt = null;
22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = null, str = null, mloc = null;
22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean strict = false;
22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (;;) {
22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String tok = tokens.next();
22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (tok == null) {
22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String where = "(" + tokens.getLineNumber() + ") ";
22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int cmd = keywordIndex(tok);
22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                switch (cmd) {
22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 0:
22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // ref= <reference pattern>
22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ref = new DecimalFormat(tokens.next(),
22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new DecimalFormatSymbols(Locale.US));
22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ref.setParseStrict(strict);
22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting reference pattern to:\t" + ref);
22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 1:
22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // loc= <locale>
22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    loc = LocaleUtility.getLocaleFromName(tokens.next());
22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat = ((DecimalFormat) NumberFormat.getInstance(loc)).toPattern();
22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting locale to:\t" + loc + ", \tand pattern to:\t" + pat);
22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 2: // f:
22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 3: // fp:
22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 4: // rt:
22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 5: // p:
22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tok = tokens.next();
22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!tok.equals("-")) {
22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        pat = tok;
22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc));
22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        fmt.setParseStrict(strict);
22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (IllegalArgumentException iae) {
22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + "Pattern \"" + pat + '"');
22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        iae.printStackTrace();
22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        tokens.next(); // consume remaining tokens
22707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        //tokens.next();
22717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (cmd == 3) tokens.next();
22727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        continue;
22737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
22747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    str = null;
22757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
22767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (cmd == 2 || cmd == 3 || cmd == 4) {
22777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // f: <pattern or '-'> <number> <exp. string>
22787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // fp: <pattern or '-'> <number> <exp. string> <exp. number>
22797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // rt: <pattern or '-'> <number> <string>
22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String num = tokens.next();
22817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            str = tokens.next();
22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number n = ref.parse(num);
22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + pat + "\".format(" + num + ")",
22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    str, fmt.format(n));
22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (cmd == 3) { // fp:
22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                n = ref.parse(tokens.next());
22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (cmd != 2) { // != f:
22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")",
22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        n, fmt.parse(str));
22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // p: <pattern or '-'> <string to parse> <exp. number>
22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        else {
22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            str = tokens.next();
22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String expstr = tokens.next();
22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number parsed = fmt.parse(str);
22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Number exp = ref.parse(expstr);
22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")",
23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    exp, parsed);
23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (ParseException e) {
23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + '"' + pat + "\".parse(\"" + str +
23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "\") threw an exception");
23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        e.printStackTrace();
23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 6:
23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // perr: <pattern or '-'> <invalid string>
23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Under construction");
23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 7:
23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // pat: <pattern> <exp. toPattern, or '-' or 'err'>
23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String testpat = tokens.next();
23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String exppat  = tokens.next();
23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    boolean err    = exppat.equals("err");
23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (testpat.equals("-")) {
23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("Invalid command \"pat: - err\" at " +  tokens.describePosition());
23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            continue;
23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        testpat = pat;
23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (exppat.equals("-")) exppat = testpat;
23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat f = null;
23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (testpat == pat) { // [sic]
23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f = fmt;
23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f = new DecimalFormat(testpat);
23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            f.setParseStrict(strict);
23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
23347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Invalid pattern \"" + testpat +
23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" was accepted");
23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            assertEquals(where + '"' + testpat + "\".toPattern()",
23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    exppat, f.toPattern());
23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (IllegalArgumentException iae2) {
23417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (err) {
23427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            logln("Ok: " + where + "Invalid pattern \"" + testpat +
23437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" threw an exception");
23447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Valid pattern \"" + testpat +
23467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "\" threw an exception");
23477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            iae2.printStackTrace();
23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 8: // fpc:
23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tok = tokens.next();
23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!tok.equals("-")) {
23547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        mloc = tok;
23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ULocale l = new ULocale(mloc);
23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        try {
23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            mfmt = MeasureFormat.getCurrencyFormat(l);
23587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } catch (IllegalArgumentException iae) {
23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln(where + "Loc \"" + tok + '"');
23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            iae.printStackTrace();
23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next(); // consume remaining tokens
23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next();
23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            tokens.next();
23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            continue;
23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    str = null;
23687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    try {
23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt>
23707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String currAmt = tokens.next();
23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str = tokens.next();
23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        CurrencyAmount target = parseCurrencyAmount(currAmt, ref, '/');
23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String formatResult = mfmt.format(target);
23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")",
23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                str, formatResult);
23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        target = parseCurrencyAmount(tokens.next(), ref, '/');
23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        CurrencyAmount parseResult = (CurrencyAmount) mfmt.parseObject(str);
23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")",
23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                target, parseResult);
23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } catch (ParseException e) {
23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(where + '"' + pat + "\".parse(\"" + str +
23827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "\") threw an exception");
23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        e.printStackTrace();
23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 9: // strict= true or false
23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    strict = "true".equalsIgnoreCase(tokens.next());
23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Setting strict to:\t" + strict);
23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case -1:
23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Unknown command \"" + tok + "\" at " + tokens.describePosition());
23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
23947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (java.io.IOException e) {
23967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException(e);
2397aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        } finally {
2398aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            try {
2399aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                reader.close();
2400aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            } catch (IOException ignored) {
2401aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            }
24027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
24067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionDecimal() {
24077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
24087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
24097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
24107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
24117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
24127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
24137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
24147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 5, fp.getBeginIndex());
24157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 6, fp.getEndIndex());
24167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
24197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionInteger() {
24207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
24217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
24227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
24237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
24247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.INTEGER);
24257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
24267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
24277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 3, fp.getBeginIndex());
24287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 5, fp.getEndIndex());
24297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
24327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionFractionButInteger() {
24337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
24347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
24357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
24367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
24377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION);
24387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35, buffer, fp);
24397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35", "FOO35BA", buffer.toString());
24407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 5, fp.getBeginIndex());
24417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 5, fp.getEndIndex());
24427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
24457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPositionFraction() {
24467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
24477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositivePrefix("FOO");
24487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setPositiveSuffix("BA");
24497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buffer = new StringBuffer();
24507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION);
24517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.format(35.47, buffer, fp);
24527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("35.47", "FOO35.47BA", buffer.toString());
24537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp begin", 6, fp.getBeginIndex());
24547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 8, fp.getEndIndex());
24557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2458ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius    public void TestFieldPositionCurrency() {
2459ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.US);
2460ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        double amount = 35.47;
2461ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        double negAmount = -34.567;
2462ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        FieldPosition cp = new FieldPosition(NumberFormat.Field.CURRENCY);
24632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2464ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer0 = new StringBuffer();
2465ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer0, cp);
2466ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("$35.47", "$35.47", buffer0.toString());
2467ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2468ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 1, cp.getEndIndex());
24692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2470ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer01 = new StringBuffer();
2471ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer01, cp);
2472ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-$34.57", "-$34.57", buffer01.toString());
2473ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
24742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("cp end", 2, cp.getEndIndex());
24752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2476ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(Locale.FRANCE));
2477ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer1 = new StringBuffer();
2478ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer1, cp);
2479ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("€35.47", "€35.47", buffer1.toString());
2480ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2481ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 1, cp.getEndIndex());
2482ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2483ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("fr", "ch", "")));
2484ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer2 = new StringBuffer();
2485ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer2, cp);
2486ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("CHF35.47", "CHF35.47", buffer2.toString());
2487ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 0, cp.getBeginIndex());
2488ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 3, cp.getEndIndex());
2489ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2490ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer20 = new StringBuffer();
2491ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer20, cp);
2492ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-CHF34.57", "-CHF34.57", buffer20.toString());
2493ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
2494ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 4, cp.getEndIndex());
24952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2496ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.FRANCE);
2497ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer3 = new StringBuffer();
2498ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(amount, buffer3, cp);
2499ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("35,47 €", "35,47 €", buffer3.toString());
2500ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2501ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 7, cp.getEndIndex());
2502ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius
2503ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer4 = new StringBuffer();
2504ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer4, cp);
2505ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34,57 €", "-34,57 €", buffer4.toString());
2506ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
2507ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 8, cp.getEndIndex());
25082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2509ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("fr", "ch")));
2510ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer5 = new StringBuffer();
2511ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer5, cp);
2512ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34,57 CHF", "-34,57 CHF", buffer5.toString());
2513ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
2514ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 10, cp.getEndIndex());
25152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2516ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        NumberFormat plCurrencyFmt = NumberFormat.getInstance(new Locale("fr", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2517ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer6 = new StringBuffer();
2518ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer6, cp);
2519ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57 francs suisses", "-34.57 francs suisses", buffer6.toString());
2520ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 7, cp.getBeginIndex());
25212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("cp end", 21, cp.getEndIndex());
25222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2523ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Positive value with PLURALCURRENCYSTYLE.
2524ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2525ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer7 = new StringBuffer();
2526ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(amount, buffer7, cp);
2527ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("35.47スイス フラン", "35.47スイス フラン", buffer7.toString());
2528ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 5, cp.getBeginIndex());
2529ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 12, cp.getEndIndex());
25302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2531ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // PLURALCURRENCYSTYLE for non-ASCII.
2532ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "de"), NumberFormat.PLURALCURRENCYSTYLE);
2533ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer8 = new StringBuffer();
2534ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer8, cp);
2535ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57ユーロ", "-34.57ユーロ", buffer8.toString());
2536ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2537ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 9, cp.getEndIndex());
25382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2539ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.JAPAN);
2540ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.setCurrency(Currency.getInstance(new Locale("ja", "jp")));
2541ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer9 = new StringBuffer();
2542ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf.format(negAmount, buffer9, cp);
2543ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-¥35", "-¥35", buffer9.toString());
2544ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 1, cp.getBeginIndex());
2545ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 2, cp.getEndIndex());
25462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2547ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Negative value with PLURALCURRENCYSTYLE.
2548ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE);
2549ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer10 = new StringBuffer();
2550ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer10, cp);
2551ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("-34.57スイス フラン", "-34.57スイス フラン", buffer10.toString());
2552ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 6, cp.getBeginIndex());
2553ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 13, cp.getEndIndex());
25542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2555ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        // Nagative value with PLURALCURRENCYSTYLE, Arabic digits.
2556ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("ar", "eg"));
2557ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt = NumberFormat.getInstance(new Locale("ar", "eg"), NumberFormat.PLURALCURRENCYSTYLE);
2558ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        StringBuffer buffer11 = new StringBuffer();
2559ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        plCurrencyFmt.format(negAmount, buffer11, cp);
25602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("؜-٣٤٫٥٧ جنيه مصري", "؜-٣٤٫٥٧ جنيه مصري", buffer11.toString());
2561ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp begin", 8, cp.getBeginIndex());
2562ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius        assertEquals("cp end", 17, cp.getEndIndex());
2563ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius    }
25642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
25652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
25667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRounding() {
25677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
25687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (false) { // for debugging specific value
25697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.setRoundingMode(BigDecimal.ROUND_HALF_UP);
25707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            checkRounding(nf, new BigDecimal("300.0300000000"), 0, new BigDecimal("0.020000000"));
25717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // full tests
25737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] roundingIncrements = {1, 2, 5, 20, 50, 100};
25747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] testValues = {0, 300};
25757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < testValues.length; ++j) {
25767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int mode = BigDecimal.ROUND_UP; mode < BigDecimal.ROUND_HALF_EVEN; ++mode) {
25777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setRoundingMode(mode);
25787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int increment = 0; increment < roundingIncrements.length; ++increment) {
25797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    BigDecimal base = new BigDecimal(testValues[j]);
25807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    BigDecimal rInc = new BigDecimal(roundingIncrements[increment]);
25817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    checkRounding(nf,  base, 20, rInc);
25827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rInc = new BigDecimal("1.000000000").divide(rInc);
25837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    checkRounding(nf,  base, 20, rInc);
25847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
25857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
25907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingPattern() {
25917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestRoundingPatternItem {
25927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String     pattern;
25937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double     roundingIncrement;
25947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double     testCase;
25957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String     expected;
25967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestRoundingPatternItem(String pattern, double roundingIncrement, double testCase, String expected) {
25987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.pattern = pattern;
25997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.roundingIncrement = roundingIncrement;
26007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.testCase = testCase;
26017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.expected = expected;
26027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
26047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestRoundingPatternItem []tests = {
26067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestRoundingPatternItem("##0.65", 0.65, 1.234, "1.30"),
26077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TestRoundingPatternItem("#50", 50.0, 1230, "1250")
26087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
26097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH);
26117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result;
26127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal bd;
26137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tests.length; i++) {
26147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.applyPattern(tests[i].pattern);
26157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = df.format(tests[i].testCase);
26177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tests[i].expected.equals(result)) {
26197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected);
26207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bd = new BigDecimal(tests[i].roundingIncrement);
26237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setRoundingIncrement(bd);
26257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = df.format(tests[i].testCase);
26277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tests[i].expected.equals(result)) {
26297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("BigDecimal Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected);
26307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
26357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBigDecimalRounding() {
26367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String figure = "50.000000004";
26377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Double dbl = new Double(figure);
26387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal dec = new BigDecimal(figure);
26397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat f = (DecimalFormat) NumberFormat.getInstance();
26417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.applyPattern("00.00######");
26427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("double format", "50.00", f.format(dbl));
26447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("bigdec format", "50.00", f.format(dec));
26457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int maxFracDigits = f.getMaximumFractionDigits();
26477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal roundingIncrement = new BigDecimal("1").movePointLeft(maxFracDigits);
26487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingIncrement(roundingIncrement);
26507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingMode(BigDecimal.ROUND_DOWN);
26517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Rounding down", f.format(dbl), f.format(dec));
26527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingIncrement(roundingIncrement);
26547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        f.setRoundingMode(BigDecimal.ROUND_HALF_UP);
26557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Rounding half up", f.format(dbl), f.format(dec));
26567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void checkRounding(DecimalFormat nf, BigDecimal base, int iterations, BigDecimal increment) {
26597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setRoundingIncrement(increment.toBigDecimal());
26607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BigDecimal lastParsed = new BigDecimal(Integer.MIN_VALUE); // used to make sure that rounding is monotonic
26617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = -iterations; i <= iterations; ++i) {
26627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal iValue = base.add(increment.multiply(new BigDecimal(i)).movePointLeft(1));
26637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal smallIncrement = new BigDecimal("0.00000001");
26647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (iValue.signum() != 0) {
26657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                smallIncrement.multiply(iValue); // scale unless zero
26667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // we not only test the value, but some values in a small range around it.
26687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue.subtract(smallIncrement), lastParsed);
26697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue, lastParsed);
26707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = checkRound(nf, iValue.add(smallIncrement), lastParsed);
26717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private BigDecimal checkRound(DecimalFormat nf, BigDecimal iValue, BigDecimal lastParsed) {
26757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formatedBigDecimal = nf.format(iValue);
26767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formattedDouble = nf.format(iValue.doubleValue());
26777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!equalButForTrailingZeros(formatedBigDecimal, formattedDouble)) {
26787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Failure at: " + iValue + " (" + iValue.doubleValue() + ")"
26807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()]
26817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tRounding-increment: " + nf.getRoundingIncrement()
26827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tdouble: " + formattedDouble
26837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tBigDecimal: " + formatedBigDecimal);
26847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
26867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Value: " + iValue
26877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()]
26887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tRounding-increment: " + nf.getRoundingIncrement()
26897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tdouble: " + formattedDouble
26907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ",\tBigDecimal: " + formatedBigDecimal);
26917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
26937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Number should have compareTo(...)
26947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BigDecimal parsed = toBigDecimal(nf.parse(formatedBigDecimal));
26957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (lastParsed.compareTo(parsed) > 0) {
26967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Rounding wrong direction!: " + lastParsed + " > " + parsed);
26977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            lastParsed = parsed;
26997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
27007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse Failure with: " + formatedBigDecimal);
27017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return lastParsed;
27037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static BigDecimal toBigDecimal(Number number) {
27067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return number instanceof BigDecimal ? (BigDecimal) number
27077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : number instanceof BigInteger ? new BigDecimal((BigInteger)number)
27087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        : number instanceof java.math.BigDecimal ? new BigDecimal((java.math.BigDecimal)number)
27097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : number instanceof Double ? new BigDecimal(number.doubleValue())
27107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        : number instanceof Float ? new BigDecimal(number.floatValue())
27117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                : new BigDecimal(number.longValue());
27127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static String[] roundingModeNames = {
27157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_UP", "ROUND_DOWN", "ROUND_CEILING", "ROUND_FLOOR",
27167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_HALF_UP", "ROUND_HALF_DOWN", "ROUND_HALF_EVEN",
27177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ROUND_UNNECESSARY"
27187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
27197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static boolean equalButForTrailingZeros(String formatted1, String formatted2) {
27217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (formatted1.length() == formatted2.length()) return formatted1.equals(formatted2);
27227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return stripFinalZeros(formatted1).equals(stripFinalZeros(formatted2));
27237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String stripFinalZeros(String formatted) {
27267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len1 = formatted.length();
27277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char ch;
27287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (len1 > 0 && ((ch = formatted.charAt(len1-1)) == '0' || ch == '.')) --len1;
27297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (len1==1 && ((ch = formatted.charAt(len1-1)) == '-')) --len1;
27307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return formatted.substring(0,len1);
27317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //------------------------------------------------------------------
27347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Support methods
27357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //------------------------------------------------------------------
27367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test
27387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, Number n, String exp) {
27397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Don't round-trip format test, since we explicitly do it
27407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, n, exp, false);
27417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, exp, n);
27427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test
27447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, Number n, String exp) {
27457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Don't round-trip format test, since we explicitly do it
27467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect_rbnf(fmt, n, exp, false);
27477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect_rbnf(fmt, exp, n);
27487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
27517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, double n, String exp) {
27527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, new Double(n), exp);
27537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
27557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, double n, String exp) {
27567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect3(fmt, new Double(n), exp);
27577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
27607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect2(NumberFormat fmt, long n, String exp) {
27617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, new Long(n), exp);
27627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format-Parse test (convenience)
27647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect3(NumberFormat fmt, long n, String exp) {
27657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect3(fmt, new Long(n), exp);
27667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test
27697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, Number n, String exp, boolean rt) {
27707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer saw = new StringBuffer();
27717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
27727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(n, saw, pos);
27737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat)fmt).toPattern();
27747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.toString().equals(exp)) {
27757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   " + n + " x " +
27767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat + " = \"" +
27777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    saw + "\"");
27787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // We should be able to round-trip the formatted string =>
27797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // number => string (but not the other way around: number
27807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // => string => number2, might have number2 != number):
27817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rt) {
27827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
27837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n2 = fmt.parse(exp);
27847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    StringBuffer saw2 = new StringBuffer();
27857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.format(n2, saw2, pos);
27867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!saw2.toString().equals(exp)) {
27877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"');
27897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
27907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
27917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", " + e.getMessage());
27937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
27947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
27957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
27977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
27987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL " + n + " x " + pat + " = \"" + saw + "\", expected \"" + exp + "\"");
27997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test
28027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect_rbnf(NumberFormat fmt, Number n, String exp, boolean rt) {
28037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer saw = new StringBuffer();
28047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
28057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(n, saw, pos);
28067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (saw.toString().equals(exp)) {
28077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   " + n + " = \"" +
28087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    saw + "\"");
28097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // We should be able to round-trip the formatted string =>
28107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // number => string (but not the other way around: number
28117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // => string => number2, might have number2 != number):
28127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rt) {
28137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
28147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n2 = fmt.parse(exp);
28157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    StringBuffer saw2 = new StringBuffer();
28167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.format(n2, saw2, pos);
28177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!saw2.toString().equals(exp)) {
28187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"');
28207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
28217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
28227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ", " + e.getMessage());
28247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
28257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
28267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect_rbnf() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL " + n + " = \"" + saw + "\", expected \"" + exp + "\"");
28307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
28347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, Number n, String exp) {
28357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, n, exp, true);
28367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
28397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, double n, String exp) {
28407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, new Double(n), exp);
28417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Format test (convenience)
28447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, long n, String exp) {
28457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, new Long(n), exp);
28467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test
28497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, Number n) {
28507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = null;
28517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
28527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            num = fmt.parse(str);
28537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
28547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(e.getMessage());
28557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
28567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = ((DecimalFormat)fmt).toPattern();
28587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // A little tricky here -- make sure Double(12345.0) and
28597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Long(12345) match.
28607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (num.equals(n) || num.doubleValue() == n.doubleValue()) {
28617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + str + "\" x " +
28627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pat + " = " +
28637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    num);
28647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL \"" + str + "\" x " + pat + " = " + num + ", expected " + n);
28677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test
28717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect_rbnf(NumberFormat fmt, String str, Number n) {
28727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = null;
28737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
28747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            num = fmt.parse(str);
28757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
28767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(e.getMessage());
28777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
28787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // A little tricky here -- make sure Double(12345.0) and
28807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Long(12345) match.
28817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (num.equals(n) || num.doubleValue() == n.doubleValue()) {
28827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + str + " = " +
28837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    num);
28847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("expect_rbnf() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) +
28867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", FAIL \"" + str + " = " + num + ", expected " + n);
28877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test (convenience)
28917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, double n) {
28927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, str, new Double(n));
28937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Parse test (convenience)
28967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expect(NumberFormat fmt, String str, long n) {
28977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, str, new Long(n));
28987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectCurrency(NumberFormat nf, Currency curr,
29017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double value, String string) {
29027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = (DecimalFormat) nf;
29037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (curr != null) {
29047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.setCurrency(curr);
29057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = fmt.format(value).replace('\u00A0', ' ');
29077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (s.equals(string)) {
29097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok: " + value + " x " + curr + " => " + s);
29107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
29117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + value + " x " + curr + " => " + s +
29127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ", expected " + string);
29137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPad(DecimalFormat fmt, String pat, int pos) {
29177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expectPad(fmt, pat, pos, 0, (char)0);
29187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPad(DecimalFormat fmt, final String pat, int pos, int width, final char pad) {
29217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int apos = 0, awidth = 0;
29227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char apadStr;
29237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
29247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.applyPattern(pat);
29257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = fmt.getPadPosition();
29267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = fmt.getFormatWidth();
29277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apadStr = fmt.getPadCharacter();
29287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
29297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apos = -1;
29307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            awidth = width;
29317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            apadStr = pad;
29327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (apos == pos && awidth == width && apadStr == pad) {
29357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + "\" pos="
29367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + apos + ((pos == -1) ? "" : " width=" + awidth + " pad=" + apadStr));
29377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
29387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + pat + "\" pos=" + apos + " width="
29397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + awidth + " pad=" + apadStr + ", expected "
29407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + pos + " " + width + " " + pad);
29417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void expectPat(DecimalFormat fmt, final String exp) {
29457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = fmt.toPattern();
29467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pat.equals(exp)) {
29477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok   \"" + pat + "\"");
29487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
29497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \"" + pat + "\", expected \"" + exp + "\"");
29507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void expectParseCurrency(NumberFormat fmt, Currency expected, String text) {
29557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
29567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount currencyAmount = fmt.parseCurrency(text, pos);
29577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("Parse of " + text + " should have succeeded.", pos.getIndex() > 0);
29582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("Currency should be correct.", expected, currencyAmount.getCurrency());
29597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
29627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB3832(){
29637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale locale = new ULocale("pt_PT@currency=PTE");
29647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat format = NumberFormat.getCurrencyInstance(locale);
29657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency curr = Currency.getInstance(locale);
29667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false}));
29677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount cAmt = new CurrencyAmount(1150.50, curr);
29687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode
29697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = format.format(cAmt);
29707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected = "1,150$50\u00a0\u200b";
29717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!expected.equals(str)){
29727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Did not get the expected output Expected: "+expected+" Got: "+ str);
29737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
29777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStrictParse() {
29787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] pass = {
29797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0",           // single zero before end of text is not leading
29807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0 ",          // single zero at end of number is not leading
29817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.",          // single zero before period (or decimal, it's ambiguous) is not leading
29827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0,",          // single zero before comma (not group separator) is not leading
29837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0",         // single zero before decimal followed by digit is not leading
29847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0. ",         // same as above before period (or decimal) is not leading
29857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.100,5",     // comma stops parse of decimal (no grouping)
29867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".00",         // leading decimal is ok, even with zeros
29877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234567",     // group separators are not required
29887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345, ",     // comma not followed by digit is not a group separator, but end of number
29897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234, ",     // if group separator is present, group sizes must be appropriate
29907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,567",   // ...secondary too
29917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E",          // an exponent not followed by zero or digits is not an exponent
29927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00",          // leading zero before zero - used to be error - see ticket #7913
29937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "012",         // leading zero before digit - used to be error - see ticket #7913
29947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0,456",       // leading zero before group separator - used to be error - see ticket #7913
29957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
29967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] fail = {
29977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,2",       // wrong number of digits after group separator
29987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",0",        // leading group separator before zero
29997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",1",        // leading group separator before digit
30007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ",.02",      // leading group separator before decimal
30017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,.02",     // group separator before decimal
30027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,,200",    // multiple group separators
30037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45",      // wrong number of digits in primary group
30047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45 that", // wrong number of digits in primary group
30057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,45.34",   // wrong number of digits in primary group
30067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234,567",  // wrong number of digits in secondary group
30077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567", // wrong number of digits in secondary group
30087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,23,456,7890", // wrong number of digits in primary and secondary groups
30097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
30127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, pass, fail);
30137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] scientificPass = {
30157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0E2",      // single zero before exponent is ok
30167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1234E2",   // any number of digits before exponent is ok
30177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234E",   // an exponent string not followed by zero or digits is not an exponent
30187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "00E2",     // leading zeroes now allowed in strict mode - see ticket #
30197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] scientificFail = {
30217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234E2",  // group separators with exponent fail
30227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
30257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, scientificPass, scientificFail);
30267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] mixedPass = {
30287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567",
30297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567,",
30307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567, that",
30317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,567 that",
30327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] mixedFail = {
30347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56",
30357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56,",
30367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56, that ",
30377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12,34,56 that",
30387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = new DecimalFormat("#,##,##0.#");
30417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseBatch(nf, mixedPass, mixedFail);
30427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void runStrictParseBatch(DecimalFormat nf, String[] pass, String[] fail) {
30457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseStrict(false);
30467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should pass", nf, pass, true);
30477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should also pass", nf, fail, true);
30487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseStrict(true);
30497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should still pass", nf, pass, true);
30507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        runStrictParseTests("should fail", nf, fail, false);
30517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void runStrictParseTests(String msg, DecimalFormat nf, String[] tests, boolean pass) {
30547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("");
30557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: '" + nf.toPattern() + "'");
30567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(msg);
30577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < tests.length; ++i) {
30587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = tests[i];
30597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition pp = new ParsePosition(0);
30607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Number n = nf.parse(str, pp);
30617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String formatted = n != null ? nf.format(n) : "null";
30627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String err = pp.getErrorIndex() == -1 ? "" : "(error at " + pp.getErrorIndex() + ")";
30637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((err.length() == 0) != pass) {
30647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("'" + str + "' parsed '" +
30657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str.substring(0, pp.getIndex()) +
30667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "' returned " + n + " formats to '" +
30677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted + "' " + err);
30687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
30697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (err.length() > 0) {
30707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    err = "got expected " + err;
30717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("'" + str + "' parsed '" +
30737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        str.substring(0, pp.getIndex()) +
30747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "' returned " + n + " formats to '" +
30757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted + "' " + err);
30767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
30802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
30817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB5251(){
30827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //save default locale
30837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale defaultLocale = ULocale.getDefault();
30847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(new ULocale("qr_QR"));
30857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
30867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat.getInstance();
30877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
30897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Numberformat threw exception for non-existent locale. It should use the default.");
30907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //reset default locale
30927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale.setDefault(defaultLocale);
30937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
30967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseReturnType() {
30977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] defaultNonBigDecimals = {
30987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123",      // Long
30997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.0",    // Long
31007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0",      // Long
31017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345678901234567890"      // BigInteger
31027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
31037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] doubles = {
31057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-0.0",
31067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "NaN",
31077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\u221E"    // Infinity
31087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
31097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
31117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat nf = new DecimalFormat("#.#", sym);
31127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (nf.isParseBigDecimal()) {
31147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isParseDecimal() must return false by default");
31157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // isParseBigDecimal() is false
31187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < defaultNonBigDecimals.length; i++) {
31197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
31207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(defaultNonBigDecimals[i]);
31217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (n instanceof BigDecimal) {
31227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse returns BigDecimal instance");
31237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
31247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
31257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e);
31267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // parse results for doubls must be always Double
31297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < doubles.length; i++) {
31307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
31317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(doubles[i]);
31327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof Double)) {
31337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return Double instance");
31347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
31357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
31367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + doubles[i] + "' threw exception: " + e);
31377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // force this DecimalFormat to return BigDecimal
31417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setParseBigDecimal(true);
31427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nf.isParseBigDecimal()) {
31437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: isParseBigDecimal() must return true");
31447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // isParseBigDecimal() is true
31477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < defaultNonBigDecimals.length; i++) {
31487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
31497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(defaultNonBigDecimals[i]);
31507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof BigDecimal)) {
31517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return BigDecimal instance");
31527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
31537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
31547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e);
31557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // parse results for doubls must be always Double
31587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < doubles.length; i++) {
31597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
31607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nf.parse(doubles[i]);
31617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof Double)) {
31627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: parse does not return Double instance");
31637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
31647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
31657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("parse of '" + doubles[i] + "' threw exception: " + e);
31667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
31697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
31717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNonpositiveMultiplier() {
31727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = new DecimalFormat("0");
31737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test zero multiplier
31757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
31777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setMultiplier(0);
31787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // bad
31807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("DecimalFormat.setMultiplier(0) did not throw an IllegalArgumentException");
31817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException ex) {
31827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // good
31837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test negative multiplier
31867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
31887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            df.setMultiplier(-1);
31897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (df.getMultiplier() != -1) {
31917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("DecimalFormat.setMultiplier(-1) did not change the multiplier to -1");
31927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
31937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // good
31967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException ex) {
31977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // bad
31987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("DecimalFormat.setMultiplier(-1) threw an IllegalArgumentException");
31997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
32007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "1122.123", -1122.123);
32037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "-1122.123", 1122.123);
32047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "1.2", -1.2);
32057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(df, "-1.2", 1.2);
32067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MAX_VALUE, BigInteger.valueOf(Long.MAX_VALUE).negate().toString());
32087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MIN_VALUE, BigInteger.valueOf(Long.MIN_VALUE).negate().toString());
32097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MAX_VALUE / 2, BigInteger.valueOf(Long.MAX_VALUE / 2).negate().toString());
32107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, Long.MIN_VALUE / 2, BigInteger.valueOf(Long.MIN_VALUE / 2).negate().toString());
32117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
32137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
32147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString());
32167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString());
32177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
32207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB5358() {
32217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int numThreads = 10;
32227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String numstr = "12345";
32237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double expected = 12345;
32247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US);
32257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#.#", sym);
32267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArrayList errors = new ArrayList();
32277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads];
32297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < numThreads; i++) {
32307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            threads[i] = new ParseThreadJB5358((DecimalFormat)fmt.clone(), numstr, expected, errors);
32317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            threads[i].start();
32327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < numThreads; i++) {
32347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
32357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                threads[i].join();
32367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (InterruptedException ie) {
32377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ie.printStackTrace();
32387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (errors.size() != 0) {
32417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer errBuf = new StringBuffer();
32427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < errors.size(); i++) {
32437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errBuf.append((String)errors.get(i));
32447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errBuf.append("\n");
32457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + errBuf);
32477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static private class ParseThreadJB5358 extends Thread {
32517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final DecimalFormat decfmt;
32527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final String numstr;
32537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final double expect;
32547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final ArrayList errors;
32557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) {
32577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.decfmt = decfmt;
32587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.numstr = numstr;
32597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.expect = expect;
32607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.errors = errors;
32617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
32647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public void run() {
32657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < 10000; i++) {
32667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
32677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Number n = decfmt.parse(numstr);
32687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (n.doubleValue() != expect) {
32697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        synchronized(errors) {
32707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errors.add(new String("Bad parse result - expected:" + expect + " actual:" + n.doubleValue()));
32717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
32727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
32737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Throwable t) {
32747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    synchronized(errors) {
32757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errors.add(new String(t.getClass().getName() + " - " + t.getMessage()));
32767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
32777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
32787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
32837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetCurrency() {
32847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decf1 = DecimalFormatSymbols.getInstance(ULocale.US);
32857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decf2 = DecimalFormatSymbols.getInstance(ULocale.US);
32867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decf2.setCurrencySymbol("UKD");
32877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format1 = new DecimalFormat("000.000", decf1);
32887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat format2 = new DecimalFormat("000.000", decf2);
32897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Currency euro = Currency.getInstance("EUR");
32907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1.setCurrency(euro);
32917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format2.setCurrency(euro);
32927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Reset with currency symbol", format1, format2);
32937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
32967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing the method public StringBuffer format(Object number, ...)
32977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
32982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
32997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormat() {
33007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
33017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer sb = new StringBuffer("dummy");
33027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(0);
33037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (number instanceof Long)" is true
33057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new Long("0"), sb, fp);
33077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a Long object. Error: " + e);
33107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof BigInteger)" is true
33137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new BigInteger("0"), sb, fp);
33157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a BigInteger object. Error: " + e);
33187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof java.math.BigDecimal)" is true
33217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new java.math.BigDecimal("0"), sb, fp);
33237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a java.math.BigDecimal object. Error: " + e);
33267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof com.ibm.icu.math.BigDecimal)" is true
33297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)new com.ibm.icu.math.BigDecimal("0"), sb, fp);
33317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a com.ibm.icu.math.BigDecimal object. Error: " + e);
33347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof CurrencyAmount)" is true
33377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CurrencyAmount ca = new CurrencyAmount(0.0, Currency.getInstance(new ULocale("en_US")));
33397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format((Object)ca, sb, fp);
33407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for a CurrencyAmount object. Error: " + e);
33437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else if (number instanceof Number)" is true
33467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(0.0, sb, fp);
33487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was not suppose to "
33507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "to return an exception for a Number object. Error: " + e);
33517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "else" is true
33547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new Object(), sb, fp);
33567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was suppose to "
33577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for an invalid object.");
33587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
33627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf.format(new String("dummy"), sb, fp);
33637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format(Object number, ...) was suppose to "
33647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception for an invalid object.");
33657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
33667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
33687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
3370b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín     * Coverage tests for the implementation of abstract format methods not being called otherwise
3371b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín     */
3372b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    public void TestFormatAbstractImplCoverage() {
3373b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat df = DecimalFormat.getInstance(Locale.ENGLISH);
3374b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat cdf = CompactDecimalFormat.getInstance(Locale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT);
3375b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        NumberFormat rbf = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT);
3376b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3377b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        /*
3378b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín         *  Test  NumberFormat.format(BigDecimal,StringBuffer,FieldPosition)
3379b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín         */
3380b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        StringBuffer sb = new StringBuffer();
3381b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        String result = df.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3382b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"2,000.43".equals(result)) {
3383b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 2,000.43 - Actual: " + result);
3384b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        }
3385b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3386b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        sb.delete(0, sb.length());
3387b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        result = cdf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3388b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"2K".equals(result)) {
3389b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 2K - Actual: " + result);
3390b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        }
3391b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3392b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        sb.delete(0, sb.length());
3393b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        result = rbf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
3394b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín        if (!"two thousand point four three".equals(result)) {
3395b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("DecimalFormat failed. Expected: 'two thousand point four three' - Actual: '" + result + "'");
33962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
3397b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    }
3398b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín
3399b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín    /*
34007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public final static NumberFormat getInstance(int style) public static NumberFormat
34017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * getInstance(Locale inLocale, int style) public static NumberFormat getInstance(ULocale desiredLocale, int choice)
34027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
34047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetInstance() {
34057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public final static NumberFormat getInstance(int style)"
3406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int maxStyle = NumberFormat.STANDARDCURRENCYSTYLE;
34077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_cases = { NumberFormat.NUMBERSTYLE - 1, NumberFormat.NUMBERSTYLE - 2,
34097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                maxStyle + 1, maxStyle + 2 };
34107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) {
34127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
34137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance(i);
34147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
34157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(int style) was not suppose to "
34167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + i);
34177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < invalid_cases.length; i++) {
34217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
34227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance(invalid_cases[i]);
34237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(int style) was suppose to "
34247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + invalid_cases[i]);
34257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
34267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public static NumberFormat getInstance(Locale inLocale, int style)"
34307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] localeCases = { "en_US", "fr_FR", "de_DE", "jp_JP" };
34317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) {
34337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int j = 0; j < localeCases.length; j++) {
34347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
34357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    NumberFormat.getInstance(new Locale(localeCases[j]), i);
34367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
34377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.getInstance(Locale inLocale, int style) was not suppose to "
34387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + "return an exception for passing value of " + localeCases[j] + ", " + i);
34397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
34407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public static NumberFormat getInstance(ULocale desiredLocale, int choice)"
34447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (choice < NUMBERSTYLE || choice > PLURALCURRENCYSTYLE)" is true
34457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < invalid_cases.length; i++) {
34467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
34477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat.getInstance((ULocale) null, invalid_cases[i]);
34487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("NumberFormat.getInstance(ULocale inLocale, int choice) was not suppose to "
34497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "return an exception for passing value of " + invalid_cases[i]);
34507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
34517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
34567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the class public static abstract class NumberFormatFactory
34577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
34597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumberFormatFactory() {
34607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The following class allows the method public NumberFormat createFormat(Locale loc, int formatType) to be
34627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * tested.
34637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory extends NumberFormatFactory {
34657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Set<String> getSupportedLocaleNames() {
34677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(ULocale loc, int formatType) {
34727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The following class allows the method public NumberFormat createFormat(ULocale loc, int formatType) to be
34787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * tested.
34797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestFactory1 extends NumberFormatFactory {
34817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Set<String> getSupportedLocaleNames() {
34837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
34877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public NumberFormat createFormat(Locale loc, int formatType) {
34887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
34897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestFactory tf = new TestFactory();
34937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestFactory1 tf1 = new TestFactory1();
34947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
34967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public boolean visible()
34977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
34987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf.visible() != true) {
3499b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.visible() was suppose to return true.");
35007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
35037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public NumberFormat createFormat(Locale loc, int formatType)
35047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
35057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf.createFormat(new Locale(""), 0) != null) {
3506b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.createFormat(Locale loc, int formatType) " + "was suppose to return null");
35077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
35107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Tests the method public NumberFormat createFormat(ULocale loc, int formatType)
35117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
35127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (tf1.createFormat(new ULocale(""), 0) != null) {
3513b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín            errln("NumberFormatFactory.createFormat(ULocale loc, int formatType) " + "was suppose to return null");
35147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the class public static abstract class SimpleNumberFormatFactory extends NumberFormatFactory
35197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
35217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSimpleNumberFormatFactory() {
35227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestSimpleNumberFormatFactory extends SimpleNumberFormatFactory {
35237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*
35247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Tests the method public SimpleNumberFormatFactory(Locale locale)
35257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             */
35267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestSimpleNumberFormatFactory() {
35277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                super(new Locale(""));
35287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("unused")
35317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestSimpleNumberFormatFactory tsnff = new TestSimpleNumberFormatFactory();
35327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public static ULocale[] getAvailableLocales()
35367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @SuppressWarnings("static-access")
35382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
35397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetAvailableLocales() {
35407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (shim == null)" is true
35417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("serial")
35427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestGetAvailableLocales extends NumberFormat {
35437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
35457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
35507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
35557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
35607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
35657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
35697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Number parse(String text, ParsePosition parsePosition) {
35707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
35717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
35727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
35757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestGetAvailableLocales test = new TestGetAvailableLocales();
35767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            test.getAvailableLocales();
35777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
35787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.getAvailableLocales() was not suppose to "
35797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "return an exception when getting getting available locales.");
35807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
35817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
35827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
35837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
35847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public void setMinimumIntegerDigits(int newValue)
35857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
35862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
35877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetMinimumIntegerDigits() {
35887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance();
35897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // For valid array, it is displayed as {min value, max value}
35907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (minimumIntegerDigits > maximumIntegerDigits)" is true
35917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[][] cases = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 2, 0 }, { 2, 1 }, { 10, 0 } };
35927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] expectedMax = { 0, 1, 1, 2, 2, 10 };
35937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cases.length != expectedMax.length) {
35947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Can't continue test case method TestSetMinimumIntegerDigits "
35957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "since the test case arrays are unequal.");
35967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
35977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < cases.length; i++) {
35987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMaximumIntegerDigits(cases[i][1]);
35997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMinimumIntegerDigits(cases[i][0]);
36007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (nf.getMaximumIntegerDigits() != expectedMax[i]) {
36017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("NumberFormat.setMinimumIntegerDigits(int newValue "
36027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + "did not return an expected result for parameter " + cases[i][1] + " and " + cases[i][0]
36037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    + " and expected " + expectedMax[i] + " but got " + nf.getMaximumIntegerDigits());
36047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
36057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
36087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
36107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method public int getRoundingMode() public void setRoundingMode(int roundingMode)
36117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
36122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
36137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingMode() {
36147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @SuppressWarnings("serial")
36157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestRoundingMode extends NumberFormat {
36167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
36187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
36237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
36287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
36337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
36387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            @Override
36427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public Number parse(String text, ParsePosition parsePosition) {
36437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return null;
36447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
36457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestRoundingMode tgrm = new TestRoundingMode();
36477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests the function 'public void setRoundingMode(int roundingMode)'
36497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
36507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tgrm.setRoundingMode(0);
36517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.setRoundingMode(int) was suppose to return an exception");
36527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
36537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests the function 'public int getRoundingMode()'
36567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
36577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tgrm.getRoundingMode();
36587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.getRoundingMode() was suppose to return an exception");
36597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
36607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
36617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
36627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
36647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing lenient decimal/grouping separator parsing
36657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
36662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
36677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestLenientSymbolParsing() {
36687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat();
36697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols sym = new DecimalFormatSymbols();
36707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "12\u300234", 12.34);
36727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7345 - case 1
36747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Even strict parsing, the decimal separator set in the symbols
36757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // should be successfully parsed.
36767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setDecimalSeparator('\u3002');
36787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // non-strict
36807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // strict - failed before the fix for #7345
36837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseStrict(true);
36847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "23\u300245", 23.45);
36857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseStrict(false);
36867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7345 - case 2
36897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Decimal separator variants other than DecimalFormatSymbols.decimalSeparator
36907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // should not hide the grouping separator DecimalFormatSymbols.groupingSeparator.
36917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setDecimalSeparator('.');
36927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator(',');
36937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "1,234.56", 1234.56);
36967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
36977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator('\uFF61');
36987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
36997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect(fmt, "2\uFF61345.67", 2345.67);
37017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket#7128
37037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //
37047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sym.setGroupingSeparator(',');
37057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setDecimalFormatSymbols(sym);
37067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String skipExtSepParse = ICUConfig.get("com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "false");
37087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (skipExtSepParse.equals("true")) {
37097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // When the property SkipExtendedSeparatorParsing is true,
37107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // DecimalFormat does not use the extended equivalent separator
37117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // data and only uses the one in DecimalFormatSymbols.
37127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmt, "23 456", 23);
37137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
37147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Lenient separator parsing is enabled by default.
37157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // A space character below is interpreted as a
37167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // group separator, even ',' is used as grouping
37177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // separator in the symbols.
37187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expect(fmt, "12 345", 12345);
37197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
37237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing currency driven max/min fraction digits problem
37247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * reported by ticket#7282
37257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
37262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
37277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyFractionDigits() {
37287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double value = 99.12345;
37297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Create currency instance
37317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat cfmt  = NumberFormat.getCurrencyInstance(new ULocale("ja_JP"));
37327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text1 = cfmt.format(value);
37337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Reset the same currency and format the test value again
37357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cfmt.setCurrency(cfmt.getCurrency());
37367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text2 = cfmt.format(value);
37377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // output1 and output2 must be identical
37397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!text1.equals(text2)) {
37407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format() should return the same result - text1="
37417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + text1 + " text2=" + text2);
37427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
37467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing rounding to negative zero problem
37477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * reported by ticket#7609
37487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
37492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
37507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNegZeroRounding() {
37517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
37537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setRoundingMode(MathContext.ROUND_HALF_UP);
37547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMinimumFractionDigits(1);
37557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setMaximumFractionDigits(1);
37567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text1 = df.format(-0.01);
37577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setRoundingIncrement(0.1);
37597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text2 = df.format(-0.01);
37607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // output1 and output2 must be identical
37627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!text1.equals(text2)) {
37637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NumberFormat.format() should return the same result - text1="
37647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + text1 + " text2=" + text2);
37657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
37707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyAmountCoverage() {
37717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyAmount ca, cb;
37727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
37747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ca = new CurrencyAmount(null, null);
37757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NullPointerException should have been thrown.");
37767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (NullPointerException ex) {
37777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
37797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ca = new CurrencyAmount(new Integer(0), null);
37807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("NullPointerException should have been thrown.");
37817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (NullPointerException ex) {
37827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ca = new CurrencyAmount(new Integer(0), Currency.getInstance(new ULocale("ja_JP")));
37857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cb = new CurrencyAmount(new Integer(1), Currency.getInstance(new ULocale("ja_JP")));
37867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ca.equals(null)) {
37877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparison should return false.");
37887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!ca.equals(ca)) {
37907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparision should return true.");
37917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ca.equals(cb)) {
37937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Comparison should return false.");
37947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
37957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
37967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
37972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
37987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExponentParse() {
37997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition parsePos = new ParsePosition(0);
38007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
38017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("#####", symbols);
38027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number result = fmt.parse("5.06e-27", parsePos);
38037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ( result.doubleValue() != 5.06E-27 || parsePos.getIndex() != 8) {
38047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: ERROR: parse failed - expected 5.06E-27, 8; got " + result.doubleValue() + ", " + parsePos.getIndex());
38057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
38077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
38097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExplicitParents() {
38107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // We use these for testing because decimal and grouping separators will be inherited from es_419
38117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // starting with CLDR 2.0
38127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
38137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "CO", "", "1.250,75",
38147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "ES", "", "1.250,75",
38157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "GQ", "", "1.250,75",
38167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "MX", "", "1,250.75",
38177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "US", "", "1,250.75",
38187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "es", "VE", "", "1.250,75",
38197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
38217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=4) {
38237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]);
38247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat fmt = NumberFormat.getInstance(locale);
38257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = fmt.format(1250.75);
38267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (s.equals(DATA[i+3])) {
38277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: 1250.75 x " + locale + " => " + s);
38287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
38297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: 1250.75 x " + locale + " => " + s +
38307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected " + DATA[i+3]);
38317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
38347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
38367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for #9240
38377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ICU4J 49.1 DecimalFormat did not clone the internal object holding
38387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * formatted text attribute information properly. Therefore, DecimalFormat
38397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * created by cloning may return incorrect results or may throw an exception
38407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * when formatToCharacterIterator is invoked from multiple threads.
38417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
38422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
38437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormatToCharacterIteratorThread() {
38447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final int COUNT = 10;
38457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt1 = new DecimalFormat("#0");
38477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt2 = (DecimalFormat)fmt1.clone();
38487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] res1 = new int[COUNT];
38507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] res2 = new int[COUNT];
38517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Thread t1 = new Thread(new FormatCharItrTestThread(fmt1, 1, res1));
38537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Thread t2 = new Thread(new FormatCharItrTestThread(fmt2, 100, res2));
38547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t1.start();
38567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t2.start();
38577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
38597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t1.join();
38607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t2.join();
38617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (InterruptedException e) {
38627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //TODO
38637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val1 = res1[0];
38667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val2 = res2[0];
38677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < COUNT; i++) {
38697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (res1[i] != val1) {
38707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Inconsistent first run limit in test thread 1");
38717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (res2[i] != val2) {
38737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Inconsistent first run limit in test thread 2");
38747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
38777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
38797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseMaxDigits() {
38807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat();
38817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String number = "100000000000";
38827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int newParseMax = number.length() - 1;
38837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseMaxDigits(-1);
38857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Default value is 1000 */
38877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (fmt.getParseMaxDigits() != 1000) {
38887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail valid value checking in setParseMaxDigits.");
38897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
38907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
38927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (fmt.parse(number).doubleValue() == Float.POSITIVE_INFINITY) {
38937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Got Infinity but should NOT when parsing number: " + number);
38947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
38957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.setParseMaxDigits(newParseMax);
38977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
38987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (fmt.parse(number).doubleValue() != Float.POSITIVE_INFINITY) {
38997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Did not get Infinity but should when parsing number: " + number);
39007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException ex) {
39027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
39047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
39057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static class FormatCharItrTestThread implements Runnable {
39077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final NumberFormat fmt;
39087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final int num;
39097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final int[] result;
39107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatCharItrTestThread(NumberFormat fmt, int num, int[] result) {
39127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.fmt = fmt;
39137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.num = num;
39147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.result = result;
39157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
39167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
39187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public void run() {
39197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < result.length; i++) {
39207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                AttributedCharacterIterator acitr = fmt.formatToCharacterIterator(num);
39217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                acitr.first();
39227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result[i] = acitr.getRunLimit();
39237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
39257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
39267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
39287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRoundingBehavior() {
39297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final Object[][] TEST_CASES = {
39307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
39317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,                             // ULocale - null for default locale
39327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",                                 // Pattern
39337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN), // Rounding Mode or null (implicit)
39347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.0d),                   // Rounding increment, Double or BigDecimal, or null (implicit)
39357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),              // Input value, Long, Double, BigInteger or BigDecimal
39367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.45"                                // Expected result, null for exception
39377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
39387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
39397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
39407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
39417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
39427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.1d),
39437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
39447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.5"
39457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
39467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
39477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
39487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
39497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN),
39507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(0.1d),
39517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
39527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "123.4"
39537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
39547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
39557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
39567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
39577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_UNNECESSARY),
39587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
39597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Double.valueOf(123.4567d),
39607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null
39617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
39627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
39637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ULocale.US,
39647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "#.##",
39657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.valueOf(BigDecimal.ROUND_DOWN),
39667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    null,
39677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Long.valueOf(1234),
39687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "1234"
39697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                },
39707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
39717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int testNum = 1;
39737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] testCase : TEST_CASES) {
39757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 0: locale
39767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 1: pattern
39777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = testCase[0] == null ? ULocale.getDefault() : (ULocale)testCase[0];
39787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = (String)testCase[1];
39797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(locale));
39817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 2: rounding mode
39837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Integer roundingMode = null;
39847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (testCase[2] != null) {
39857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                roundingMode = (Integer)testCase[2];
39867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt.setRoundingMode(roundingMode);
39877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
39897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 3: rounding increment
39907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (testCase[3] != null) {
39917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[3] instanceof Double) {
39927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((Double)testCase[3]);
39937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (testCase[3] instanceof BigDecimal) {
39947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((BigDecimal)testCase[3]);
39957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (testCase[3] instanceof java.math.BigDecimal) {
39967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fmt.setRoundingIncrement((java.math.BigDecimal)testCase[3]);
39977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
39987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
39997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // 4: input number
40017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = null;
40027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean bException = false;
40037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
40047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = fmt.format(testCase[4]);
40057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ArithmeticException e) {
40067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                bException = true;
40077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
40087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bException) {
40107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[5] != null) {
40117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Test case #" + testNum + ": ArithmeticException was thrown.");
40127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
40137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
40147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (testCase[5] == null) {
40157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Test case #" + testNum +
40167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ": ArithmeticException must be thrown, but got formatted result: " +
40177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            s);
40187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
40192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    assertEquals("Test case #" + testNum, testCase[5], s);
40207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
40217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
40227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            testNum++;
40247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
40257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
40287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSignificantDigits() {
40297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double input[] = {
40307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0, 0,
40317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123, -123,
40327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12345, -12345,
40337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123.45, -123.45,
40347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123.44501, -123.44501,
40357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.001234, -0.001234,
40367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.00000000123, -0.00000000123,
40377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0000000000000000000123, -0.0000000000000000000123,
40387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.2, -1.2,
40397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0000000012344501, -0.0000000012344501,
40407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                123445.01, -123445.01,
40417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0,
40427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
40437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] expected = {
40447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.00", "0.00",
40457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123", "-123",
40467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345", "-12345",
40477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.45", "-123.45",
40487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123.45", "-123.45",
40497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.001234", "-0.001234",
40507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.00000000123", "-0.00000000123",
40517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0000000000000000000123", "-0.0000000000000000000123",
40527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.20", "-1.20",
40537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "0.0000000012345", "-0.0000000012345",
40547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "123450", "-123450",
40557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345000000000000000000000000000000", "-12345000000000000000000000000000000",
40567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
40577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
40587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
40597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
40607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMinimumSignificantDigits(3);
40617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(5);
40627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setGroupingUsed(false);
40637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < input.length; i++) {
40647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("TestSignificantDigits", expected[i], numberFormat.format(input[i]));
40657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
40667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
40697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBug9936() {
40707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
40717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
40727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("", numberFormat.areSignificantDigitsUsed());
40737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
40757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
40767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(false);
40787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse("", numberFormat.areSignificantDigitsUsed());
40797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMinimumSignificantDigits(3);
40817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
40827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(false);
40847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(6);
40852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("", numberFormat.areSignificantDigitsUsed());
40867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
40897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestShowZero() {
40907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat numberFormat =
40917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (DecimalFormat) NumberFormat.getInstance(ULocale.US);
40927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setSignificantDigitsUsed(true);
40937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        numberFormat.setMaximumSignificantDigits(3);
40947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("TestShowZero", "0", numberFormat.format(0.0));
40957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
40967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
40972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
40987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyPlurals() {
40997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
41007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1", "1 US dollar"},
41017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.0", "1.0 US dollars"},
41027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.00", "1.00 US dollars"},
41037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "USD", "1.99", "1.99 US dollars"},
41047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "AUD", "1", "1 Australian dollar"},
41057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"en", "AUD", "1.00", "1.00 Australian dollars"},
41067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "1", "1 ameri\u0161ki dolar"},
41077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "2", "2 ameri\u0161ka dolarja"},
41087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "3", "3 ameri\u0161ki dolarji"},
41097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"sl", "USD", "5", "5 ameriških dolarjev"},
41107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"fr", "USD", "1.99", "1,99 dollar des États-Unis"},
41117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "1", "1 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0440\u0443\u0431\u043B\u044C"},
41127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "2", "2 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u044F"},
41137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"ru", "RUB", "5", "5 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u0435\u0439"},
41147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
41157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String test[] : tests) {
41167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(new ULocale(test[0]), NumberFormat.PLURALCURRENCYSTYLE);
41177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setCurrency(Currency.getInstance(test[1]));
41187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double number = Double.parseDouble(test[2]);
41197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int dotPos = test[2].indexOf('.');
41207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int decimals = dotPos < 0 ? 0 : test[2].length() - dotPos - 1;
41217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int digits = dotPos < 0 ? test[2].length() : test[2].length() - 1;
41227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMaximumFractionDigits(decimals);
41237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMinimumFractionDigits(decimals);
41247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String actual = numberFormat.format(number);
41257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual);
41267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMaximumSignificantDigits(digits);
41277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            numberFormat.setMinimumSignificantDigits(digits);
41287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            actual = numberFormat.format(number);
41297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual);
41307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
41317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
41327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
41347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCustomCurrencySignAndSeparator() {
41357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols custom = new DecimalFormatSymbols(ULocale.US);
41367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setCurrencySymbol("*");
41387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setMonetaryGroupingSeparator('^');
41397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        custom.setMonetaryDecimalSeparator(':');
41407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat fmt = new DecimalFormat("\u00A4 #,##0.00", custom);
41427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String numstr = "* 1^234:56";
41447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        expect2(fmt, 1234.56, numstr);
41457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
41467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
41487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseSignsAndMarks() {
41497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class SignsAndMarksItem {
41507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String locale;
41517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public boolean lenient;
41527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String numString;
41537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public double value;
41547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             // Simple constructor
41557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public SignsAndMarksItem(String loc, boolean lnt, String numStr, double val) {
41567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                locale = loc;
41577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                lenient = lnt;
41587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numString = numStr;
41597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                value = val;
41607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
41617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
41627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final SignsAndMarksItem[] items = {
41637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // *** Note, ICU4J lenient number parsing does not handle arbitrary whitespace, but can
41647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // treat some whitespace as a grouping separator. The cases marked *** below depend
41657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // on isGroupingUsed() being set for the locale, which in turn depends on grouping
41667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // separators being present in the decimalFormat pattern for the locale (& num sys).
41677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //
41687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //                    locale                lenient numString                               value
41697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "12",                                    12 ),
41707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "12",                                    12 ),
41717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "-23",                                  -23 ),
41727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "-23",                                  -23 ),
41737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "- 23",                                 -23 ), // ***
41747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 false,  "\u200E-23",                            -23 ),
41757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "\u200E-23",                            -23 ),
41767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en",                 true,   "\u200E- 23",                           -23 ), // ***
41777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "\u0663\u0664",                          34 ),
41797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u0663\u0664",                          34 ),
41807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "-\u0664\u0665",                        -45 ),
41817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "-\u0664\u0665",                        -45 ),
41827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "- \u0664\u0665",                       -45 ), // ***
41837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    false,  "\u200F-\u0664\u0665",                  -45 ),
41847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u200F-\u0664\u0665",                  -45 ),
41857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arab",    true,   "\u200F- \u0664\u0665",                 -45 ), // ***
41867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
41877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "\u06F5\u06F6",                          56 ),
41887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u06F5\u06F6",                          56 ),
41897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "-\u06F6\u06F7",                        -67 ),
41907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "-\u06F6\u06F7",                        -67 ),
41917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "- \u06F6\u06F7",                       -67 ), // ***
41927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", false,  "\u200E-\u200E\u06F6\u06F7",            -67 ),
41937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u200E-\u200E\u06F6\u06F7",            -67 ),
41947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("en@numbers=arabext", true,   "\u200E-\u200E \u06F6\u06F7",           -67 ), // ***
41952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
41967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "12",                                    12 ),
41977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "12",                                    12 ),
41987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "-23",                                  -23 ),
41997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "-23",                                  -23 ),
42007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "- 23",                                 -23 ), // ***
42017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 false,  "\u200E-23",                            -23 ),
42027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "\u200E-23",                            -23 ),
42037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("he",                 true,   "\u200E- 23",                           -23 ), // ***
42047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "\u0663\u0664",                          34 ),
42067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u0663\u0664",                          34 ),
42077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "-\u0664\u0665",                        -45 ),
42087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "-\u0664\u0665",                        -45 ),
42097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "- \u0664\u0665",                       -45 ), // ***
42107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 false,  "\u200F-\u0664\u0665",                  -45 ),
42117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u200F-\u0664\u0665",                  -45 ),
42127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar",                 true,   "\u200F- \u0664\u0665",                 -45 ), // ***
42137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "12",                                    12 ),
42157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "12",                                    12 ),
42167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "-23",                                  -23 ),
42177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "-23",                                  -23 ),
42187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "- 23",                                 -23 ), // ***
42197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              false,  "\u200E-23",                            -23 ),
42207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "\u200E-23",                            -23 ),
42217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ar_MA",              true,   "\u200E- 23",                           -23 ), // ***
42227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u06F5\u06F6",                          56 ),
42247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u06F5\u06F6",                          56 ),
42257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u2212\u06F6\u06F7",                   -67 ),
42267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u2212\u06F6\u06F7",                   -67 ),
42277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u2212 \u06F6\u06F7",                  -67 ), // ***
42287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 false,  "\u200E\u2212\u200E\u06F6\u06F7",       -67 ),
42297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u200E\u2212\u200E\u06F6\u06F7",       -67 ),
42307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("fa",                 true,   "\u200E\u2212\u200E \u06F6\u06F7",      -67 ), // ***
42317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "\u06F5\u06F6",                          56 ),
42337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u06F5\u06F6",                          56 ),
42347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "-\u06F6\u06F7",                        -67 ),
42357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u06F6\u06F7",                        -67 ),
42367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "- \u06F6\u06F7",                       -67 ), // ***
42377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "\u200E-\u200E\u06F6\u06F7",            -67 ),
42387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u200E-\u200E\u06F6\u06F7",            -67 ),
42397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "\u200E-\u200E \u06F6\u06F7",           -67 ), // ***
42407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 false,  "-\u200E\u06F6\u06F7",                  -67 ),
42417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u200E\u06F6\u06F7",                  -67 ),
42427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new SignsAndMarksItem("ps",                 true,   "-\u200E \u06F6\u06F7",                 -67 ), // ***
42437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
42447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (SignsAndMarksItem item: items) {
42457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale locale = new ULocale(item.locale);
42467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NumberFormat numfmt = NumberFormat.getInstance(locale);
42477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (numfmt != null) {
42487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                numfmt.setParseStrict(!item.lenient);
42497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition ppos = new ParsePosition(0);
42507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number num = numfmt.parse(item.numString, ppos);
42517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (num != null && ppos.getIndex() == item.numString.length()) {
42527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    double parsedValue = num.doubleValue();
42537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (parsedValue != item.value) {
42547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives value " + parsedValue);
42557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
42567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
42577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives position " + ppos.getIndex());
42587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
42597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
42607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: NumberFormat.getInstance for locale " + item.locale);
42617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
42627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
42647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
42667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestContext() {
42677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // just a minimal sanity check for now
42687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getInstance();
42697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DisplayContext context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION);
42707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (context != DisplayContext.CAPITALIZATION_NONE) {
42717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Initial NumberFormat.getContext() is not CAPITALIZATION_NONE");
42727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nfmt.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE);
42747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION);
42757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (context != DisplayContext.CAPITALIZATION_FOR_STANDALONE) {
42767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: NumberFormat.getContext() does not return the value set, CAPITALIZATION_FOR_STANDALONE");
42777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
42787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
42797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
42802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
42817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAccountingCurrency() {
42827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] tests = {
4283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                //locale              num         curr fmt per loc     curr std fmt         curr acct fmt        rt
4284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "1234.5",   "$1,234.50",         "$1,234.50",         "$1,234.50",         "true"},
4285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "1234.5",   "$1,234.50",         "$1,234.50",         "$1,234.50",         "true"},
4286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "-1234.5",  "-$1,234.50",        "-$1,234.50",        "($1,234.50)",       "true"},
4287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=standard", "-1234.5",  "-$1,234.50",        "-$1,234.50",        "($1,234.50)",       "true"},
4288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "-1234.5",  "($1,234.50)",       "-$1,234.50",        "($1,234.50)",       "true"},
4289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "0",        "$0.00",             "$0.00",             "$0.00",             "true"},
4290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US",             "-0.2",     "-$0.20",            "-$0.20",            "($0.20)",           "true"},
4291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=standard", "-0.2",     "-$0.20",            "-$0.20",            "($0.20)",           "true"},
4292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"en_US@cf=account",  "-0.2",     "($0.20)",           "-$0.20",            "($0.20)",           "true"},
4293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP",             "10000",    "¥10,000",          "¥10,000",          "¥10,000",          "true" },
4294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP",             "-1000.5",  "-¥1,000",          "-¥1,000",          "(¥1,000)",         "false"},
4295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"ja_JP@cf=account",  "-1000.5",  "(¥1,000)",         "-¥1,000",          "(¥1,000)",         "false"},
4296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {"de_DE",             "-23456.7", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "true" },
42977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
42987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] data : tests) {
42997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(data[0]);
43007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double num = Double.parseDouble(data[1]);
4301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtPerLocExpected   = data[2];
4302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtStandardExpected = data[3];
4303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            String fmtAccountExpected  = data[4];
4304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            boolean rt = Boolean.parseBoolean(data[5]);
4305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtPerLoc = NumberFormat.getInstance(loc, NumberFormat.CURRENCYSTYLE);
4307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtPerLoc, num, fmtPerLocExpected, rt);
4308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtStandard = NumberFormat.getInstance(loc, NumberFormat.STANDARDCURRENCYSTYLE);
4310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtStandard, num, fmtStandardExpected, rt);
43117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            NumberFormat fmtAccount = NumberFormat.getInstance(loc, NumberFormat.ACCOUNTINGCURRENCYSTYLE);
4313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            expect(fmtAccount, num, fmtAccountExpected, rt);
43147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
43162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
43172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
43187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrencyUsage() {
43197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
43207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // compare the Currency and Currency Cash Digits
43217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Note that as of CLDR 26:
43227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that
432387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // * CAD rounds to .05 in the cash style only.
43247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
43257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String original_expected = "PKR124";
43267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat custom = null;
43277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 0) {
43287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"),
43297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CURRENCYSTYLE);
43307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String original = custom.format(123.567);
43327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context", original_expected, original);
43337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // test the getter
43357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(),
43367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Currency.CurrencyUsage.STANDARD);
43377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom.setCurrencyUsage(Currency.CurrencyUsage.CASH);
43387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH);
43397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
43407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"),
43417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CASHCURRENCYSTYLE);
43427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // test the getter
43447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH);
43457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
43467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_currency = custom.format(123.567);
43487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_currency_expected = "PKR124";
43497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", cash_currency_expected, cash_currency);
43507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
43537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // compare the Currency and Currency Cash Rounding
43547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
43557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String original_rounding_expected = "CA$123.57";
43567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt = null;
43577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 0) {
43587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"),
43597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CURRENCYSTYLE);
43607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String original_rounding = fmt.format(123.566);
43627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test Currency Context", original_rounding_expected, original_rounding);
43637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt.setCurrencyUsage(Currency.CurrencyUsage.CASH);
43657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
43667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"),
43677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        DecimalFormat.CASHCURRENCYSTYLE);
43687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
43697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String cash_rounding_currency = fmt.format(123.567);
437187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            String cash__rounding_currency_expected = "CA$123.55";
43727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", cash__rounding_currency_expected, cash_rounding_currency);
43737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // the 1st one is checking setter/getter, while the 2nd one checks for getInstance
43767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test the currency change
43777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 2; i++) {
43787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DecimalFormat fmt2 = null;
43797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 1) {
43807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"),
43817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        NumberFormat.CURRENCYSTYLE);
43827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2.setCurrencyUsage(Currency.CurrencyUsage.CASH);
43837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
43847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"),
43857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        NumberFormat.CASHCURRENCYSTYLE);
43867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
43877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt2.setCurrency(Currency.getInstance("PKR"));
43897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String PKR_changed = fmt2.format(123.567);
43907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String PKR_changed_expected = "PKR124";
43917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("Test Currency Context", PKR_changed_expected, PKR_changed);
43927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
43937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
43947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
43952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
43967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParseRequiredDecimalPoint() {
43972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
43987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] testPattern = { "00.####", "00.0", "00" };
43992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String value2Parse = "99";
44017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double parseValue  =  99;
44027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat parser = new DecimalFormat();
44037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double result;
44042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        boolean hasDecimalPoint;
44052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        for (int i = 0; i < testPattern.length; i++) {
44067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.applyPattern(testPattern[i]);
44077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            hasDecimalPoint = testPattern[i].contains(".");
44082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.setDecimalPatternMatchRequired(false);
44107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
44117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = parser.parse(value2Parse).doubleValue();
44127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("wrong parsed value", parseValue, result);
44137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
44142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                TestFmwk.errln("Parsing " + value2Parse + " should have succeeded with " + testPattern[i] +
44157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
44167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
44172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            parser.setDecimalPatternMatchRequired(true);
44197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
44207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = parser.parse(value2Parse).doubleValue();
44217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(hasDecimalPoint){
44222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    TestFmwk.errln("Parsing " + value2Parse + " should NOT have succeeded with " + testPattern[i] +
44237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
44247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
44257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
44267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // OK, should fail
44277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
44287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
44292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
44312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
44332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    //TODO(junit): investigate
44342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestDataDrivenICU() {
44362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DataDrivenNumberFormatTestUtility.runSuite(
44372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "numberformattestspecification.txt", ICU);
4438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
44402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    //TODO(junit): investigate
44412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestDataDrivenJDK() {
4443543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert        // Android patch: Android java.text.DecimalFormat is actually ICU.
4444543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert        if (TestUtil.getJavaVendor() == TestUtil.JavaVendor.Android) return;
4445543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert        // Android patch end.
44462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DataDrivenNumberFormatTestUtility.runSuite(
44472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "numberformattestspecification.txt", JDK);
4448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
44507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
44512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
44527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCurrFmtNegSameAsPositive() {
44537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormatSymbols decfmtsym = DecimalFormatSymbols.getInstance(Locale.US);
44547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decfmtsym.setMinusSign('\u200B'); // ZERO WIDTH SPACE, in ICU4J cannot set to empty string
44557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat decfmt = new DecimalFormat("\u00A4#,##0.00;\u00A4#,##0.00", decfmtsym);
44567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String currFmtResult = decfmt.format(-100.0);
44577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!currFmtResult.equals("\u200B$100.00")) {
44587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("decfmt.toPattern results wrong, expected \u200B$100.00, got " + currFmtResult);
44597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
44607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
44617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
44622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
44632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestNumberFormatTestDataToString() {
44642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        new NumberFormatTestData().toString();
4465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
4466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
4467ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius   // Testing for Issue 11805.
44682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4469ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius    public void TestFormatToCharacterIteratorIssue11805 () {
4470ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        final double number = -350.76;
4471ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfUS = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.US);
4472ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strUS = dfUS.format(number);
4473ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultUS  = dfUS.formatToCharacterIterator(number).getAllAttributeKeys();
4474ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative US Results: " + strUS, 5, resultUS.size());
4475ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4476ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // For each test, add assert that all the fields are present and in the right spot.
4477ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // TODO: Add tests for identify and position of each field, as in IntlTestDecimalFormatAPIC.
44782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4479ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfDE = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.GERMANY);
4480ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strDE = dfDE.format(number);
4481ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultDE  = dfDE.formatToCharacterIterator(number).getAllAttributeKeys();
4482ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative DE Results: " + strDE, 5, resultDE.size());
4483ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4484ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfIN = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("hi", "in"));
4485ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strIN = dfIN.format(number);
4486ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultIN  = dfIN.formatToCharacterIterator(number).getAllAttributeKeys();
4487ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative IN Results: " + strIN, 5, resultIN.size());
4488ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4489ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfJP = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.JAPAN);
4490ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strJP = dfJP.format(number);
4491ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultJP  = dfJP.formatToCharacterIterator(number).getAllAttributeKeys();
4492ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative JA Results: " + strJP, 3, resultJP.size());
4493ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4494ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfGB = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("en", "gb"));
4495ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strGB = dfGB.format(number);
4496ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultGB  = dfGB.formatToCharacterIterator(number).getAllAttributeKeys();
4497ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 5, resultGB.size());
4498ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4499ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "gb"),
4500ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius            NumberFormat.PLURALCURRENCYSTYLE);
4501ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPlural.format(number);
4502ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPlural.formatToCharacterIterator(number).getAllAttributeKeys();
4503ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 5, resultGB.size());
4504ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4505ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPlural.format(1);
4506ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPlural.formatToCharacterIterator(1).getAllAttributeKeys();
4507ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Results: " + strGB , 4, resultGB.size());
4508ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4509ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // Test output with unit value.
4510ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat auPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "au"),
4511ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius                NumberFormat.PLURALCURRENCYSTYLE);
4512ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        String strAU = auPlural.format(1L);
4513ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        Set<AttributedCharacterIterator.Attribute> resultAU  =
4514ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius                auPlural.formatToCharacterIterator(1L).getAllAttributeKeys();
4515ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Unit AU Result: " + strAU , 4, resultAU.size());
4516ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
4517ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        // Verify Permille fields.
4518ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormatSymbols sym = new DecimalFormatSymbols(new Locale("en", "gb"));
4519ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        DecimalFormat dfPermille = new DecimalFormat("####0.##\u2030", sym);
4520ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        strGB = dfPermille.format(number);
4521ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        resultGB = dfPermille.formatToCharacterIterator(number).getAllAttributeKeys();
4522ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius        assertEquals("Negative GB Permille Results: " + strGB , 3, resultGB.size());
4523ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius    }
4524ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius
45252391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    // Testing for Issue 11808.
45262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
45272391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    public void TestRoundUnnecessarytIssue11808 () {
45282391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();
45292391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        StringBuffer result = new StringBuffer("");
45302391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        df.setRoundingMode(BigDecimal.ROUND_UNNECESSARY);
45312391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        df.applyPattern("00.0#E0");
45322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
45332391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
45342391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            df.format(99999.0, result, new FieldPosition(0));
45352391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for double: " + result);
45362391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
45372391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
45382391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
45392391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
45402391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
45412391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(99999, result, new FieldPosition(0));
45422391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for int: " + result);
45432391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius       } catch (ArithmeticException expected) {
45442391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius           // The exception should be thrown, since rounding is needed.
45452391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
45462391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
45472391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
45482391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigInteger("999999"), result, new FieldPosition(0));
45492391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigInteger: " + result);
45502391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
45512391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
45522391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
45532391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius
45542391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
45552391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigDecimal("99999"), result, new FieldPosition(0));
45562391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigDecimal: " + result);
45572391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
45582391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
45592391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
45602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
45612391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        try {
45622391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            result = df.format(new BigDecimal("-99999"), result, new FieldPosition(0));
45632391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            fail("Missing ArithmeticException for BigDecimal: " + result);
45642391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        } catch (ArithmeticException expected) {
45652391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius            // The exception should be thrown, since rounding is needed.
45662391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius        }
45672391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius    }
456887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
456987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    // Testing for Issue 11735.
45702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
457187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void TestNPEIssue11735() {
457287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormat fmt = new DecimalFormat("0", new DecimalFormatSymbols(new ULocale("en")));
457387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        ParsePosition ppos = new ParsePosition(0);
457487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("Currency symbol missing in parse. Expect null result.",
457587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                fmt.parseCurrency("53.45", ppos), null);
457687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
457787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
457887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    private void CompareAttributedCharacterFormatOutput(AttributedCharacterIterator iterator,
457987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> expected, String formattedOutput) {
458087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
458187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> result = new ArrayList<FieldContainer>();
458287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        while (iterator.getIndex() != iterator.getEndIndex()) {
458387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            int start = iterator.getRunStart();
458487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            int end = iterator.getRunLimit();
458587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            Iterator it = iterator.getAttributes().keySet().iterator();
45862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next();
45872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            Object value = iterator.getAttribute(attribute);
45882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            result.add(new FieldContainer(start, end, attribute, value));
458987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            iterator.setIndex(end);
459087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        }
459187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("Comparing vector length for " + formattedOutput,
459287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert            expected.size(), result.size());
459387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
45942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if (!expected.containsAll(result)) {
459587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          // Print information on the differences.
459687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          for (int i = 0; i < expected.size(); i++) {
45972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            System.out.println("     expected[" + i + "] =" +
459887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).start + " " +
459987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).end + " " +
46002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                expected.get(i).attribute + " " +
460187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                expected.get(i).value);
46022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            System.out.println(" result[" + i + "] =" +
460387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).start + " " +
460487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).end + " " +
46052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                result.get(i).attribute + " " +
460687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                result.get(i).value);
460787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert          }
460887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        }
46092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // TODO: restore when #11914 is fixed.
46102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // assertTrue("Comparing vector results for " + formattedOutput,
46112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //    expected.containsAll(result));
461287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
461387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
461487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    // Testing for Issue 11914, missing FieldPositions for some field types.
46152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
461687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void TestNPEIssue11914() {
461787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // First test: Double value with grouping separators.
461887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v1 = new ArrayList<FieldContainer>(7);
461987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(0, 3, NumberFormat.Field.INTEGER));
462087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(3, 4, NumberFormat.Field.GROUPING_SEPARATOR));
462187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(4, 7, NumberFormat.Field.INTEGER));
462287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(7, 8, NumberFormat.Field.GROUPING_SEPARATOR));
462387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(8, 11, NumberFormat.Field.INTEGER));
462487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(11, 12, NumberFormat.Field.DECIMAL_SEPARATOR));
462587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v1.add(new FieldContainer(12, 15, NumberFormat.Field.FRACTION));
462687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
462787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        Number number = new Double(123456789.9753);
462887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        ULocale usLoc = new ULocale("en-US");
462987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormatSymbols US = new DecimalFormatSymbols(usLoc);
463087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
463187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        NumberFormat outFmt = NumberFormat.getNumberInstance(usLoc);
463287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String numFmtted = outFmt.format(number);
463387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        AttributedCharacterIterator iterator =
463487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                outFmt.formatToCharacterIterator(number);
463587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v1, numFmtted);
463687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
463787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Second test: Double with scientific notation formatting.
463887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v2 = new ArrayList<FieldContainer>(7);
463987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(0, 1, NumberFormat.Field.INTEGER));
464087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(1, 2, NumberFormat.Field.DECIMAL_SEPARATOR));
464187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(2, 5, NumberFormat.Field.FRACTION));
464287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(5, 6, NumberFormat.Field.EXPONENT_SYMBOL));
464387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SIGN));
464487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v2.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT));
464587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US);
464687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
464787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        numFmtted = fmt2.format(number);
464887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = fmt2.formatToCharacterIterator(number);
464987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v2, numFmtted);
465087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
465187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Third test. BigInteger with grouping separators.
465287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v3 = new ArrayList<FieldContainer>(7);
465387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN));
465487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER));
465587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(2, 3, NumberFormat.Field.GROUPING_SEPARATOR));
465687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(3, 6, NumberFormat.Field.INTEGER));
465787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(6, 7, NumberFormat.Field.GROUPING_SEPARATOR));
465887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(7, 10, NumberFormat.Field.INTEGER));
465987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(10, 11, NumberFormat.Field.GROUPING_SEPARATOR));
466087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(11, 14, NumberFormat.Field.INTEGER));
466187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(14, 15, NumberFormat.Field.GROUPING_SEPARATOR));
466287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(15, 18, NumberFormat.Field.INTEGER));
466387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(18, 19, NumberFormat.Field.GROUPING_SEPARATOR));
466487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(19, 22, NumberFormat.Field.INTEGER));
466587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(22, 23, NumberFormat.Field.GROUPING_SEPARATOR));
466687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v3.add(new FieldContainer(23, 26, NumberFormat.Field.INTEGER));
466787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        BigInteger bigNumberInt = new BigInteger("-1234567890246813579");
466887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String fmtNumberBigInt = outFmt.format(bigNumberInt);
466987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
467087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = outFmt.formatToCharacterIterator(bigNumberInt);
467187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v3, fmtNumberBigInt);
467287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
467387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Fourth test: BigDecimal with exponential formatting.
467487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        List<FieldContainer> v4 = new ArrayList<FieldContainer>(7);
467587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN));
467687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER));
467787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(2, 3, NumberFormat.Field.DECIMAL_SEPARATOR));
467887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(3, 6, NumberFormat.Field.FRACTION));
467987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SYMBOL));
468087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT_SIGN));
468187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        v4.add(new FieldContainer(8, 9, NumberFormat.Field.EXPONENT));
468287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
468387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        java.math.BigDecimal numberBigD = new java.math.BigDecimal(-123456789);
468487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        String fmtNumberBigDExp = fmt2.format(numberBigD);
468587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
468687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        iterator = fmt2.formatToCharacterIterator(numberBigD);
468787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        CompareAttributedCharacterFormatOutput(iterator, v4, fmtNumberBigDExp);
46882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
468987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
469087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
46912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    // Test that the decimal is shown even when there are no fractional digits
46922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
46932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void Test11621() throws Exception {
46942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String pat = "0.##E0";
46952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
46962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormatSymbols icuSym = new DecimalFormatSymbols(Locale.US);
46972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormat icuFmt = new DecimalFormat(pat, icuSym);
46982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        icuFmt.setDecimalSeparatorAlwaysShown(true);
46992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String icu = ((NumberFormat)icuFmt).format(299792458);
47002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
47012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        java.text.DecimalFormatSymbols jdkSym = new java.text.DecimalFormatSymbols(Locale.US);
47022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        java.text.DecimalFormat jdkFmt = new java.text.DecimalFormat(pat,jdkSym);
47032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        jdkFmt.setDecimalSeparatorAlwaysShown(true);
47042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String jdk = ((java.text.NumberFormat)jdkFmt).format(299792458);
47052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
47062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("ICU and JDK placement of decimal in exponent", jdk, icu);
470787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
470887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
47096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    private void checkFormatWithField(String testInfo, Format format, Object object,
47106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            String expected, Format.Field field, int begin, int end) {
47116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        StringBuffer buffer = new StringBuffer();
47126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        FieldPosition pos = new FieldPosition(field);
47136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        format.format(object, buffer, pos);
47146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        assertEquals("Test " + testInfo + ": incorrect formatted text", expected, buffer.toString());
47166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        if (begin != pos.getBeginIndex() || end != pos.getEndIndex()) {
47186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            assertEquals("Index mismatch", field + " " + begin + ".." + end,
47196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius                pos.getFieldAttribute() + " " + pos.getBeginIndex() + ".." + pos.getEndIndex());
47206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        }
47216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
47246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsCurrency() {
47256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(ULocale.US);
47266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(92314587.66);
47276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String result = "$92,314,587.66";
47286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("currency", formatter, number, result,
47306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.CURRENCY, 0, 1);
47316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, result,
47326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 11);
47336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("grouping separator", formatter, number, result,
47346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.GROUPING_SEPARATOR, 3, 4);
47356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, result,
47366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 11, 12);
47376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", formatter, number, result,
47386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 12, 14);
47396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
47426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeDouble() {
47436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // test for exponential fields with double
47446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-12345678.90123);
47466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+00", us_symbols);
47476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = formatter.format(number);
47486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, numFmtted,
47506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, numFmtted,
47526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
47536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, numFmtted,
47546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
47556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, numFmtted,
47566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
47576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, numFmtted,
47586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
47596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, numFmtted,
47606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
47616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
47646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerCent() {
47656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERCENT
47666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat percentFormat = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.US);
47676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-0.986);
47686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numberFormatted = percentFormat.format(number);
47696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", percentFormat, number, numberFormatted,
47706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", percentFormat, number, numberFormatted,
47726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 3);
47736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("percent", percentFormat, number, numberFormatted,
47746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERCENT, 3, 4);
47756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
47786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerCentPattern() {
47796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERCENT with more digits
47806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
47816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPercent = new DecimalFormat("0.#####%", us_symbols);
47826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Double(-0.986);
47836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = fmtPercent.format(number);
47846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPercent, number, numFmtted,
47866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
47876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPercent, number, numFmtted,
47886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 3);
47896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPercent, number, numFmtted,
47906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 3, 4);
47916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPercent, number, numFmtted,
47926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 4, 5);
47936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("percent", fmtPercent, number, numFmtted,
47946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERCENT, 5, 6);
47956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
47966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
47972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
47986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPerMille() {
47996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check PERMILLE
48006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
48016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPerMille = new DecimalFormat("0.######‰", us_symbols);
48026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number numberPermille = new Double(-0.98654);
48036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String numFmtted = fmtPerMille.format(numberPermille);
48046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPerMille, numberPermille, numFmtted,
48066bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
48076bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPerMille, numberPermille, numFmtted,
48086bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 4);
48096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPerMille, numberPermille, numFmtted,
48106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 4, 5);
48116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPerMille, numberPermille, numFmtted,
48126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 5, 7);
48136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("permille", fmtPerMille, numberPermille, numFmtted,
48146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.PERMILLE, 7, 8);
48156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
48166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
48186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeBigInt() {
48196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius      DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
48206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols);
48216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new BigDecimal("-123456789987654321");
48226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String bigDecFmtted = formatter.format(number);
48236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, bigDecFmtted,
48256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
48266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, bigDecFmtted,
48276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
48286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, bigDecFmtted,
48296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
48306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, bigDecFmtted,
48316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
48326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, bigDecFmtted,
48336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
48346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, bigDecFmtted,
48356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
48366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
48376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
48396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeLong() {
48406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number number = new Long("-123456789987654321");
48416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
48426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols);
48436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String longFmtted = formatter.format(number);
48446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", formatter, number, longFmtted,
48466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
48476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", formatter, number, longFmtted,
48486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
48496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", formatter, number, longFmtted,
48506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
48516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", formatter, number, longFmtted,
48526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 8, 9);
48536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", formatter, number, longFmtted,
48546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 9, 10);
48556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", formatter, number, longFmtted,
48566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 10, 12);
48576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
48586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
48606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsPositiveBigDec() {
48616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check complex positive;negative pattern.
48626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
48636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols);
48646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number positiveExp = new Double("9876543210");
48656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String posExpFormatted = fmtPosNegSign.format(positiveExp);
48666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPosNegSign, positiveExp, posExpFormatted,
48686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
48696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPosNegSign, positiveExp, posExpFormatted,
48706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
48716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPosNegSign, positiveExp, posExpFormatted,
48726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
48736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPosNegSign, positiveExp, posExpFormatted,
48746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 3, 7);
48756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", fmtPosNegSign, positiveExp, posExpFormatted,
48766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 7, 8);
48776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", fmtPosNegSign, positiveExp, posExpFormatted,
48786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 8, 9);
48796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", fmtPosNegSign, positiveExp, posExpFormatted,
48806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 9, 11);
48816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
48826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
48846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    public void TestMissingFieldPositionsNegativeBigDec() {
48856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        // Check complex positive;negative pattern.
48866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius      DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US);
48876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols);
48886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        Number negativeExp = new BigDecimal("-0.000000987654321083");
48896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        String negExpFormatted = fmtPosNegSign.format(negativeExp);
48906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius
48916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("sign", fmtPosNegSign, negativeExp, negExpFormatted,
48926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.SIGN, 0, 1);
48936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("integer", fmtPosNegSign, negativeExp, negExpFormatted,
48946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.INTEGER, 1, 2);
48956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("decimal separator", fmtPosNegSign, negativeExp, negExpFormatted,
48966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3);
48976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("fraction", fmtPosNegSign, negativeExp, negExpFormatted,
48986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.FRACTION, 3, 7);
48996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent symbol", fmtPosNegSign, negativeExp, negExpFormatted,
49006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SYMBOL, 7, 8);
49016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent sign", fmtPosNegSign, negativeExp, negExpFormatted,
49026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT_SIGN, 8, 9);
49036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius        checkFormatWithField("exponent", fmtPosNegSign, negativeExp, negExpFormatted,
49046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius            NumberFormat.Field.EXPONENT, 9, 11);
49056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius    }
49062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
49072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
49082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestStringSymbols() {
49092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormatSymbols symbols = new DecimalFormatSymbols(ULocale.US);
49102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
49112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String[] customDigits = {"(0)", "(1)", "(2)", "(3)", "(4)", "(5)", "(6)", "(7)", "(8)", "(9)"};
49122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        symbols.setDigitStrings(customDigits);
49132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        symbols.setDecimalSeparatorString("~~");
49142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        symbols.setGroupingSeparatorString("^^");
49152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
49162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DecimalFormat fmt = new DecimalFormat("#,##0.0#", symbols);
49172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
49182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        expect2(fmt, 1234567.89, "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)");
49192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
49207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
4921