| /* | |
| * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /* | |
| * @test | |
| * @bug 8005471 8008577 8129881 8130845 8136518 8181157 8210490 8220037 | |
| * 8234347 8236548 8317979 | |
| * @modules jdk.localedata | |
| * @run main CLDRDisplayNamesTest | |
| * @summary Make sure that localized time zone names of CLDR are used | |
| * if specified. | |
| */ | |
| import java.text.*; | |
| import java.util.*; | |
| import static java.util.TimeZone.*; | |
| public class CLDRDisplayNamesTest { | |
| /* | |
| * The first element is a language tag. The rest are localized | |
| * display names of America/Los_Angeles copied from the CLDR | |
| * resources data. If data change in CLDR, test data below will | |
| * need to be changed accordingly. | |
| * | |
| * Generic names are NOT tested (until they are supported by API). | |
| */ | |
| static final String[][] CLDR_DATA = { | |
| { | |
| "ja-JP", | |
| "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", | |
| "PST", | |
| "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593", | |
| "PDT", | |
| //"\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6642\u9593", | |
| //"PT" | |
| }, | |
| { | |
| "zh-CN", | |
| "\u5317\u7f8e\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", | |
| "PST", | |
| "\u5317\u7f8e\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4", | |
| "PDT", | |
| //"\u5317\u7f8e\u592a\u5e73\u6d0b\u65f6\u95f4", | |
| //"PT", | |
| }, | |
| { | |
| "de-DE", | |
| "Nordamerikanische Westk\u00fcsten-Normalzeit", | |
| "PST", | |
| "Nordamerikanische Westk\u00fcsten-Sommerzeit", | |
| "PDT", | |
| //"Nordamerikanische Westk\u00fcstenzeit", | |
| //"PT", | |
| }, | |
| }; | |
| private static final String NO_INHERITANCE_MARKER = "\u2205\u2205\u2205"; | |
| public static void main(String[] args) { | |
| // Make sure that localized time zone names of CLDR are used | |
| // if specified. | |
| TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); | |
| int errors = 0; | |
| for (String[] data : CLDR_DATA) { | |
| Locale locale = Locale.forLanguageTag(data[0]); | |
| for (int i = 1; i < data.length; i++) { | |
| int style = ((i % 2) == 1) ? LONG : SHORT; | |
| boolean daylight = (i == 3 || i == 4); | |
| String name = tz.getDisplayName(daylight, style, locale); | |
| if (!data[i].equals(name)) { | |
| System.err.printf("error: got '%s' expected '%s' (style=%d, daylight=%s, locale=%s)%n", | |
| name, data[i], style, daylight, locale); | |
| errors++; | |
| } | |
| } | |
| } | |
| // for 8129881 | |
| /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore. | |
| tz = TimeZone.getTimeZone("Europe/Vienna"); | |
| String name = tz.getDisplayName(false, SHORT, Locale.ENGLISH); | |
| if (!"CET".equals(name)) { | |
| System.err.printf("error: got '%s' expected 'CET' %n", name); | |
| errors++; | |
| } | |
| */ | |
| // for 8130845 | |
| SimpleDateFormat fmtROOT = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.ROOT); | |
| SimpleDateFormat fmtUS = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.US); | |
| SimpleDateFormat fmtUK = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.UK); | |
| Locale originalLocale = Locale.getDefault(); | |
| try { | |
| Locale.setDefault(Locale.ROOT); | |
| fmtROOT.parse("Thu Nov 13 04:35:51 GMT-09:00 2008"); | |
| fmtUS.parse("Thu Nov 13 04:35:51 AKST 2008"); | |
| fmtUK.parse("Thu Nov 13 04:35:51 GMT-09:00 2008"); | |
| } catch (ParseException pe) { | |
| System.err.println(pe); | |
| errors++; | |
| } finally { | |
| Locale.setDefault(originalLocale); | |
| } | |
| // for 8210490 | |
| // Check that TimeZone.getDisplayName should honor passed locale parameter, | |
| // even if default locale is set to some other locale. | |
| Locale.setDefault(Locale.forLanguageTag("ar-PK")); | |
| TimeZone zi = TimeZone.getTimeZone("Etc/GMT-5"); | |
| String displayName = zi.getDisplayName(false, TimeZone.SHORT, Locale.US); | |
| Locale.setDefault(originalLocale); | |
| if (!displayName.equals("GMT+05:00")) { | |
| System.err.println("Wrong display name for timezone Etc/GMT-5 : expected GMT+05:00, Actual " + displayName); | |
| errors++; | |
| } | |
| // 8217366: No "no inheritance marker" should be left in the returned array | |
| // from DateFormatSymbols.getZoneStrings() | |
| errors += List.of(Locale.ROOT, | |
| Locale.CHINA, | |
| Locale.GERMANY, | |
| Locale.JAPAN, | |
| Locale.UK, | |
| Locale.US, | |
| Locale.forLanguageTag("hi-IN"), | |
| Locale.forLanguageTag("es-419")).stream() | |
| .peek(System.out::println) | |
| .map(l -> DateFormatSymbols.getInstance(l).getZoneStrings()) | |
| .flatMap(zoneStrings -> Arrays.stream(zoneStrings)) | |
| .filter(namesArray -> Arrays.stream(namesArray) | |
| .anyMatch(aName -> aName.equals(NO_INHERITANCE_MARKER))) | |
| .peek(marker -> { | |
| System.err.println("No-inheritance-marker is detected with tzid: " | |
| + marker[0]); | |
| }) | |
| .count(); | |
| // 8220037: Make sure CLDRConverter uniquely produces bundles, regardless of the | |
| // source file enumeration order. | |
| /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore. | |
| tz = TimeZone.getTimeZone("America/Argentina/La_Rioja"); | |
| if (!"ARST".equals(tz.getDisplayName(true, TimeZone.SHORT, | |
| new Locale.Builder() | |
| .setLanguage("en") | |
| .setRegion("CA") | |
| .build()))) { | |
| System.err.println("Short display name of \"" + tz.getID() + "\" was not \"ARST\""); | |
| errors++; | |
| } | |
| */ | |
| if (errors > 0) { | |
| throw new RuntimeException("test failed"); | |
| } | |
| } | |
| } |