1 /*
2  * Copyright (c) 2012, 2020, 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 
24  /*
25  * @test
26  * @bug 8005471 8008577 8129881 8130845 8136518 8181157 8210490 8220037
27  *      8234347 8236548
28  * @modules jdk.localedata
29  * @run main/othervm -Djava.locale.providers=CLDR CLDRDisplayNamesTest
30  * @summary Make sure that localized time zone names of CLDR are used
31  * if specified.
32  */
33 
34 import java.text.*;
35 import java.util.*;
36 import static java.util.TimeZone.*;
37 
38 public class CLDRDisplayNamesTest {
39     /*
40      * The first element is a language tag. The rest are localized
41      * display names of America/Los_Angeles copied from the CLDR
42      * resources data. If data change in CLDR, test data below will
43      * need to be changed accordingly.
44      *
45      * Generic names are NOT tested (until they are supported by API).
46      */
47     static final String[][] CLDR_DATA = {
48         {
49             "ja-JP",
50             "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6a19\u6e96\u6642",
51             "GMT-08:00",
52             "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593",
53             "GMT-07:00",
54             //"\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6642\u9593",
55         //"PT"
56         },
57         {
58             "zh-CN",
59             "\u5317\u7f8e\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4",
60             "GMT-08:00",
61             "\u5317\u7f8e\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4",
62             "GMT-07:00",
63             //"\u5317\u7f8e\u592a\u5e73\u6d0b\u65f6\u95f4",
64         //"PT",
65         },
66         {
67             "de-DE",
68             "Nordamerikanische Westk\u00fcsten-Normalzeit",
69             "GMT-08:00",
70             "Nordamerikanische Westk\u00fcsten-Sommerzeit",
71             "GMT-07:00",
72             //"Nordamerikanische Westk\u00fcstenzeit",
73         //"PT",
74         },
75     };
76 
77     private static final String NO_INHERITANCE_MARKER = "\u2205\u2205\u2205";
78 
main(String[] args)79     public static void main(String[] args) {
80         // Make sure that localized time zone names of CLDR are used
81         // if specified.
82         TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
83         int errors = 0;
84         for (String[] data : CLDR_DATA) {
85             Locale locale = Locale.forLanguageTag(data[0]);
86             for (int i = 1; i < data.length; i++) {
87                 int style = ((i % 2) == 1) ? LONG : SHORT;
88                 boolean daylight = (i == 3 || i == 4);
89                 String name = tz.getDisplayName(daylight, style, locale);
90                 if (!data[i].equals(name)) {
91                     System.err.printf("error: got '%s' expected '%s' (style=%d, daylight=%s, locale=%s)%n",
92                             name, data[i], style, daylight, locale);
93                     errors++;
94                 }
95             }
96         }
97 
98         // for 8129881
99         /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore.
100         tz = TimeZone.getTimeZone("Europe/Vienna");
101         String name = tz.getDisplayName(false, SHORT, Locale.ENGLISH);
102         if (!"CET".equals(name)) {
103             System.err.printf("error: got '%s' expected 'CET' %n", name);
104             errors++;
105         }
106         */
107 
108         // for 8130845
109         SimpleDateFormat fmtROOT = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.ROOT);
110         SimpleDateFormat fmtUS = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.US);
111         SimpleDateFormat fmtUK = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.UK);
112         Locale originalLocale = Locale.getDefault();
113         try {
114             Locale.setDefault(Locale.ROOT);
115             fmtROOT.parse("Thu Nov 13 04:35:51 GMT-09:00 2008");
116             fmtUS.parse("Thu Nov 13 04:35:51 AKST 2008");
117             fmtUK.parse("Thu Nov 13 04:35:51 GMT-09:00 2008");
118         } catch (ParseException pe) {
119             System.err.println(pe);
120             errors++;
121         } finally {
122             Locale.setDefault(originalLocale);
123         }
124 
125         // for 8210490
126         // Check that TimeZone.getDisplayName should honor passed locale parameter,
127         // even if default locale is set to some other locale.
128         Locale.setDefault(Locale.forLanguageTag("ar-PK"));
129         TimeZone zi = TimeZone.getTimeZone("Etc/GMT-5");
130         String displayName = zi.getDisplayName(false, TimeZone.SHORT, Locale.US);
131         Locale.setDefault(originalLocale);
132         if (!displayName.equals("GMT+05:00")) {
133             System.err.printf("Wrong display name for timezone Etc/GMT-5 : expected GMT+05:00,  Actual " + displayName);
134             errors++;
135         }
136 
137         // 8217366: No "no inheritance marker" should be left in the returned array
138         // from DateFormatSymbols.getZoneStrings()
139         errors += List.of(Locale.ROOT,
140                 Locale.CHINA,
141                 Locale.GERMANY,
142                 Locale.JAPAN,
143                 Locale.UK,
144                 Locale.US,
145                 Locale.forLanguageTag("hi-IN"),
146                 Locale.forLanguageTag("es-419")).stream()
147             .peek(System.out::println)
148             .map(l -> DateFormatSymbols.getInstance(l).getZoneStrings())
149             .flatMap(zoneStrings -> Arrays.stream(zoneStrings))
150             .filter(namesArray -> Arrays.stream(namesArray)
151                 .anyMatch(aName -> aName.equals(NO_INHERITANCE_MARKER)))
152             .peek(marker -> {
153                  System.err.println("No-inheritance-marker is detected with tzid: "
154                                                 + marker[0]);
155             })
156             .count();
157 
158         // 8220037: Make sure CLDRConverter uniquely produces bundles, regardless of the
159         // source file enumeration order.
160         /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore.
161         tz = TimeZone.getTimeZone("America/Argentina/La_Rioja");
162         if (!"ARST".equals(tz.getDisplayName(true, TimeZone.SHORT,
163                                 new Locale.Builder()
164                                     .setLanguage("en")
165                                     .setRegion("CA")
166                                     .build()))) {
167             System.err.println("Short display name of \"" + tz.getID() + "\" was not \"ARST\"");
168             errors++;
169         }
170         */
171 
172         if (errors > 0) {
173             throw new RuntimeException("test failed");
174         }
175     }
176 }
177