--- old/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ar.java 2019-05-17 16:39:49.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ar.java 2019-05-17 16:39:49.000000000 +0800 @@ -212,6 +212,7 @@ "\u062a\u064a\u0634\u0648", "\u0634\u0648\u0648\u0627", "\u0647\u064a\u0633\u064a", + "\u0631\u064a\u0648\u0627", } }, { "japanese.short.Eras", @@ -221,6 +222,7 @@ "\u062a\u064a\u0634\u0648", "\u0634\u0648\u0648\u0627", "\u0647\u064a\u0633\u064a", + "\u0631\u064a\u0648\u0627", } }, { "buddhist.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ko.java 2019-05-17 16:39:50.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ko.java 2019-05-17 16:39:50.000000000 +0800 @@ -192,6 +192,7 @@ "\ub2e4\uc774\uc1fc", "\uc1fc\uc640", "\ud5e4\uc774\uc138\uc774", + "\ub808\uc774\uc640", } }, { "AmPmMarkers", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_th.java 2019-05-17 16:39:51.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_th.java 2019-05-17 16:39:51.000000000 +0800 @@ -245,6 +245,7 @@ "\u0e17\u0e30\u0e2d\u0e34\u0e42\u0e0a", "\u0e42\u0e0a\u0e27\u0e30", "\u0e40\u0e2e\u0e40\u0e0b", + "\u0e40\u0e23\u0e27\u0e30", } }, { "japanese.short.Eras", @@ -254,6 +255,7 @@ "\u0e17", "\u0e0a", "\u0e2e", + "R", } }, { "buddhist.TimePatterns", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java 2019-05-17 16:39:52.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java 2019-05-17 16:39:52.000000000 +0800 @@ -282,6 +282,7 @@ "\u5927\u6b63", "\u662d\u548c", "\u5e73\u6210", + "\u4ee4\u548c", } }, { "TimePatterns", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ar.java 2019-05-17 16:39:53.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ar.java 2019-05-17 16:39:53.000000000 +0800 @@ -157,6 +157,7 @@ "\u062a\u064a\u0634\u0648", "\u0634\u0648\u0648\u0627", "\u0647\u064a\u0633\u064a", + "\u0631\u064a\u0648\u0627", }; final String[] sharedShortEras = { --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_hi_IN.java 2019-05-17 16:39:55.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_hi_IN.java 2019-05-17 16:39:54.000000000 +0800 @@ -241,6 +241,7 @@ "\u0924\u093e\u0908\u0936\u094b", "\u0936\u094b\u0935\u093e", "\u0939\u0947\u0908\u0938\u0947\u0908", + "\u0930\u0947\u0907\u0935\u093e", } }, { "java.time.japanese.short.Eras", @@ -250,6 +251,7 @@ "\u0924\u093e\u0908\u0936\u094b", "\u0936\u094b\u0935\u093e", "\u0939\u0947\u0908\u0938\u0947\u0908", + "\u0930\u0947\u0907\u0935\u093e", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_hr.java 2019-05-17 16:39:56.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_hr.java 2019-05-17 16:39:55.000000000 +0800 @@ -231,6 +231,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.japanese.short.Eras", @@ -240,6 +241,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_in.java 2019-05-17 16:39:57.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_in.java 2019-05-17 16:39:57.000000000 +0800 @@ -148,6 +148,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", }; final String[] sharedEras = { --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ko.java 2019-05-17 16:39:58.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ko.java 2019-05-17 16:39:58.000000000 +0800 @@ -143,6 +143,7 @@ "\ub2e4\uc774\uc1fc", "\uc1fc\uc640", "\ud5e4\uc774\uc138\uc774", + "\ub808\uc774\uc640", }; final String[] sharedJavaTimeShortEras2 = { --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_lt.java 2019-05-17 16:39:59.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_lt.java 2019-05-17 16:39:59.000000000 +0800 @@ -223,6 +223,7 @@ "Tai\u0161o", "\u0160ova", "Heisei", + "Reiwa", } }, { "java.time.japanese.short.Eras", @@ -232,6 +233,7 @@ "Tai\u0161o", "\u0160ova", "Heisei", + "Reiwa", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_nl.java 2019-05-17 16:40:01.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_nl.java 2019-05-17 16:40:00.000000000 +0800 @@ -265,6 +265,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.japanese.short.Eras", @@ -274,6 +275,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_no.java 2019-05-17 16:40:02.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_no.java 2019-05-17 16:40:01.000000000 +0800 @@ -283,6 +283,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.japanese.short.Eras", @@ -292,6 +293,7 @@ "T", "S", "H", + "R", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ru.java 2019-05-17 16:40:03.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_ru.java 2019-05-17 16:40:02.000000000 +0800 @@ -237,6 +237,7 @@ "\u042d\u043f\u043e\u0445\u0430 \u0422\u0430\u0439\u0441\u044c\u043e", "\u0421\u044c\u043e\u0432\u0430", "\u042d\u043f\u043e\u0445\u0430 \u0425\u044d\u0439\u0441\u044d\u0439", + "\u0420\u044d\u0439\u0432\u0430", } }, { "java.time.japanese.short.Eras", @@ -246,6 +247,7 @@ "\u042d\u043f\u043e\u0445\u0430 \u0422\u0430\u0439\u0441\u044c\u043e", "\u0421\u044c\u043e\u0432\u0430", "\u042d\u043f\u043e\u0445\u0430 \u0425\u044d\u0439\u0441\u044d\u0439", + "\u0420\u044d\u0439\u0432\u0430", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sr.java 2019-05-17 16:40:04.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sr.java 2019-05-17 16:40:04.000000000 +0800 @@ -280,6 +280,7 @@ "\u0422\u0430\u0438\u0448\u043e", "\u0428\u043e\u0432\u0430", "\u0425\u0430\u0438\u0441\u0435\u0438", + "\u0420\u0435\u0438\u0432\u0430", } }, { "java.time.japanese.short.Eras", @@ -289,6 +290,7 @@ "\u0422\u0430\u0438\u0448\u043e", "\u0428\u043e\u0432\u0430", "\u0425\u0430\u0438\u0441\u0435\u0438", + "\u0420\u0435\u0438\u0432\u0430", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sr_Latn.java 2019-05-17 16:40:05.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sr_Latn.java 2019-05-17 16:40:05.000000000 +0800 @@ -225,6 +225,7 @@ "Tai\u0161o", "\u0160ova", "Haisei", + "Reiva", } }, { "java.time.japanese.short.Eras", @@ -234,6 +235,7 @@ "Tai\u0161o", "\u0160ova", "Haisei", + "Reiva", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sv.java 2019-05-17 16:40:06.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_sv.java 2019-05-17 16:40:06.000000000 +0800 @@ -249,6 +249,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.japanese.short.Eras", @@ -258,6 +259,7 @@ "Taish\u014d", "Sh\u014dwa", "Heisei", + "Reiwa", } }, { "java.time.long.Eras", --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_th.java 2019-05-17 16:40:08.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_th.java 2019-05-17 16:40:07.000000000 +0800 @@ -137,6 +137,7 @@ "\u0e17\u0e30\u0e2d\u0e34\u0e42\u0e0a", "\u0e42\u0e0a\u0e27\u0e30", "\u0e40\u0e2e\u0e40\u0e0b", + "\u0e40\u0e23\u0e27\u0e30", }; final String[] sharedShortEras = { --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_zh.java 2019-05-17 16:40:09.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_zh.java 2019-05-17 16:40:08.000000000 +0800 @@ -176,6 +176,7 @@ "\u5927\u6b63", "\u662d\u548c", "\u5e73\u6210", + "\u4ee4\u548c", }; final String[] sharedJavaTimeShortEras2 = { --- old/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_zh_TW.java 2019-05-17 16:40:10.000000000 +0800 +++ new/src/jdk.localedata/share/classes/sun/text/resources/ext/JavaTimeSupplementary_zh_TW.java 2019-05-17 16:40:10.000000000 +0800 @@ -135,6 +135,7 @@ "\u5927\u6b63", "\u662d\u548c", "\u5e73\u6210", + "\u4ee4\u548c", }; final String[] sharedJavaTimeShortEras2 = { --- /dev/null 2019-05-17 16:40:11.000000000 +0800 +++ new/test/jdk/java/util/Calendar/JapanEraNameCompatTest.java 2019-05-17 16:40:11.000000000 +0800 @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2019, 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 8218781 + * @summary Test the localized names of Japanese era Reiwa from COMPAT provider. + * @modules jdk.localedata + * @run testng/othervm -Djava.locale.providers=COMPAT JapanEraNameCompatTest + */ + +import static java.util.Calendar.*; +import static java.util.Locale.*; + +import java.time.LocalDate; +import java.time.chrono.JapaneseChronology; +import java.time.chrono.JapaneseEra; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.format.TextStyle; +import java.util.Calendar; +import java.util.Locale; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; + +@Test +public class JapanEraNameCompatTest { + static final Calendar c = new Calendar.Builder() + .setCalendarType("japanese") + .setFields(ERA, 5, YEAR, 1, MONTH, MAY, DAY_OF_MONTH, 1) + .build(); + static final String EngName = "Reiwa"; + static final String CJName = "\u4ee4\u548c"; + static final String KoreanName = "\ub808\uc774\uc640"; + static final String ArabicName = "\u0631\u064a\u0648\u0627"; + static final String ThaiName = "\u0e40\u0e23\u0e27\u0e30"; + static final String HindiName = "\u0930\u0947\u0907\u0935\u093e"; + static final String RussianName = "\u0420\u044d\u0439\u0432\u0430"; + static final String SerbianName = "\u0420\u0435\u0438\u0432\u0430"; + static final String SerbLatinName = "Reiva"; + + @DataProvider(name="FormatData") + Object[][] dataFormatData() { + return new Object[][] { + //locale, long, short + { JAPAN, CJName, "R" }, + { KOREAN, KoreanName, "R" }, + { CHINA, CJName, "R" }, + { TAIWAN, CJName, "R" }, // fallback to zh + { new Locale("ar"), ArabicName, ArabicName }, + { new Locale("th"), ThaiName, "R" }, + // hi_IN fallback to root in FormatData resources + { new Locale("hi", "IN"), EngName, "R" } + }; + } + + @Test(dataProvider="FormatData") + public void testCalendarEraDisplayName(Locale locale, + String longName, String shortName) { + assertEquals(c.getDisplayName(ERA, LONG, locale), longName); + assertEquals(c.getDisplayName(ERA, SHORT, locale), shortName); + } + + @DataProvider(name="JavaTimeSupplementary") + Object[][] dataJTS() { + return new Object[][] { + // JavaTimeSupplementary + { JAPAN, CJName, CJName }, + { KOREAN, KoreanName, KoreanName }, + { CHINA, CJName, CJName }, + { TAIWAN, CJName, CJName }, + { new Locale("ar"), ArabicName, ArabicName }, + { new Locale("th"), ThaiName, ThaiName }, + { new Locale("hi", "IN"), HindiName, HindiName }, + { new Locale("ru"), RussianName, RussianName }, + { new Locale("sr"), SerbianName, SerbianName }, + { Locale.forLanguageTag("sr-Latn"), SerbLatinName, SerbLatinName }, + { new Locale("hr"), EngName, EngName }, + { new Locale("in"), EngName, EngName }, + { new Locale("lt"), EngName, EngName }, + { new Locale("nl"), EngName, EngName }, + { new Locale("no"), EngName, "R" }, + { new Locale("sv"), EngName, EngName }, + // el fallback to root in JTS resources + { new Locale("el"), EngName, EngName } + }; + } + + @Test(dataProvider="JavaTimeSupplementary") + public void testChronoJapanEraDisplayName(Locale locale, + String fullName, String shortName) { + + JapaneseEra era = JapaneseEra.valueOf("Reiwa"); + assertEquals(era.getDisplayName(TextStyle.FULL, locale), fullName); + assertEquals(era.getDisplayName(TextStyle.SHORT, locale), shortName); + assertEquals(era.getDisplayName(TextStyle.NARROW, locale), "R"); + } + + // If in JTS resource defined the Japanese era array, but missing the elem + // of Reiwa, parse would throw the DateTimeParseException. + @Test + public void findMissingJTS() { + LocalDate date = LocalDate.of(2019, 5, 1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd GGGG"); + formatter = formatter.withChronology(JapaneseChronology.INSTANCE); + + int num = 0; + for (Locale locale : Calendar.getAvailableLocales()) { + formatter = formatter.withLocale(locale); + try { + LocalDate.parse(date.format(formatter), formatter); + } catch (DateTimeParseException e) { + num++; + System.out.println("Missing JTS data for locale: " + locale); + } + } + if (num > 0) { + throw new RuntimeException("Missing some JTS data update"); + } + } +}