1 // Copyright 2017 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base; 6 7 import android.annotation.SuppressLint; 8 import android.content.res.Configuration; 9 import android.os.Build; 10 import android.os.LocaleList; 11 12 import androidx.test.filters.SmallTest; 13 14 import org.junit.Assert; 15 import org.junit.Test; 16 import org.junit.runner.RunWith; 17 18 import org.chromium.base.test.BaseJUnit4ClassRunner; 19 import org.chromium.base.test.util.MinAndroidSdkLevel; 20 21 import java.util.Locale; 22 23 /** 24 * Tests for the LocaleUtils class. 25 */ 26 @RunWith(BaseJUnit4ClassRunner.class) 27 public class LocaleUtilsTest { 28 // This is also a part of test for toLanguageTag when API level is lower than 24 29 @Test 30 @SmallTest testGetUpdatedLanguageForChromium()31 public void testGetUpdatedLanguageForChromium() { 32 String language = "en"; 33 String updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language); 34 Assert.assertEquals(language, updatedLanguage); 35 36 language = "iw"; 37 updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language); 38 Assert.assertEquals("he", updatedLanguage); 39 40 language = "ji"; 41 updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language); 42 Assert.assertEquals("yi", updatedLanguage); 43 44 language = "in"; 45 updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language); 46 Assert.assertEquals("id", updatedLanguage); 47 48 language = "tl"; 49 updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language); 50 Assert.assertEquals("fil", updatedLanguage); 51 } 52 53 // This is also a part of test for toLanguageTags when API level is 24 or higher 54 @Test 55 @SmallTest 56 @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) testGetUpdatedLocaleForChromium()57 public void testGetUpdatedLocaleForChromium() { 58 Locale locale = new Locale("jp"); 59 Locale updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale); 60 Assert.assertEquals(locale, updatedLocale); 61 62 locale = new Locale("iw"); 63 updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale); 64 Assert.assertEquals(new Locale("he"), updatedLocale); 65 66 locale = new Locale("ji"); 67 updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale); 68 Assert.assertEquals(new Locale("yi"), updatedLocale); 69 70 locale = new Locale("in"); 71 updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale); 72 Assert.assertEquals(new Locale("id"), updatedLocale); 73 74 locale = new Locale("tl"); 75 updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale); 76 Assert.assertEquals(new Locale("fil"), updatedLocale); 77 } 78 79 // This is also a part of test for forLanguageTag when API level is lower than 21 80 @Test 81 @SmallTest testGetUpdatedLanguageForAndroid()82 public void testGetUpdatedLanguageForAndroid() { 83 String language = "en"; 84 String updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language); 85 Assert.assertEquals(language, updatedLanguage); 86 87 language = "und"; 88 updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language); 89 Assert.assertEquals("", updatedLanguage); 90 91 language = "fil"; 92 updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language); 93 Assert.assertEquals("tl", updatedLanguage); 94 } 95 96 // This is also a part of test for forLanguageTag when API level is 21 or higher 97 @Test 98 @SmallTest 99 @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) testGetUpdatedLocaleForAndroid()100 public void testGetUpdatedLocaleForAndroid() { 101 Locale locale = new Locale("jp"); 102 Locale updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale); 103 Assert.assertEquals(locale, updatedLocale); 104 105 locale = new Locale("und"); 106 updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale); 107 Assert.assertEquals(new Locale(""), updatedLocale); 108 109 locale = new Locale("fil"); 110 updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale); 111 Assert.assertEquals(new Locale("tl"), updatedLocale); 112 } 113 114 // Test for toLanguageTag when API level is lower than 24 115 @Test 116 @SmallTest testToLanguageTag()117 public void testToLanguageTag() { 118 Locale locale = new Locale("en", "US"); 119 String localeString = LocaleUtils.toLanguageTag(locale); 120 Assert.assertEquals("en-US", localeString); 121 122 locale = new Locale("jp"); 123 localeString = LocaleUtils.toLanguageTag(locale); 124 Assert.assertEquals("jp", localeString); 125 126 locale = new Locale("mas"); 127 localeString = LocaleUtils.toLanguageTag(locale); 128 Assert.assertEquals("mas", localeString); 129 130 locale = new Locale("es", "005"); 131 localeString = LocaleUtils.toLanguageTag(locale); 132 Assert.assertEquals("es-005", localeString); 133 134 locale = new Locale("iw"); 135 localeString = LocaleUtils.toLanguageTag(locale); 136 Assert.assertEquals("he", localeString); 137 138 locale = new Locale("ji"); 139 localeString = LocaleUtils.toLanguageTag(locale); 140 Assert.assertEquals("yi", localeString); 141 142 locale = new Locale("in", "ID"); 143 localeString = LocaleUtils.toLanguageTag(locale); 144 Assert.assertEquals("id-ID", localeString); 145 146 locale = new Locale("tl", "PH"); 147 localeString = LocaleUtils.toLanguageTag(locale); 148 Assert.assertEquals("fil-PH", localeString); 149 150 locale = new Locale("no", "NO", "NY"); 151 localeString = LocaleUtils.toLanguageTag(locale); 152 Assert.assertEquals("nn-NO", localeString); 153 } 154 155 // Test for toLanguageTags when API level is 24 or higher 156 @Test 157 @SmallTest 158 @MinAndroidSdkLevel(Build.VERSION_CODES.N) 159 @SuppressLint("NewApi") testToLanguageTags()160 public void testToLanguageTags() { 161 Locale locale1 = new Locale("en", "US"); 162 Locale locale2 = new Locale("es", "005"); 163 LocaleList localeList = new LocaleList(locale1, locale2); 164 String localeString = LocaleUtils.toLanguageTags(localeList); 165 Assert.assertEquals("en-US,es-005", localeString); 166 167 locale1 = new Locale("jp"); 168 locale2 = new Locale("mas"); 169 localeList = new LocaleList(locale1, locale2); 170 localeString = LocaleUtils.toLanguageTags(localeList); 171 Assert.assertEquals("jp,mas", localeString); 172 173 locale1 = new Locale("iw"); 174 locale2 = new Locale("ji"); 175 localeList = new LocaleList(locale1, locale2); 176 localeString = LocaleUtils.toLanguageTags(localeList); 177 Assert.assertEquals("he,yi", localeString); 178 179 locale1 = new Locale("in", "ID"); 180 locale2 = new Locale("tl", "PH"); 181 localeList = new LocaleList(locale1, locale2); 182 localeString = LocaleUtils.toLanguageTags(localeList); 183 Assert.assertEquals("id-ID,fil-PH", localeString); 184 185 locale1 = new Locale("no", "NO", "NY"); 186 localeList = new LocaleList(locale1); 187 localeString = LocaleUtils.toLanguageTags(localeList); 188 Assert.assertEquals("nn-NO", localeString); 189 } 190 191 // Test for forLanguageTag when API level is lower than 21 192 @Test 193 @SmallTest testForLanguageTagCompat()194 public void testForLanguageTagCompat() { 195 String languageTag = ""; 196 Locale locale = new Locale(""); 197 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 198 199 languageTag = "und"; 200 locale = new Locale(""); 201 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 202 203 languageTag = "en"; 204 locale = new Locale("en"); 205 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 206 207 languageTag = "mas"; 208 locale = new Locale("mas"); 209 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 210 211 languageTag = "en-GB"; 212 locale = new Locale("en", "GB"); 213 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 214 215 languageTag = "es-419"; 216 locale = new Locale("es", "419"); 217 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 218 219 // Tests if updated Chromium language code and deprecated language code 220 // are pointing to the same Locale Object. 221 languageTag = "he"; 222 locale = new Locale("iw"); 223 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 224 225 languageTag = "iw"; 226 locale = new Locale("he"); 227 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 228 229 languageTag = "ji"; 230 locale = new Locale("yi"); 231 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 232 233 languageTag = "yi"; 234 locale = new Locale("ji"); 235 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 236 237 languageTag = "in"; 238 locale = new Locale("id"); 239 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 240 241 languageTag = "id"; 242 locale = new Locale("in"); 243 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 244 245 // Tests for Tagalog/Filipino if updated Chromium language code and 246 // language code are pointing to the same Locale Object. 247 languageTag = "tl"; 248 locale = new Locale("tl"); 249 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 250 251 languageTag = "fil"; 252 locale = new Locale("tl"); 253 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 254 255 // Test with invalid inputs. 256 languageTag = "notValidLanguage"; 257 locale = new Locale(""); 258 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 259 260 languageTag = "en-notValidCountry"; 261 locale = new Locale("en"); 262 Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag)); 263 } 264 265 // Test for toLanguage. 266 @Test 267 @SmallTest testToLanguage()268 public void testToLanguage() { 269 Assert.assertEquals("en", LocaleUtils.toBaseLanguage("en-US")); 270 Assert.assertEquals("en", LocaleUtils.toBaseLanguage("en")); 271 Assert.assertEquals("", LocaleUtils.toBaseLanguage("-")); 272 Assert.assertEquals("", LocaleUtils.toBaseLanguage("-US")); 273 Assert.assertEquals("", LocaleUtils.toBaseLanguage("")); 274 Assert.assertEquals("fil", LocaleUtils.toBaseLanguage("fil")); 275 } 276 277 // Test for isBaseLanguageEqual 278 @Test 279 @SmallTest testIsBaseLanguageEqual()280 public void testIsBaseLanguageEqual() { 281 Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt-PT", "pt-PT")); 282 Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt-PT", "pt")); 283 Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt", "pt-PT-xx")); 284 Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("zh-Hans-CN", "zh-HK")); 285 Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("", "")); 286 287 Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("en-US", "es-US")); 288 Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("af", "zu")); 289 Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("af", "")); 290 Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("", "zu")); 291 } 292 293 // Test for getConfigurationLocale < N 294 @Test 295 @SmallTest testGetConfigurationLocale()296 public void testGetConfigurationLocale() { 297 Configuration config = new Configuration(); 298 Assert.assertEquals("", LocaleUtils.getConfigurationLanguage(config)); 299 300 config.setLocale(Locale.forLanguageTag("hi-IN")); 301 Assert.assertEquals("hi-IN", LocaleUtils.getConfigurationLanguage(config)); 302 303 config.setLocale(new Locale("ar")); 304 Assert.assertEquals("ar", LocaleUtils.getConfigurationLanguage(config)); 305 } 306 307 // Test for getConfigurationLocale N+ (with LocaleList) 308 @Test 309 @SmallTest 310 @MinAndroidSdkLevel(Build.VERSION_CODES.N) testGetConfigurationN()311 public void testGetConfigurationN() { 312 Configuration config = new Configuration(); 313 314 Locale locale1 = new Locale("hi", "IN"); 315 Locale locale2 = new Locale("tl", "PH"); 316 LocaleList localeList = new LocaleList(locale1, locale2); 317 config.setLocales(localeList); 318 Assert.assertEquals("hi-IN", LocaleUtils.getConfigurationLanguage(config)); 319 320 locale1 = new Locale("ceb"); 321 locale2 = new Locale("tl", "PH"); 322 localeList = new LocaleList(locale1, locale2); 323 config.setLocales(localeList); 324 Assert.assertEquals("ceb", LocaleUtils.getConfigurationLanguage(config)); 325 } 326 327 // Test for setDefaultLocalesFromConfiguration 328 @Test 329 @SmallTest testSetDefaultLocalesFromConfiguration()330 public void testSetDefaultLocalesFromConfiguration() { 331 Configuration config = new Configuration(); 332 config.setLocale(new Locale("tl", "PH")); 333 LocaleUtils.setDefaultLocalesFromConfiguration(config); 334 Assert.assertEquals("tl-PH", Locale.getDefault().toLanguageTag()); 335 336 config.setLocale(new Locale("es", "AR")); 337 LocaleUtils.setDefaultLocalesFromConfiguration(config); 338 Assert.assertEquals("es-AR", Locale.getDefault().toLanguageTag()); 339 } 340 341 // Test for setDefaultLocalesFromConfiguration N+ (with LocaleList) 342 @Test 343 @SmallTest 344 @MinAndroidSdkLevel(Build.VERSION_CODES.N) testSetDefaultLocalesFromConfigurationN()345 public void testSetDefaultLocalesFromConfigurationN() { 346 Configuration config = new Configuration(); 347 String tags = "tl-PH,es-AR,en"; 348 config.setLocales(LocaleList.forLanguageTags(tags)); 349 LocaleUtils.setDefaultLocalesFromConfiguration(config); 350 Assert.assertEquals("tl-PH", Locale.getDefault().toLanguageTag()); 351 Assert.assertEquals(tags, LocaleList.getDefault().toLanguageTags()); 352 353 tags = "en,en-US,en-GB"; 354 config.setLocales(LocaleList.forLanguageTags(tags)); 355 LocaleUtils.setDefaultLocalesFromConfiguration(config); 356 Assert.assertEquals("en", Locale.getDefault().toLanguageTag()); 357 Assert.assertEquals(tags, LocaleList.getDefault().toLanguageTags()); 358 } 359 360 // Test for prependToLocaleList 361 @Test 362 @SmallTest 363 @MinAndroidSdkLevel(Build.VERSION_CODES.N) testPrependToLocaleList()364 public void testPrependToLocaleList() { 365 // Prepend to empty list 366 LocaleList resultList = LocaleUtils.ApisN.prependToLocaleList("ceb-PH", new LocaleList()); 367 Assert.assertEquals("ceb-PH", resultList.toLanguageTags()); 368 369 // Prepend and not in list 370 LocaleList baseList = LocaleList.forLanguageTags("en,es-ES,fr"); 371 resultList = LocaleUtils.ApisN.prependToLocaleList("zu", baseList); 372 Assert.assertEquals("zu,en,es-ES,fr", resultList.toLanguageTags()); 373 374 // Prepend and in middle of list 375 resultList = LocaleUtils.ApisN.prependToLocaleList("es-ES", baseList); 376 Assert.assertEquals("es-ES,en,fr", resultList.toLanguageTags()); 377 378 // Prepend and at end of list 379 resultList = LocaleUtils.ApisN.prependToLocaleList("fr", baseList); 380 Assert.assertEquals("fr,en,es-ES", resultList.toLanguageTags()); 381 382 // Prepend and at front of list 383 resultList = LocaleUtils.ApisN.prependToLocaleList("en", baseList); 384 Assert.assertEquals("en,es-ES,fr", resultList.toLanguageTags()); 385 386 // Prepend to list of one 387 baseList = LocaleList.forLanguageTags("fr"); 388 resultList = LocaleUtils.ApisN.prependToLocaleList("en", baseList); 389 Assert.assertEquals("en,fr", resultList.toLanguageTags()); 390 391 // Prepend to list of one (self) 392 resultList = LocaleUtils.ApisN.prependToLocaleList("fr", baseList); 393 Assert.assertEquals("fr", resultList.toLanguageTags()); 394 } 395 } 396