1 /* 2 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 import java.text.*; 24 import java.text.spi.*; 25 import java.util.*; 26 import java.util.spi.*; 27 import sun.util.locale.provider.LocaleProviderAdapter; 28 29 public class LocaleProviders { 30 31 public static void main(String[] args) { 32 String methodName = args[0]; 33 34 switch (methodName) { 35 case "getPlatformLocale": 36 if (args[1].equals("format")) { 37 getPlatformLocale(Locale.Category.FORMAT); 38 } else { 39 getPlatformLocale(Locale.Category.DISPLAY); 40 } 41 break; 42 43 case "adapterTest": 44 adapterTest(args[1], args[2], (args.length >= 4 ? args[3] : "")); 45 break; 46 47 case "bug7198834Test": 48 bug7198834Test(); 49 break; 50 51 case "tzNameTest": 52 tzNameTest(args[1]); 53 break; 54 55 case "bug8001440Test": 56 bug8001440Test(); 57 break; 58 59 case "bug8010666Test": 60 bug8010666Test(); 61 break; 62 63 case "bug8013086Test": 64 bug8013086Test(args[1], args[2]); 65 break; 66 67 case "bug8013903Test": 68 bug8013903Test(); 69 break; 70 71 case "bug8027289Test": 72 bug8027289Test(args[1]); 73 break; 74 75 case "bug8220227Test": 76 bug8220227Test(); 77 break; 78 79 default: 80 throw new RuntimeException("Test method '"+methodName+"' not found."); 81 } 82 } 83 84 static void getPlatformLocale(Locale.Category cat) { 85 Locale defloc = Locale.getDefault(cat); 86 System.out.printf("%s,%s\n", defloc.getLanguage(), defloc.getCountry()); 87 } 88 89 static void adapterTest(String expected, String lang, String ctry) { 90 Locale testLocale = new Locale(lang, ctry); 91 LocaleProviderAdapter ldaExpected = 92 LocaleProviderAdapter.forType(LocaleProviderAdapter.Type.valueOf(expected)); 93 if (!ldaExpected.getDateFormatProvider().isSupportedLocale(testLocale)) { 94 System.out.println("test locale: "+testLocale+" is not supported by the expected provider: "+ldaExpected+". Ignoring the test."); 95 return; 96 } 97 String preference = System.getProperty("java.locale.providers", ""); 98 LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, testLocale); 99 LocaleProviderAdapter.Type type = lda.getAdapterType(); 100 System.out.printf("testLocale: %s, got: %s, expected: %s\n", testLocale, type, expected); 101 if (!type.toString().equals(expected)) { 102 throw new RuntimeException("Returned locale data adapter is not correct."); 103 } 104 } 105 106 static void bug7198834Test() { 107 LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, Locale.US); 108 LocaleProviderAdapter.Type type = lda.getAdapterType(); 109 if (type == LocaleProviderAdapter.Type.HOST && System.getProperty("os.name").startsWith("Windows")) { 110 DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.US); 111 String date = df.format(new Date()); 112 if (date.charAt(date.length()-1) == ' ') { 113 throw new RuntimeException("Windows Host Locale Provider returns a trailing space."); 114 } 115 } else { 116 System.out.println("Windows HOST locale adapter not found. Ignoring this test."); 117 } 118 } 119 120 static void tzNameTest(String id) { 121 TimeZone tz = TimeZone.getTimeZone(id); 122 String tzName = tz.getDisplayName(false, TimeZone.SHORT, Locale.US); 123 if (tzName.startsWith("GMT")) { 124 throw new RuntimeException("JRE's localized time zone name for "+id+" could not be retrieved. Returned name was: "+tzName); 125 } 126 } 127 128 static void bug8001440Test() { 129 Locale locale = Locale.forLanguageTag("th-TH-u-nu-hoge"); 130 NumberFormat nf = NumberFormat.getInstance(locale); 131 String nu = nf.format(1234560); 132 } 133 134 // This test assumes Windows localized language/country display names. 135 static void bug8010666Test() { 136 if (System.getProperty("os.name").startsWith("Windows")) { 137 NumberFormat nf = NumberFormat.getInstance(Locale.US); 138 try { 139 double ver = nf.parse(System.getProperty("os.version")) 140 .doubleValue(); 141 System.out.printf("Windows version: %.1f\n", ver); 142 if (ver >= 6.0) { 143 LocaleProviderAdapter lda = 144 LocaleProviderAdapter.getAdapter( 145 LocaleNameProvider.class, Locale.ENGLISH); 146 LocaleProviderAdapter.Type type = lda.getAdapterType(); 147 if (type == LocaleProviderAdapter.Type.HOST) { 148 LocaleNameProvider lnp = lda.getLocaleNameProvider(); 149 Locale mkmk = Locale.forLanguageTag("mk-MK"); 150 String result = mkmk.getDisplayLanguage(Locale.ENGLISH); 151 String hostResult = 152 lnp.getDisplayLanguage(mkmk.getLanguage(), 153 Locale.ENGLISH); 154 System.out.printf(" Display language name for" + 155 " (mk_MK): result(HOST): \"%s\", returned: \"%s\"\n", 156 hostResult, result); 157 if (result == null || 158 hostResult != null && 159 !result.equals(hostResult)) { 160 throw new RuntimeException("Display language name" + 161 " mismatch for \"mk\". Returned name was" + 162 " \"" + result + "\", result(HOST): \"" + 163 hostResult + "\""); 164 } 165 result = Locale.US.getDisplayLanguage(Locale.ENGLISH); 166 hostResult = 167 lnp.getDisplayLanguage(Locale.US.getLanguage(), 168 Locale.ENGLISH); 169 System.out.printf(" Display language name for" + 170 " (en_US): result(HOST): \"%s\", returned: \"%s\"\n", 171 hostResult, result); 172 if (result == null || 173 hostResult != null && 174 !result.equals(hostResult)) { 175 throw new RuntimeException("Display language name" + 176 " mismatch for \"en\". Returned name was" + 177 " \"" + result + "\", result(HOST): \"" + 178 hostResult + "\""); 179 } 180 if (ver >= 6.1) { 181 result = Locale.US.getDisplayCountry(Locale.ENGLISH); 182 hostResult = lnp.getDisplayCountry( 183 Locale.US.getCountry(), Locale.ENGLISH); 184 System.out.printf(" Display country name for" + 185 " (en_US): result(HOST): \"%s\", returned: \"%s\"\n", 186 hostResult, result); 187 if (result == null || 188 hostResult != null && 189 !result.equals(hostResult)) { 190 throw new RuntimeException("Display country name" + 191 " mismatch for \"US\". Returned name was" + 192 " \"" + result + "\", result(HOST): \"" + 193 hostResult + "\""); 194 } 195 } 196 } else { 197 throw new RuntimeException("Windows Host" + 198 " LocaleProviderAdapter was not selected for" + 199 " English locale."); 200 } 201 } 202 } catch (ParseException pe) { 203 throw new RuntimeException("Parsing Windows version failed: "+pe.toString()); 204 } 205 } 206 } 207 208 static void bug8013086Test(String lang, String ctry) { 209 try { 210 // Throws a NullPointerException if the test fails. 211 System.out.println(new SimpleDateFormat("z", new Locale(lang, ctry)).parse("UTC")); 212 } catch (ParseException pe) { 213 // ParseException is fine in this test, as it's not "UTC" 214 } 215 } 216 217 static void bug8013903Test() { 218 if (System.getProperty("os.name").startsWith("Windows")) { 219 Date sampleDate = new Date(0x10000000000L); 220 String hostResult = "\u5e73\u6210 16.11.03 (Wed) AM 11:53:47"; 221 String jreResult = "\u5e73\u6210 16.11.03 (\u6c34) \u5348\u524d 11:53:47"; 222 Locale l = new Locale("ja", "JP", "JP"); 223 SimpleDateFormat sdf = new SimpleDateFormat("GGGG yyyy.MMM.dd '('E')' a hh:mm:ss", l); 224 sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 225 String result = sdf.format(sampleDate); 226 System.out.println(result); 227 if (LocaleProviderAdapter.getAdapterPreference() 228 .contains(LocaleProviderAdapter.Type.JRE)) { 229 if (!jreResult.equals(result)) { 230 throw new RuntimeException("Format failed. result: \"" + 231 result + "\", expected: \"" + jreResult); 232 } 233 } else { 234 // Windows display names. Subject to change if Windows changes its format. 235 if (!hostResult.equals(result)) { 236 throw new RuntimeException("Format failed. result: \"" + 237 result + "\", expected: \"" + hostResult); 238 } 239 } 240 } 241 } 242 243 static void bug8027289Test(String expectedCodePoint) { 244 if (System.getProperty("os.name").startsWith("Windows")) { 245 char[] expectedSymbol = Character.toChars(Integer.valueOf(expectedCodePoint, 16)); 246 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA); 247 char formatted = nf.format(7000).charAt(0); 248 System.out.println("returned: " + formatted + ", expected: " + expectedSymbol[0]); 249 if (formatted != expectedSymbol[0]) { 250 throw new RuntimeException( 251 "Unexpected Chinese currency symbol. returned: " 252 + formatted + ", expected: " + expectedSymbol[0]); 253 } 254 } 255 } 256 257 static void bug8220227Test() { 258 if (System.getProperty("os.name").startsWith("Windows")) { 259 Locale l = new Locale("xx","XX"); 260 String country = l.getDisplayCountry(); 261 if (country.contains("(XX)")) { 262 throw new RuntimeException( 263 "Unexpected Region name: " + country); 264 } 265 } 266 } 267 }