NumberFormatProviderTest.java revision 6389:1d7a6adf499f
190090Sobrien/*
2132727Skan * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
3169699Skan * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
490090Sobrien *
518334Speter * This code is free software; you can redistribute it and/or modify it
690090Sobrien * under the terms of the GNU General Public License version 2 only, as
718334Speter * published by the Free Software Foundation.
890090Sobrien *
990090Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT
1090090Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1190090Sobrien * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1218334Speter * version 2 for more details (a copy is included in the LICENSE file that
1390090Sobrien * accompanied this code).
1490090Sobrien *
1590090Sobrien * You should have received a copy of the GNU General Public License version
1690090Sobrien * 2 along with this work; if not, write to the Free Software Foundation,
1718334Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1818334Speter *
1990090Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20169699Skan * or visit www.oracle.com if you need additional information or have any
21169699Skan * questions.
2218334Speter */
2390090Sobrien/*
2490090Sobrien *
2590090Sobrien */
26259268Spfg
27169699Skanimport java.text.*;
28169699Skanimport java.util.*;
2918334Speterimport sun.util.locale.provider.*;
3018334Speterimport sun.util.resources.*;
3118334Speter
3218334Speterimport com.foo.FooNumberFormat;
3318334Speter
3450506Sobrienpublic class NumberFormatProviderTest extends ProviderTest {
3590090Sobrien
3690090Sobrien    com.foo.NumberFormatProviderImpl nfp = new com.foo.NumberFormatProviderImpl();
3790090Sobrien    List<Locale> availloc = Arrays.asList(NumberFormat.getAvailableLocales());
3890090Sobrien    List<Locale> providerloc = Arrays.asList(nfp.getAvailableLocales());
3918334Speter    List<Locale> jreloc = Arrays.asList(LocaleProviderAdapter.forJRE().getAvailableLocales());
4018334Speter    List<Locale> jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getNumberFormatProvider().getAvailableLocales());
4118334Speter
4218334Speter    public static void main(String[] s) {
4318334Speter        new NumberFormatProviderTest();
44132727Skan    }
45132727Skan
46132727Skan    NumberFormatProviderTest() {
4718334Speter        availableLocalesTest();
4818334Speter        objectValidityTest();
4918334Speter        messageFormatTest();
5018334Speter    }
5190090Sobrien
5218334Speter    void availableLocalesTest() {
5318334Speter        Set<Locale> localesFromAPI = new HashSet<>(availloc);
5418334Speter        Set<Locale> localesExpected = new HashSet<>(jreloc);
5518334Speter        localesExpected.addAll(providerloc);
5618334Speter        if (localesFromAPI.equals(localesExpected)) {
5718334Speter            System.out.println("availableLocalesTest passed.");
58259268Spfg        } else {
59259268Spfg            throw new RuntimeException("availableLocalesTest failed");
60259268Spfg        }
61259268Spfg    }
62259268Spfg
63259268Spfg    void objectValidityTest() {
64259268Spfg
65259268Spfg        for (Locale target: availloc) {
66259268Spfg            boolean jreSupportsLocale = jreimplloc.contains(target);
67259268Spfg
68259268Spfg            // JRE string arrays
69259268Spfg            String[] jreNumberPatterns = null;
70259268Spfg            if (jreSupportsLocale) {
71259268Spfg                jreNumberPatterns = LocaleProviderAdapter.forJRE().getLocaleResources(target).getNumberPatterns();
72259268Spfg            }
73259268Spfg
74259268Spfg            // result object
75259268Spfg            String resultCur = getPattern(NumberFormat.getCurrencyInstance(target));
76259268Spfg            String resultInt = getPattern(NumberFormat.getIntegerInstance(target));
7718334Speter            String resultNum = getPattern(NumberFormat.getNumberInstance(target));
7818334Speter            String resultPer = getPattern(NumberFormat.getPercentInstance(target));
79132727Skan
8018334Speter            // provider's object (if any)
81169699Skan            String providersCur = null;
82169699Skan            String providersInt = null;
83169699Skan            String providersNum = null;
84169699Skan            String providersPer = null;
85169699Skan            if (providerloc.contains(target)) {
86169699Skan                NumberFormat dfCur = nfp.getCurrencyInstance(target);
87169699Skan                if (dfCur != null) {
88169699Skan                    providersCur = getPattern(dfCur);
89169699Skan                }
90169699Skan                NumberFormat dfInt = nfp.getIntegerInstance(target);
91169699Skan                if (dfInt != null) {
92169699Skan                    providersInt = getPattern(dfInt);
93132727Skan                }
94169699Skan                NumberFormat dfNum = nfp.getNumberInstance(target);
95169699Skan                if (dfNum != null) {
96169699Skan                    providersNum = getPattern(dfNum);
97169699Skan                }
98169699Skan                NumberFormat dfPer = nfp.getPercentInstance(target);
99169699Skan                if (dfPer != null) {
100169699Skan                    providersPer = getPattern(dfPer);
101169699Skan                }
102169699Skan            }
103169699Skan
104169699Skan            // JRE's object (if any)
105169699Skan            // note that this totally depends on the current implementation
10618334Speter            String jresCur = null;
10718334Speter            String jresInt = null;
10818334Speter            String jresNum = null;
10918334Speter            String jresPer = null;
11050506Sobrien            if (jreSupportsLocale) {
11150506Sobrien                DecimalFormat dfCur = new DecimalFormat(jreNumberPatterns[1],
11250506Sobrien                    DecimalFormatSymbols.getInstance(target));
11350506Sobrien                if (dfCur != null) {
114132727Skan                    adjustForCurrencyDefaultFractionDigits(dfCur);
115132727Skan                    jresCur = dfCur.toPattern();
11618334Speter                }
117132727Skan                DecimalFormat dfInt = new DecimalFormat(jreNumberPatterns[0],
11818334Speter                    DecimalFormatSymbols.getInstance(target));
11990090Sobrien                if (dfInt != null) {
12090090Sobrien                    dfInt.setMaximumFractionDigits(0);
12190090Sobrien                    dfInt.setDecimalSeparatorAlwaysShown(false);
12218334Speter                    dfInt.setParseIntegerOnly(true);
123132727Skan                    jresInt = dfInt.toPattern();
12418334Speter                }
125259405Spfg                DecimalFormat dfNum = new DecimalFormat(jreNumberPatterns[0],
126259405Spfg                    DecimalFormatSymbols.getInstance(target));
127259405Spfg                if (dfNum != null) {
128259405Spfg                    jresNum = dfNum.toPattern();
129259405Spfg                }
130259405Spfg                DecimalFormat dfPer = new DecimalFormat(jreNumberPatterns[2],
131259405Spfg                    DecimalFormatSymbols.getInstance(target));
132259405Spfg                if (dfPer != null) {
133259405Spfg                    jresPer = dfPer.toPattern();
13418334Speter                }
13518334Speter            }
13618334Speter
13718334Speter            checkValidity(target, jresCur, providersCur, resultCur, jreSupportsLocale);
138132727Skan            checkValidity(target, jresInt, providersInt, resultInt, jreSupportsLocale);
13990090Sobrien            checkValidity(target, jresNum, providersNum, resultNum, jreSupportsLocale);
14018334Speter            checkValidity(target, jresPer, providersPer, resultPer, jreSupportsLocale);
141259405Spfg        }
142259405Spfg    }
143259405Spfg
144259405Spfg    /**
145259405Spfg     * Adjusts the minimum and maximum fraction digits to values that
146259405Spfg     * are reasonable for the currency's default fraction digits.
147117404Skan     */
148117404Skan    void adjustForCurrencyDefaultFractionDigits(DecimalFormat df) {
149117404Skan        DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
150169699Skan        Currency currency = dfs.getCurrency();
151117404Skan        if (currency == null) {
152169699Skan            try {
153169699Skan                currency = Currency.getInstance(dfs.getInternationalCurrencySymbol());
15418334Speter            } catch (IllegalArgumentException e) {
155169699Skan            }
15618334Speter        }
15718334Speter        if (currency != null) {
15818334Speter            int digits = currency.getDefaultFractionDigits();
15918334Speter            if (digits != -1) {
16018334Speter                int oldMinDigits = df.getMinimumFractionDigits();
16118334Speter                // Common patterns are "#.##", "#.00", "#".
16218334Speter                // Try to adjust all of them in a reasonable way.
16318334Speter                if (oldMinDigits == df.getMaximumFractionDigits()) {
16418334Speter                    df.setMinimumFractionDigits(digits);
16518334Speter                    df.setMaximumFractionDigits(digits);
16618334Speter                } else {
16718334Speter                    df.setMinimumFractionDigits(Math.min(digits, oldMinDigits));
16818334Speter                    df.setMaximumFractionDigits(digits);
16918334Speter                }
17018334Speter            }
17118334Speter        }
17218334Speter    }
173169699Skan
174169699Skan    private static String getPattern(NumberFormat nf) {
17518334Speter        if (nf instanceof DecimalFormat) {
17618334Speter            return ((DecimalFormat)nf).toPattern();
17718334Speter        }
17818334Speter        if (nf instanceof FooNumberFormat) {
17918334Speter            return ((FooNumberFormat)nf).toPattern();
18018334Speter        }
18118334Speter        return null;
18252516Sobrien    }
18352516Sobrien
184169699Skan    private static final String[] NUMBER_PATTERNS = {
18552516Sobrien        "num={0,number}",
186169699Skan        "num={0,number,currency}",
18752516Sobrien        "num={0,number,percent}",
18896282Sobrien        "num={0,number,integer}"
18996282Sobrien    };
19096282Sobrien
19196282Sobrien    void messageFormatTest() {
19296282Sobrien        for (Locale target : providerloc) {
19318334Speter            for (String pattern : NUMBER_PATTERNS) {
19418334Speter                MessageFormat mf = new MessageFormat(pattern, target);
195169699Skan                String toPattern = mf.toPattern();
19618334Speter                if (!pattern.equals(toPattern)) {
19718334Speter                    throw new RuntimeException("MessageFormat.toPattern: got '"
19818334Speter                                               + toPattern
19918334Speter                                               + "', expected '" + pattern + "'");
20018334Speter                }
20152516Sobrien            }
20252516Sobrien        }
20352516Sobrien    }
20452516Sobrien}
20552516Sobrien