| /* |
| * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /* |
| * @test |
| * @bug 8176841 8202537 |
| * @summary Tests java.time classes deals with Unicode extensions |
| * correctly. |
| * @modules jdk.localedata |
| */ |
| package test.java.time.format; |
| |
| import static org.testng.Assert.assertEquals; |
| |
| import java.time.DayOfWeek; |
| import java.time.ZonedDateTime; |
| import java.time.ZoneId; |
| import java.time.chrono.Chronology; |
| import java.time.chrono.HijrahChronology; |
| import java.time.chrono.IsoChronology; |
| import java.time.chrono.JapaneseChronology; |
| import java.time.format.DateTimeFormatter; |
| import java.time.format.DateTimeFormatterBuilder; |
| import java.time.format.FormatStyle; |
| import java.time.temporal.ChronoField; |
| import java.time.temporal.TemporalField; |
| import java.time.temporal.WeekFields; |
| import java.util.Locale; |
| import java.util.TimeZone; |
| |
| import org.testng.annotations.AfterTest; |
| import org.testng.annotations.BeforeTest; |
| import org.testng.annotations.DataProvider; |
| import org.testng.annotations.Test; |
| |
| /** |
| * Test JavaTime with BCP47 U extensions |
| */ |
| @Test |
| public class TestUnicodeExtension { |
| private static TimeZone defaultTZ; |
| |
| private static final Chronology JAPANESE = JapaneseChronology.INSTANCE; |
| private static final Chronology HIJRAH = HijrahChronology.INSTANCE; |
| |
| private static final ZoneId ASIATOKYO = ZoneId.of("Asia/Tokyo"); |
| private static final ZoneId AMLA = ZoneId.of("America/Los_Angeles"); |
| |
| private static final Locale JPTYO = Locale.forLanguageTag("en-u-tz-jptyo"); |
| private static final Locale JCAL = Locale.forLanguageTag("en-u-ca-japanese"); |
| private static final Locale HCAL = Locale.forLanguageTag("en-u-ca-islamic-umalqura"); |
| |
| private static final Locale FW_SUN = Locale.forLanguageTag("en-US-u-fw-sun"); |
| private static final Locale FW_MON = Locale.forLanguageTag("en-US-u-fw-mon"); |
| private static final Locale FW_TUE = Locale.forLanguageTag("en-US-u-fw-tue"); |
| private static final Locale FW_WED = Locale.forLanguageTag("en-US-u-fw-wed"); |
| private static final Locale FW_THU = Locale.forLanguageTag("en-US-u-fw-thu"); |
| private static final Locale FW_FRI = Locale.forLanguageTag("en-US-u-fw-fri"); |
| private static final Locale FW_SAT = Locale.forLanguageTag("en-US-u-fw-sat"); |
| |
| private static final Locale RG_GB = Locale.forLanguageTag("en-US-u-rg-gbzzzz"); |
| |
| private static final ZonedDateTime ZDT = ZonedDateTime.of(2017, 8, 10, 15, 15, 0, 0, AMLA); |
| |
| private static final String PATTERN = "GGGG MMMM-dd-uu HH:mm:ss zzzz"; |
| |
| @BeforeTest |
| public void beforeTest() { |
| defaultTZ = TimeZone.getDefault(); |
| TimeZone.setDefault(TimeZone.getTimeZone(AMLA)); |
| } |
| |
| @AfterTest |
| public void afterTest() { |
| TimeZone.setDefault(defaultTZ); |
| } |
| |
| @DataProvider(name="localizedBy") |
| Object[][] localizedBy() { |
| return new Object[][] { |
| // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, |
| // Expected formatted string |
| {Locale.JAPAN, null, null, null, null, |
| "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" |
| }, |
| {Locale.JAPAN, JAPANESE, null, JAPANESE, null, |
| "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" |
| }, |
| {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO, |
| "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 \u65e5\u672c\u6a19\u6e96\u6642" |
| }, |
| |
| {JCAL, null, null, JAPANESE, null, |
| "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {JCAL, HIJRAH, null, JAPANESE, null, |
| "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {HCAL, JAPANESE, null, HIJRAH, null, |
| "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH at 3:15:00 PM Pacific Daylight Time" |
| }, |
| |
| |
| {JPTYO, null, null, null, ASIATOKYO, |
| "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time" |
| }, |
| {JPTYO, null, AMLA, null, ASIATOKYO, |
| "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time" |
| }, |
| // invalid tz |
| {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, AMLA, null, AMLA, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| |
| {RG_GB, null, null, null, null, |
| "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time" |
| }, |
| |
| // DecimalStyle |
| {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null, |
| "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50 PM Pacific Daylight Time" |
| }, |
| // DecimalStyle, "nu" vs "rg" |
| {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null, |
| "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57 at \u0e53:\u0e51\u0e55:\u0e50\u0e50 PM Pacific Daylight Time" |
| }, |
| // DecimalStyle, invalid |
| {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| }; |
| } |
| |
| @DataProvider(name="withLocale") |
| Object[][] withLocale() { |
| return new Object[][] { |
| // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, |
| // Expected formatted string |
| {Locale.JAPAN, null, null, null, null, |
| "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" |
| }, |
| {Locale.JAPAN, JAPANESE, null, JAPANESE, null, |
| "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 \u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" |
| }, |
| {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO, |
| "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 \u65e5\u672c\u6a19\u6e96\u6642" |
| }, |
| |
| {JCAL, null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {JCAL, HIJRAH, null, HIJRAH, null, |
| "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {HCAL, JAPANESE, null, JAPANESE, null, |
| "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time" |
| }, |
| |
| |
| {JPTYO, null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {JPTYO, null, AMLA, null, AMLA, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| // invalid tz |
| {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| |
| {RG_GB, null, null, null, null, |
| "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time" |
| }, |
| |
| // DecimalStyle |
| {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| // DecimalStyle, "nu" vs "rg" |
| {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| // DecimalStyle, invalid |
| {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null, |
| "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time" |
| }, |
| }; |
| } |
| |
| @DataProvider(name="firstDayOfWeek") |
| Object[][] firstDayOfWeek () { |
| return new Object[][] { |
| // Locale, Expected DayOfWeek, |
| {Locale.US, DayOfWeek.SUNDAY}, |
| {FW_SUN, DayOfWeek.SUNDAY}, |
| {FW_MON, DayOfWeek.MONDAY}, |
| {FW_TUE, DayOfWeek.TUESDAY}, |
| {FW_WED, DayOfWeek.WEDNESDAY}, |
| {FW_THU, DayOfWeek.THURSDAY}, |
| {FW_FRI, DayOfWeek.FRIDAY}, |
| {FW_SAT, DayOfWeek.SATURDAY}, |
| |
| // invalid case |
| {Locale.forLanguageTag("en-US-u-fw-xxx"), DayOfWeek.SUNDAY}, |
| |
| // region override |
| {RG_GB, DayOfWeek.MONDAY}, |
| {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), DayOfWeek.MONDAY}, |
| |
| // "fw" and "rg". |
| {Locale.forLanguageTag("en-US-u-fw-wed-rg-gbzzzz"), DayOfWeek.WEDNESDAY}, |
| {Locale.forLanguageTag("en-US-u-fw-xxx-rg-gbzzzz"), DayOfWeek.MONDAY}, |
| {Locale.forLanguageTag("en-US-u-fw-xxx-rg-zzzz"), DayOfWeek.SUNDAY}, |
| }; |
| } |
| |
| @DataProvider(name="minDaysInFirstWeek") |
| Object[][] minDaysInFrstWeek () { |
| return new Object[][] { |
| // Locale, Expected minDay, |
| {Locale.US, 1}, |
| |
| // region override |
| {RG_GB, 4}, |
| {Locale.forLanguageTag("zh-CN-u-rg-eszzzz"), 4}, |
| }; |
| } |
| |
| @DataProvider(name="ofPattern") |
| Object[][] ofPattern() { |
| return new Object[][] { |
| // Locale, Expected Chrono, Expected Zone, |
| // Expected formatted string |
| {JCAL, null, null, |
| "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" |
| }, |
| {HCAL, null, null, |
| "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" |
| }, |
| |
| {JPTYO, null, null, |
| "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" |
| }, |
| {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, |
| "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" |
| }, |
| |
| {RG_GB, null, null, |
| "Anno Domini August-10-17 15:15:00 Pacific Daylight Time" |
| }, |
| |
| }; |
| } |
| |
| @DataProvider(name="shortTZID") |
| Object[][] shortTZID() { |
| return new Object[][] { |
| // LDML's short ID, Expected Zone, |
| {"adalv", "Europe/Andorra"}, |
| {"aedxb", "Asia/Dubai"}, |
| {"afkbl", "Asia/Kabul"}, |
| {"aganu", "America/Antigua"}, |
| {"aiaxa", "America/Anguilla"}, |
| {"altia", "Europe/Tirane"}, |
| {"amevn", "Asia/Yerevan"}, |
| {"ancur", "America/Curacao"}, |
| {"aolad", "Africa/Luanda"}, |
| {"aqcas", "Antarctica/Casey"}, |
| {"aqdav", "Antarctica/Davis"}, |
| {"aqddu", "Antarctica/DumontDUrville"}, |
| {"aqmaw", "Antarctica/Mawson"}, |
| {"aqmcm", "Antarctica/McMurdo"}, |
| {"aqplm", "Antarctica/Palmer"}, |
| {"aqrot", "Antarctica/Rothera"}, |
| {"aqsyw", "Antarctica/Syowa"}, |
| {"aqtrl", "Antarctica/Troll"}, |
| {"aqvos", "Antarctica/Vostok"}, |
| {"arbue", "America/Buenos_Aires"}, |
| {"arcor", "America/Cordoba"}, |
| {"arctc", "America/Catamarca"}, |
| {"arirj", "America/Argentina/La_Rioja"}, |
| {"arjuj", "America/Jujuy"}, |
| {"arluq", "America/Argentina/San_Luis"}, |
| {"armdz", "America/Mendoza"}, |
| {"arrgl", "America/Argentina/Rio_Gallegos"}, |
| {"arsla", "America/Argentina/Salta"}, |
| {"artuc", "America/Argentina/Tucuman"}, |
| {"aruaq", "America/Argentina/San_Juan"}, |
| {"arush", "America/Argentina/Ushuaia"}, |
| {"asppg", "Pacific/Pago_Pago"}, |
| {"atvie", "Europe/Vienna"}, |
| {"auadl", "Australia/Adelaide"}, |
| {"aubhq", "Australia/Broken_Hill"}, |
| {"aubne", "Australia/Brisbane"}, |
| {"audrw", "Australia/Darwin"}, |
| {"aueuc", "Australia/Eucla"}, |
| {"auhba", "Australia/Hobart"}, |
| {"aukns", "Australia/Currie"}, |
| {"auldc", "Australia/Lindeman"}, |
| {"auldh", "Australia/Lord_Howe"}, |
| {"aumel", "Australia/Melbourne"}, |
| {"aumqi", "Antarctica/Macquarie"}, |
| {"auper", "Australia/Perth"}, |
| {"ausyd", "Australia/Sydney"}, |
| {"awaua", "America/Aruba"}, |
| {"azbak", "Asia/Baku"}, |
| {"basjj", "Europe/Sarajevo"}, |
| {"bbbgi", "America/Barbados"}, |
| {"bddac", "Asia/Dhaka"}, |
| {"bebru", "Europe/Brussels"}, |
| {"bfoua", "Africa/Ouagadougou"}, |
| {"bgsof", "Europe/Sofia"}, |
| {"bhbah", "Asia/Bahrain"}, |
| {"bibjm", "Africa/Bujumbura"}, |
| {"bjptn", "Africa/Porto-Novo"}, |
| {"bmbda", "Atlantic/Bermuda"}, |
| {"bnbwn", "Asia/Brunei"}, |
| {"bolpb", "America/La_Paz"}, |
| {"bqkra", "America/Kralendijk"}, |
| {"braux", "America/Araguaina"}, |
| {"brbel", "America/Belem"}, |
| {"brbvb", "America/Boa_Vista"}, |
| {"brcgb", "America/Cuiaba"}, |
| {"brcgr", "America/Campo_Grande"}, |
| {"brern", "America/Eirunepe"}, |
| {"brfen", "America/Noronha"}, |
| {"brfor", "America/Fortaleza"}, |
| {"brmao", "America/Manaus"}, |
| {"brmcz", "America/Maceio"}, |
| {"brpvh", "America/Porto_Velho"}, |
| {"brrbr", "America/Rio_Branco"}, |
| {"brrec", "America/Recife"}, |
| {"brsao", "America/Sao_Paulo"}, |
| {"brssa", "America/Bahia"}, |
| {"brstm", "America/Santarem"}, |
| {"bsnas", "America/Nassau"}, |
| {"btthi", "Asia/Thimphu"}, |
| {"bwgbe", "Africa/Gaborone"}, |
| {"bymsq", "Europe/Minsk"}, |
| {"bzbze", "America/Belize"}, |
| {"cacfq", "America/Creston"}, |
| {"caedm", "America/Edmonton"}, |
| {"caffs", "America/Rainy_River"}, |
| {"cafne", "America/Fort_Nelson"}, |
| {"caglb", "America/Glace_Bay"}, |
| {"cagoo", "America/Goose_Bay"}, |
| {"cahal", "America/Halifax"}, |
| {"caiql", "America/Iqaluit"}, |
| {"camon", "America/Moncton"}, |
| {"capnt", "America/Pangnirtung"}, |
| {"careb", "America/Resolute"}, |
| {"careg", "America/Regina"}, |
| {"casjf", "America/St_Johns"}, |
| {"canpg", "America/Nipigon"}, |
| {"cathu", "America/Thunder_Bay"}, |
| {"cator", "America/Toronto"}, |
| {"cavan", "America/Vancouver"}, |
| {"cawnp", "America/Winnipeg"}, |
| {"caybx", "America/Blanc-Sablon"}, |
| {"caycb", "America/Cambridge_Bay"}, |
| {"cayda", "America/Dawson"}, |
| {"caydq", "America/Dawson_Creek"}, |
| {"cayek", "America/Rankin_Inlet"}, |
| {"cayev", "America/Inuvik"}, |
| {"cayxy", "America/Whitehorse"}, |
| {"cayyn", "America/Swift_Current"}, |
| {"cayzf", "America/Yellowknife"}, |
| {"cayzs", "America/Coral_Harbour"}, |
| {"cccck", "Indian/Cocos"}, |
| {"cdfbm", "Africa/Lubumbashi"}, |
| {"cdfih", "Africa/Kinshasa"}, |
| {"cfbgf", "Africa/Bangui"}, |
| {"cgbzv", "Africa/Brazzaville"}, |
| {"chzrh", "Europe/Zurich"}, |
| {"ciabj", "Africa/Abidjan"}, |
| {"ckrar", "Pacific/Rarotonga"}, |
| {"clipc", "Pacific/Easter"}, |
| {"clscl", "America/Santiago"}, |
| {"cmdla", "Africa/Douala"}, |
| {"cnsha", "Asia/Shanghai"}, |
| {"cnurc", "Asia/Urumqi"}, |
| {"cobog", "America/Bogota"}, |
| {"crsjo", "America/Costa_Rica"}, |
| {"cst6cdt", "CST6CDT"}, |
| {"cuhav", "America/Havana"}, |
| {"cvrai", "Atlantic/Cape_Verde"}, |
| {"cxxch", "Indian/Christmas"}, |
| {"cynic", "Asia/Nicosia"}, |
| {"czprg", "Europe/Prague"}, |
| {"deber", "Europe/Berlin"}, |
| {"debsngn", "Europe/Busingen"}, |
| {"djjib", "Africa/Djibouti"}, |
| {"dkcph", "Europe/Copenhagen"}, |
| {"dmdom", "America/Dominica"}, |
| {"dosdq", "America/Santo_Domingo"}, |
| {"dzalg", "Africa/Algiers"}, |
| {"ecgps", "Pacific/Galapagos"}, |
| {"ecgye", "America/Guayaquil"}, |
| {"eetll", "Europe/Tallinn"}, |
| {"egcai", "Africa/Cairo"}, |
| {"eheai", "Africa/El_Aaiun"}, |
| {"erasm", "Africa/Asmera"}, |
| {"esceu", "Africa/Ceuta"}, |
| {"eslpa", "Atlantic/Canary"}, |
| {"esmad", "Europe/Madrid"}, |
| {"est5edt", "EST5EDT"}, |
| {"etadd", "Africa/Addis_Ababa"}, |
| {"fihel", "Europe/Helsinki"}, |
| {"fimhq", "Europe/Mariehamn"}, |
| {"fjsuv", "Pacific/Fiji"}, |
| {"fkpsy", "Atlantic/Stanley"}, |
| {"fmksa", "Pacific/Kosrae"}, |
| {"fmpni", "Pacific/Ponape"}, |
| {"fmtkk", "Pacific/Truk"}, |
| {"fotho", "Atlantic/Faeroe"}, |
| {"frpar", "Europe/Paris"}, |
| {"galbv", "Africa/Libreville"}, |
| {"gaza", "Asia/Gaza"}, |
| {"gblon", "Europe/London"}, |
| {"gdgnd", "America/Grenada"}, |
| {"getbs", "Asia/Tbilisi"}, |
| {"gfcay", "America/Cayenne"}, |
| {"gggci", "Europe/Guernsey"}, |
| {"ghacc", "Africa/Accra"}, |
| {"gigib", "Europe/Gibraltar"}, |
| {"gldkshvn", "America/Danmarkshavn"}, |
| {"glgoh", "America/Godthab"}, |
| {"globy", "America/Scoresbysund"}, |
| {"glthu", "America/Thule"}, |
| {"gmbjl", "Africa/Banjul"}, |
| {"gncky", "Africa/Conakry"}, |
| {"gpbbr", "America/Guadeloupe"}, |
| {"gpmsb", "America/Marigot"}, |
| {"gpsbh", "America/St_Barthelemy"}, |
| {"gqssg", "Africa/Malabo"}, |
| {"grath", "Europe/Athens"}, |
| {"gsgrv", "Atlantic/South_Georgia"}, |
| {"gtgua", "America/Guatemala"}, |
| {"gugum", "Pacific/Guam"}, |
| {"gwoxb", "Africa/Bissau"}, |
| {"gygeo", "America/Guyana"}, |
| {"hebron", "Asia/Hebron"}, |
| {"hkhkg", "Asia/Hong_Kong"}, |
| {"hntgu", "America/Tegucigalpa"}, |
| {"hrzag", "Europe/Zagreb"}, |
| {"htpap", "America/Port-au-Prince"}, |
| {"hubud", "Europe/Budapest"}, |
| {"iddjj", "Asia/Jayapura"}, |
| {"idjkt", "Asia/Jakarta"}, |
| {"idmak", "Asia/Makassar"}, |
| {"idpnk", "Asia/Pontianak"}, |
| {"iedub", "Europe/Dublin"}, |
| {"imdgs", "Europe/Isle_of_Man"}, |
| {"inccu", "Asia/Calcutta"}, |
| {"iodga", "Indian/Chagos"}, |
| {"iqbgw", "Asia/Baghdad"}, |
| {"irthr", "Asia/Tehran"}, |
| {"isrey", "Atlantic/Reykjavik"}, |
| {"itrom", "Europe/Rome"}, |
| {"jeruslm", "Asia/Jerusalem"}, |
| {"jesth", "Europe/Jersey"}, |
| {"jmkin", "America/Jamaica"}, |
| {"joamm", "Asia/Amman"}, |
| {"jptyo", "Asia/Tokyo"}, |
| {"kenbo", "Africa/Nairobi"}, |
| {"kgfru", "Asia/Bishkek"}, |
| {"khpnh", "Asia/Phnom_Penh"}, |
| {"kicxi", "Pacific/Kiritimati"}, |
| {"kipho", "Pacific/Enderbury"}, |
| {"kitrw", "Pacific/Tarawa"}, |
| {"kmyva", "Indian/Comoro"}, |
| {"knbas", "America/St_Kitts"}, |
| {"kpfnj", "Asia/Pyongyang"}, |
| {"krsel", "Asia/Seoul"}, |
| {"kwkwi", "Asia/Kuwait"}, |
| {"kygec", "America/Cayman"}, |
| {"kzaau", "Asia/Aqtau"}, |
| {"kzakx", "Asia/Aqtobe"}, |
| {"kzala", "Asia/Almaty"}, |
| {"kzkzo", "Asia/Qyzylorda"}, |
| {"kzura", "Asia/Oral"}, |
| {"lavte", "Asia/Vientiane"}, |
| {"lbbey", "Asia/Beirut"}, |
| {"lccas", "America/St_Lucia"}, |
| {"livdz", "Europe/Vaduz"}, |
| {"lkcmb", "Asia/Colombo"}, |
| {"lrmlw", "Africa/Monrovia"}, |
| {"lsmsu", "Africa/Maseru"}, |
| {"ltvno", "Europe/Vilnius"}, |
| {"lulux", "Europe/Luxembourg"}, |
| {"lvrix", "Europe/Riga"}, |
| {"lytip", "Africa/Tripoli"}, |
| {"macas", "Africa/Casablanca"}, |
| {"mcmon", "Europe/Monaco"}, |
| {"mdkiv", "Europe/Chisinau"}, |
| {"metgd", "Europe/Podgorica"}, |
| {"mgtnr", "Indian/Antananarivo"}, |
| {"mhkwa", "Pacific/Kwajalein"}, |
| {"mhmaj", "Pacific/Majuro"}, |
| {"mkskp", "Europe/Skopje"}, |
| {"mlbko", "Africa/Bamako"}, |
| {"mmrgn", "Asia/Rangoon"}, |
| {"mncoq", "Asia/Choibalsan"}, |
| {"mnhvd", "Asia/Hovd"}, |
| {"mnuln", "Asia/Ulaanbaatar"}, |
| {"momfm", "Asia/Macau"}, |
| {"mpspn", "Pacific/Saipan"}, |
| {"mqfdf", "America/Martinique"}, |
| {"mrnkc", "Africa/Nouakchott"}, |
| {"msmni", "America/Montserrat"}, |
| {"mst7mdt", "MST7MDT"}, |
| {"mtmla", "Europe/Malta"}, |
| {"muplu", "Indian/Mauritius"}, |
| {"mvmle", "Indian/Maldives"}, |
| {"mwblz", "Africa/Blantyre"}, |
| {"mxchi", "America/Chihuahua"}, |
| {"mxcun", "America/Cancun"}, |
| {"mxhmo", "America/Hermosillo"}, |
| {"mxmam", "America/Matamoros"}, |
| {"mxmex", "America/Mexico_City"}, |
| {"mxmid", "America/Merida"}, |
| {"mxmty", "America/Monterrey"}, |
| {"mxmzt", "America/Mazatlan"}, |
| {"mxoji", "America/Ojinaga"}, |
| {"mxpvr", "America/Bahia_Banderas"}, |
| {"mxstis", "America/Santa_Isabel"}, |
| {"mxtij", "America/Tijuana"}, |
| {"mykch", "Asia/Kuching"}, |
| {"mykul", "Asia/Kuala_Lumpur"}, |
| {"mzmpm", "Africa/Maputo"}, |
| {"nawdh", "Africa/Windhoek"}, |
| {"ncnou", "Pacific/Noumea"}, |
| {"nenim", "Africa/Niamey"}, |
| {"nfnlk", "Pacific/Norfolk"}, |
| {"nglos", "Africa/Lagos"}, |
| {"nimga", "America/Managua"}, |
| {"nlams", "Europe/Amsterdam"}, |
| {"noosl", "Europe/Oslo"}, |
| {"npktm", "Asia/Katmandu"}, |
| {"nrinu", "Pacific/Nauru"}, |
| {"nuiue", "Pacific/Niue"}, |
| {"nzakl", "Pacific/Auckland"}, |
| {"nzcht", "Pacific/Chatham"}, |
| {"ommct", "Asia/Muscat"}, |
| {"papty", "America/Panama"}, |
| {"pelim", "America/Lima"}, |
| {"pfgmr", "Pacific/Gambier"}, |
| {"pfnhv", "Pacific/Marquesas"}, |
| {"pfppt", "Pacific/Tahiti"}, |
| {"pgpom", "Pacific/Port_Moresby"}, |
| {"pgraw", "Pacific/Bougainville"}, |
| {"phmnl", "Asia/Manila"}, |
| {"pkkhi", "Asia/Karachi"}, |
| {"plwaw", "Europe/Warsaw"}, |
| {"pmmqc", "America/Miquelon"}, |
| {"pnpcn", "Pacific/Pitcairn"}, |
| {"prsju", "America/Puerto_Rico"}, |
| {"pst8pdt", "PST8PDT"}, |
| {"ptfnc", "Atlantic/Madeira"}, |
| {"ptlis", "Europe/Lisbon"}, |
| {"ptpdl", "Atlantic/Azores"}, |
| {"pwror", "Pacific/Palau"}, |
| {"pyasu", "America/Asuncion"}, |
| {"qadoh", "Asia/Qatar"}, |
| {"rereu", "Indian/Reunion"}, |
| {"robuh", "Europe/Bucharest"}, |
| {"rsbeg", "Europe/Belgrade"}, |
| {"ruchita", "Asia/Chita"}, |
| {"rudyr", "Asia/Anadyr"}, |
| {"rugdx", "Asia/Magadan"}, |
| {"ruikt", "Asia/Irkutsk"}, |
| {"rukgd", "Europe/Kaliningrad"}, |
| {"rukhndg", "Asia/Khandyga"}, |
| {"rukra", "Asia/Krasnoyarsk"}, |
| {"rukuf", "Europe/Samara"}, |
| {"rumow", "Europe/Moscow"}, |
| {"runoz", "Asia/Novokuznetsk"}, |
| {"ruoms", "Asia/Omsk"}, |
| {"ruovb", "Asia/Novosibirsk"}, |
| {"rupkc", "Asia/Kamchatka"}, |
| {"rusred", "Asia/Srednekolymsk"}, |
| {"ruunera", "Asia/Ust-Nera"}, |
| {"ruuus", "Asia/Sakhalin"}, |
| {"ruvog", "Europe/Volgograd"}, |
| {"ruvvo", "Asia/Vladivostok"}, |
| {"ruyek", "Asia/Yekaterinburg"}, |
| {"ruyks", "Asia/Yakutsk"}, |
| {"rwkgl", "Africa/Kigali"}, |
| {"saruh", "Asia/Riyadh"}, |
| {"sbhir", "Pacific/Guadalcanal"}, |
| {"scmaw", "Indian/Mahe"}, |
| {"sdkrt", "Africa/Khartoum"}, |
| {"sesto", "Europe/Stockholm"}, |
| {"sgsin", "Asia/Singapore"}, |
| {"shshn", "Atlantic/St_Helena"}, |
| {"silju", "Europe/Ljubljana"}, |
| {"sjlyr", "Arctic/Longyearbyen"}, |
| {"skbts", "Europe/Bratislava"}, |
| {"slfna", "Africa/Freetown"}, |
| {"smsai", "Europe/San_Marino"}, |
| {"sndkr", "Africa/Dakar"}, |
| {"somgq", "Africa/Mogadishu"}, |
| {"srpbm", "America/Paramaribo"}, |
| {"ssjub", "Africa/Juba"}, |
| {"sttms", "Africa/Sao_Tome"}, |
| {"svsal", "America/El_Salvador"}, |
| {"sxphi", "America/Lower_Princes"}, |
| {"sydam", "Asia/Damascus"}, |
| {"szqmn", "Africa/Mbabane"}, |
| {"tcgdt", "America/Grand_Turk"}, |
| {"tdndj", "Africa/Ndjamena"}, |
| {"tfpfr", "Indian/Kerguelen"}, |
| {"tglfw", "Africa/Lome"}, |
| {"thbkk", "Asia/Bangkok"}, |
| {"tjdyu", "Asia/Dushanbe"}, |
| {"tkfko", "Pacific/Fakaofo"}, |
| {"tldil", "Asia/Dili"}, |
| {"tmasb", "Asia/Ashgabat"}, |
| {"tntun", "Africa/Tunis"}, |
| {"totbu", "Pacific/Tongatapu"}, |
| {"trist", "Europe/Istanbul"}, |
| {"ttpos", "America/Port_of_Spain"}, |
| {"tvfun", "Pacific/Funafuti"}, |
| {"twtpe", "Asia/Taipei"}, |
| {"tzdar", "Africa/Dar_es_Salaam"}, |
| {"uaiev", "Europe/Kiev"}, |
| {"uaozh", "Europe/Zaporozhye"}, |
| {"uasip", "Europe/Simferopol"}, |
| {"uauzh", "Europe/Uzhgorod"}, |
| {"ugkla", "Africa/Kampala"}, |
| {"umawk", "Pacific/Wake"}, |
| {"umjon", "Pacific/Johnston"}, |
| {"ummdy", "Pacific/Midway"}, |
| // {"unk", "Etc/Unknown"}, |
| {"usadk", "America/Adak"}, |
| {"usaeg", "America/Indiana/Marengo"}, |
| {"usanc", "America/Anchorage"}, |
| {"usboi", "America/Boise"}, |
| {"uschi", "America/Chicago"}, |
| {"usden", "America/Denver"}, |
| {"usdet", "America/Detroit"}, |
| {"ushnl", "Pacific/Honolulu"}, |
| {"usind", "America/Indianapolis"}, |
| {"usinvev", "America/Indiana/Vevay"}, |
| {"usjnu", "America/Juneau"}, |
| {"usknx", "America/Indiana/Knox"}, |
| {"uslax", "America/Los_Angeles"}, |
| {"uslui", "America/Louisville"}, |
| {"usmnm", "America/Menominee"}, |
| {"usmtm", "America/Metlakatla"}, |
| {"usmoc", "America/Kentucky/Monticello"}, |
| {"usndcnt", "America/North_Dakota/Center"}, |
| {"usndnsl", "America/North_Dakota/New_Salem"}, |
| {"usnyc", "America/New_York"}, |
| {"usoea", "America/Indiana/Vincennes"}, |
| {"usome", "America/Nome"}, |
| {"usphx", "America/Phoenix"}, |
| {"ussit", "America/Sitka"}, |
| {"ustel", "America/Indiana/Tell_City"}, |
| {"uswlz", "America/Indiana/Winamac"}, |
| {"uswsq", "America/Indiana/Petersburg"}, |
| {"usxul", "America/North_Dakota/Beulah"}, |
| {"usyak", "America/Yakutat"}, |
| {"utc", "Etc/UTC"}, |
| {"utce01", "Etc/GMT-1"}, |
| {"utce02", "Etc/GMT-2"}, |
| {"utce03", "Etc/GMT-3"}, |
| {"utce04", "Etc/GMT-4"}, |
| {"utce05", "Etc/GMT-5"}, |
| {"utce06", "Etc/GMT-6"}, |
| {"utce07", "Etc/GMT-7"}, |
| {"utce08", "Etc/GMT-8"}, |
| {"utce09", "Etc/GMT-9"}, |
| {"utce10", "Etc/GMT-10"}, |
| {"utce11", "Etc/GMT-11"}, |
| {"utce12", "Etc/GMT-12"}, |
| {"utce13", "Etc/GMT-13"}, |
| {"utce14", "Etc/GMT-14"}, |
| {"utcw01", "Etc/GMT+1"}, |
| {"utcw02", "Etc/GMT+2"}, |
| {"utcw03", "Etc/GMT+3"}, |
| {"utcw04", "Etc/GMT+4"}, |
| {"utcw05", "Etc/GMT+5"}, |
| {"utcw06", "Etc/GMT+6"}, |
| {"utcw07", "Etc/GMT+7"}, |
| {"utcw08", "Etc/GMT+8"}, |
| {"utcw09", "Etc/GMT+9"}, |
| {"utcw10", "Etc/GMT+10"}, |
| {"utcw11", "Etc/GMT+11"}, |
| {"utcw12", "Etc/GMT+12"}, |
| {"uymvd", "America/Montevideo"}, |
| {"uzskd", "Asia/Samarkand"}, |
| {"uztas", "Asia/Tashkent"}, |
| {"vavat", "Europe/Vatican"}, |
| {"vcsvd", "America/St_Vincent"}, |
| {"veccs", "America/Caracas"}, |
| {"vgtov", "America/Tortola"}, |
| {"vistt", "America/St_Thomas"}, |
| {"vnsgn", "Asia/Saigon"}, |
| {"vuvli", "Pacific/Efate"}, |
| {"wfmau", "Pacific/Wallis"}, |
| {"wsapw", "Pacific/Apia"}, |
| {"yeade", "Asia/Aden"}, |
| {"ytmam", "Indian/Mayotte"}, |
| {"zajnb", "Africa/Johannesburg"}, |
| {"zmlun", "Africa/Lusaka"}, |
| {"zwhre", "Africa/Harare"}, |
| |
| }; |
| } |
| |
| @DataProvider(name="getLocalizedDateTimePattern") |
| Object[][] getLocalizedDateTimePattern() { |
| return new Object[][] { |
| // Locale, Expected pattern, |
| {Locale.US, FormatStyle.FULL, "EEEE, MMMM d, y 'at' h:mm:ss a zzzz"}, |
| {Locale.US, FormatStyle.LONG, "MMMM d, y 'at' h:mm:ss a z"}, |
| {Locale.US, FormatStyle.MEDIUM, "MMM d, y, h:mm:ss a"}, |
| {Locale.US, FormatStyle.SHORT, "M/d/yy, h:mm a"}, |
| {RG_GB, FormatStyle.FULL, "EEEE, d MMMM y 'at' HH:mm:ss zzzz"}, |
| {RG_GB, FormatStyle.LONG, "d MMMM y 'at' HH:mm:ss z"}, |
| {RG_GB, FormatStyle.MEDIUM, "d MMM y, HH:mm:ss"}, |
| {RG_GB, FormatStyle.SHORT, "dd/MM/y, HH:mm"}, |
| }; |
| } |
| |
| @DataProvider(name="getDisplayName") |
| Object[][] getDisplayName() { |
| return new Object[][] { |
| // Locale, field, Expected name, |
| {Locale.US, ChronoField.AMPM_OF_DAY, "AM/PM"}, |
| {RG_GB, ChronoField.AMPM_OF_DAY, "am/pm"}, |
| }; |
| } |
| |
| @Test(dataProvider="localizedBy") |
| public void test_localizedBy(Locale locale, Chronology chrono, ZoneId zone, |
| Chronology chronoExpected, ZoneId zoneExpected, |
| String formatExpected) { |
| DateTimeFormatter dtf = |
| DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) |
| .withChronology(chrono).withZone(zone).localizedBy(locale); |
| assertEquals(dtf.getChronology(), chronoExpected); |
| assertEquals(dtf.getZone(), zoneExpected); |
| String formatted = dtf.format(ZDT); |
| assertEquals(formatted, formatExpected); |
| assertEquals(dtf.parse(formatted, ZonedDateTime::from), |
| zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); |
| } |
| |
| @Test(dataProvider="withLocale") |
| public void test_withLocale(Locale locale, Chronology chrono, ZoneId zone, |
| Chronology chronoExpected, ZoneId zoneExpected, |
| String formatExpected) { |
| DateTimeFormatter dtf = |
| DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) |
| .withChronology(chrono).withZone(zone).withLocale(locale); |
| assertEquals(dtf.getChronology(), chronoExpected); |
| assertEquals(dtf.getZone(), zoneExpected); |
| String formatted = dtf.format(ZDT); |
| assertEquals(formatted, formatExpected); |
| assertEquals(dtf.parse(formatted, ZonedDateTime::from), |
| zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); |
| } |
| |
| @Test(dataProvider="firstDayOfWeek") |
| public void test_firstDayOfWeek(Locale locale, DayOfWeek dowExpected) { |
| DayOfWeek dow = WeekFields.of(locale).getFirstDayOfWeek(); |
| assertEquals(dow, dowExpected); |
| } |
| |
| @Test(dataProvider="minDaysInFirstWeek") |
| public void test_minDaysInFirstWeek(Locale locale, int minDaysExpected) { |
| int minDays = WeekFields.of(locale).getMinimalDaysInFirstWeek(); |
| assertEquals(minDays, minDaysExpected); |
| } |
| |
| @Test(dataProvider="ofPattern") |
| public void test_ofPattern(Locale locale, |
| Chronology chronoExpected, ZoneId zoneExpected, |
| String formatExpected) { |
| DateTimeFormatter dtf = |
| DateTimeFormatter.ofPattern(PATTERN, locale); |
| assertEquals(dtf.getChronology(), chronoExpected); |
| assertEquals(dtf.getZone(), zoneExpected); |
| String formatted = dtf.format(ZDT); |
| assertEquals(formatted, formatExpected); |
| assertEquals(dtf.parse(formatted, ZonedDateTime::from), |
| zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); |
| } |
| |
| @Test(dataProvider="ofPattern") |
| public void test_toFormatter(Locale locale, |
| Chronology chronoExpected, ZoneId zoneExpected, |
| String formatExpected) { |
| DateTimeFormatter dtf = |
| new DateTimeFormatterBuilder().appendPattern(PATTERN).toFormatter(locale); |
| assertEquals(dtf.getChronology(), chronoExpected); |
| assertEquals(dtf.getZone(), zoneExpected); |
| String formatted = dtf.format(ZDT); |
| assertEquals(formatted, formatExpected); |
| assertEquals(dtf.parse(formatted, ZonedDateTime::from), |
| zoneExpected != null ? ZDT.withZoneSameInstant(zoneExpected) : ZDT); |
| } |
| |
| @Test(dataProvider="shortTZID") |
| public void test_shortTZID(String shortID, String expectedZone) { |
| Locale l = Locale.forLanguageTag("en-US-u-tz-" + shortID); |
| DateTimeFormatter dtf = |
| DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL) |
| .localizedBy(l); |
| assertEquals(dtf.getZone(), ZoneId.of(expectedZone)); |
| } |
| |
| @Test(dataProvider="getLocalizedDateTimePattern") |
| public void test_getLocalizedDateTimePattern(Locale l, FormatStyle s, String expectedPattern) { |
| DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder(); |
| assertEquals(dtfb.getLocalizedDateTimePattern(s, s, IsoChronology.INSTANCE, l), |
| expectedPattern); |
| } |
| |
| @Test(dataProvider="getDisplayName") |
| public void test_getDisplayName(Locale l, TemporalField f, String expectedName) { |
| assertEquals(f.getDisplayName(l), expectedName); |
| } |
| } |