/* * 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="UtilCalendar") Object[][] dataUtilCalendar() { 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 { new Locale("hi", "IN"), EngName, "R" } }; } @Test(dataProvider="UtilCalendar") 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="JavaTime") Object[][] dataJavaTime() { return new Object[][] { // locale, full, short { 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 { new Locale("el"), EngName, EngName } }; } @Test(dataProvider="JavaTime") 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"); } @Test public void testFormatParseEraName() { 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) { // If an array is defined for Japanese eras in java.time resource, // but an era entry is missing, format fallback to English name // while parse throw DateTimeParseException. num++; System.out.println("Missing java.time resource data for locale: " + locale); } } if (num > 0) { throw new RuntimeException("Missing java.time data for " + num + " locales"); } } }