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