1 /*
   2  * Copyright (c) 2012, 2018, 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
  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     public static void main(String[] args) {
  77         // Make sure that localized time zone names of CLDR are used
  78         // if specified.
  79         TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
  80         int errors = 0;
  81         for (String[] data : CLDR_DATA) {
  82             Locale locale = Locale.forLanguageTag(data[0]);
  83             for (int i = 1; i < data.length; i++) {
  84                 int style = ((i % 2) == 1) ? LONG : SHORT;
  85                 boolean daylight = (i == 3 || i == 4);
  86                 String name = tz.getDisplayName(daylight, style, locale);
  87                 if (!data[i].equals(name)) {
  88                     System.err.printf("error: got '%s' expected '%s' (style=%d, daylight=%s, locale=%s)%n",
  89                             name, data[i], style, daylight, locale);
  90                     errors++;
  91                 }
  92             }
  93         }
  94 
  95         // for 8129881
  96         tz = TimeZone.getTimeZone("Europe/Vienna");
  97         String name = tz.getDisplayName(false, SHORT, Locale.ENGLISH);
  98         if (!"CET".equals(name)) {
  99             System.err.printf("error: got '%s' expected 'CET' %n", name);
 100             errors++;
 101         }
 102 
 103         // for 8130845
 104         SimpleDateFormat fmtROOT = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.ROOT);
 105         SimpleDateFormat fmtUS = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.US);
 106         SimpleDateFormat fmtUK = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.UK);
 107         Locale originalLocale = Locale.getDefault();
 108         try {
 109             Locale.setDefault(Locale.ROOT);
 110             fmtROOT.parse("Thu Nov 13 04:35:51 AKST 2008");
 111             fmtUS.parse("Thu Nov 13 04:35:51 AKST 2008");
 112             fmtUK.parse("Thu Nov 13 04:35:51 GMT-09:00 2008");
 113         } catch (ParseException pe) {
 114             System.err.println(pe);
 115             errors++;
 116         } finally {
 117             Locale.setDefault(originalLocale);
 118         }
 119 
 120         // for 8210490
 121         // Check that TimeZone.getDisplayName should honor passed locale parameter,
 122         // even if default locale is set to some other locale.
 123         Locale.setDefault(Locale.forLanguageTag("ar-PK"));
 124         TimeZone zi = TimeZone.getTimeZone("Etc/GMT-5");
 125         String displayName = zi.getDisplayName(false, TimeZone.SHORT, Locale.US);
 126         Locale.setDefault(originalLocale);
 127         if (!displayName.equals("GMT+05:00")) {
 128             System.err.printf("Wrong display name for timezone Etc/GMT-5 : expected GMT+05:00,  Actual " + displayName);
 129             errors++;
 130         }
 131         if (errors > 0) {
 132             throw new RuntimeException("test failed");
 133         }
 134     }
 135 }