1 /*
2  * Copyright (c) 2001, 2016, 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 4322313
27  * @summary Make sure that new implementation of custom time zone
28  * support for TimeZone.getTimeZone() works correctly and the
29  * getDisplayName() methods are locale independent.
30  * @library /java/text/testlib
31  */
32 
33 import java.io.*;
34 import java.text.*;
35 import java.util.*;
36 
37 public class Bug4322313 extends IntlTest {
38     private static final int MPM = 60 * 1000;    /* Milliseconds per minute */
39     private static final Object[][] VALIDS = {
40         /* given ID    rawOffset   normalized ID */
41         {"GMT+00:00",  0,          "GMT+00:00"},
42         {"GMT+3:04",   184 * MPM,  "GMT+03:04"},
43         {"GMT+03:04",  184 * MPM,  "GMT+03:04"},
44         {"GMT+13:42",  822 * MPM,  "GMT+13:42"},
45         /* ISO-LATIN-1 digits */
46         {"GMT+\u0030\u0031:\u0032\u0033", 83 * MPM, "GMT+01:23"},
47 
48         {"GMT+0",      0,          "GMT+00:00"},
49         {"GMT+3",      180 * MPM,  "GMT+03:00"},
50         {"GMT+13",     780 * MPM,  "GMT+13:00"},
51         {"GMT+034",    34 * MPM,   "GMT+00:34"},
52         {"GMT+1034",   634 * MPM,  "GMT+10:34"},
53 
54         {"GMT-00:00",  0,          "GMT-00:00"},
55         {"GMT-3:04",   -184 * MPM, "GMT-03:04"},
56         {"GMT-03:04",  -184 * MPM, "GMT-03:04"},
57         {"GMT-13:42",  -822 * MPM, "GMT-13:42"},
58         /* ISO-LATIN-1 digits */
59         {"GMT-\u0030\u0031:\u0032\u0033", -83 * MPM, "GMT-01:23"},
60 
61         {"GMT-0",      0,          "GMT-00:00"},
62         {"GMT-3",      -180 * MPM, "GMT-03:00"},
63         {"GMT-13",     -780 * MPM, "GMT-13:00"},
64         {"GMT-034",    -34 * MPM,  "GMT-00:34"},
65         {"GMT-1034",   -634 * MPM, "GMT-10:34"},
66     };
67 
68     private static final String[] INVALIDS = {
69         "GMT+5:8",    "GMT+11:1",    "GMT+23:60",  "GMT+24:13",
70         "GMT+0a:0A",  "GMT +13:42",  "GMT+ 13:42", "GMT+13 :42",
71         "GMT+13: 42", "GMT+421:950", "GMT+-13:42", "GMT+!13:42",
72         "GMT+a",      "GMT+24",      "GMT+060",    "GMT+3003",
73         "GMT+42195",  "GMT+-1",      "GMT+-15",    " GMT",
74 
75         "GMT-5:8",    "GMT-11:1",    "GMT-23:60",  "GMT-24:13",
76         "GMT-0a:0A",  "GMT -13:42",  "GMT- 13:42", "GMT-13 :42",
77         "GMT-13: 42", "GMT-421:950", "GMT-+13:42", "GMT-#13:42",
78         "GMT-a",      "GMT-24",      "GMT-060",    "GMT-2403",
79         "GMT-42195",  "GMT-+1",      "GMT-+15",    "G M T",
80         "GMT+09:00 ",
81     };
82 
Test4322313()83     void Test4322313() {
84         Locale savedLocale = Locale.getDefault();
85         TimeZone savedTimeZone = TimeZone.getDefault();
86         boolean err = false;
87 
88         Locale[] locs = Locale.getAvailableLocales();
89         try {
90             TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
91 
92             for (int i = 0; i < locs.length; i++) {
93                 Locale locale = locs[i];
94                 Locale.setDefault(locale);
95 
96 
97                 /* Okay case */
98                 for (int k = 0; k < VALIDS.length; k++) {
99                     TimeZone tz = TimeZone.getTimeZone((String)VALIDS[k][0]);
100                     int offset;
101 
102                     if (!tz.getID().equals(VALIDS[k][2])) {
103                         err = true;
104                         System.err.println("\tFailed [Locale=" +
105                                            locale + ", \"" + VALIDS[k][0] +
106                                            "\"] Invalid TimeZone ID, expected:" +
107                                            VALIDS[k][2] + ", got:" + tz.getID() + ", " + tz);
108                     } else {
109                         logln("\tPassed [Locale=" +
110                               locale + ", \"" + VALIDS[k][0] +
111                               "\"] Valid TimeZone ID, got:" + VALIDS[k][2]);
112                     }
113 
114                     offset = tz.getRawOffset();
115                     if (offset != (int)VALIDS[k][1]) {
116                         err = true;
117                         System.err.println("\tFailed [Locale=" +
118                                            locale + ", \"" + VALIDS[k][0] +
119                                            "\"] Invalid RawOffset, expected:" + VALIDS[k][1] +
120                                            ", got:" + offset + ", " + tz);
121                     } else {
122                         logln("\tPassed [Locale=" +
123                               locale + ", \"" + VALIDS[k][0] +
124                               "\"] Vaild RawOffset, got:" + offset);
125                     }
126 
127                     offset = tz.getDSTSavings();
128                     if (offset != 0) {
129                         err = true;
130                         System.err.println("\tFailed [Locale=" +
131                                            locale + ", \"" + VALIDS[k][0] +
132                                            "\"] DSTSavings should be zero, got:" + offset +
133                                            ", " + tz);
134                     } else {
135                         logln("\tPassed [Locale=" +
136                               locale + ", \"" + VALIDS[k][0] +
137                               "\"] DSTSavings is zero.");
138                     }
139                 }
140 
141                 /* Error case */
142                 for (int k=0; k < INVALIDS.length; k++) {
143                     TimeZone tz = TimeZone.getTimeZone(INVALIDS[k]);
144                     int offset;
145 
146                     if (!tz.getID().equals("GMT")) {
147                         err = true;
148                         System.err.println("\tFailed [Locale=" +
149                                            locale + ", \"" + INVALIDS[k] +
150                                            "\"] Invalid TimeZone ID, expected:GMT, got:" +
151                                            tz.getID() + ", " + tz);
152                     } else {
153                         logln("\tPassed [Locale=" +
154                               locale + ", \"" + INVALIDS[k] +
155                               "\"] Valid TimeZone ID, got:" + tz.getID());
156                     }
157 
158                     offset = tz.getRawOffset();
159                     if (offset != 0) {
160                         err = true;
161                         System.err.println("\tFailed [Locale=" +
162                                            locale + ", \"" + INVALIDS[k] +
163                                            "\"] RawOffset should be zero, got:" + offset +
164                                            ", " + tz);
165                     } else {
166                         logln("\tPassed [Locale=" +
167                               locale + ", \"" + INVALIDS[k] +
168                               "\"] RawOffset is zero.");
169                     }
170 
171                     offset = tz.getDSTSavings();
172                     if (offset != 0) {
173                         err = true;
174                         System.err.println("\tFailed [Locale=" +
175                                            locale + ", \"" + INVALIDS[k] +
176                                            "\"] DSTSavings should be zero, got:" + offset +
177                                            ", " + tz);
178                     } else {
179                         logln("\tPassed [Locale=" +
180                               locale + ", \"" + INVALIDS[k] +
181                               "\"] DSTSavings is zero.");
182                     }
183                 }
184 
185                 // getDisplayName() tests
186                 {
187                     String normalizedID = "GMT-08:00";
188                     TimeZone tz = TimeZone.getTimeZone("GMT-8");
189                     String s;
190                     s = tz.getDisplayName(true, tz.LONG);
191                     if (!normalizedID.equals(s)) {
192                         err = true;
193                         System.err.println("getDisplayName returned unexpected name: " + s +
194                                            " in " + locale);
195                     }
196                     s = tz.getDisplayName(true, tz.SHORT);
197                     if (!normalizedID.equals(s)) {
198                         err = true;
199                         System.err.println("getDisplayName returned unexpected name: " + s +
200                                            " in " + locale);
201                     }
202                     s = tz.getDisplayName(false, tz.LONG);
203                     if (!normalizedID.equals(s)) {
204                         err = true;
205                         System.err.println("getDisplayName returned unexpected name: " + s +
206                                            " in " + locale);
207                     }
208                     s = tz.getDisplayName(false, tz.SHORT);
209                     if (!normalizedID.equals(s)) {
210                         err = true;
211                         System.err.println("getDisplayName returned unexpected name: " + s +
212                                            " in " + locale);
213                     }
214                 }
215             }
216         } finally {
217             Locale.setDefault(savedLocale);
218             TimeZone.setDefault(savedTimeZone);
219         }
220         if (err) {
221             errln("TimeZone.getTimeZone() test failed");
222         } else {
223             logln("TimeZone.getTimeZone() test passed");
224         }
225     }
226 
main(String[] args)227     public static void main (String[] args) throws Exception {
228         new Bug4322313().run(args);
229     }
230 }
231