• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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