ConfigLocale_test.cpp revision b927c559e1ef8530b08712507f320502627db298
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->localeScriptWasProvided = true; 129 } else { 130 out->computeScript(); 131 out->localeScriptWasProvided = false; 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_FALSE(test.localeScriptWasProvided); 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_TRUE(test.localeScriptWasProvided); 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_FALSE(test.localeScriptWasProvided); 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_TRUE(test.localeScriptWasProvided); 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.localeScriptWasProvided = true; 274 config.getBcp47Locale(out); 275 EXPECT_EQ(0, strcmp("en-Latn", out)); 276 277 config.localeScriptWasProvided = false; 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, isLocaleBetterThan_basics) { 375 ResTable_config config1, config2, request; 376 377 fillIn(NULL, NULL, NULL, NULL, &request); 378 fillIn("fr", "FR", NULL, NULL, &config1); 379 fillIn("fr", "CA", NULL, NULL, &config2); 380 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 381 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 382 383 fillIn("fr", "CA", NULL, NULL, &request); 384 fillIn(NULL, NULL, NULL, NULL, &config1); 385 fillIn(NULL, NULL, NULL, NULL, &config2); 386 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 387 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 388 389 fillIn("fr", "CA", NULL, NULL, &request); 390 fillIn("fr", "FR", NULL, NULL, &config1); 391 fillIn(NULL, NULL, NULL, NULL, &config2); 392 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 393 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 394 395 fillIn("de", "DE", NULL, NULL, &request); 396 fillIn("de", "DE", NULL, "1901", &config1); 397 fillIn("de", "DE", NULL, "1996", &config2); 398 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 399 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 400 401 fillIn("de", "DE", NULL, "1901", &request); 402 fillIn("de", "DE", NULL, "1901", &config1); 403 fillIn("de", "DE", NULL, NULL, &config2); 404 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 405 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 406 407 fillIn("de", "DE", NULL, "1901", &request); 408 fillIn("de", "DE", NULL, "1996", &config1); 409 fillIn("de", "DE", NULL, NULL, &config2); 410 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 411 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 412} 413 414TEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) { 415 ResTable_config config1, config2, request; 416 417 fillIn("es", "AR", NULL, NULL, &request); 418 fillIn("es", "419", NULL, NULL, &config1); 419 fillIn("es", "419", NULL, NULL, &config2); 420 // Both supported locales are the same, so none is better than the other. 421 EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 422 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 423 424 fillIn("es", "AR", NULL, NULL, &request); 425 fillIn("es", "AR", NULL, NULL, &config1); 426 fillIn("es", "419", NULL, NULL, &config2); 427 // An exact locale match is better than a parent. 428 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 429 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 430 431 fillIn("es", "AR", NULL, NULL, &request); 432 fillIn("es", "419", NULL, NULL, &config1); 433 fillIn("es", NULL, NULL, NULL, &config2); 434 // A closer parent is better. 435 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 436 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 437 438 fillIn("es", "AR", NULL, NULL, &request); 439 fillIn("es", "419", NULL, NULL, &config1); 440 fillIn("es", "ES", NULL, NULL, &config2); 441 // A parent is better than a non-parent representative locale. 442 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 443 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 444 445 fillIn("es", "AR", NULL, NULL, &request); 446 fillIn("es", NULL, NULL, NULL, &config1); 447 fillIn("es", "ES", NULL, NULL, &config2); 448 // A parent is better than a non-parent representative locale. 449 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 450 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 451 452 fillIn("es", "AR", NULL, NULL, &request); 453 fillIn("es", "PE", NULL, NULL, &config1); 454 fillIn("es", "ES", NULL, NULL, &config2); 455 // A closer locale is better. 456 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 457 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 458 459 fillIn("es", "AR", NULL, NULL, &request); 460 fillIn("es", "MX", NULL, NULL, &config1); 461 fillIn("es", "BO", NULL, NULL, &config2); 462 // A representative locale is better if they are equidistant. 463 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 464 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 465 466 fillIn("es", "AR", NULL, NULL, &request); 467 fillIn("es", "US", NULL, NULL, &config1); 468 fillIn("es", "BO", NULL, NULL, &config2); 469 // A representative locale is better if they are equidistant. 470 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 471 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 472 473 fillIn("es", "AR", NULL, NULL, &request); 474 fillIn("es", "MX", NULL, NULL, &config1); 475 fillIn("es", "US", NULL, NULL, &config2); 476 // If all is equal, the locale earlier in the dictionary is better. 477 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 478 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 479 480 fillIn("es", "GQ", NULL, NULL, &request); 481 fillIn("es", "IC", NULL, NULL, &config1); 482 fillIn("es", "419", NULL, NULL, &config2); 483 // If all is equal, the locale earlier in the dictionary is better and 484 // letters are better than numbers. 485 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 486 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 487 488 fillIn("en", "GB", NULL, NULL, &request); 489 fillIn("en", "001", NULL, NULL, &config1); 490 fillIn("en", NULL, NULL, NULL, &config2); 491 // A closer parent is better. 492 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 493 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 494 495 fillIn("en", "PR", NULL, NULL, &request); 496 fillIn("en", NULL, NULL, NULL, &config1); 497 fillIn("en", "001", NULL, NULL, &config2); 498 // A parent is better than a non-parent. 499 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 500 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 501 502 fillIn("en", "DE", NULL, NULL, &request); 503 fillIn("en", "150", NULL, NULL, &config1); 504 fillIn("en", "001", NULL, NULL, &config2); 505 // A closer parent is better. 506 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 507 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 508 509 fillIn("en", "IN", NULL, NULL, &request); 510 fillIn("en", "AU", NULL, NULL, &config1); 511 fillIn("en", "US", NULL, NULL, &config2); 512 // A closer locale is better. 513 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 514 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 515 516 fillIn("en", "PR", NULL, NULL, &request); 517 fillIn("en", "001", NULL, NULL, &config1); 518 fillIn("en", "GB", NULL, NULL, &config2); 519 // A closer locale is better. 520 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 521 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 522 523 fillIn("en", "IN", NULL, NULL, &request); 524 fillIn("en", "GB", NULL, NULL, &config1); 525 fillIn("en", "AU", NULL, NULL, &config2); 526 // A representative locale is better if they are equidistant. 527 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 528 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 529 530 fillIn("en", "IN", NULL, NULL, &request); 531 fillIn("en", "AU", NULL, NULL, &config1); 532 fillIn("en", "CA", NULL, NULL, &config2); 533 // If all is equal, the locale earlier in the dictionary is better. 534 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 535 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 536 537 fillIn("pt", "MZ", NULL, NULL, &request); 538 fillIn("pt", "PT", NULL, NULL, &config1); 539 fillIn("pt", NULL, NULL, NULL, &config2); 540 // A closer parent is better. 541 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 542 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 543 544 fillIn("pt", "MZ", NULL, NULL, &request); 545 fillIn("pt", "PT", NULL, NULL, &config1); 546 fillIn("pt", "BR", NULL, NULL, &config2); 547 // A parent is better than a non-parent. 548 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 549 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 550 551 fillIn("zh", "MO", "Hant", NULL, &request); 552 fillIn("zh", "HK", "Hant", NULL, &config1); 553 fillIn("zh", "TW", "Hant", NULL, &config2); 554 // A parent is better than a non-parent. 555 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 556 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 557 558 fillIn("zh", "US", "Hant", NULL, &request); 559 fillIn("zh", "TW", "Hant", NULL, &config1); 560 fillIn("zh", "HK", "Hant", NULL, &config2); 561 // A representative locale is better if they are equidistant. 562 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 563 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 564 565 fillIn("ar", "DZ", NULL, NULL, &request); 566 fillIn("ar", "015", NULL, NULL, &config1); 567 fillIn("ar", NULL, NULL, NULL, &config2); 568 // A closer parent is better. 569 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 570 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 571 572 fillIn("ar", "EG", NULL, NULL, &request); 573 fillIn("ar", NULL, NULL, NULL, &config1); 574 fillIn("ar", "015", NULL, NULL, &config2); 575 // A parent is better than a non-parent. 576 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 577 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 578 579 fillIn("ar", "QA", NULL, NULL, &request); 580 fillIn("ar", "EG", NULL, NULL, &config1); 581 fillIn("ar", "BH", NULL, NULL, &config2); 582 // A representative locale is better if they are equidistant. 583 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 584 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 585 586 fillIn("ar", "QA", NULL, NULL, &request); 587 fillIn("ar", "SA", NULL, NULL, &config1); 588 fillIn("ar", "015", NULL, NULL, &config2); 589 // If all is equal, the locale earlier in the dictionary is better and 590 // letters are better than numbers. 591 EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 592 EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 593} 594 595} // namespace android 596