• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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