Print this page
rev 5615 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o Jigsaw. by Naoto Sato and Masayoshi Okutsu)
Split |
Close |
Expand all |
Collapse all |
--- old/test/java/util/PluggableLocale/NumberFormatProviderTest.java
+++ new/test/java/util/PluggableLocale/NumberFormatProviderTest.java
1 1 /*
2 - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
2 + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 18 *
↓ open down ↓ |
6 lines elided |
↑ open up ↑ |
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 */
23 23 /*
24 24 *
25 25 */
26 26
27 27 import java.text.*;
28 28 import java.util.*;
29 -import sun.util.*;
29 +import sun.util.locale.provider.*;
30 30 import sun.util.resources.*;
31 31
32 32 import com.foo.FooNumberFormat;
33 33
34 34 public class NumberFormatProviderTest extends ProviderTest {
35 35
36 36 com.foo.NumberFormatProviderImpl nfp = new com.foo.NumberFormatProviderImpl();
37 37 List<Locale> availloc = Arrays.asList(NumberFormat.getAvailableLocales());
38 38 List<Locale> providerloc = Arrays.asList(nfp.getAvailableLocales());
39 - List<Locale> jreloc = Arrays.asList(LocaleData.getAvailableLocales());
39 + List<Locale> jreloc = Arrays.asList(LocaleProviderAdapter.forJRE().getAvailableLocales());
40 + List<Locale> jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getNumberFormatProvider().getAvailableLocales());
40 41
41 42 public static void main(String[] s) {
42 43 new NumberFormatProviderTest();
43 44 }
44 45
45 46 NumberFormatProviderTest() {
46 47 availableLocalesTest();
47 48 objectValidityTest();
48 49 messageFormatTest();
49 50 }
50 51
51 52 void availableLocalesTest() {
52 53 Set<Locale> localesFromAPI = new HashSet<Locale>(availloc);
53 - Set<Locale> localesExpected = new HashSet<Locale>(jreloc);
54 + Set<Locale> localesExpected = new HashSet<Locale>(jreimplloc);
55 + localesExpected.remove(Locale.ROOT);
54 56 localesExpected.addAll(providerloc);
55 57 if (localesFromAPI.equals(localesExpected)) {
56 58 System.out.println("availableLocalesTest passed.");
57 59 } else {
58 60 throw new RuntimeException("availableLocalesTest failed");
59 61 }
60 62 }
61 63
62 64 void objectValidityTest() {
63 65
64 66 for (Locale target: availloc) {
65 67 // pure JRE implementation
66 - ResourceBundle rb = LocaleData.getNumberFormatData(target);
67 - boolean jreSupportsLocale = jreloc.contains(target);
68 + ResourceBundle rb = LocaleProviderAdapter.forJRE().getLocaleData().getNumberFormatData(target);
69 + boolean jreSupportsLocale = jreimplloc.contains(target);
68 70
69 71 // JRE string arrays
70 72 String[] jreNumberPatterns = null;
71 73 if (jreSupportsLocale) {
72 74 try {
73 75 jreNumberPatterns = rb.getStringArray("NumberPatterns");
74 76 } catch (MissingResourceException mre) {}
75 77 }
76 78
77 79 // result object
78 80 String resultCur = getPattern(NumberFormat.getCurrencyInstance(target));
79 81 String resultInt = getPattern(NumberFormat.getIntegerInstance(target));
80 82 String resultNum = getPattern(NumberFormat.getNumberInstance(target));
81 83 String resultPer = getPattern(NumberFormat.getPercentInstance(target));
82 84
83 85 // provider's object (if any)
84 86 String providersCur = null;
85 87 String providersInt = null;
86 88 String providersNum = null;
87 89 String providersPer = null;
88 90 if (providerloc.contains(target)) {
89 91 NumberFormat dfCur = nfp.getCurrencyInstance(target);
90 92 if (dfCur != null) {
91 93 providersCur = getPattern(dfCur);
92 94 }
93 95 NumberFormat dfInt = nfp.getIntegerInstance(target);
94 96 if (dfInt != null) {
95 97 providersInt = getPattern(dfInt);
96 98 }
97 99 NumberFormat dfNum = nfp.getNumberInstance(target);
98 100 if (dfNum != null) {
99 101 providersNum = getPattern(dfNum);
100 102 }
101 103 NumberFormat dfPer = nfp.getPercentInstance(target);
102 104 if (dfPer != null) {
103 105 providersPer = getPattern(dfPer);
104 106 }
105 107 }
106 108
107 109 // JRE's object (if any)
108 110 // note that this totally depends on the current implementation
109 111 String jresCur = null;
110 112 String jresInt = null;
111 113 String jresNum = null;
112 114 String jresPer = null;
113 115 if (jreSupportsLocale) {
114 116 DecimalFormat dfCur = new DecimalFormat(jreNumberPatterns[1],
115 117 DecimalFormatSymbols.getInstance(target));
116 118 if (dfCur != null) {
117 119 adjustForCurrencyDefaultFractionDigits(dfCur);
118 120 jresCur = dfCur.toPattern();
119 121 }
120 122 DecimalFormat dfInt = new DecimalFormat(jreNumberPatterns[0],
121 123 DecimalFormatSymbols.getInstance(target));
122 124 if (dfInt != null) {
123 125 dfInt.setMaximumFractionDigits(0);
124 126 dfInt.setDecimalSeparatorAlwaysShown(false);
125 127 dfInt.setParseIntegerOnly(true);
126 128 jresInt = dfInt.toPattern();
127 129 }
128 130 DecimalFormat dfNum = new DecimalFormat(jreNumberPatterns[0],
129 131 DecimalFormatSymbols.getInstance(target));
130 132 if (dfNum != null) {
131 133 jresNum = dfNum.toPattern();
132 134 }
133 135 DecimalFormat dfPer = new DecimalFormat(jreNumberPatterns[2],
134 136 DecimalFormatSymbols.getInstance(target));
135 137 if (dfPer != null) {
136 138 jresPer = dfPer.toPattern();
137 139 }
138 140 }
139 141
140 142 checkValidity(target, jresCur, providersCur, resultCur, jreSupportsLocale);
141 143 checkValidity(target, jresInt, providersInt, resultInt, jreSupportsLocale);
142 144 checkValidity(target, jresNum, providersNum, resultNum, jreSupportsLocale);
143 145 checkValidity(target, jresPer, providersPer, resultPer, jreSupportsLocale);
144 146 }
145 147 }
146 148
147 149 /**
148 150 * Adjusts the minimum and maximum fraction digits to values that
149 151 * are reasonable for the currency's default fraction digits.
150 152 */
151 153 void adjustForCurrencyDefaultFractionDigits(DecimalFormat df) {
152 154 DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
153 155 Currency currency = dfs.getCurrency();
154 156 if (currency == null) {
155 157 try {
156 158 currency = Currency.getInstance(dfs.getInternationalCurrencySymbol());
157 159 } catch (IllegalArgumentException e) {
158 160 }
159 161 }
160 162 if (currency != null) {
161 163 int digits = currency.getDefaultFractionDigits();
162 164 if (digits != -1) {
163 165 int oldMinDigits = df.getMinimumFractionDigits();
164 166 // Common patterns are "#.##", "#.00", "#".
165 167 // Try to adjust all of them in a reasonable way.
166 168 if (oldMinDigits == df.getMaximumFractionDigits()) {
167 169 df.setMinimumFractionDigits(digits);
168 170 df.setMaximumFractionDigits(digits);
169 171 } else {
170 172 df.setMinimumFractionDigits(Math.min(digits, oldMinDigits));
171 173 df.setMaximumFractionDigits(digits);
172 174 }
173 175 }
174 176 }
175 177 }
176 178
177 179 private static String getPattern(NumberFormat nf) {
178 180 if (nf instanceof DecimalFormat) {
179 181 return ((DecimalFormat)nf).toPattern();
180 182 }
181 183 if (nf instanceof FooNumberFormat) {
182 184 return ((FooNumberFormat)nf).toPattern();
183 185 }
184 186 return null;
185 187 }
186 188
187 189 private static final String[] NUMBER_PATTERNS = {
188 190 "num={0,number}",
189 191 "num={0,number,currency}",
190 192 "num={0,number,percent}",
191 193 "num={0,number,integer}"
192 194 };
193 195
194 196 void messageFormatTest() {
195 197 for (Locale target : providerloc) {
196 198 for (String pattern : NUMBER_PATTERNS) {
197 199 MessageFormat mf = new MessageFormat(pattern, target);
198 200 String toPattern = mf.toPattern();
199 201 if (!pattern.equals(toPattern)) {
200 202 throw new RuntimeException("MessageFormat.toPattern: got '"
201 203 + toPattern
202 204 + "', expected '" + pattern + "'");
203 205 }
204 206 }
205 207 }
206 208 }
207 209 }
↓ open down ↓ |
130 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX