ConfigLocale_test.cpp revision cf246af30d007050f8b16bbbae6fbdf8d0559cca
1/* 2 * Copyright (C) 2014 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#include <androidfw/LocaleData.h> 18#include <androidfw/ResourceTypes.h> 19#include <utils/Log.h> 20#include <utils/String8.h> 21 22#include <gtest/gtest.h> 23namespace android { 24 25TEST(ConfigLocaleTest, packAndUnpack2LetterLanguage) { 26 ResTable_config config; 27 config.packLanguage("en"); 28 29 EXPECT_EQ('e', config.language[0]); 30 EXPECT_EQ('n', config.language[1]); 31 32 char out[4] = {1, 1, 1, 1}; 33 config.unpackLanguage(out); 34 EXPECT_EQ('e', out[0]); 35 EXPECT_EQ('n', out[1]); 36 EXPECT_EQ(0, out[2]); 37 EXPECT_EQ(0, out[3]); 38 39 memset(out, 1, sizeof(out)); 40 config.locale = 0; 41 config.unpackLanguage(out); 42 EXPECT_EQ(0, out[0]); 43 EXPECT_EQ(0, out[1]); 44 EXPECT_EQ(0, out[2]); 45 EXPECT_EQ(0, out[3]); 46} 47 48TEST(ConfigLocaleTest, packAndUnpack2LetterRegion) { 49 ResTable_config config; 50 config.packRegion("US"); 51 52 EXPECT_EQ('U', config.country[0]); 53 EXPECT_EQ('S', config.country[1]); 54 55 char out[4] = {1, 1, 1, 1}; 56 config.unpackRegion(out); 57 EXPECT_EQ('U', out[0]); 58 EXPECT_EQ('S', out[1]); 59 EXPECT_EQ(0, out[2]); 60 EXPECT_EQ(0, out[3]); 61} 62 63TEST(ConfigLocaleTest, packAndUnpack3LetterLanguage) { 64 ResTable_config config; 65 config.packLanguage("eng"); 66 67 // 1-00110-01 101-00100 68 EXPECT_EQ('\x99', config.language[0]); 69 EXPECT_EQ('\xA4', config.language[1]); 70 71 char out[4] = {1, 1, 1, 1}; 72 config.unpackLanguage(out); 73 EXPECT_EQ('e', out[0]); 74 EXPECT_EQ('n', out[1]); 75 EXPECT_EQ('g', out[2]); 76 EXPECT_EQ(0, out[3]); 77} 78 79TEST(ConfigLocaleTest, packAndUnpack3LetterLanguageAtOffset16) { 80 ResTable_config config; 81 config.packLanguage("tgp"); 82 83 // We had a bug where we would accidentally mask 84 // the 5th bit of both bytes 85 // 86 // packed[0] = 1011 1100 87 // packed[1] = 1101 0011 88 // 89 // which is equivalent to: 90 // 1 [0] [1] [2] 91 // 1-01111-00110-10011 92 EXPECT_EQ(char(0xbc), config.language[0]); 93 EXPECT_EQ(char(0xd3), config.language[1]); 94 95 char out[4] = {1, 1, 1, 1}; 96 config.unpackLanguage(out); 97 EXPECT_EQ('t', out[0]); 98 EXPECT_EQ('g', out[1]); 99 EXPECT_EQ('p', out[2]); 100 EXPECT_EQ(0, out[3]); 101} 102 103TEST(ConfigLocaleTest, packAndUnpack3LetterRegion) { 104 ResTable_config config; 105 config.packRegion("419"); 106 107 char out[4] = {1, 1, 1, 1}; 108 config.unpackRegion(out); 109 110 EXPECT_EQ('4', out[0]); 111 EXPECT_EQ('1', out[1]); 112 EXPECT_EQ('9', out[2]); 113} 114 115/* static */ void fillIn(const char* lang, const char* country, 116 const char* script, const char* variant, ResTable_config* out) { 117 memset(out, 0, sizeof(ResTable_config)); 118 if (lang != NULL) { 119 out->packLanguage(lang); 120 } 121 122 if (country != NULL) { 123 out->packRegion(country); 124 } 125 126 if (script != NULL) { 127 memcpy(out->localeScript, script, 4); 128 out->localeScriptWasComputed = false; 129 } else { 130 out->computeScript(); 131 out->localeScriptWasComputed = true; 132 } 133 134 if (variant != NULL) { 135 memcpy(out->localeVariant, variant, strlen(variant)); 136 } 137} 138 139TEST(ConfigLocaleTest, IsMoreSpecificThan) { 140 ResTable_config l; 141 ResTable_config r; 142 143 fillIn("en", NULL, NULL, NULL, &l); 144 fillIn(NULL, NULL, NULL, NULL, &r); 145 146 EXPECT_TRUE(l.isMoreSpecificThan(r)); 147 EXPECT_FALSE(r.isMoreSpecificThan(l)); 148 149 fillIn("eng", NULL, NULL, NULL, &l); 150 EXPECT_TRUE(l.isMoreSpecificThan(r)); 151 EXPECT_FALSE(r.isMoreSpecificThan(l)); 152 153 fillIn("eng", "419", NULL, NULL, &r); 154 EXPECT_FALSE(l.isMoreSpecificThan(r)); 155 EXPECT_TRUE(r.isMoreSpecificThan(l)); 156 157 fillIn("en", NULL, NULL, NULL, &l); 158 fillIn("en", "US", NULL, NULL, &r); 159 EXPECT_FALSE(l.isMoreSpecificThan(r)); 160 EXPECT_TRUE(r.isMoreSpecificThan(l)); 161 162 fillIn("en", "US", NULL, NULL, &l); 163 fillIn("en", "US", "Latn", NULL, &r); 164 EXPECT_FALSE(l.isMoreSpecificThan(r)); 165 EXPECT_TRUE(r.isMoreSpecificThan(l)); 166 167 fillIn("en", "US", NULL, NULL, &l); 168 fillIn("en", "US", NULL, "POSIX", &r); 169 EXPECT_FALSE(l.isMoreSpecificThan(r)); 170 EXPECT_TRUE(r.isMoreSpecificThan(l)); 171 172 fillIn("en", "US", "Latn", NULL, &l); 173 fillIn("en", "US", NULL, "POSIX", &r); 174 EXPECT_FALSE(l.isMoreSpecificThan(r)); 175 EXPECT_TRUE(r.isMoreSpecificThan(l)); 176} 177 178TEST(ConfigLocaleTest, setLocale) { 179 ResTable_config test; 180 test.setBcp47Locale("en-US"); 181 EXPECT_EQ('e', test.language[0]); 182 EXPECT_EQ('n', test.language[1]); 183 EXPECT_EQ('U', test.country[0]); 184 EXPECT_EQ('S', test.country[1]); 185 EXPECT_TRUE(test.localeScriptWasComputed); 186 EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 187 EXPECT_EQ(0, test.localeVariant[0]); 188 189 test.setBcp47Locale("eng-419"); 190 char out[4] = {1, 1, 1, 1}; 191 test.unpackLanguage(out); 192 EXPECT_EQ('e', out[0]); 193 EXPECT_EQ('n', out[1]); 194 EXPECT_EQ('g', out[2]); 195 EXPECT_EQ(0, out[3]); 196 memset(out, 1, 4); 197 test.unpackRegion(out); 198 EXPECT_EQ('4', out[0]); 199 EXPECT_EQ('1', out[1]); 200 EXPECT_EQ('9', out[2]); 201 202 test.setBcp47Locale("en-Latn-419"); 203 EXPECT_EQ('e', test.language[0]); 204 EXPECT_EQ('n', test.language[1]); 205 EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 206 EXPECT_FALSE(test.localeScriptWasComputed); 207 memset(out, 1, 4); 208 test.unpackRegion(out); 209 EXPECT_EQ('4', out[0]); 210 EXPECT_EQ('1', out[1]); 211 EXPECT_EQ('9', out[2]); 212 213 test.setBcp47Locale("de-1901"); 214 memset(out, 1, 4); 215 test.unpackLanguage(out); 216 EXPECT_EQ('d', out[0]); 217 EXPECT_EQ('e', out[1]); 218 EXPECT_EQ('\0', out[2]); 219 EXPECT_TRUE(test.localeScriptWasComputed); 220 EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 221 memset(out, 1, 4); 222 test.unpackRegion(out); 223 EXPECT_EQ('\0', out[0]); 224 EXPECT_EQ(0, strcmp("1901", test.localeVariant)); 225 226 test.setBcp47Locale("de-Latn-1901"); 227 memset(out, 1, 4); 228 test.unpackLanguage(out); 229 EXPECT_EQ('d', out[0]); 230 EXPECT_EQ('e', out[1]); 231 EXPECT_EQ('\0', out[2]); 232 EXPECT_FALSE(test.localeScriptWasComputed); 233 EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 234 memset(out, 1, 4); 235 test.unpackRegion(out); 236 EXPECT_EQ('\0', out[0]); 237 EXPECT_EQ(0, strcmp("1901", test.localeVariant)); 238} 239 240TEST(ConfigLocaleTest, computeScript) { 241 ResTable_config config; 242 243 fillIn(NULL, NULL, NULL, NULL, &config); 244 EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4)); 245 246 fillIn("zh", "TW", NULL, NULL, &config); 247 EXPECT_EQ(0, memcmp("Hant", config.localeScript, 4)); 248 249 fillIn("zh", "CN", NULL, NULL, &config); 250 EXPECT_EQ(0, memcmp("Hans", config.localeScript, 4)); 251 252 fillIn("az", NULL, NULL, NULL, &config); 253 EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4)); 254 255 fillIn("az", "AZ", NULL, NULL, &config); 256 EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4)); 257 258 fillIn("az", "IR", NULL, NULL, &config); 259 EXPECT_EQ(0, memcmp("Arab", config.localeScript, 4)); 260 261 fillIn("peo", NULL, NULL, NULL, &config); 262 EXPECT_EQ(0, memcmp("Xpeo", config.localeScript, 4)); 263 264 fillIn("qaa", NULL, NULL, NULL, &config); 265 EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4)); 266} 267 268TEST(ConfigLocaleTest, getBcp47Locale_script) { 269 ResTable_config config; 270 fillIn("en", NULL, "Latn", NULL, &config); 271 272 char out[RESTABLE_MAX_LOCALE_LEN]; 273 config.localeScriptWasComputed = false; 274 config.getBcp47Locale(out); 275 EXPECT_EQ(0, strcmp("en-Latn", out)); 276 277 config.localeScriptWasComputed = true; 278 config.getBcp47Locale(out); 279 EXPECT_EQ(0, strcmp("en", out)); 280} 281 282TEST(ConfigLocaleTest, match) { 283 ResTable_config supported, requested; 284 285 fillIn(NULL, NULL, NULL, NULL, &supported); 286 fillIn("fr", "CA", NULL, NULL, &requested); 287 // Empty locale matches everything (as a default). 288 EXPECT_TRUE(supported.match(requested)); 289 290 fillIn("en", "CA", NULL, NULL, &supported); 291 fillIn("fr", "CA", NULL, NULL, &requested); 292 // Different languages don't match. 293 EXPECT_FALSE(supported.match(requested)); 294 295 fillIn("qaa", "FR", NULL, NULL, &supported); 296 fillIn("qaa", "CA", NULL, NULL, &requested); 297 // If we can't infer the scripts, different regions don't match. 298 EXPECT_FALSE(supported.match(requested)); 299 300 fillIn("qaa", "FR", "Latn", NULL, &supported); 301 fillIn("qaa", "CA", NULL, NULL, &requested); 302 // If we can't infer any of the scripts, different regions don't match. 303 EXPECT_FALSE(supported.match(requested)); 304 305 fillIn("qaa", "FR", NULL, NULL, &supported); 306 fillIn("qaa", "CA", "Latn", NULL, &requested); 307 // If we can't infer any of the scripts, different regions don't match. 308 EXPECT_FALSE(supported.match(requested)); 309 310 fillIn("qaa", NULL, NULL, NULL, &supported); 311 fillIn("qaa", "CA", NULL, NULL, &requested); 312 // language-only resources still support language+region requests, even if we can't infer the 313 // script. 314 EXPECT_TRUE(supported.match(requested)); 315 316 fillIn("qaa", "CA", NULL, NULL, &supported); 317 fillIn("qaa", "CA", NULL, NULL, &requested); 318 // Even if we can't infer the scripts, exactly equal locales match. 319 EXPECT_TRUE(supported.match(requested)); 320 321 fillIn("az", NULL, NULL, NULL, &supported); 322 fillIn("az", NULL, "Latn", NULL, &requested); 323 // If the resolved scripts are the same, it doesn't matter if they were explicitly provided 324 // or not, and they match. 325 EXPECT_TRUE(supported.match(requested)); 326 327 fillIn("az", NULL, NULL, NULL, &supported); 328 fillIn("az", NULL, "Cyrl", NULL, &requested); 329 // If the resolved scripts are different, they don't match. 330 EXPECT_FALSE(supported.match(requested)); 331 332 fillIn("az", NULL, NULL, NULL, &supported); 333 fillIn("az", "IR", NULL, NULL, &requested); 334 // If the resolved scripts are different, they don't match. 335 EXPECT_FALSE(supported.match(requested)); 336 337 fillIn("az", "IR", NULL, NULL, &supported); 338 fillIn("az", NULL, "Arab", NULL, &requested); 339 // If the resolved scripts are the same, it doesn't matter if they were explicitly provided 340 // or not, and they match. 341 EXPECT_TRUE(supported.match(requested)); 342 343 fillIn("en", NULL, NULL, NULL, &supported); 344 fillIn("en", "XA", NULL, NULL, &requested); 345 // en-XA is a pseudo-locale, and English resources are not a match for it. 346 EXPECT_FALSE(supported.match(requested)); 347 348 fillIn("en", "XA", NULL, NULL, &supported); 349 fillIn("en", NULL, NULL, NULL, &requested); 350 // en-XA is a pseudo-locale, and its resources don't support English locales. 351 EXPECT_FALSE(supported.match(requested)); 352 353 fillIn("en", "XA", NULL, NULL, &supported); 354 fillIn("en", "XA", NULL, NULL, &requested); 355 // Even if they are pseudo-locales, exactly equal locales match. 356 EXPECT_TRUE(supported.match(requested)); 357 358 fillIn("ar", NULL, NULL, NULL, &supported); 359 fillIn("ar", "XB", NULL, NULL, &requested); 360 // ar-XB is a pseudo-locale, and Arabic resources are not a match for it. 361 EXPECT_FALSE(supported.match(requested)); 362 363 fillIn("ar", "XB", NULL, NULL, &supported); 364 fillIn("ar", NULL, NULL, NULL, &requested); 365 // ar-XB is a pseudo-locale, and its resources don't support Arabic locales. 366 EXPECT_FALSE(supported.match(requested)); 367 368 fillIn("ar", "XB", NULL, NULL, &supported); 369 fillIn("ar", "XB", NULL, NULL, &requested); 370 // Even if they are pseudo-locales, exactly equal locales match. 371 EXPECT_TRUE(supported.match(requested)); 372} 373 374TEST(ConfigLocaleTest, match_emptyScript) { 375 ResTable_config supported, requested; 376 377 fillIn("fr", "FR", NULL, NULL, &supported); 378 fillIn("fr", "CA", NULL, NULL, &requested); 379 380 // emulate packages built with older AAPT 381 memset(supported.localeScript, '\0', 4); 382 supported.localeScriptWasComputed = false; 383 384 EXPECT_TRUE(supported.match(requested)); 385} 386 387TEST(ConfigLocaleTest, isLocaleBetterThan_basics) { 388 ResTable_config config1, config2, request; 389 390 fillIn(NULL, NULL, NULL, NULL, &request); 391 fillIn("fr", "FR", NULL, NULL, &config1); 392 fillIn("fr", "CA", NULL, NULL, &config2); 393 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 394 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 395 396 fillIn("fr", "CA", NULL, NULL, &request); 397 fillIn(NULL, NULL, NULL, NULL, &config1); 398 fillIn(NULL, NULL, NULL, NULL, &config2); 399 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 400 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 401 402 fillIn("fr", "CA", NULL, NULL, &request); 403 fillIn("fr", "FR", NULL, NULL, &config1); 404 fillIn(NULL, NULL, NULL, NULL, &config2); 405 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 406 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 407 408 fillIn("de", "DE", NULL, NULL, &request); 409 fillIn("de", "DE", NULL, "1901", &config1); 410 fillIn("de", "DE", NULL, "1996", &config2); 411 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 412 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 413 414 fillIn("de", "DE", NULL, "1901", &request); 415 fillIn("de", "DE", NULL, "1901", &config1); 416 fillIn("de", "DE", NULL, NULL, &config2); 417 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 418 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 419 420 fillIn("de", "DE", NULL, "1901", &request); 421 fillIn("de", "DE", NULL, "1996", &config1); 422 fillIn("de", "DE", NULL, NULL, &config2); 423 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 424 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 425} 426 427TEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) { 428 ResTable_config config1, config2, request; 429 430 fillIn("es", "AR", NULL, NULL, &request); 431 fillIn("es", "419", NULL, NULL, &config1); 432 fillIn("es", "419", NULL, NULL, &config2); 433 // Both supported locales are the same, so none is better than the other. 434 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 435 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 436 437 fillIn("es", "AR", NULL, NULL, &request); 438 fillIn("es", "AR", NULL, NULL, &config1); 439 fillIn("es", "419", NULL, NULL, &config2); 440 // An exact locale match is better than a parent. 441 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 442 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 443 444 fillIn("es", "AR", NULL, NULL, &request); 445 fillIn("es", "419", NULL, NULL, &config1); 446 fillIn("es", NULL, NULL, NULL, &config2); 447 // A closer parent is better. 448 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 449 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 450 451 fillIn("es", "AR", NULL, NULL, &request); 452 fillIn("es", "419", NULL, NULL, &config1); 453 fillIn("es", "ES", NULL, NULL, &config2); 454 // A parent is better than a non-parent representative locale. 455 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 456 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 457 458 fillIn("es", "AR", NULL, NULL, &request); 459 fillIn("es", NULL, NULL, NULL, &config1); 460 fillIn("es", "ES", NULL, NULL, &config2); 461 // A parent is better than a non-parent representative locale. 462 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 463 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 464 465 fillIn("es", "AR", NULL, NULL, &request); 466 fillIn("es", "PE", NULL, NULL, &config1); 467 fillIn("es", "ES", NULL, NULL, &config2); 468 // A closer locale is better. 469 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 470 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 471 472 fillIn("es", "AR", NULL, NULL, &request); 473 fillIn("es", "US", NULL, NULL, &config1); 474 fillIn("es", NULL, NULL, NULL, &config2); 475 // Special case for Latin American Spanish: es-MX and es-US are 476 // pseudo-parents of all Latin Ameircan Spanish locales. 477 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 478 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 479 480 fillIn("es", "MX", NULL, NULL, &request); 481 fillIn("es", "US", NULL, NULL, &config1); 482 fillIn("es", NULL, NULL, NULL, &config2); 483 // Special case for Latin American Spanish: es-MX and es-US are 484 // pseudo-parents of all Latin Ameircan Spanish locales. 485 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 486 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 487 488 fillIn("es", "AR", NULL, NULL, &request); 489 fillIn("es", "MX", NULL, NULL, &config1); 490 fillIn("es", NULL, NULL, NULL, &config2); 491 // Special case for Latin American Spanish: es-MX and es-US are 492 // pseudo-parents of all Latin Ameircan Spanish locales. 493 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 494 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 495 496 fillIn("es", "US", NULL, NULL, &request); 497 fillIn("es", "MX", NULL, NULL, &config1); 498 fillIn("es", NULL, NULL, NULL, &config2); 499 // Special case for Latin American Spanish: es-MX and es-US are 500 // pseudo-parents of all Latin Ameircan Spanish locales. 501 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 502 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 503 504 fillIn("es", "AR", NULL, NULL, &request); 505 fillIn("es", "419", NULL, NULL, &config1); 506 fillIn("es", "MX", NULL, NULL, &config2); 507 // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 508 // Spanish locales, es-419 is a closer parent. 509 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 510 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 511 512 fillIn("es", "US", NULL, NULL, &request); 513 fillIn("es", "419", NULL, NULL, &config1); 514 fillIn("es", "MX", NULL, NULL, &config2); 515 // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 516 // Spanish locales, es-419 is a closer parent. 517 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 518 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 519 520 fillIn("es", "MX", NULL, NULL, &request); 521 fillIn("es", "419", NULL, NULL, &config1); 522 fillIn("es", "US", NULL, NULL, &config2); 523 // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 524 // Spanish locales, es-419 is a closer parent. 525 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 526 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 527 528 fillIn("es", "AR", NULL, NULL, &request); 529 fillIn("es", "MX", NULL, NULL, &config1); 530 fillIn("es", "BO", NULL, NULL, &config2); 531 // Special case for Latin American Spanish: es-MX and es-US are 532 // pseudo-parents of all Latin Ameircan Spanish locales. 533 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 534 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 535 536 fillIn("es", "AR", NULL, NULL, &request); 537 fillIn("es", "US", NULL, NULL, &config1); 538 fillIn("es", "BO", NULL, NULL, &config2); 539 // Special case for Latin American Spanish: es-MX and es-US are 540 // pseudo-parents of all Latin Ameircan Spanish locales. 541 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 542 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 543 544 fillIn("es", "IC", NULL, NULL, &request); 545 fillIn("es", "ES", NULL, NULL, &config1); 546 fillIn("es", "GQ", NULL, NULL, &config2); 547 // A representative locale is better if they are equidistant. 548 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 549 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 550 551 fillIn("es", "AR", NULL, NULL, &request); 552 fillIn("es", "MX", NULL, NULL, &config1); 553 fillIn("es", "US", NULL, NULL, &config2); 554 // If all is equal, the locale earlier in the dictionary is better. 555 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 556 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 557 558 fillIn("es", "GQ", NULL, NULL, &request); 559 fillIn("es", "IC", NULL, NULL, &config1); 560 fillIn("es", "419", NULL, NULL, &config2); 561 // If all is equal, the locale earlier in the dictionary is better and 562 // letters are better than numbers. 563 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 564 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 565 566 fillIn("en", "GB", NULL, NULL, &request); 567 fillIn("en", "001", NULL, NULL, &config1); 568 fillIn("en", NULL, NULL, NULL, &config2); 569 // A closer parent is better. 570 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 571 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 572 573 fillIn("en", "PR", NULL, NULL, &request); 574 fillIn("en", NULL, NULL, NULL, &config1); 575 fillIn("en", "001", NULL, NULL, &config2); 576 // A parent is better than a non-parent. 577 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 578 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 579 580 fillIn("en", "DE", NULL, NULL, &request); 581 fillIn("en", "150", NULL, NULL, &config1); 582 fillIn("en", "001", NULL, NULL, &config2); 583 // A closer parent is better. 584 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 585 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 586 587 fillIn("en", "IN", NULL, NULL, &request); 588 fillIn("en", "AU", NULL, NULL, &config1); 589 fillIn("en", "US", NULL, NULL, &config2); 590 // A closer locale is better. 591 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 592 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 593 594 fillIn("en", "PR", NULL, NULL, &request); 595 fillIn("en", "001", NULL, NULL, &config1); 596 fillIn("en", "GB", NULL, NULL, &config2); 597 // A closer locale is better. 598 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 599 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 600 601 fillIn("en", "IN", NULL, NULL, &request); 602 fillIn("en", "GB", NULL, NULL, &config1); 603 fillIn("en", "AU", NULL, NULL, &config2); 604 // A representative locale is better if they are equidistant. 605 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 606 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 607 608 fillIn("en", "IN", NULL, NULL, &request); 609 fillIn("en", "AU", NULL, NULL, &config1); 610 fillIn("en", "CA", NULL, NULL, &config2); 611 // If all is equal, the locale earlier in the dictionary is better. 612 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 613 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 614 615 fillIn("pt", "MZ", NULL, NULL, &request); 616 fillIn("pt", "PT", NULL, NULL, &config1); 617 fillIn("pt", NULL, NULL, NULL, &config2); 618 // A closer parent is better. 619 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 620 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 621 622 fillIn("pt", "MZ", NULL, NULL, &request); 623 fillIn("pt", "PT", NULL, NULL, &config1); 624 fillIn("pt", "BR", NULL, NULL, &config2); 625 // A parent is better than a non-parent. 626 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 627 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 628 629 fillIn("zh", "MO", "Hant", NULL, &request); 630 fillIn("zh", "HK", "Hant", NULL, &config1); 631 fillIn("zh", "TW", "Hant", NULL, &config2); 632 // A parent is better than a non-parent. 633 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 634 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 635 636 fillIn("zh", "US", "Hant", NULL, &request); 637 fillIn("zh", "TW", "Hant", NULL, &config1); 638 fillIn("zh", "HK", "Hant", NULL, &config2); 639 // A representative locale is better if they are equidistant. 640 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 641 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 642 643 fillIn("ar", "DZ", NULL, NULL, &request); 644 fillIn("ar", "015", NULL, NULL, &config1); 645 fillIn("ar", NULL, NULL, NULL, &config2); 646 // A closer parent is better. 647 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 648 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 649 650 fillIn("ar", "EG", NULL, NULL, &request); 651 fillIn("ar", NULL, NULL, NULL, &config1); 652 fillIn("ar", "015", NULL, NULL, &config2); 653 // A parent is better than a non-parent. 654 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 655 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 656 657 fillIn("ar", "QA", NULL, NULL, &request); 658 fillIn("ar", "EG", NULL, NULL, &config1); 659 fillIn("ar", "BH", NULL, NULL, &config2); 660 // A representative locale is better if they are equidistant. 661 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 662 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 663 664 fillIn("ar", "QA", NULL, NULL, &request); 665 fillIn("ar", "SA", NULL, NULL, &config1); 666 fillIn("ar", "015", NULL, NULL, &config2); 667 // If all is equal, the locale earlier in the dictionary is better and 668 // letters are better than numbers. 669 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 670 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 671} 672 673// Default resources are considered better matches for US English 674// and US-like English locales than International English locales 675TEST(ConfigLocaleTest, isLocaleBetterThan_UsEnglishIsSpecial) { 676 ResTable_config config1, config2, request; 677 678 fillIn("en", "US", NULL, NULL, &request); 679 fillIn(NULL, NULL, NULL, NULL, &config1); 680 fillIn("en", "001", NULL, NULL, &config2); 681 // default is better than International English 682 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 683 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 684 685 fillIn("en", "US", NULL, NULL, &request); 686 fillIn(NULL, NULL, NULL, NULL, &config1); 687 fillIn("en", "GB", NULL, NULL, &config2); 688 // default is better than British English 689 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 690 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 691 692 fillIn("en", "PR", NULL, NULL, &request); 693 fillIn(NULL, NULL, NULL, NULL, &config1); 694 fillIn("en", "001", NULL, NULL, &config2); 695 // Even for Puerto Rico, default is better than International English 696 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 697 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 698 699 fillIn("en", "US", NULL, NULL, &request); 700 fillIn("en", NULL, NULL, NULL, &config1); 701 fillIn(NULL, NULL, NULL, NULL, &config2); 702 // "English" is better than default, since it's a parent of US English 703 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 704 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 705 706 fillIn("en", "PR", NULL, NULL, &request); 707 fillIn("en", NULL, NULL, NULL, &config1); 708 fillIn(NULL, NULL, NULL, NULL, &config2); 709 // "English" is better than default, since it's a parent of Puerto Rico English 710 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 711 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 712 713 fillIn("en", "US", NULL, NULL, &request); 714 fillIn(NULL, NULL, NULL, NULL, &config1); 715 fillIn("en", "PR", NULL, NULL, &config2); 716 // For US English itself, we prefer default to its siblings in the parent tree 717 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 718 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 719} 720 721} // namespace android 722