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