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