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 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.setDefault(locs[i]); 94 95 /* Okay case */ 96 for (int k = 0; k < VALIDS.length; k++) { 97 TimeZone tz = TimeZone.getTimeZone((String)VALIDS[k][0]); 98 int offset; 99 100 if (!tz.getID().equals(VALIDS[k][2])) { 101 err = true; 102 System.err.println("\tFailed [Locale=" + 103 Locale.getDefault() + ", \"" + VALIDS[k][0] + 104 "\"] Invalid TimeZone ID, expected:" + 105 VALIDS[k][2] + ", got:" + tz.getID() + ", " + tz); 106 } else { 107 logln("\tPassed [Locale=" + 108 Locale.getDefault() + ", \"" + VALIDS[k][0] + 109 "\"] Valid TimeZone ID, got:" + VALIDS[k][2]); 110 } 111 112 offset = tz.getRawOffset(); 113 if (offset != (int)VALIDS[k][1]) { 114 err = true; 115 System.err.println("\tFailed [Locale=" + 116 Locale.getDefault() + ", \"" + VALIDS[k][0] + 117 "\"] Invalid RawOffset, expected:" + VALIDS[k][1] + 118 ", got:" + offset + ", " + tz); 119 } else { 120 logln("\tPassed [Locale=" + 121 Locale.getDefault() + ", \"" + VALIDS[k][0] + 122 "\"] Vaild RawOffset, got:" + offset); 123 } 124 125 offset = tz.getDSTSavings(); 126 if (offset != 0) { 127 err = true; 128 System.err.println("\tFailed [Locale=" + 129 Locale.getDefault() + ", \"" + VALIDS[k][0] + 130 "\"] DSTSavings should be zero, got:" + offset + 131 ", " + tz); 132 } else { 133 logln("\tPassed [Locale=" + 134 Locale.getDefault() + ", \"" + VALIDS[k][0] + 135 "\"] DSTSavings is zero."); 136 } 137 } 138 139 /* Error case */ 140 for (int k=0; k < INVALIDS.length; k++) { 141 TimeZone tz = TimeZone.getTimeZone(INVALIDS[k]); 142 int offset; 143 144 if (!tz.getID().equals("GMT")) { 145 err = true; 146 System.err.println("\tFailed [Locale=" + 147 Locale.getDefault() + ", \"" + INVALIDS[k] + 148 "\"] Invalid TimeZone ID, expected:GMT, got:" + 149 tz.getID() + ", " + tz); 150 } else { 151 logln("\tPassed [Locale=" + 152 Locale.getDefault() + ", \"" + INVALIDS[k] + 153 "\"] Valid TimeZone ID, got:" + tz.getID()); 154 } 155 156 offset = tz.getRawOffset(); 157 if (offset != 0) { 158 err = true; 159 System.err.println("\tFailed [Locale=" + 160 Locale.getDefault() + ", \"" + INVALIDS[k] + 161 "\"] RawOffset should be zero, got:" + offset + 162 ", " + tz); 163 } else { 164 logln("\tPassed [Locale=" + 165 Locale.getDefault() + ", \"" + INVALIDS[k] + 166 "\"] RawOffset is zero."); 167 } 168 169 offset = tz.getDSTSavings(); 170 if (offset != 0) { 171 err = true; 172 System.err.println("\tFailed [Locale=" + 173 Locale.getDefault() + ", \"" + INVALIDS[k] + 174 "\"] DSTSavings should be zero, got:" + offset + 175 ", " + tz); 176 } else { 177 logln("\tPassed [Locale=" + 178 Locale.getDefault() + ", \"" + INVALIDS[k] + 179 "\"] DSTSavings is zero."); 180 } 181 } 182 183 // getDisplayName() tests 184 { 185 String normalizedID = "GMT-08:00"; 186 TimeZone tz = TimeZone.getTimeZone("GMT-8"); 187 String s; 188 s = tz.getDisplayName(true, tz.LONG); 189 if (!normalizedID.equals(s)) { 190 err = true; 191 System.err.println("getDisplayName returned unexpected name: " + s + 192 " in " + Locale.getDefault()); 193 } 194 s = tz.getDisplayName(true, tz.SHORT); 195 if (!normalizedID.equals(s)) { 196 err = true; 197 System.err.println("getDisplayName returned unexpected name: " + s + 198 " in " + Locale.getDefault()); 199 } 200 s = tz.getDisplayName(false, tz.LONG); 201 if (!normalizedID.equals(s)) { 202 err = true; 203 System.err.println("getDisplayName returned unexpected name: " + s + 204 " in " + Locale.getDefault()); 205 } 206 s = tz.getDisplayName(false, tz.SHORT); 207 if (!normalizedID.equals(s)) { 208 err = true; 209 System.err.println("getDisplayName returned unexpected name: " + s + 210 " in " + Locale.getDefault()); 211 } 212 } 213 } 214 } finally { 215 Locale.setDefault(savedLocale); 216 TimeZone.setDefault(savedTimeZone); 217 } 218 if (err) { 219 errln("TimeZone.getTimeZone() test failed"); 220 } else { 221 logln("TimeZone.getTimeZone() test passed"); 222 } 223 } 224 225 public static void main (String[] args) throws Exception { 226 new Bug4322313().run(args); 227 } 228 }