• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package libcore.libcore.icu;
18 
19 import static org.junit.Assert.assertArrayEquals;
20 import static org.junit.Assert.assertEquals;
21 
22 import android.icu.text.DateTimePatternGenerator;
23 
24 import android.icu.util.VersionInfo;
25 import java.text.DateFormatSymbols;
26 import java.text.DecimalFormatSymbols;
27 import java.text.SimpleDateFormat;
28 import java.util.Calendar;
29 import java.util.Date;
30 import java.util.Locale;
31 import java.util.TimeZone;
32 
33 import libcore.icu.DecimalFormatData;
34 import libcore.icu.LocaleData;
35 import libcore.junit.util.SwitchTargetSdkVersionRule;
36 import libcore.test.annotation.NonCts;
37 import libcore.test.annotation.NonMts;
38 import libcore.test.reasons.NonCtsReasons;
39 import libcore.test.reasons.NonMtsReasons;
40 
41 import org.junit.Assume;
42 import org.junit.Rule;
43 import org.junit.Test;
44 import org.junit.rules.TestRule;
45 import org.junit.runner.RunWith;
46 import org.junit.runners.JUnit4;
47 
48 @NonCts(bug = 287231726, reason = NonCtsReasons.INTERNAL_APIS)
49 @RunWith(JUnit4.class)
50 public class LocaleDataTest {
51 
52   @Rule
53   public TestRule switchTargetSdkVersionRule = SwitchTargetSdkVersionRule.getInstance();
54 
55   @Test
test_en_US()56   public void test_en_US() throws Exception {
57     LocaleData l = LocaleData.get(Locale.US);
58     assertEquals("AM", l.amPm[0]);
59 
60     assertEquals("BC", l.eras[0]);
61 
62     assertEquals("January", l.longMonthNames[0]);
63     assertEquals("Jan", l.shortMonthNames[0]);
64     assertEquals("J", l.tinyMonthNames[0]);
65 
66     assertEquals("January", l.longStandAloneMonthNames[0]);
67     assertEquals("Jan", l.shortStandAloneMonthNames[0]);
68     assertEquals("J", l.tinyStandAloneMonthNames[0]);
69 
70     assertEquals("Sunday", l.longWeekdayNames[1]);
71     assertEquals("Sun", l.shortWeekdayNames[1]);
72     assertEquals("S", l.tinyWeekdayNames[1]);
73 
74     assertEquals("Sunday", l.longStandAloneWeekdayNames[1]);
75     assertEquals("Sun", l.shortStandAloneWeekdayNames[1]);
76     assertEquals("S", l.tinyStandAloneWeekdayNames[1]);
77 
78   }
79 
80   @Test
test_cs_CZ()81   public void test_cs_CZ() throws Exception {
82     LocaleData l = LocaleData.get(new Locale("cs", "CZ"));
83 
84     assertEquals("ledna", l.longMonthNames[0]);
85     assertEquals("led", l.shortMonthNames[0]);
86     assertEquals("1", l.tinyMonthNames[0]);
87 
88     assertEquals("leden", l.longStandAloneMonthNames[0]);
89     assertEquals("led", l.shortStandAloneMonthNames[0]);
90     assertEquals("1", l.tinyStandAloneMonthNames[0]);
91   }
92 
93   @Test
test_ru_RU()94   public void test_ru_RU() throws Exception {
95     Assume.assumeTrue("Require min ICU version 70", VersionInfo.ICU_VERSION.getMajor() >= 70);
96     LocaleData l = LocaleData.get(new Locale("ru", "RU"));
97 
98     assertEquals("воскресенье", l.longWeekdayNames[1]);
99     assertEquals("вс", l.shortWeekdayNames[1]);
100     assertEquals("В", l.tinyWeekdayNames[1]);
101 
102     // Russian stand-alone weekday names have no initial capital since CLDR 28/ICU 56.
103     assertEquals("воскресенье", l.longStandAloneWeekdayNames[1]);
104     assertEquals("вс", l.shortStandAloneWeekdayNames[1]);
105     assertEquals("В", l.tinyStandAloneWeekdayNames[1]);
106   }
107 
108   /**
109    * Check that LocaleData.get() does not throw when the input locale is invalid.
110    * http://b/129070579
111    */
112   @Test
testInvalidLocale()113   public void testInvalidLocale() {
114     LocaleData.get(new Locale("invalidLocale"));
115   }
116 
117   // Test for b/159514442 when targetSdkVersion == current
118   @Test
test_rootLocale_icu4jConsistency()119   public void test_rootLocale_icu4jConsistency() {
120     assertRootDataEqualsToTargetLocaleData(Locale.ROOT);
121   }
122 
123   // Test for b/159514442
124   @Test
125   @SwitchTargetSdkVersionRule.TargetSdkVersion(30)
test_rootLocale_useRealRootLocaleData()126   public void test_rootLocale_useRealRootLocaleData() {
127     assertRootDataEqualsToTargetLocaleData(Locale.ROOT);
128 
129     // Regression test as in b/159514442.
130     SimpleDateFormat df = new SimpleDateFormat("MMM", Locale.ROOT);
131     df.setTimeZone(TimeZone.getTimeZone("GMT"));
132     assertEquals("M07", df.format(new Date(1594255915217L)));
133   }
134 
135   // Test for b/159514442
136   @Test
137   @SwitchTargetSdkVersionRule.TargetSdkVersion(29)
test_rootLocale_notUseRealRootLocaleData()138   public void test_rootLocale_notUseRealRootLocaleData() {
139     Locale LOCALE_EN_US_POSIX = new Locale("en", "US", "POSIX");
140     assertRootDataEqualsToTargetLocaleData(LOCALE_EN_US_POSIX);
141 
142     // Regression test as in b/159514442.
143     SimpleDateFormat df = new SimpleDateFormat("MMM", Locale.ROOT);
144     df.setTimeZone(TimeZone.getTimeZone("GMT"));
145     assertEquals("Jul", df.format(new Date(1594255915217L)));
146   }
147 
assertRootDataEqualsToTargetLocaleData(Locale targetLocale)148   private static void assertRootDataEqualsToTargetLocaleData(Locale targetLocale) {
149     LocaleData localeData = LocaleData.get(Locale.ROOT);
150     DecimalFormatData decimalFormatData = DecimalFormatData.getInstance(Locale.ROOT);
151     Calendar calendar = Calendar.getInstance(Locale.ROOT);
152     android.icu.util.Calendar icuCalendar = android.icu.util.Calendar.getInstance(targetLocale);
153     DateFormatSymbols dateFormatSymbols = DateFormatSymbols.getInstance(Locale.ROOT);
154     android.icu.text.DateFormatSymbols icuDateFormatSymbols =
155         android.icu.text.DateFormatSymbols.getInstance(targetLocale);
156     DecimalFormatSymbols decimalFormatSymbols = DecimalFormatSymbols.getInstance(Locale.ROOT);
157     android.icu.text.DecimalFormatSymbols icuDecimalFormatSymbols =
158         android.icu.text.DecimalFormatSymbols.getInstance(targetLocale);
159     DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(Locale.ROOT);
160 
161     assertEquals(localeData.firstDayOfWeek, (Integer) icuCalendar.getFirstDayOfWeek());
162     assertEquals(localeData.minimalDaysInFirstWeek,
163         (Integer) icuCalendar.getMinimalDaysInFirstWeek());
164 
165     assertArrayEquals(localeData.amPm, icuDateFormatSymbols.getAmPmStrings());
166     assertArrayEquals(localeData.eras, icuDateFormatSymbols.getEras());
167     assertArrayEquals(localeData.longMonthNames, icuDateFormatSymbols.getMonths(
168         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.WIDE));
169     assertArrayEquals(localeData.tinyMonthNames, icuDateFormatSymbols.getMonths(
170         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.NARROW));
171     assertArrayEquals(localeData.shortMonthNames, icuDateFormatSymbols.getMonths(
172         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.ABBREVIATED));
173     assertArrayEquals(localeData.longStandAloneMonthNames, icuDateFormatSymbols.getMonths(
174         android.icu.text.DateFormatSymbols.STANDALONE, android.icu.text.DateFormatSymbols.WIDE));
175     assertArrayEquals(localeData.tinyStandAloneMonthNames, icuDateFormatSymbols.getMonths(
176         android.icu.text.DateFormatSymbols.STANDALONE, android.icu.text.DateFormatSymbols.NARROW));
177     assertArrayEquals(localeData.shortStandAloneMonthNames, icuDateFormatSymbols.getMonths(
178         android.icu.text.DateFormatSymbols.STANDALONE,
179         android.icu.text.DateFormatSymbols.ABBREVIATED));
180     assertArrayEquals(localeData.longWeekdayNames, icuDateFormatSymbols.getWeekdays(
181         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.WIDE));
182     assertArrayEquals(localeData.tinyWeekdayNames, icuDateFormatSymbols.getWeekdays(
183         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.NARROW));
184     assertArrayEquals(localeData.shortWeekdayNames, icuDateFormatSymbols.getWeekdays(
185         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.ABBREVIATED));
186     assertArrayEquals(localeData.longStandAloneWeekdayNames, icuDateFormatSymbols.getWeekdays(
187         android.icu.text.DateFormatSymbols.STANDALONE, android.icu.text.DateFormatSymbols.WIDE));
188     assertArrayEquals(localeData.tinyStandAloneWeekdayNames, icuDateFormatSymbols.getWeekdays(
189         android.icu.text.DateFormatSymbols.STANDALONE, android.icu.text.DateFormatSymbols.NARROW));
190     assertArrayEquals(localeData.shortStandAloneWeekdayNames, icuDateFormatSymbols.getWeekdays(
191         android.icu.text.DateFormatSymbols.STANDALONE,
192         android.icu.text.DateFormatSymbols.ABBREVIATED));
193 
194     // ICU DecimalFormatSymbols has data slightly different from LocaleData, but infinity is known
195     // to be the same, but caused the bug b/68318492 in old Android version.
196     assertEquals(decimalFormatData.getInfinity(), icuDecimalFormatSymbols.getInfinity());
197     assertEquals(decimalFormatSymbols.getInfinity(), icuDecimalFormatSymbols.getInfinity());
198 
199     // Explicitly test Calendar and DateFormatSymbols here because they are known to
200     // cache some part of LocaleData.
201     assertEquals(calendar.getFirstDayOfWeek(), icuCalendar.getFirstDayOfWeek());
202     assertEquals(calendar.getMinimalDaysInFirstWeek(), icuCalendar.getMinimalDaysInFirstWeek());
203     assertArrayEquals(dateFormatSymbols.getAmPmStrings(), icuDateFormatSymbols.getAmPmStrings());
204     assertArrayEquals(dateFormatSymbols.getEras(), icuDateFormatSymbols.getEras());
205 
206     assertArrayEquals(dateFormatSymbols.getMonths(), icuDateFormatSymbols.getMonths(
207         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.WIDE));
208     assertArrayEquals(dateFormatSymbols.getShortMonths(), icuDateFormatSymbols.getMonths(
209         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.ABBREVIATED));
210     assertArrayEquals(dateFormatSymbols.getWeekdays(), icuDateFormatSymbols.getWeekdays(
211         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.WIDE));
212     assertArrayEquals(dateFormatSymbols.getShortWeekdays(), icuDateFormatSymbols.getWeekdays(
213         android.icu.text.DateFormatSymbols.FORMAT, android.icu.text.DateFormatSymbols.ABBREVIATED));
214   }
215 }
216