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