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