1 /* 2 * Copyright (c) 2017, 2020, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package test.java.time.chrono; 27 28 import android.icu.util.VersionInfo; 29 import java.time.*; 30 import java.time.chrono.*; 31 import java.time.format.*; 32 import java.util.Arrays; 33 import java.util.Locale; 34 import java.util.stream.Stream; 35 36 import org.testng.annotations.DataProvider; 37 import org.testng.annotations.Test; 38 import static org.testng.Assert.assertEquals; 39 import static org.testng.Assert.assertFalse; 40 41 /** 42 * Tests Era.getDisplayName() correctly returns the name based on each 43 * chrono implementation. 44 * Note: The exact result may depend on locale data provider's implementation. 45 * 46 * @bug 8171049 8224105 8240626 47 */ 48 @Test 49 public class TestEraDisplayName { 50 private static final Locale THAI = Locale.forLanguageTag("th-TH"); 51 private static final Locale EGYPT = Locale.forLanguageTag("ar-EG"); 52 53 private static final LocalDate REIWA_1ST = LocalDate.of(2019, 5, 1); 54 private static final DateTimeFormatter JAPANESE_FORMATTER = 55 DateTimeFormatter.ofPattern("yyyy MM dd GGGG G GGGGG") 56 .withChronology(JapaneseChronology.INSTANCE); 57 58 @DataProvider(name="eraDisplayName") eraDisplayName()59 Object[][] eraDisplayName() { 60 return new Object[][] { 61 // Era, text style, displyay locale, expected name 62 // IsoEra 63 { IsoEra.BCE, TextStyle.FULL, Locale.US, "Before Christ" }, 64 { IsoEra.CE, TextStyle.FULL, Locale.US, "Anno Domini" }, 65 { IsoEra.BCE, TextStyle.FULL, Locale.JAPAN, "\u7d00\u5143\u524d" }, 66 { IsoEra.CE, TextStyle.FULL, Locale.JAPAN, "\u897f\u66a6" }, 67 { IsoEra.BCE, TextStyle.SHORT, Locale.US, "BC" }, 68 { IsoEra.CE, TextStyle.SHORT, Locale.US, "AD" }, 69 { IsoEra.BCE, TextStyle.SHORT, Locale.JAPAN, "\u7d00\u5143\u524d" }, 70 { IsoEra.CE, TextStyle.SHORT, Locale.JAPAN, "\u897f\u66a6" }, 71 { IsoEra.BCE, TextStyle.NARROW, Locale.US, "B" }, 72 { IsoEra.CE, TextStyle.NARROW, Locale.US, "A" }, 73 { IsoEra.BCE, TextStyle.NARROW, Locale.JAPAN, "BC" }, 74 { IsoEra.CE, TextStyle.NARROW, Locale.JAPAN, "AD" }, 75 76 // JapaneseEra 77 { JapaneseEra.MEIJI, TextStyle.FULL, Locale.US, "Meiji" }, 78 { JapaneseEra.TAISHO, TextStyle.FULL, Locale.US, "Taish\u014d" }, 79 { JapaneseEra.SHOWA, TextStyle.FULL, Locale.US, "Sh\u014dwa" }, 80 { JapaneseEra.HEISEI, TextStyle.FULL, Locale.US, "Heisei" }, 81 { JapaneseEra.REIWA, TextStyle.FULL, Locale.US, "Reiwa" }, 82 { JapaneseEra.MEIJI, TextStyle.FULL, Locale.JAPAN, "\u660e\u6cbb" }, 83 { JapaneseEra.TAISHO, TextStyle.FULL, Locale.JAPAN, "\u5927\u6b63" }, 84 { JapaneseEra.SHOWA, TextStyle.FULL, Locale.JAPAN, "\u662d\u548c" }, 85 { JapaneseEra.HEISEI, TextStyle.FULL, Locale.JAPAN, "\u5e73\u6210" }, 86 { JapaneseEra.REIWA, TextStyle.FULL, Locale.JAPAN, "\u4ee4\u548c" }, 87 { JapaneseEra.MEIJI, TextStyle.SHORT, Locale.US, "Meiji" }, 88 { JapaneseEra.TAISHO, TextStyle.SHORT, Locale.US, "Taish\u014d" }, 89 { JapaneseEra.SHOWA, TextStyle.SHORT, Locale.US, "Sh\u014dwa" }, 90 { JapaneseEra.HEISEI, TextStyle.SHORT, Locale.US, "Heisei" }, 91 { JapaneseEra.REIWA, TextStyle.SHORT, Locale.US, "Reiwa" }, 92 { JapaneseEra.MEIJI, TextStyle.SHORT, Locale.JAPAN, "\u660e\u6cbb" }, 93 { JapaneseEra.TAISHO, TextStyle.SHORT, Locale.JAPAN, "\u5927\u6b63" }, 94 { JapaneseEra.SHOWA, TextStyle.SHORT, Locale.JAPAN, "\u662d\u548c" }, 95 { JapaneseEra.HEISEI, TextStyle.SHORT, Locale.JAPAN, "\u5e73\u6210" }, 96 { JapaneseEra.REIWA, TextStyle.SHORT, Locale.JAPAN, "\u4ee4\u548c" }, 97 { JapaneseEra.MEIJI, TextStyle.NARROW, Locale.US, "M" }, 98 { JapaneseEra.TAISHO, TextStyle.NARROW, Locale.US, "T" }, 99 { JapaneseEra.SHOWA, TextStyle.NARROW, Locale.US, "S" }, 100 { JapaneseEra.HEISEI, TextStyle.NARROW, Locale.US, "H" }, 101 { JapaneseEra.REIWA, TextStyle.NARROW, Locale.US, "R" }, 102 { JapaneseEra.MEIJI, TextStyle.NARROW, Locale.JAPAN, "M" }, 103 { JapaneseEra.TAISHO, TextStyle.NARROW, Locale.JAPAN, "T" }, 104 { JapaneseEra.SHOWA, TextStyle.NARROW, Locale.JAPAN, "S" }, 105 { JapaneseEra.HEISEI, TextStyle.NARROW, Locale.JAPAN, "H" }, 106 { JapaneseEra.REIWA, TextStyle.NARROW, Locale.JAPAN, "R" }, 107 108 // ThaiBuddhistEra 109 // Android-changed: Android uses CLDR data. 110 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, Locale.US, "BC" }, 111 // { ThaiBuddhistEra.BE, TextStyle.FULL, Locale.US, "BE" }, 112 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, THAI, "BC" }, 113 // { ThaiBuddhistEra.BE, TextStyle.FULL, THAI, 114 // "\u0e1e\u0e38\u0e17\u0e18\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a" }, 115 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, Locale.US, "BC" }, 116 // { ThaiBuddhistEra.BE, TextStyle.SHORT, Locale.US, "BE" }, 117 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, THAI, "BC" }, 118 // { ThaiBuddhistEra.BE, TextStyle.SHORT, THAI, "\u0e1e.\u0e28." }, 119 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, Locale.US, "BC" }, 120 // { ThaiBuddhistEra.BE, TextStyle.NARROW, Locale.US, "BE" }, 121 // { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, THAI, "BC" }, 122 // { ThaiBuddhistEra.BE, TextStyle.NARROW, THAI, "\u0e1e.\u0e28." }, 123 { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, Locale.US, "0" }, 124 { ThaiBuddhistEra.BE, TextStyle.FULL, Locale.US, "BE" }, 125 { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, THAI, "0" }, 126 { ThaiBuddhistEra.BE, TextStyle.FULL, THAI, 127 "\u0e1e\u0e38\u0e17\u0e18\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a" }, 128 { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, Locale.US, "0" }, 129 { ThaiBuddhistEra.BE, TextStyle.SHORT, Locale.US, "BE" }, 130 { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, THAI, "0" }, 131 { ThaiBuddhistEra.BE, TextStyle.SHORT, THAI, "\u0e1e.\u0e28." }, 132 { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, Locale.US, "0" }, 133 { ThaiBuddhistEra.BE, TextStyle.NARROW, Locale.US, "BE" }, 134 { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, THAI, "0" }, 135 { ThaiBuddhistEra.BE, TextStyle.NARROW, THAI, "\u0e1e.\u0e28." }, 136 137 // MinguoEra 138 // Android-changed: Android uses CLDR data. 139 // { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.US, "Before R.O.C." }, 140 // { MinguoEra.ROC, TextStyle.FULL, Locale.US, "Minguo" }, 141 // { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 142 // { MinguoEra.ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b" }, 143 // { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.US, "Before R.O.C." }, 144 // { MinguoEra.ROC, TextStyle.SHORT, Locale.US, "Minguo" }, 145 // { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 146 // { MinguoEra.ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b" }, 147 // { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.US, "Before R.O.C." }, 148 // { MinguoEra.ROC, TextStyle.NARROW, Locale.US, "Minguo" }, 149 // { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 150 // { MinguoEra.ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b" }, 151 { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.US, "B.R.O.C." }, 152 { MinguoEra.ROC, TextStyle.FULL, Locale.US, "Minguo" }, 153 { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 154 { MinguoEra.ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b" }, 155 { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.US, "B.R.O.C." }, 156 { MinguoEra.ROC, TextStyle.SHORT, Locale.US, "Minguo" }, 157 { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 158 { MinguoEra.ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b" }, 159 { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.US, "B.R.O.C." }, 160 { MinguoEra.ROC, TextStyle.NARROW, Locale.US, "Minguo" }, 161 { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b\u524d" }, 162 { MinguoEra.ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b" }, 163 164 // HijrahEra 165 { HijrahEra.AH, TextStyle.FULL, Locale.US, "AH" }, 166 { HijrahEra.AH, TextStyle.FULL, EGYPT, "\u0647\u0640" }, 167 { HijrahEra.AH, TextStyle.SHORT, Locale.US, "AH" }, 168 { HijrahEra.AH, TextStyle.SHORT, EGYPT, "\u0647\u0640" }, 169 { HijrahEra.AH, TextStyle.NARROW, Locale.US, "AH" }, 170 { HijrahEra.AH, TextStyle.NARROW, EGYPT, "\u0647\u0640" }, 171 }; 172 } 173 174 @DataProvider allLocales()175 Object[][] allLocales() { 176 return Arrays.stream(Locale.getAvailableLocales()) 177 .map(Stream::of) 178 .map(Stream::toArray) 179 .toArray(Object[][]::new); 180 } 181 182 @DataProvider allEras()183 Object[][] allEras() { 184 return Stream.of(IsoEra.values(), 185 JapaneseEra.values(), 186 HijrahEra.values(), 187 ThaiBuddhistEra.values(), 188 MinguoEra.values()) 189 .flatMap(v -> Arrays.stream(v)) 190 .map(Stream::of) 191 .map(Stream::toArray) 192 .toArray(Object[][]::new); 193 } 194 195 @Test(dataProvider="eraDisplayName") test_eraDisplayName(Era era, TextStyle style, Locale locale, String expected)196 public void test_eraDisplayName(Era era, TextStyle style, Locale locale, String expected) { 197 // Android-added: The ICU data is different before ICU version 70. http://b/229960530 198 if (VersionInfo.ICU_VERSION.getMajor() < 70) { 199 return; 200 } 201 assertEquals(era.getDisplayName(style, locale), expected); 202 } 203 204 @Test(dataProvider="allLocales") test_reiwaNames(Locale locale)205 public void test_reiwaNames(Locale locale) throws DateTimeParseException { 206 DateTimeFormatter f = JAPANESE_FORMATTER.withLocale(locale); 207 assertEquals(LocalDate.parse(REIWA_1ST.format(f), f), REIWA_1ST); 208 } 209 210 // Make sure era display names aren't empty 211 // @bug 8240626 212 @Test(dataProvider="allEras") test_noEmptyEraNames(Era era)213 public void test_noEmptyEraNames(Era era) { 214 Arrays.stream(Locale.getAvailableLocales()) 215 .forEach(l -> { 216 Arrays.stream(TextStyle.values()) 217 .forEach(s -> { 218 assertFalse(era.getDisplayName(s, l).isEmpty(), 219 "getDisplayName() returns empty display name for era: " + era 220 + ", style: " + s + ", locale: " + l); 221 }); 222 }); 223 } 224 } 225