--- /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"); + } + } +}