1 /* 2 * Copyright (c) 2017, 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 8176841 8202537 8244245 27 * @summary Tests java.time classes deals with Unicode extensions 28 * correctly. 29 * @modules jdk.localedata 30 */ 31 package test.java.time.format; 32 33 import static org.testng.Assert.assertEquals; 34 35 import android.icu.util.VersionInfo; 36 37 import java.time.DayOfWeek; 38 import java.time.ZonedDateTime; 39 import java.time.ZoneId; 40 import java.time.chrono.Chronology; 41 import java.time.chrono.HijrahChronology; 42 import java.time.chrono.IsoChronology; 43 import java.time.chrono.JapaneseChronology; 44 import java.time.format.DateTimeFormatter; 45 import java.time.format.DateTimeFormatterBuilder; 46 import java.time.format.FormatStyle; 47 import java.time.temporal.ChronoField; 48 import java.time.temporal.TemporalField; 49 import java.time.temporal.WeekFields; 50 import java.util.Locale; 51 import java.util.TimeZone; 52 import java.util.stream.Stream; 53 54 import org.testng.annotations.AfterTest; 55 import org.testng.annotations.BeforeTest; 56 import org.testng.annotations.DataProvider; 57 import org.testng.annotations.Test; 58 59 /** 60 * Test JavaTime with BCP47 U extensions 61 */ 62 @Test 63 public class TestUnicodeExtension { 64 private static TimeZone defaultTZ; 65 66 private static final Chronology JAPANESE = JapaneseChronology.INSTANCE; 67 private static final Chronology HIJRAH = HijrahChronology.INSTANCE; 68 private static final Chronology ISO = IsoChronology.INSTANCE; 69 70 private static final ZoneId ASIATOKYO = ZoneId.of("Asia/Tokyo"); 71 private static final ZoneId AMLA = ZoneId.of("America/Los_Angeles"); 72 73 private static final Locale JPTYO = Locale.forLanguageTag("en-u-tz-jptyo"); 74 private static final Locale JCAL = Locale.forLanguageTag("en-u-ca-japanese"); 75 private static final Locale HCAL = Locale.forLanguageTag("en-u-ca-islamic-umalqura"); 76 77 private static final Locale FW_SUN = Locale.forLanguageTag("en-US-u-fw-sun"); 78 private static final Locale FW_MON = Locale.forLanguageTag("en-US-u-fw-mon"); 79 private static final Locale FW_TUE = Locale.forLanguageTag("en-US-u-fw-tue"); 80 private static final Locale FW_WED = Locale.forLanguageTag("en-US-u-fw-wed"); 81 private static final Locale FW_THU = Locale.forLanguageTag("en-US-u-fw-thu"); 82 private static final Locale FW_FRI = Locale.forLanguageTag("en-US-u-fw-fri"); 83 private static final Locale FW_SAT = Locale.forLanguageTag("en-US-u-fw-sat"); 84 85 private static final Locale RG_GB = Locale.forLanguageTag("en-US-u-rg-gbzzzz"); 86 87 private static final ZonedDateTime ZDT = ZonedDateTime.of(2017, 8, 10, 15, 15, 0, 0, AMLA); 88 89 private static final String PATTERN = "GGGG MMMM-dd-uu HH:mm:ss zzzz"; 90 91 // Android-changed: ICU 72 started to use '\u202f' instead of ' ' before AM/PM. 92 public static final char AM_PM_SPACE_CHAR = VersionInfo.ICU_VERSION.getMajor() >= 72 93 ? '\u202f' : ' '; 94 95 // Android-changed: ICU 72 has stopped inserting '\u060a' after date. 96 public static final String DATE_TIME_SEP_CHAR_FOR_LOCALE_FA = 97 VersionInfo.ICU_VERSION.getMajor() >= 72 ? "" : "\u060a"; 98 99 100 @BeforeTest beforeTest()101 public void beforeTest() { 102 defaultTZ = TimeZone.getDefault(); 103 TimeZone.setDefault(TimeZone.getTimeZone(AMLA)); 104 } 105 106 @AfterTest afterTest()107 public void afterTest() { 108 TimeZone.setDefault(defaultTZ); 109 } 110 111 @DataProvider(name="localizedBy") localizedBy()112 Object[][] localizedBy() { 113 return new Object[][] { 114 // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, 115 // Expected formatted string 116 {Locale.JAPAN, null, null, ISO, null, 117 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + 118 "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" 119 }, 120 {Locale.JAPAN, JAPANESE, null, ISO, null, 121 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + 122 "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" 123 }, 124 {Locale.JAPAN, JAPANESE, ASIATOKYO, ISO, ASIATOKYO, 125 "2017\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 " + 126 "\u65e5\u672c\u6a19\u6e96\u6642" 127 }, 128 129 {JCAL, null, null, JAPANESE, null, 130 "Thursday, August 10, 29 Heisei at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 131 }, 132 {JCAL, HIJRAH, null, JAPANESE, null, 133 "Thursday, August 10, 29 Heisei at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 134 }, 135 {HCAL, JAPANESE, null, HIJRAH, null, 136 "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 137 }, 138 139 140 {JPTYO, null, null, ISO, ASIATOKYO, 141 "Friday, August 11, 2017 at 7:15:00" + AM_PM_SPACE_CHAR + "AM Japan Standard Time" 142 }, 143 {JPTYO, null, AMLA, ISO, ASIATOKYO, 144 "Friday, August 11, 2017 at 7:15:00" + AM_PM_SPACE_CHAR + "AM Japan Standard Time" 145 }, 146 // invalid tz 147 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, ISO, null, 148 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 149 }, 150 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, AMLA, ISO, AMLA, 151 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 152 }, 153 154 {RG_GB, null, null, ISO, null, 155 // Android-changed: Android doesn't support "rg" extension yet. 156 // "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time" 157 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 158 }, 159 160 // DecimalStyle 161 {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, ISO, null, 162 "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 163 }, 164 // DecimalStyle, "nu" vs "rg" 165 {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, ISO, null, 166 "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 167 }, 168 // DecimalStyle, invalid 169 {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, ISO, null, 170 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 171 }, 172 // DecimalStyle, locale default 173 // Farsi uses Extended Arabic-Indic numbering system 174 {Locale.forLanguageTag("fa"), null, null, ISO, null, 175 "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 \u06f1\u06f0 \u0627\u0648\u062a " + 176 // Android-changed: CLDR 42 doesn't provide 'ARABIC COMMA' \u060c after year. 177 // "\u06f2\u06f0\u06f1\u06f7\u060c \u0633\u0627\u0639\u062a \u06f1\u06f5:\u06f1\u06f5:" + 178 "\u06f2\u06f0\u06f1\u06f7" + DATE_TIME_SEP_CHAR_FOR_LOCALE_FA + " \u0633\u0627\u0639\u062a \u06f1\u06f5:\u06f1\u06f5:" + 179 "\u06f0\u06f0 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633\u062a\u0627\u0646\u06cc " + 180 "\u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" 181 }, 182 // Farsi uses Extended Arabic-Indic numbering system 183 // (should not be overridden with it, as "latn" is explicitly specified) 184 {Locale.forLanguageTag("fa-u-nu-latn"), null, null, ISO, null, 185 // Android-changed: CLDR 42 doesn't provide 'ARABIC COMMA' \u060c after year. 186 // "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + 187 "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017" + DATE_TIME_SEP_CHAR_FOR_LOCALE_FA + " " + 188 "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + 189 "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" 190 }, 191 // Dzongkha uses Tibetan numbering system 192 {Locale.forLanguageTag("dz"), null, null, ISO, null, 193 "\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b, \u0f66\u0fa4\u0fb1" + 194 "\u0f72\u0f0b\u0f63\u0f7c\u0f0b\u0f22\u0f20\u0f21\u0f27 \u0f5f\u0fb3\u0f0b\u0f56" + 195 "\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54\u0f0b \u0f5a\u0f7a\u0f66\u0f0b\u0f21\u0f20 " + 196 "\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b \u0f23 \u0f66\u0f90\u0f62\u0f0b\u0f58" + 197 "\u0f0b \u0f21\u0f25:\u0f20\u0f20 \u0f55\u0fb1\u0f72\u0f0b\u0f46\u0f0b \u0f56\u0fb1" + 198 "\u0f44\u0f0b\u0f68\u0f0b\u0f58\u0f72\u0f0b\u0f62\u0f72\u0f0b\u0f40\u0f0b\u0f54\u0f7a" + 199 "\u0f0b\u0f66\u0f72\u0f0b\u0f55\u0f72\u0f42\u0f0b\u0f49\u0f72\u0f53\u0f0b\u0f66\u0fb2" + 200 "\u0f74\u0f44\u0f0b\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51" 201 }, 202 }; 203 } 204 205 @DataProvider(name="withLocale") withLocale()206 Object[][] withLocale() { 207 return new Object[][] { 208 // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, 209 // Expected formatted string 210 {Locale.JAPAN, null, null, null, null, 211 "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + 212 "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" 213 }, 214 {Locale.JAPAN, JAPANESE, null, JAPANESE, null, 215 "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + 216 "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" 217 }, 218 {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO, 219 "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 " + 220 "\u65e5\u672c\u6a19\u6e96\u6642" 221 }, 222 223 {JCAL, null, null, null, null, 224 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 225 }, 226 {JCAL, HIJRAH, null, HIJRAH, null, 227 "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 228 }, 229 {HCAL, JAPANESE, null, JAPANESE, null, 230 "Thursday, August 10, 29 Heisei at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 231 }, 232 233 234 {JPTYO, null, null, null, null, 235 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 236 }, 237 {JPTYO, null, AMLA, null, AMLA, 238 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 239 }, 240 // invalid tz 241 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, 242 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 243 }, 244 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, 245 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 246 }, 247 248 {RG_GB, null, null, null, null, 249 // Android-changed: Android doesn't support "rg" extension yet. 250 // "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time" 251 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 252 }, 253 254 // DecimalStyle 255 {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null, 256 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 257 }, 258 // DecimalStyle, "nu" vs "rg" 259 {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null, 260 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 261 }, 262 // DecimalStyle, invalid 263 {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null, 264 "Thursday, August 10, 2017 at 3:15:00" + AM_PM_SPACE_CHAR + "PM Pacific Daylight Time" 265 }, 266 // DecimalStyle, locale default 267 // Farsi uses Extended Arabic-Indic numbering system 268 // (should not be overridden with it) 269 {Locale.forLanguageTag("fa"), null, null, null, null, 270 // Android-changed: CLDR 42 doesn't provide 'ARABIC COMMA' \u060c after year. 271 // "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + 272 "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017" + DATE_TIME_SEP_CHAR_FOR_LOCALE_FA + " " + 273 "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + 274 "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" 275 }, 276 // Farsi uses Extended Arabic-Indic numbering system 277 // (should not be overridden with it) 278 {Locale.forLanguageTag("fa-u-nu-latn"), null, null, null, null, 279 // Android-changed: CLDR 42 doesn't provide 'ARABIC COMMA' \u060c after year. 280 // "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + 281 "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017" + DATE_TIME_SEP_CHAR_FOR_LOCALE_FA + " " + 282 "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + 283 "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" 284 }, 285 // Dzongkha uses Tibetan numbering system 286 // (should not be overridden with it) 287 {Locale.forLanguageTag("dz"), null, null, null, null, 288 "\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b, \u0f66\u0fa4\u0fb1" + 289 "\u0f72\u0f0b\u0f63\u0f7c\u0f0b2017 \u0f5f\u0fb3\u0f0b\u0f56\u0f62\u0f92\u0fb1" + 290 "\u0f51\u0f0b\u0f54\u0f0b \u0f5a\u0f7a\u0f66\u0f0b10 \u0f46\u0f74\u0f0b\u0f5a" + 291 "\u0f7c\u0f51\u0f0b 3 \u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b 15:00 \u0f55\u0fb1" + 292 "\u0f72\u0f0b\u0f46\u0f0b \u0f56\u0fb1\u0f44\u0f0b\u0f68\u0f0b\u0f58\u0f72\u0f0b" + 293 "\u0f62\u0f72\u0f0b\u0f40\u0f0b\u0f54\u0f7a\u0f0b\u0f66\u0f72\u0f0b\u0f55\u0f72" + 294 "\u0f42\u0f0b\u0f49\u0f72\u0f53\u0f0b\u0f66\u0fb2\u0f74\u0f44\u0f0b\u0f46\u0f74" + 295 "\u0f0b\u0f5a\u0f7c\u0f51" 296 }, 297 }; 298 } 299 300 @DataProvider(name="firstDayOfWeek") firstDayOfWeek()301 Object[][] firstDayOfWeek () { 302 return new Object[][] { 303 // Locale, Expected DayOfWeek, 304 {Locale.US, DayOfWeek.SUNDAY}, 305 {FW_SUN, DayOfWeek.SUNDAY}, 306 {FW_MON, DayOfWeek.MONDAY}, 307 {FW_TUE, DayOfWeek.TUESDAY}, 308 {FW_WED, DayOfWeek.WEDNESDAY}, 309 {FW_THU, DayOfWeek.THURSDAY}, 310 {FW_FRI, DayOfWeek.FRIDAY}, 311 {FW_SAT, DayOfWeek.SATURDAY}, 312 313 // invalid case 314 {Locale.forLanguageTag("en-US-u-fw-xxx"), DayOfWeek.SUNDAY}, 315 316 // region override 317 {RG_GB, DayOfWeek.MONDAY}, 318 {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), DayOfWeek.MONDAY}, 319 320 // "fw" and "rg". 321 {Locale.forLanguageTag("en-US-u-fw-wed-rg-gbzzzz"), DayOfWeek.WEDNESDAY}, 322 {Locale.forLanguageTag("en-US-u-fw-xxx-rg-gbzzzz"), DayOfWeek.MONDAY}, 323 {Locale.forLanguageTag("en-US-u-fw-xxx-rg-zzzz"), DayOfWeek.SUNDAY}, 324 }; 325 } 326 327 @DataProvider(name="minDaysInFirstWeek") minDaysInFrstWeek()328 Object[][] minDaysInFrstWeek () { 329 return new Object[][] { 330 // Locale, Expected minDay, 331 {Locale.US, 1}, 332 333 // region override 334 {RG_GB, 4}, 335 {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), 4}, 336 }; 337 } 338 339 @DataProvider(name="ofPattern") ofPattern()340 Object[][] ofPattern() { 341 return new Object[][] { 342 // Locale, Expected Chrono, Expected Zone, 343 // Expected formatted string 344 {JCAL, null, null, 345 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" 346 }, 347 {HCAL, null, null, 348 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" 349 }, 350 351 {JPTYO, null, null, 352 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" 353 }, 354 {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, 355 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" 356 }, 357 358 {RG_GB, null, null, 359 "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" 360 }, 361 362 }; 363 } 364 365 @DataProvider(name="shortTZID") shortTZID()366 Object[][] shortTZID() { 367 return new Object[][] { 368 // LDML's short ID, Expected Zone, 369 {"adalv", "Europe/Andorra"}, 370 {"aedxb", "Asia/Dubai"}, 371 {"afkbl", "Asia/Kabul"}, 372 {"aganu", "America/Antigua"}, 373 {"aiaxa", "America/Anguilla"}, 374 {"altia", "Europe/Tirane"}, 375 {"amevn", "Asia/Yerevan"}, 376 {"ancur", "America/Curacao"}, 377 {"aolad", "Africa/Luanda"}, 378 {"aqcas", "Antarctica/Casey"}, 379 {"aqdav", "Antarctica/Davis"}, 380 {"aqddu", "Antarctica/DumontDUrville"}, 381 {"aqmaw", "Antarctica/Mawson"}, 382 {"aqmcm", "Antarctica/McMurdo"}, 383 {"aqplm", "Antarctica/Palmer"}, 384 {"aqrot", "Antarctica/Rothera"}, 385 {"aqsyw", "Antarctica/Syowa"}, 386 {"aqtrl", "Antarctica/Troll"}, 387 {"aqvos", "Antarctica/Vostok"}, 388 {"arbue", "America/Buenos_Aires"}, 389 {"arcor", "America/Cordoba"}, 390 {"arctc", "America/Catamarca"}, 391 {"arirj", "America/Argentina/La_Rioja"}, 392 {"arjuj", "America/Jujuy"}, 393 {"arluq", "America/Argentina/San_Luis"}, 394 {"armdz", "America/Mendoza"}, 395 {"arrgl", "America/Argentina/Rio_Gallegos"}, 396 {"arsla", "America/Argentina/Salta"}, 397 {"artuc", "America/Argentina/Tucuman"}, 398 {"aruaq", "America/Argentina/San_Juan"}, 399 {"arush", "America/Argentina/Ushuaia"}, 400 {"asppg", "Pacific/Pago_Pago"}, 401 {"atvie", "Europe/Vienna"}, 402 {"auadl", "Australia/Adelaide"}, 403 {"aubhq", "Australia/Broken_Hill"}, 404 {"aubne", "Australia/Brisbane"}, 405 {"audrw", "Australia/Darwin"}, 406 {"aueuc", "Australia/Eucla"}, 407 {"auhba", "Australia/Hobart"}, 408 {"aukns", "Australia/Currie"}, 409 {"auldc", "Australia/Lindeman"}, 410 {"auldh", "Australia/Lord_Howe"}, 411 {"aumel", "Australia/Melbourne"}, 412 {"aumqi", "Antarctica/Macquarie"}, 413 {"auper", "Australia/Perth"}, 414 {"ausyd", "Australia/Sydney"}, 415 {"awaua", "America/Aruba"}, 416 {"azbak", "Asia/Baku"}, 417 {"basjj", "Europe/Sarajevo"}, 418 {"bbbgi", "America/Barbados"}, 419 {"bddac", "Asia/Dhaka"}, 420 {"bebru", "Europe/Brussels"}, 421 {"bfoua", "Africa/Ouagadougou"}, 422 {"bgsof", "Europe/Sofia"}, 423 {"bhbah", "Asia/Bahrain"}, 424 {"bibjm", "Africa/Bujumbura"}, 425 {"bjptn", "Africa/Porto-Novo"}, 426 {"bmbda", "Atlantic/Bermuda"}, 427 {"bnbwn", "Asia/Brunei"}, 428 {"bolpb", "America/La_Paz"}, 429 {"bqkra", "America/Kralendijk"}, 430 {"braux", "America/Araguaina"}, 431 {"brbel", "America/Belem"}, 432 {"brbvb", "America/Boa_Vista"}, 433 {"brcgb", "America/Cuiaba"}, 434 {"brcgr", "America/Campo_Grande"}, 435 {"brern", "America/Eirunepe"}, 436 {"brfen", "America/Noronha"}, 437 {"brfor", "America/Fortaleza"}, 438 {"brmao", "America/Manaus"}, 439 {"brmcz", "America/Maceio"}, 440 {"brpvh", "America/Porto_Velho"}, 441 {"brrbr", "America/Rio_Branco"}, 442 {"brrec", "America/Recife"}, 443 {"brsao", "America/Sao_Paulo"}, 444 {"brssa", "America/Bahia"}, 445 {"brstm", "America/Santarem"}, 446 {"bsnas", "America/Nassau"}, 447 {"btthi", "Asia/Thimphu"}, 448 {"bwgbe", "Africa/Gaborone"}, 449 {"bymsq", "Europe/Minsk"}, 450 {"bzbze", "America/Belize"}, 451 {"cacfq", "America/Creston"}, 452 {"caedm", "America/Edmonton"}, 453 {"caffs", "America/Rainy_River"}, 454 {"cafne", "America/Fort_Nelson"}, 455 {"caglb", "America/Glace_Bay"}, 456 {"cagoo", "America/Goose_Bay"}, 457 {"cahal", "America/Halifax"}, 458 {"caiql", "America/Iqaluit"}, 459 {"camon", "America/Moncton"}, 460 {"capnt", "America/Pangnirtung"}, 461 {"careb", "America/Resolute"}, 462 {"careg", "America/Regina"}, 463 {"casjf", "America/St_Johns"}, 464 {"canpg", "America/Nipigon"}, 465 {"cathu", "America/Thunder_Bay"}, 466 {"cator", "America/Toronto"}, 467 {"cavan", "America/Vancouver"}, 468 {"cawnp", "America/Winnipeg"}, 469 {"caybx", "America/Blanc-Sablon"}, 470 {"caycb", "America/Cambridge_Bay"}, 471 {"cayda", "America/Dawson"}, 472 {"caydq", "America/Dawson_Creek"}, 473 {"cayek", "America/Rankin_Inlet"}, 474 {"cayev", "America/Inuvik"}, 475 {"cayxy", "America/Whitehorse"}, 476 {"cayyn", "America/Swift_Current"}, 477 {"cayzf", "America/Yellowknife"}, 478 {"cayzs", "America/Coral_Harbour"}, 479 {"cccck", "Indian/Cocos"}, 480 {"cdfbm", "Africa/Lubumbashi"}, 481 {"cdfih", "Africa/Kinshasa"}, 482 {"cfbgf", "Africa/Bangui"}, 483 {"cgbzv", "Africa/Brazzaville"}, 484 {"chzrh", "Europe/Zurich"}, 485 {"ciabj", "Africa/Abidjan"}, 486 {"ckrar", "Pacific/Rarotonga"}, 487 {"clipc", "Pacific/Easter"}, 488 {"clscl", "America/Santiago"}, 489 {"cmdla", "Africa/Douala"}, 490 {"cnsha", "Asia/Shanghai"}, 491 {"cnurc", "Asia/Urumqi"}, 492 {"cobog", "America/Bogota"}, 493 {"crsjo", "America/Costa_Rica"}, 494 {"cst6cdt", "CST6CDT"}, 495 {"cuhav", "America/Havana"}, 496 {"cvrai", "Atlantic/Cape_Verde"}, 497 {"cxxch", "Indian/Christmas"}, 498 {"cynic", "Asia/Nicosia"}, 499 {"czprg", "Europe/Prague"}, 500 {"deber", "Europe/Berlin"}, 501 {"debsngn", "Europe/Busingen"}, 502 {"djjib", "Africa/Djibouti"}, 503 {"dkcph", "Europe/Copenhagen"}, 504 {"dmdom", "America/Dominica"}, 505 {"dosdq", "America/Santo_Domingo"}, 506 {"dzalg", "Africa/Algiers"}, 507 {"ecgps", "Pacific/Galapagos"}, 508 {"ecgye", "America/Guayaquil"}, 509 {"eetll", "Europe/Tallinn"}, 510 {"egcai", "Africa/Cairo"}, 511 {"eheai", "Africa/El_Aaiun"}, 512 {"erasm", "Africa/Asmera"}, 513 {"esceu", "Africa/Ceuta"}, 514 {"eslpa", "Atlantic/Canary"}, 515 {"esmad", "Europe/Madrid"}, 516 {"est5edt", "EST5EDT"}, 517 {"etadd", "Africa/Addis_Ababa"}, 518 {"fihel", "Europe/Helsinki"}, 519 {"fimhq", "Europe/Mariehamn"}, 520 {"fjsuv", "Pacific/Fiji"}, 521 {"fkpsy", "Atlantic/Stanley"}, 522 {"fmksa", "Pacific/Kosrae"}, 523 {"fmpni", "Pacific/Ponape"}, 524 {"fmtkk", "Pacific/Truk"}, 525 {"fotho", "Atlantic/Faeroe"}, 526 {"frpar", "Europe/Paris"}, 527 {"galbv", "Africa/Libreville"}, 528 {"gaza", "Asia/Gaza"}, 529 {"gblon", "Europe/London"}, 530 {"gdgnd", "America/Grenada"}, 531 {"getbs", "Asia/Tbilisi"}, 532 {"gfcay", "America/Cayenne"}, 533 {"gggci", "Europe/Guernsey"}, 534 {"ghacc", "Africa/Accra"}, 535 {"gigib", "Europe/Gibraltar"}, 536 {"gldkshvn", "America/Danmarkshavn"}, 537 {"glgoh", "America/Godthab"}, 538 {"globy", "America/Scoresbysund"}, 539 {"glthu", "America/Thule"}, 540 {"gmbjl", "Africa/Banjul"}, 541 {"gncky", "Africa/Conakry"}, 542 {"gpbbr", "America/Guadeloupe"}, 543 {"gpmsb", "America/Marigot"}, 544 {"gpsbh", "America/St_Barthelemy"}, 545 {"gqssg", "Africa/Malabo"}, 546 {"grath", "Europe/Athens"}, 547 {"gsgrv", "Atlantic/South_Georgia"}, 548 {"gtgua", "America/Guatemala"}, 549 {"gugum", "Pacific/Guam"}, 550 {"gwoxb", "Africa/Bissau"}, 551 {"gygeo", "America/Guyana"}, 552 {"hebron", "Asia/Hebron"}, 553 {"hkhkg", "Asia/Hong_Kong"}, 554 {"hntgu", "America/Tegucigalpa"}, 555 {"hrzag", "Europe/Zagreb"}, 556 {"htpap", "America/Port-au-Prince"}, 557 {"hubud", "Europe/Budapest"}, 558 {"iddjj", "Asia/Jayapura"}, 559 {"idjkt", "Asia/Jakarta"}, 560 {"idmak", "Asia/Makassar"}, 561 {"idpnk", "Asia/Pontianak"}, 562 {"iedub", "Europe/Dublin"}, 563 {"imdgs", "Europe/Isle_of_Man"}, 564 {"inccu", "Asia/Calcutta"}, 565 {"iodga", "Indian/Chagos"}, 566 {"iqbgw", "Asia/Baghdad"}, 567 {"irthr", "Asia/Tehran"}, 568 {"isrey", "Atlantic/Reykjavik"}, 569 {"itrom", "Europe/Rome"}, 570 {"jeruslm", "Asia/Jerusalem"}, 571 {"jesth", "Europe/Jersey"}, 572 {"jmkin", "America/Jamaica"}, 573 {"joamm", "Asia/Amman"}, 574 {"jptyo", "Asia/Tokyo"}, 575 {"kenbo", "Africa/Nairobi"}, 576 {"kgfru", "Asia/Bishkek"}, 577 {"khpnh", "Asia/Phnom_Penh"}, 578 {"kicxi", "Pacific/Kiritimati"}, 579 {"kipho", "Pacific/Enderbury"}, 580 {"kitrw", "Pacific/Tarawa"}, 581 {"kmyva", "Indian/Comoro"}, 582 {"knbas", "America/St_Kitts"}, 583 {"kpfnj", "Asia/Pyongyang"}, 584 {"krsel", "Asia/Seoul"}, 585 {"kwkwi", "Asia/Kuwait"}, 586 {"kygec", "America/Cayman"}, 587 {"kzaau", "Asia/Aqtau"}, 588 {"kzakx", "Asia/Aqtobe"}, 589 {"kzala", "Asia/Almaty"}, 590 {"kzkzo", "Asia/Qyzylorda"}, 591 {"kzura", "Asia/Oral"}, 592 {"lavte", "Asia/Vientiane"}, 593 {"lbbey", "Asia/Beirut"}, 594 {"lccas", "America/St_Lucia"}, 595 {"livdz", "Europe/Vaduz"}, 596 {"lkcmb", "Asia/Colombo"}, 597 {"lrmlw", "Africa/Monrovia"}, 598 {"lsmsu", "Africa/Maseru"}, 599 {"ltvno", "Europe/Vilnius"}, 600 {"lulux", "Europe/Luxembourg"}, 601 {"lvrix", "Europe/Riga"}, 602 {"lytip", "Africa/Tripoli"}, 603 {"macas", "Africa/Casablanca"}, 604 {"mcmon", "Europe/Monaco"}, 605 {"mdkiv", "Europe/Chisinau"}, 606 {"metgd", "Europe/Podgorica"}, 607 {"mgtnr", "Indian/Antananarivo"}, 608 {"mhkwa", "Pacific/Kwajalein"}, 609 {"mhmaj", "Pacific/Majuro"}, 610 {"mkskp", "Europe/Skopje"}, 611 {"mlbko", "Africa/Bamako"}, 612 {"mmrgn", "Asia/Rangoon"}, 613 {"mncoq", "Asia/Choibalsan"}, 614 {"mnhvd", "Asia/Hovd"}, 615 {"mnuln", "Asia/Ulaanbaatar"}, 616 {"momfm", "Asia/Macau"}, 617 {"mpspn", "Pacific/Saipan"}, 618 {"mqfdf", "America/Martinique"}, 619 {"mrnkc", "Africa/Nouakchott"}, 620 {"msmni", "America/Montserrat"}, 621 {"mst7mdt", "MST7MDT"}, 622 {"mtmla", "Europe/Malta"}, 623 {"muplu", "Indian/Mauritius"}, 624 {"mvmle", "Indian/Maldives"}, 625 {"mwblz", "Africa/Blantyre"}, 626 {"mxchi", "America/Chihuahua"}, 627 {"mxcun", "America/Cancun"}, 628 {"mxhmo", "America/Hermosillo"}, 629 {"mxmam", "America/Matamoros"}, 630 {"mxmex", "America/Mexico_City"}, 631 {"mxmid", "America/Merida"}, 632 {"mxmty", "America/Monterrey"}, 633 {"mxmzt", "America/Mazatlan"}, 634 {"mxoji", "America/Ojinaga"}, 635 {"mxpvr", "America/Bahia_Banderas"}, 636 {"mxstis", "America/Santa_Isabel"}, 637 {"mxtij", "America/Tijuana"}, 638 {"mykch", "Asia/Kuching"}, 639 {"mykul", "Asia/Kuala_Lumpur"}, 640 {"mzmpm", "Africa/Maputo"}, 641 {"nawdh", "Africa/Windhoek"}, 642 {"ncnou", "Pacific/Noumea"}, 643 {"nenim", "Africa/Niamey"}, 644 {"nfnlk", "Pacific/Norfolk"}, 645 {"nglos", "Africa/Lagos"}, 646 {"nimga", "America/Managua"}, 647 {"nlams", "Europe/Amsterdam"}, 648 {"noosl", "Europe/Oslo"}, 649 {"npktm", "Asia/Katmandu"}, 650 {"nrinu", "Pacific/Nauru"}, 651 {"nuiue", "Pacific/Niue"}, 652 {"nzakl", "Pacific/Auckland"}, 653 {"nzcht", "Pacific/Chatham"}, 654 {"ommct", "Asia/Muscat"}, 655 {"papty", "America/Panama"}, 656 {"pelim", "America/Lima"}, 657 {"pfgmr", "Pacific/Gambier"}, 658 {"pfnhv", "Pacific/Marquesas"}, 659 {"pfppt", "Pacific/Tahiti"}, 660 {"pgpom", "Pacific/Port_Moresby"}, 661 {"pgraw", "Pacific/Bougainville"}, 662 {"phmnl", "Asia/Manila"}, 663 {"pkkhi", "Asia/Karachi"}, 664 {"plwaw", "Europe/Warsaw"}, 665 {"pmmqc", "America/Miquelon"}, 666 {"pnpcn", "Pacific/Pitcairn"}, 667 {"prsju", "America/Puerto_Rico"}, 668 {"pst8pdt", "PST8PDT"}, 669 {"ptfnc", "Atlantic/Madeira"}, 670 {"ptlis", "Europe/Lisbon"}, 671 {"ptpdl", "Atlantic/Azores"}, 672 {"pwror", "Pacific/Palau"}, 673 {"pyasu", "America/Asuncion"}, 674 {"qadoh", "Asia/Qatar"}, 675 {"rereu", "Indian/Reunion"}, 676 {"robuh", "Europe/Bucharest"}, 677 {"rsbeg", "Europe/Belgrade"}, 678 {"ruchita", "Asia/Chita"}, 679 {"rudyr", "Asia/Anadyr"}, 680 {"rugdx", "Asia/Magadan"}, 681 {"ruikt", "Asia/Irkutsk"}, 682 {"rukgd", "Europe/Kaliningrad"}, 683 {"rukhndg", "Asia/Khandyga"}, 684 {"rukra", "Asia/Krasnoyarsk"}, 685 {"rukuf", "Europe/Samara"}, 686 {"rumow", "Europe/Moscow"}, 687 {"runoz", "Asia/Novokuznetsk"}, 688 {"ruoms", "Asia/Omsk"}, 689 {"ruovb", "Asia/Novosibirsk"}, 690 {"rupkc", "Asia/Kamchatka"}, 691 {"rusred", "Asia/Srednekolymsk"}, 692 {"ruunera", "Asia/Ust-Nera"}, 693 {"ruuus", "Asia/Sakhalin"}, 694 {"ruvog", "Europe/Volgograd"}, 695 {"ruvvo", "Asia/Vladivostok"}, 696 {"ruyek", "Asia/Yekaterinburg"}, 697 {"ruyks", "Asia/Yakutsk"}, 698 {"rwkgl", "Africa/Kigali"}, 699 {"saruh", "Asia/Riyadh"}, 700 {"sbhir", "Pacific/Guadalcanal"}, 701 {"scmaw", "Indian/Mahe"}, 702 {"sdkrt", "Africa/Khartoum"}, 703 {"sesto", "Europe/Stockholm"}, 704 {"sgsin", "Asia/Singapore"}, 705 {"shshn", "Atlantic/St_Helena"}, 706 {"silju", "Europe/Ljubljana"}, 707 {"sjlyr", "Arctic/Longyearbyen"}, 708 {"skbts", "Europe/Bratislava"}, 709 {"slfna", "Africa/Freetown"}, 710 {"smsai", "Europe/San_Marino"}, 711 {"sndkr", "Africa/Dakar"}, 712 {"somgq", "Africa/Mogadishu"}, 713 {"srpbm", "America/Paramaribo"}, 714 {"ssjub", "Africa/Juba"}, 715 {"sttms", "Africa/Sao_Tome"}, 716 {"svsal", "America/El_Salvador"}, 717 {"sxphi", "America/Lower_Princes"}, 718 {"sydam", "Asia/Damascus"}, 719 {"szqmn", "Africa/Mbabane"}, 720 {"tcgdt", "America/Grand_Turk"}, 721 {"tdndj", "Africa/Ndjamena"}, 722 {"tfpfr", "Indian/Kerguelen"}, 723 {"tglfw", "Africa/Lome"}, 724 {"thbkk", "Asia/Bangkok"}, 725 {"tjdyu", "Asia/Dushanbe"}, 726 {"tkfko", "Pacific/Fakaofo"}, 727 {"tldil", "Asia/Dili"}, 728 {"tmasb", "Asia/Ashgabat"}, 729 {"tntun", "Africa/Tunis"}, 730 {"totbu", "Pacific/Tongatapu"}, 731 {"trist", "Europe/Istanbul"}, 732 {"ttpos", "America/Port_of_Spain"}, 733 {"tvfun", "Pacific/Funafuti"}, 734 {"twtpe", "Asia/Taipei"}, 735 {"tzdar", "Africa/Dar_es_Salaam"}, 736 {"uaiev", "Europe/Kiev"}, 737 {"uaozh", "Europe/Zaporozhye"}, 738 {"uasip", "Europe/Simferopol"}, 739 {"uauzh", "Europe/Uzhgorod"}, 740 {"ugkla", "Africa/Kampala"}, 741 {"umawk", "Pacific/Wake"}, 742 {"umjon", "Pacific/Johnston"}, 743 {"ummdy", "Pacific/Midway"}, 744 // {"unk", "Etc/Unknown"}, 745 {"usadk", "America/Adak"}, 746 {"usaeg", "America/Indiana/Marengo"}, 747 {"usanc", "America/Anchorage"}, 748 {"usboi", "America/Boise"}, 749 {"uschi", "America/Chicago"}, 750 {"usden", "America/Denver"}, 751 {"usdet", "America/Detroit"}, 752 {"ushnl", "Pacific/Honolulu"}, 753 {"usind", "America/Indianapolis"}, 754 {"usinvev", "America/Indiana/Vevay"}, 755 {"usjnu", "America/Juneau"}, 756 {"usknx", "America/Indiana/Knox"}, 757 {"uslax", "America/Los_Angeles"}, 758 {"uslui", "America/Louisville"}, 759 {"usmnm", "America/Menominee"}, 760 {"usmtm", "America/Metlakatla"}, 761 {"usmoc", "America/Kentucky/Monticello"}, 762 {"usndcnt", "America/North_Dakota/Center"}, 763 {"usndnsl", "America/North_Dakota/New_Salem"}, 764 {"usnyc", "America/New_York"}, 765 {"usoea", "America/Indiana/Vincennes"}, 766 {"usome", "America/Nome"}, 767 {"usphx", "America/Phoenix"}, 768 {"ussit", "America/Sitka"}, 769 {"ustel", "America/Indiana/Tell_City"}, 770 {"uswlz", "America/Indiana/Winamac"}, 771 {"uswsq", "America/Indiana/Petersburg"}, 772 {"usxul", "America/North_Dakota/Beulah"}, 773 {"usyak", "America/Yakutat"}, 774 {"utc", "Etc/UTC"}, 775 {"utce01", "Etc/GMT-1"}, 776 {"utce02", "Etc/GMT-2"}, 777 {"utce03", "Etc/GMT-3"}, 778 {"utce04", "Etc/GMT-4"}, 779 {"utce05", "Etc/GMT-5"}, 780 {"utce06", "Etc/GMT-6"}, 781 {"utce07", "Etc/GMT-7"}, 782 {"utce08", "Etc/GMT-8"}, 783 {"utce09", "Etc/GMT-9"}, 784 {"utce10", "Etc/GMT-10"}, 785 {"utce11", "Etc/GMT-11"}, 786 {"utce12", "Etc/GMT-12"}, 787 {"utce13", "Etc/GMT-13"}, 788 {"utce14", "Etc/GMT-14"}, 789 {"utcw01", "Etc/GMT+1"}, 790 {"utcw02", "Etc/GMT+2"}, 791 {"utcw03", "Etc/GMT+3"}, 792 {"utcw04", "Etc/GMT+4"}, 793 {"utcw05", "Etc/GMT+5"}, 794 {"utcw06", "Etc/GMT+6"}, 795 {"utcw07", "Etc/GMT+7"}, 796 {"utcw08", "Etc/GMT+8"}, 797 {"utcw09", "Etc/GMT+9"}, 798 {"utcw10", "Etc/GMT+10"}, 799 {"utcw11", "Etc/GMT+11"}, 800 {"utcw12", "Etc/GMT+12"}, 801 {"uymvd", "America/Montevideo"}, 802 {"uzskd", "Asia/Samarkand"}, 803 {"uztas", "Asia/Tashkent"}, 804 {"vavat", "Europe/Vatican"}, 805 {"vcsvd", "America/St_Vincent"}, 806 {"veccs", "America/Caracas"}, 807 {"vgtov", "America/Tortola"}, 808 {"vistt", "America/St_Thomas"}, 809 {"vnsgn", "Asia/Saigon"}, 810 {"vuvli", "Pacific/Efate"}, 811 {"wfmau", "Pacific/Wallis"}, 812 {"wsapw", "Pacific/Apia"}, 813 {"yeade", "Asia/Aden"}, 814 {"ytmam", "Indian/Mayotte"}, 815 {"zajnb", "Africa/Johannesburg"}, 816 {"zmlun", "Africa/Lusaka"}, 817 {"zwhre", "Africa/Harare"}, 818 819 }; 820 } 821 822 @DataProvider(name="getLocalizedDateTimePattern") getLocalizedDateTimePattern()823 Object[][] getLocalizedDateTimePattern() { 824 return new Object[][] { 825 // Locale, Expected pattern, 826 {Locale.US, FormatStyle.FULL, "EEEE, MMMM d, y 'at' h:mm:ss a zzzz"}, 827 {Locale.US, FormatStyle.LONG, "MMMM d, y 'at' h:mm:ss a z"}, 828 {Locale.US, FormatStyle.MEDIUM, "MMM d, y, h:mm:ss a"}, 829 {Locale.US, FormatStyle.SHORT, "M/d/yy, h:mm a"}, 830 {RG_GB, FormatStyle.FULL, "EEEE, d MMMM y 'at' HH:mm:ss zzzz"}, 831 {RG_GB, FormatStyle.LONG, "d MMMM y 'at' HH:mm:ss z"}, 832 {RG_GB, FormatStyle.MEDIUM, "d MMM y, HH:mm:ss"}, 833 {RG_GB, FormatStyle.SHORT, "dd/MM/y, HH:mm"}, 834 }; 835 } 836 837 @DataProvider(name="getDisplayName") getDisplayName()838 Object[][] getDisplayName() { 839 return new Object[][] { 840 // Locale, field, Expected name, 841 {Locale.US, ChronoField.AMPM_OF_DAY, "AM/PM"}, 842 // Android-changed: Android uses CLDR data. 843 // {RG_GB, ChronoField.AMPM_OF_DAY, "am/pm"}, 844 {RG_GB, ChronoField.AMPM_OF_DAY, "AM/PM"}, 845 }; 846 } 847 848 @Test(dataProvider="localizedBy") test_localizedBy(Locale locale, Chronology chrono, ZoneId zone, Chronology chronoExpected, ZoneId zoneExpected, String formatExpected)849 public void test_localizedBy(Locale locale, Chronology chrono, ZoneId zone, 850 Chronology chronoExpected, ZoneId zoneExpected, 851 String formatExpected) { 852 // Skip this test if older ICU provides the locale data. 853 if (VersionInfo.ICU_VERSION.getMajor() < 72) { 854 return; 855 } 856 // try this test both with the implicit default locale, and explicit default locale ja-JP 857 Locale def = Locale.getDefault(); 858 try { 859 Stream.of(def, Locale.JAPAN).forEach(l -> { 860 System.out.println(" Testing with the default locale: " + l); 861 Locale.setDefault(l); 862 863 DateTimeFormatter dtf = 864 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) 865 .withChronology(chrono).withZone(zone).localizedBy(locale); 866 assertEquals(dtf.getChronology(), chronoExpected); 867 assertEquals(dtf.getZone(), zoneExpected); 868 String formatted = dtf.format(ZDT); 869 assertEquals(formatted, formatExpected); 870 assertEquals(dtf.parse(formatted, ZonedDateTime::from), 871 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); 872 }); 873 } finally { 874 Locale.setDefault(def); 875 } 876 } 877 878 @Test(dataProvider="withLocale") test_withLocale(Locale locale, Chronology chrono, ZoneId zone, Chronology chronoExpected, ZoneId zoneExpected, String formatExpected)879 public void test_withLocale(Locale locale, Chronology chrono, ZoneId zone, 880 Chronology chronoExpected, ZoneId zoneExpected, 881 String formatExpected) { 882 // Skip this test if older ICU provides the locale data. 883 if (VersionInfo.ICU_VERSION.getMajor() < 72) { 884 return; 885 } 886 DateTimeFormatter dtf = 887 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) 888 .withChronology(chrono).withZone(zone).withLocale(locale); 889 assertEquals(dtf.getChronology(), chronoExpected); 890 assertEquals(dtf.getZone(), zoneExpected); 891 String formatted = dtf.format(ZDT); 892 assertEquals(formatted, formatExpected); 893 assertEquals(dtf.parse(formatted, ZonedDateTime::from), 894 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); 895 } 896 897 @Test(dataProvider="firstDayOfWeek") test_firstDayOfWeek(Locale locale, DayOfWeek dowExpected)898 public void test_firstDayOfWeek(Locale locale, DayOfWeek dowExpected) { 899 DayOfWeek dow = WeekFields.of(locale).getFirstDayOfWeek(); 900 assertEquals(dow, dowExpected); 901 } 902 903 @Test(dataProvider="minDaysInFirstWeek") test_minDaysInFirstWeek(Locale locale, int minDaysExpected)904 public void test_minDaysInFirstWeek(Locale locale, int minDaysExpected) { 905 int minDays = WeekFields.of(locale).getMinimalDaysInFirstWeek(); 906 assertEquals(minDays, minDaysExpected); 907 } 908 909 @Test(dataProvider="ofPattern") test_ofPattern(Locale locale, Chronology chronoExpected, ZoneId zoneExpected, String formatExpected)910 public void test_ofPattern(Locale locale, 911 Chronology chronoExpected, ZoneId zoneExpected, 912 String formatExpected) { 913 DateTimeFormatter dtf = 914 DateTimeFormatter.ofPattern(PATTERN, locale); 915 assertEquals(dtf.getChronology(), chronoExpected); 916 assertEquals(dtf.getZone(), zoneExpected); 917 String formatted = dtf.format(ZDT); 918 assertEquals(formatted, formatExpected); 919 assertEquals(dtf.parse(formatted, ZonedDateTime::from), 920 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); 921 } 922 923 @Test(dataProvider="ofPattern") test_toFormatter(Locale locale, Chronology chronoExpected, ZoneId zoneExpected, String formatExpected)924 public void test_toFormatter(Locale locale, 925 Chronology chronoExpected, ZoneId zoneExpected, 926 String formatExpected) { 927 DateTimeFormatter dtf = 928 new DateTimeFormatterBuilder().appendPattern(PATTERN).toFormatter(locale); 929 assertEquals(dtf.getChronology(), chronoExpected); 930 assertEquals(dtf.getZone(), zoneExpected); 931 String formatted = dtf.format(ZDT); 932 assertEquals(formatted, formatExpected); 933 assertEquals(dtf.parse(formatted, ZonedDateTime::from), 934 zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); 935 } 936 937 @Test(dataProvider="shortTZID") test_shortTZID(String shortID, String expectedZone)938 public void test_shortTZID(String shortID, String expectedZone) { 939 Locale l = Locale.forLanguageTag("en-US-u-tz-" + shortID); 940 DateTimeFormatter dtf = 941 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) 942 .localizedBy(l); 943 assertEquals(dtf.getZone(), ZoneId.of(expectedZone)); 944 } 945 946 // Android-changed: Android doesn't support "rg" extension yet. 947 @Test(dataProvider="getLocalizedDateTimePattern", enabled = false) test_getLocalizedDateTimePattern(Locale l, FormatStyle s, String expectedPattern)948 public void test_getLocalizedDateTimePattern(Locale l, FormatStyle s, String expectedPattern) { 949 DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder(); 950 assertEquals(dtfb.getLocalizedDateTimePattern(s, s, IsoChronology.INSTANCE, l), 951 expectedPattern); 952 } 953 954 @Test(dataProvider="getDisplayName") test_getDisplayName(Locale l, TemporalField f, String expectedName)955 public void test_getDisplayName(Locale l, TemporalField f, String expectedName) { 956 assertEquals(f.getDisplayName(l), expectedName); 957 } 958 } 959