1 /* 2 * Copyright (C) 2015 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 android.os.cts; 18 19 import android.os.LocaleList; 20 import android.os.Parcel; 21 import android.test.AndroidTestCase; 22 23 import java.util.Locale; 24 25 public class LocaleListTest extends AndroidTestCase { 26 public void testEmptyLocaleList() { 27 LocaleList ll = new LocaleList(); 28 assertNotNull(ll); 29 assertTrue(ll.isEmpty()); 30 assertEquals(0, ll.size()); 31 assertNull(ll.get(0)); 32 assertNull(ll.get(1)); 33 assertNull(ll.get(10)); 34 35 ll = new LocaleList(new Locale[0]); 36 assertNotNull(ll); 37 assertTrue(ll.isEmpty()); 38 assertEquals(0, ll.size()); 39 assertNull(ll.get(0)); 40 assertNull(ll.get(1)); 41 assertNull(ll.get(10)); 42 } 43 44 public void testOneMemberLocaleList() { 45 final LocaleList ll = new LocaleList(Locale.US); 46 assertNotNull(ll); 47 assertFalse(ll.isEmpty()); 48 assertEquals(1, ll.size()); 49 assertEquals(Locale.US, ll.get(0)); 50 assertNull(ll.get(10)); 51 } 52 53 public void testTwoMemberLocaleList() { 54 final Locale enPH = Locale.forLanguageTag("en-PH"); 55 final Locale[] la = {enPH, Locale.US}; 56 final LocaleList ll = new LocaleList(la); 57 assertNotNull(ll); 58 assertFalse(ll.isEmpty()); 59 assertEquals(2, ll.size()); 60 assertEquals(enPH, ll.get(0)); 61 assertEquals(Locale.US, ll.get(1)); 62 assertNull(ll.get(10)); 63 } 64 65 public void testNullArgument() { 66 try { 67 LocaleList ll = new LocaleList((Locale) null); 68 fail("Initializing a LocaleList with a null argument should throw."); 69 } catch (Throwable e) { 70 assertEquals(NullPointerException.class, e.getClass()); 71 } 72 try { 73 LocaleList ll = new LocaleList((Locale[]) null); 74 fail("Initializing a LocaleList with a null array should throw."); 75 } catch (Throwable e) { 76 assertEquals(NullPointerException.class, e.getClass()); 77 } 78 } 79 80 public void testNullArguments() { 81 final Locale[] la = {Locale.US, null}; 82 LocaleList ll = null; 83 try { 84 ll = new LocaleList(la); 85 fail("Initializing a LocaleList with an array containing null should throw."); 86 } catch (Throwable e) { 87 assertEquals(NullPointerException.class, e.getClass()); 88 } 89 } 90 91 public void testRepeatedArguments() { 92 final Locale[] la = {Locale.US, Locale.US}; 93 LocaleList ll = null; 94 try { 95 ll = new LocaleList(la); 96 fail("Initializing a LocaleList with an array containing duplicates should throw."); 97 } catch (Throwable e) { 98 assertEquals(IllegalArgumentException.class, e.getClass()); 99 } 100 } 101 102 public void testIndexOf() { 103 final LocaleList empty = new LocaleList(); 104 assertEquals(-1, empty.indexOf(Locale.US)); 105 106 final LocaleList oneMember = new LocaleList(Locale.US); 107 assertEquals(0, oneMember.indexOf(Locale.US)); 108 assertEquals(-1, oneMember.indexOf(Locale.ENGLISH)); 109 110 final LocaleList twoMember = LocaleList.forLanguageTags("en,fr"); 111 assertEquals(0, twoMember.indexOf(Locale.forLanguageTag("en"))); 112 assertEquals(1, twoMember.indexOf(Locale.forLanguageTag("fr"))); 113 assertEquals(-1, twoMember.indexOf(Locale.forLanguageTag("en-US"))); 114 } 115 116 public void testEquals() { 117 final LocaleList empty = new LocaleList(); 118 final LocaleList anotherEmpty = new LocaleList(); 119 LocaleList oneMember = new LocaleList(Locale.US); 120 LocaleList sameOneMember = new LocaleList(new Locale("en", "US")); 121 LocaleList differentOneMember = new LocaleList(Locale.FRENCH); 122 Locale[] la = {Locale.US, Locale.FRENCH}; 123 LocaleList twoMember = new LocaleList(la); 124 125 assertFalse(empty.equals(null)); 126 assertFalse(oneMember.equals(null)); 127 128 assertFalse(empty.equals(new Object())); 129 130 assertTrue(empty.equals(empty)); 131 assertTrue(oneMember.equals(oneMember)); 132 133 assertFalse(empty.equals(oneMember)); 134 assertFalse(oneMember.equals(twoMember)); 135 136 assertFalse(oneMember.equals(differentOneMember)); 137 138 assertTrue(empty.equals(anotherEmpty)); 139 assertTrue(oneMember.equals(sameOneMember)); 140 } 141 142 public void testHashCode() { 143 final LocaleList empty = new LocaleList(); 144 final LocaleList anotherEmpty = new LocaleList(); 145 Locale[] la1 = {Locale.US}; 146 LocaleList oneMember = new LocaleList(la1); 147 LocaleList sameOneMember = new LocaleList(la1); 148 149 assertEquals(empty.hashCode(), anotherEmpty.hashCode()); 150 assertEquals(oneMember.hashCode(), sameOneMember.hashCode()); 151 } 152 153 public void testToString() { 154 LocaleList ll = new LocaleList(); 155 assertEquals("[]", ll.toString()); 156 157 final Locale[] la1 = {Locale.US}; 158 ll = new LocaleList(la1); 159 assertEquals("["+Locale.US.toString()+"]", ll.toString()); 160 161 final Locale[] la2 = {Locale.US, Locale.FRENCH}; 162 ll = new LocaleList(la2); 163 assertEquals("["+Locale.US.toString()+","+Locale.FRENCH.toString()+"]", ll.toString()); 164 } 165 166 public void testToLanguageTags() { 167 LocaleList ll = new LocaleList(); 168 assertEquals("", ll.toLanguageTags()); 169 170 final Locale[] la1 = {Locale.US}; 171 ll = new LocaleList(la1); 172 assertEquals(Locale.US.toLanguageTag(), ll.toLanguageTags()); 173 174 final Locale[] la2 = {Locale.US, Locale.FRENCH}; 175 ll = new LocaleList(la2); 176 assertEquals(Locale.US.toLanguageTag()+","+Locale.FRENCH.toLanguageTag(), 177 ll.toLanguageTags()); 178 } 179 180 public void testGetEmptyLocaleList() { 181 LocaleList empty = LocaleList.getEmptyLocaleList(); 182 LocaleList anotherEmpty = LocaleList.getEmptyLocaleList(); 183 LocaleList constructedEmpty = new LocaleList(); 184 185 assertEquals(constructedEmpty, empty); 186 assertSame(empty, anotherEmpty); 187 } 188 189 public void testForLanguageTags() { 190 assertEquals(LocaleList.getEmptyLocaleList(), LocaleList.forLanguageTags(null)); 191 assertEquals(LocaleList.getEmptyLocaleList(), LocaleList.forLanguageTags("")); 192 193 assertEquals(new LocaleList(Locale.forLanguageTag("en-US")), 194 LocaleList.forLanguageTags("en-US")); 195 196 final Locale[] la = {Locale.forLanguageTag("en-PH"), Locale.forLanguageTag("en-US")}; 197 assertEquals(new LocaleList(la), LocaleList.forLanguageTags("en-PH,en-US")); 198 } 199 200 public void testGetDefault() { 201 final LocaleList ll = LocaleList.getDefault(); 202 assertNotNull(ll); 203 assertTrue(ll.size() >= 1); 204 205 final Locale defaultLocale = Locale.getDefault(); 206 assertTrue(ll.indexOf(defaultLocale) != -1); 207 } 208 209 public void testGetAdjustedDefault() { 210 final LocaleList ll = LocaleList.getDefault(); 211 assertNotNull(ll); 212 assertTrue(ll.size() >= 1); 213 214 final Locale defaultLocale = Locale.getDefault(); 215 assertTrue(ll.indexOf(defaultLocale) == 0); 216 } 217 218 public void testGetDefault_localeSetDefaultCalled() { 219 final Locale originalLocale = Locale.getDefault(); 220 final LocaleList originalLocaleList = LocaleList.getDefault(); 221 222 LocaleList.setDefault(LocaleList.forLanguageTags("ae,en,ja")); 223 224 try { 225 Locale.setDefault(Locale.forLanguageTag("fr")); 226 assertEquals("fr,ae,en,ja", LocaleList.getDefault().toLanguageTags()); 227 assertEquals("fr,ae,en,ja", LocaleList.getAdjustedDefault().toLanguageTags()); 228 229 Locale.setDefault(Locale.forLanguageTag("de")); 230 assertEquals("de,ae,en,ja", LocaleList.getDefault().toLanguageTags()); 231 assertEquals("de,ae,en,ja", LocaleList.getAdjustedDefault().toLanguageTags()); 232 233 Locale.setDefault(Locale.forLanguageTag("en")); 234 assertEquals("en,ae,ja", LocaleList.getDefault().toLanguageTags()); 235 assertEquals("en,ae,ja", LocaleList.getAdjustedDefault().toLanguageTags()); 236 237 Locale.setDefault(Locale.forLanguageTag("es")); 238 assertEquals("es,ae,en,ja", LocaleList.getDefault().toLanguageTags()); 239 assertEquals("es,ae,en,ja", LocaleList.getAdjustedDefault().toLanguageTags()); 240 241 Locale.setDefault(Locale.forLanguageTag("ja")); 242 assertEquals("ja,ae,en", LocaleList.getDefault().toLanguageTags()); 243 assertEquals("ja,ae,en", LocaleList.getAdjustedDefault().toLanguageTags()); 244 245 Locale.setDefault(Locale.forLanguageTag("ae")); 246 assertEquals("ae,en,ja", LocaleList.getDefault().toLanguageTags()); 247 assertEquals("ae,en,ja", LocaleList.getAdjustedDefault().toLanguageTags()); 248 } finally { 249 // restore the original values 250 LocaleList.setDefault(originalLocaleList, originalLocaleList.indexOf(originalLocale)); 251 } 252 } 253 254 public void testSetDefault_null() { 255 try { 256 LocaleList.setDefault(null); 257 fail("Setting the default locale list to null should throw."); 258 } catch (Throwable e) { 259 assertEquals(NullPointerException.class, e.getClass()); 260 } 261 } 262 263 public void testSetDefault_empty() { 264 try { 265 LocaleList.setDefault(LocaleList.getEmptyLocaleList()); 266 fail("Setting the default locale list to an empty list should throw."); 267 } catch (Throwable e) { 268 assertEquals(IllegalArgumentException.class, e.getClass()); 269 } 270 } 271 272 public void testSetDefault_oneLocale() { 273 final Locale originalLocale = Locale.getDefault(); 274 final LocaleList originalLocaleList = LocaleList.getDefault(); 275 276 final LocaleList locales = LocaleList.forLanguageTags("ae"); 277 LocaleList.setDefault(locales); 278 try { 279 assertEquals("ae", Locale.getDefault().toLanguageTag()); 280 assertEquals(locales, LocaleList.getDefault()); 281 assertEquals(locales, LocaleList.getAdjustedDefault()); 282 } finally { 283 // restore the original values 284 LocaleList.setDefault(originalLocaleList, originalLocaleList.indexOf(originalLocale)); 285 } 286 } 287 288 public void testSetDefault_twoLocales() { 289 final Locale originalLocale = Locale.getDefault(); 290 final LocaleList originalLocaleList = LocaleList.getDefault(); 291 292 final LocaleList locales = LocaleList.forLanguageTags("ae,en"); 293 LocaleList.setDefault(locales); 294 try { 295 assertEquals("ae", Locale.getDefault().toLanguageTag()); 296 assertEquals(locales, LocaleList.getDefault()); 297 assertEquals(locales, LocaleList.getAdjustedDefault()); 298 } finally { 299 // restore the original values 300 LocaleList.setDefault(originalLocaleList, originalLocaleList.indexOf(originalLocale)); 301 } 302 } 303 304 public void testParcelable() { 305 // Make sure an empty LocaleList can be marshalled/unmarshalled via Parcel. 306 assertEquals(LocaleList.getEmptyLocaleList(), 307 cloneViaParcel(LocaleList.getEmptyLocaleList())); 308 309 // Make sure a non-empty LocaleList can be marshalled/unmarshalled via Parcel. 310 LocaleList original = LocaleList.forLanguageTags("en-PH,en-US"); 311 assertEquals(original, cloneViaParcel(original)); 312 } 313 314 public void testDescribeContents_doesNotThrowException() { 315 // Just check calling describeContents() should not cause any exceptions. 316 LocaleList.forLanguageTags("en").describeContents(); 317 LocaleList.forLanguageTags("").describeContents(); 318 LocaleList.forLanguageTags(null).describeContents(); 319 LocaleList.getEmptyLocaleList().describeContents(); 320 } 321 322 private static LocaleList cloneViaParcel(final LocaleList original) { 323 Parcel parcel = null; 324 try { 325 parcel = Parcel.obtain(); 326 original.writeToParcel(parcel, 0); 327 parcel.setDataPosition(0); 328 return LocaleList.CREATOR.createFromParcel(parcel); 329 } finally { 330 if (parcel != null) { 331 parcel.recycle(); 332 } 333 } 334 } 335 336 public void testGetFirstMatch_noAssets() { 337 String[] noAssets = {}; 338 assertNull(LocaleList.getEmptyLocaleList().getFirstMatch(noAssets)); 339 assertEquals( 340 Locale.forLanguageTag("fr-BE"), 341 LocaleList.forLanguageTags("fr-BE").getFirstMatch(noAssets)); 342 assertEquals( 343 Locale.forLanguageTag("fr-BE"), 344 LocaleList.forLanguageTags("fr-BE,nl-BE").getFirstMatch(noAssets)); 345 } 346 347 public void testGetFirstMatch_oneAsset() { 348 String[] oneDutchAsset = {"nl"}; 349 assertNull(LocaleList.getEmptyLocaleList().getFirstMatch(oneDutchAsset)); 350 assertEquals( 351 Locale.forLanguageTag("fr-BE"), 352 LocaleList.forLanguageTags("fr-BE").getFirstMatch(oneDutchAsset)); 353 assertEquals( 354 Locale.forLanguageTag("nl-BE"), 355 LocaleList.forLanguageTags("nl-BE").getFirstMatch(oneDutchAsset)); 356 assertEquals( 357 Locale.forLanguageTag("nl-BE"), 358 LocaleList.forLanguageTags("fr-BE,nl-BE").getFirstMatch(oneDutchAsset)); 359 assertEquals( 360 Locale.forLanguageTag("nl-BE"), 361 LocaleList.forLanguageTags("nl-BE,fr-BE").getFirstMatch(oneDutchAsset)); 362 } 363 364 public void testGetFirstMatch_twoAssets() { 365 String[] FrenchAndDutchAssets = {"fr", "nl"}; 366 assertNull(LocaleList.getEmptyLocaleList().getFirstMatch(FrenchAndDutchAssets)); 367 assertEquals( 368 Locale.forLanguageTag("fr-BE"), 369 LocaleList.forLanguageTags("fr-BE").getFirstMatch(FrenchAndDutchAssets)); 370 assertEquals( 371 Locale.forLanguageTag("nl-BE"), 372 LocaleList.forLanguageTags("nl-BE").getFirstMatch(FrenchAndDutchAssets)); 373 assertEquals( 374 Locale.forLanguageTag("fr-BE"), 375 LocaleList.forLanguageTags("fr-BE,nl-BE").getFirstMatch(FrenchAndDutchAssets)); 376 assertEquals( 377 Locale.forLanguageTag("nl-BE"), 378 LocaleList.forLanguageTags("nl-BE,fr-BE").getFirstMatch(FrenchAndDutchAssets)); 379 } 380 381 public void testGetFirstMatch_oneChineseAsset() { 382 String[] oneChineseAsset = {"zh-CN"}; // Assumed to mean zh-Hans-CN 383 // The following Chinese examples would all match, so they will be chosen. 384 assertEquals( 385 Locale.forLanguageTag("zh"), 386 LocaleList.forLanguageTags("ko-KR,zh").getFirstMatch(oneChineseAsset)); 387 assertEquals( 388 Locale.forLanguageTag("zh-CN"), 389 LocaleList.forLanguageTags("ko-KR,zh-CN").getFirstMatch(oneChineseAsset)); 390 assertEquals( 391 Locale.forLanguageTag("zh-Hans"), 392 LocaleList.forLanguageTags("ko-KR,zh-Hans").getFirstMatch(oneChineseAsset)); 393 assertEquals( 394 Locale.forLanguageTag("zh-Hans-CN"), 395 LocaleList.forLanguageTags("ko-KR,zh-Hans-CN").getFirstMatch(oneChineseAsset)); 396 assertEquals( 397 Locale.forLanguageTag("zh-Hans-HK"), 398 LocaleList.forLanguageTags("ko-KR,zh-Hans-HK").getFirstMatch(oneChineseAsset)); 399 400 // The following Chinese examples wouldn't match, so the first locale will be chosen 401 // instead. 402 assertEquals( 403 Locale.forLanguageTag("ko-KR"), 404 LocaleList.forLanguageTags("ko-KR,zh-TW").getFirstMatch(oneChineseAsset)); 405 assertEquals( 406 Locale.forLanguageTag("ko-KR"), 407 LocaleList.forLanguageTags("ko-KR,zh-Hant").getFirstMatch(oneChineseAsset)); 408 assertEquals( 409 Locale.forLanguageTag("ko-KR"), 410 LocaleList.forLanguageTags("ko-KR,zh-Hant-TW").getFirstMatch(oneChineseAsset)); 411 } 412 413 public void testGetFirstMatch_serbianCyrillic() { 414 String[] oneSerbianAsset = {"sr"}; // Assumed to mean sr-Cyrl-RS 415 // The following Serbian examples would all match, so they will be chosen. 416 assertEquals( 417 Locale.forLanguageTag("sr"), 418 LocaleList.forLanguageTags("hr-HR,sr").getFirstMatch(oneSerbianAsset)); 419 assertEquals( 420 Locale.forLanguageTag("sr-RS"), 421 LocaleList.forLanguageTags("hr-HR,sr-RS").getFirstMatch(oneSerbianAsset)); 422 assertEquals( 423 Locale.forLanguageTag("sr-Cyrl"), 424 LocaleList.forLanguageTags("hr-HR,sr-Cyrl").getFirstMatch(oneSerbianAsset)); 425 assertEquals( 426 Locale.forLanguageTag("sr-Cyrl-RS"), 427 LocaleList.forLanguageTags("hr-HR,sr-Cyrl-RS").getFirstMatch(oneSerbianAsset)); 428 assertEquals( 429 Locale.forLanguageTag("sr-Cyrl-ME"), 430 LocaleList.forLanguageTags("hr-HR,sr-Cyrl-ME").getFirstMatch(oneSerbianAsset)); 431 432 // The following Serbian examples wouldn't match, so the first locale will be chosen 433 // instead. 434 assertEquals( 435 Locale.forLanguageTag("hr-HR"), 436 LocaleList.forLanguageTags("hr-HR,sr-ME").getFirstMatch(oneSerbianAsset)); 437 assertEquals( 438 Locale.forLanguageTag("hr-HR"), 439 LocaleList.forLanguageTags("hr-HR,sr-Latn").getFirstMatch(oneSerbianAsset)); 440 assertEquals( 441 Locale.forLanguageTag("hr-HR"), 442 LocaleList.forLanguageTags("hr-HR,sr-Latn-ME").getFirstMatch(oneSerbianAsset)); 443 } 444 445 public void testGetFirstMatch_LtrPseudoLocale() { 446 String[] onePseudoLocale = {"en-XA"}; 447 // "en-XA" matches itself 448 assertEquals( 449 Locale.forLanguageTag("en-XA"), 450 LocaleList.forLanguageTags("sr,en-XA").getFirstMatch(onePseudoLocale)); 451 452 // "en-XA" doesn't match "en" or "en-US" 453 assertEquals( 454 Locale.forLanguageTag("sr"), 455 LocaleList.forLanguageTags("sr,en").getFirstMatch(onePseudoLocale)); 456 assertEquals( 457 Locale.forLanguageTag("sr"), 458 LocaleList.forLanguageTags("sr,en-US").getFirstMatch(onePseudoLocale)); 459 } 460 461 public void testGetFirstMatch_RtlPseudoLocale() { 462 String[] onePseudoLocale = {"ar-XB"}; 463 // "ar-XB" matches itself 464 assertEquals( 465 Locale.forLanguageTag("ar-XB"), 466 LocaleList.forLanguageTags("sr,ar-XB").getFirstMatch(onePseudoLocale)); 467 468 // "ar-XB" doesn't match "ar" or "ar-EG" 469 assertEquals( 470 Locale.forLanguageTag("sr"), 471 LocaleList.forLanguageTags("sr,ar").getFirstMatch(onePseudoLocale)); 472 assertEquals( 473 Locale.forLanguageTag("sr"), 474 LocaleList.forLanguageTags("sr,ar-EG").getFirstMatch(onePseudoLocale)); 475 } 476 477 public void testGetFirstMatch_privateUseWithoutCountry() { 478 String[] onePrivateLocale = {"qaa"}; 479 // "qaa" supports itself and "qaa-CA" 480 assertEquals( 481 Locale.forLanguageTag("qaa"), 482 LocaleList.forLanguageTags("sr,qaa").getFirstMatch(onePrivateLocale)); 483 assertEquals( 484 Locale.forLanguageTag("qaa-CA"), 485 LocaleList.forLanguageTags("sr,qaa-CA").getFirstMatch(onePrivateLocale)); 486 } 487 488 public void testGetFirstMatch_privateUseWithCountry() { 489 String[] onePrivateLocale = {"qaa-US"}; 490 // "qaa-US" supports itself 491 assertEquals( 492 Locale.forLanguageTag("qaa-US"), 493 LocaleList.forLanguageTags("sr,qaa-US").getFirstMatch(onePrivateLocale)); 494 495 // "qaa-US" doesn't support "qaa" or "qaa-CA" 496 assertEquals( 497 Locale.forLanguageTag("sr"), 498 LocaleList.forLanguageTags("sr,qaa-CA").getFirstMatch(onePrivateLocale)); 499 assertEquals( 500 Locale.forLanguageTag("sr"), 501 LocaleList.forLanguageTags("sr,qaa").getFirstMatch(onePrivateLocale)); 502 } 503 } 504