1378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath/* 2378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 3378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * 4378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 5378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * you may not use this file except in compliance with the License. 6378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * You may obtain a copy of the License at 7378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * 8378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 9378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * 10378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * Unless required by applicable law or agreed to in writing, software 11378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 12378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * See the License for the specific language governing permissions and 14378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath * limitations under the License. 15378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath */ 16378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 17b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader#include <androidfw/LocaleData.h> 18378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <androidfw/ResourceTypes.h> 19378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <utils/Log.h> 20378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <utils/String8.h> 21378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 22378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <gtest/gtest.h> 23378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamathnamespace android { 24378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 2531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, packAndUnpack2LetterLanguage) { 26378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config config; 27378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.packLanguage("en"); 28378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 29378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('e', config.language[0]); 30378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('n', config.language[1]); 31378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 32b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 33378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.unpackLanguage(out); 34378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('e', out[0]); 35378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('n', out[1]); 36378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[2]); 37378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[3]); 38378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 39378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath memset(out, 1, sizeof(out)); 40378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.locale = 0; 41378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.unpackLanguage(out); 42378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[0]); 43378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[1]); 44378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[2]); 45378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[3]); 46378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 47378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 4831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, packAndUnpack2LetterRegion) { 49378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config config; 50378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.packRegion("US"); 51378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 52378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('U', config.country[0]); 53378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('S', config.country[1]); 54378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 55b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 56378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.unpackRegion(out); 57378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('U', out[0]); 58378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('S', out[1]); 59378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[2]); 60378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[3]); 61378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 62378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 6331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, packAndUnpack3LetterLanguage) { 64378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config config; 65378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.packLanguage("eng"); 66378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 67378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath // 1-00110-01 101-00100 68f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski EXPECT_EQ('\x99', config.language[0]); 69f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski EXPECT_EQ('\xA4', config.language[1]); 70378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 71b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 72378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.unpackLanguage(out); 73378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('e', out[0]); 74378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('n', out[1]); 75378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('g', out[2]); 76378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ(0, out[3]); 77378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 78378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 7931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, packAndUnpack3LetterLanguageAtOffset16) { 80b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath ResTable_config config; 81b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath config.packLanguage("tgp"); 82b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath 83b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // We had a bug where we would accidentally mask 84b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // the 5th bit of both bytes 85b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // 86b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // packed[0] = 1011 1100 87b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // packed[1] = 1101 0011 88b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // 89b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // which is equivalent to: 90b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // 1 [0] [1] [2] 91b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath // 1-01111-00110-10011 9231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski EXPECT_EQ(char(0xbc), config.language[0]); 9331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski EXPECT_EQ(char(0xd3), config.language[1]); 94b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath 95b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 96b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath config.unpackLanguage(out); 97b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath EXPECT_EQ('t', out[0]); 98b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath EXPECT_EQ('g', out[1]); 99b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath EXPECT_EQ('p', out[2]); 100b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath EXPECT_EQ(0, out[3]); 101b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath} 102b2975916224caecfc2fbb84e71ebd625ce6eeb1cNarayan Kamath 10331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, packAndUnpack3LetterRegion) { 104378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config config; 105378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.packRegion("419"); 106378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 107b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 108378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath config.unpackRegion(out); 109378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 110378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('4', out[0]); 111378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('1', out[1]); 112378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_EQ('9', out[2]); 113378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 114378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 115378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath/* static */ void fillIn(const char* lang, const char* country, 116378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath const char* script, const char* variant, ResTable_config* out) { 117378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath memset(out, 0, sizeof(ResTable_config)); 118378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath if (lang != NULL) { 119378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath out->packLanguage(lang); 120378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath } 121378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 122378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath if (country != NULL) { 123378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath out->packRegion(country); 124378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath } 125378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 126378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath if (script != NULL) { 127378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath memcpy(out->localeScript, script, 4); 1287960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader out->localeScriptWasComputed = false; 129b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader } else { 130b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader out->computeScript(); 1317960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader out->localeScriptWasComputed = true; 132378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath } 133378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 134378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath if (variant != NULL) { 135378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath memcpy(out->localeVariant, variant, strlen(variant)); 136378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath } 137378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 138378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 13931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, IsMoreSpecificThan) { 140378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config l; 141378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath ResTable_config r; 142378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 143378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", NULL, NULL, NULL, &l); 144378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn(NULL, NULL, NULL, NULL, &r); 145378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 146378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(l.isMoreSpecificThan(r)); 147378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(r.isMoreSpecificThan(l)); 148378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 149378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("eng", NULL, NULL, NULL, &l); 150378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(l.isMoreSpecificThan(r)); 151378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(r.isMoreSpecificThan(l)); 152378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 153378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("eng", "419", NULL, NULL, &r); 154378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(l.isMoreSpecificThan(r)); 155378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(r.isMoreSpecificThan(l)); 156378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 157378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", NULL, NULL, NULL, &l); 158378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", NULL, NULL, &r); 159378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(l.isMoreSpecificThan(r)); 160378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(r.isMoreSpecificThan(l)); 161378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 162378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", NULL, NULL, &l); 163378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", "Latn", NULL, &r); 164378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(l.isMoreSpecificThan(r)); 165378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(r.isMoreSpecificThan(l)); 166378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 167378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", NULL, NULL, &l); 168378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", NULL, "POSIX", &r); 169378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(l.isMoreSpecificThan(r)); 170378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(r.isMoreSpecificThan(l)); 171378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 172378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", "Latn", NULL, &l); 173378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath fillIn("en", "US", NULL, "POSIX", &r); 174378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_FALSE(l.isMoreSpecificThan(r)); 175378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath EXPECT_TRUE(r.isMoreSpecificThan(l)); 176378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath} 177378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 17831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, setLocale) { 17991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath ResTable_config test; 18091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.setBcp47Locale("en-US"); 18191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('e', test.language[0]); 18291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('n', test.language[1]); 18391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('U', test.country[0]); 18491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('S', test.country[1]); 1857960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader EXPECT_TRUE(test.localeScriptWasComputed); 186b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 18791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ(0, test.localeVariant[0]); 18891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath 18991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.setBcp47Locale("eng-419"); 190b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[4] = {1, 1, 1, 1}; 19191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.unpackLanguage(out); 19291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('e', out[0]); 19391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('n', out[1]); 19491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('g', out[2]); 19591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ(0, out[3]); 19691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath memset(out, 1, 4); 19791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.unpackRegion(out); 19891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('4', out[0]); 19991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('1', out[1]); 20091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('9', out[2]); 20191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath 20291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.setBcp47Locale("en-Latn-419"); 20391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('e', test.language[0]); 20491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('n', test.language[1]); 20591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 2067960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader EXPECT_FALSE(test.localeScriptWasComputed); 207b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader memset(out, 1, 4); 20891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath test.unpackRegion(out); 20991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('4', out[0]); 21091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('1', out[1]); 21191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath EXPECT_EQ('9', out[2]); 212b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 213b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.setBcp47Locale("de-1901"); 214b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader memset(out, 1, 4); 215b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.unpackLanguage(out); 216b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('d', out[0]); 217b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('e', out[1]); 218b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('\0', out[2]); 2197960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader EXPECT_TRUE(test.localeScriptWasComputed); 220b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 221b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader memset(out, 1, 4); 222b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.unpackRegion(out); 223b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('\0', out[0]); 224b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, strcmp("1901", test.localeVariant)); 225b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 226b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.setBcp47Locale("de-Latn-1901"); 227b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader memset(out, 1, 4); 228b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.unpackLanguage(out); 229b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('d', out[0]); 230b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('e', out[1]); 231b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('\0', out[2]); 2327960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader EXPECT_FALSE(test.localeScriptWasComputed); 233b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); 234b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader memset(out, 1, 4); 235b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader test.unpackRegion(out); 236b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ('\0', out[0]); 237b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, strcmp("1901", test.localeVariant)); 238b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} 239b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 240b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, computeScript) { 241b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader ResTable_config config; 242b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 243b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config); 244b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4)); 245b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 246b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "TW", NULL, NULL, &config); 247b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Hant", config.localeScript, 4)); 248b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 249b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "CN", NULL, NULL, &config); 250b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Hans", config.localeScript, 4)); 251b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 252b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, NULL, NULL, &config); 253b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4)); 254b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 255b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", "AZ", NULL, NULL, &config); 256b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4)); 257b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 258b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", "IR", NULL, NULL, &config); 259b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Arab", config.localeScript, 4)); 260b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 261b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("peo", NULL, NULL, NULL, &config); 262b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("Xpeo", config.localeScript, 4)); 263b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 264b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", NULL, NULL, NULL, &config); 265b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4)); 266b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} 267b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 268b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, getBcp47Locale_script) { 269b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader ResTable_config config; 270b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", NULL, "Latn", NULL, &config); 271b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 272b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader char out[RESTABLE_MAX_LOCALE_LEN]; 2737960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader config.localeScriptWasComputed = false; 274b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader config.getBcp47Locale(out); 275b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, strcmp("en-Latn", out)); 276b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 2777960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader config.localeScriptWasComputed = true; 278b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader config.getBcp47Locale(out); 279b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_EQ(0, strcmp("en", out)); 280b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} 281b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 282b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, match) { 283b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader ResTable_config supported, requested; 284b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 285b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &supported); 286b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &requested); 287b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Empty locale matches everything (as a default). 288b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 289b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 290b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "CA", NULL, NULL, &supported); 291b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &requested); 292b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Different languages don't match. 293b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 294b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 295b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "FR", NULL, NULL, &supported); 296b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", NULL, NULL, &requested); 297b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If we can't infer the scripts, different regions don't match. 298b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 299b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 300b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "FR", "Latn", NULL, &supported); 301b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", NULL, NULL, &requested); 302b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If we can't infer any of the scripts, different regions don't match. 303b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 304b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 305b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "FR", NULL, NULL, &supported); 306b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", "Latn", NULL, &requested); 307b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If we can't infer any of the scripts, different regions don't match. 308b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 309b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 310b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", NULL, NULL, NULL, &supported); 311b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", NULL, NULL, &requested); 312b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // language-only resources still support language+region requests, even if we can't infer the 313b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // script. 314b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 315b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 316b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", NULL, NULL, &supported); 317b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("qaa", "CA", NULL, NULL, &requested); 318b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Even if we can't infer the scripts, exactly equal locales match. 319b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 320b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 321b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, NULL, NULL, &supported); 322b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, "Latn", NULL, &requested); 323b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If the resolved scripts are the same, it doesn't matter if they were explicitly provided 324b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // or not, and they match. 325b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 326b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 327b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, NULL, NULL, &supported); 328b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, "Cyrl", NULL, &requested); 329b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If the resolved scripts are different, they don't match. 330b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 331b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 332b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, NULL, NULL, &supported); 333b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", "IR", NULL, NULL, &requested); 334b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If the resolved scripts are different, they don't match. 335b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 336b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 337b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", "IR", NULL, NULL, &supported); 338b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("az", NULL, "Arab", NULL, &requested); 339b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If the resolved scripts are the same, it doesn't matter if they were explicitly provided 340b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // or not, and they match. 341b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 342b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 343b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", NULL, NULL, NULL, &supported); 344b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "XA", NULL, NULL, &requested); 345b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // en-XA is a pseudo-locale, and English resources are not a match for it. 346b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 347b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 348b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "XA", NULL, NULL, &supported); 349b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", NULL, NULL, NULL, &requested); 350b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // en-XA is a pseudo-locale, and its resources don't support English locales. 351b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 352b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 353b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "XA", NULL, NULL, &supported); 354b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "XA", NULL, NULL, &requested); 355b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Even if they are pseudo-locales, exactly equal locales match. 356b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 357b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 358b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", NULL, NULL, NULL, &supported); 359b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "XB", NULL, NULL, &requested); 360b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // ar-XB is a pseudo-locale, and Arabic resources are not a match for it. 361b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 362b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 363b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "XB", NULL, NULL, &supported); 364b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", NULL, NULL, NULL, &requested); 365b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // ar-XB is a pseudo-locale, and its resources don't support Arabic locales. 366b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(supported.match(requested)); 367b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 368b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "XB", NULL, NULL, &supported); 369b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "XB", NULL, NULL, &requested); 370b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Even if they are pseudo-locales, exactly equal locales match. 371b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 3724de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader} 3734de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader 3744de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh PournaderTEST(ConfigLocaleTest, match_emptyScript) { 3754de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader ResTable_config supported, requested; 3764de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader 3774de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader fillIn("fr", "FR", NULL, NULL, &supported); 3784de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &requested); 3794de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader 3804de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader // emulate packages built with older AAPT 3814de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader memset(supported.localeScript, '\0', 4); 3827960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader supported.localeScriptWasComputed = false; 3834de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader 3844de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader EXPECT_TRUE(supported.match(requested)); 385b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} 386b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 387b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_basics) { 388b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader ResTable_config config1, config2, request; 389b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 390b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &request); 391b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "FR", NULL, NULL, &config1); 392b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &config2); 393b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 394b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 395b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 396b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &request); 397b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config1); 398b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config2); 399b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 400b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 401b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 402b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "CA", NULL, NULL, &request); 403b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("fr", "FR", NULL, NULL, &config1); 404b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config2); 405b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 406b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 407b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 408b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, NULL, &request); 409b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1901", &config1); 410b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1996", &config2); 411b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 412b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 413b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 414b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1901", &request); 415b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1901", &config1); 416b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, NULL, &config2); 417b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 418b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 419b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 420b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1901", &request); 421b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, "1996", &config1); 422b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("de", "DE", NULL, NULL, &config2); 423b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 424b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 425b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} 426b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 427b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) { 428b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader ResTable_config config1, config2, request; 429b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 430b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 431b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 432b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config2); 433b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // Both supported locales are the same, so none is better than the other. 434b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request)); 435b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 436b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 437b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 438b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &config1); 439b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config2); 440b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // An exact locale match is better than a parent. 441b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 442b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 443b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 444b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 445b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 446b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", NULL, NULL, NULL, &config2); 447b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer parent is better. 448b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 449b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 450b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 451b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 452b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 453b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "ES", NULL, NULL, &config2); 454b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent representative locale. 455b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 456b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 457b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 458b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 459b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", NULL, NULL, NULL, &config1); 460b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "ES", NULL, NULL, &config2); 461b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent representative locale. 462b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 463b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 464b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 465b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 466b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "PE", NULL, NULL, &config1); 467b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "ES", NULL, NULL, &config2); 468b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer locale is better. 469b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 470b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 471b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 472b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 473cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "US", NULL, NULL, &config1); 474cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", NULL, NULL, NULL, &config2); 475cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 476cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 477cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 478cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 479cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 480cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &request); 481cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "US", NULL, NULL, &config1); 482cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", NULL, NULL, NULL, &config2); 483cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 484cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 485cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 486cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 487cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 488cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 489cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &config1); 490cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", NULL, NULL, NULL, &config2); 491cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 492cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 493cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 494cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 495cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 496cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "US", NULL, NULL, &request); 497cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &config1); 498cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", NULL, NULL, NULL, &config2); 499cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 500cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 501cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 502cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 503cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 504cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 505cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 506cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &config2); 507cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 508cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Spanish locales, es-419 is a closer parent. 509cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 510cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 511cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 512cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "US", NULL, NULL, &request); 513cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 514cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &config2); 515cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 516cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Spanish locales, es-419 is a closer parent. 517cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 518cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 519cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 520cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "MX", NULL, NULL, &request); 521cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "419", NULL, NULL, &config1); 522cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "US", NULL, NULL, &config2); 523cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan 524cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Spanish locales, es-419 is a closer parent. 525cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 526cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 527cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 528cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 529b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "MX", NULL, NULL, &config1); 530b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "BO", NULL, NULL, &config2); 531cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 532cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 533b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 534b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 535b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 536b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 537b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "US", NULL, NULL, &config1); 538b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "BO", NULL, NULL, &config2); 539cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // Special case for Latin American Spanish: es-MX and es-US are 540cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader // pseudo-parents of all Latin Ameircan Spanish locales. 541cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 542cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 543cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader 544cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "IC", NULL, NULL, &request); 545cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "ES", NULL, NULL, &config1); 546cf246af30d007050f8b16bbbae6fbdf8d0559ccaRoozbeh Pournader fillIn("es", "GQ", NULL, NULL, &config2); 547b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A representative locale is better if they are equidistant. 548b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 549b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 550b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 551b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "AR", NULL, NULL, &request); 552b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "MX", NULL, NULL, &config1); 553b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "US", NULL, NULL, &config2); 554b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If all is equal, the locale earlier in the dictionary is better. 555b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 556b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 557b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 558b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "GQ", NULL, NULL, &request); 559b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "IC", NULL, NULL, &config1); 560b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("es", "419", NULL, NULL, &config2); 561b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If all is equal, the locale earlier in the dictionary is better and 562b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // letters are better than numbers. 563b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 564b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 565b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 566b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "GB", NULL, NULL, &request); 567b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "001", NULL, NULL, &config1); 568b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", NULL, NULL, NULL, &config2); 569b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer parent is better. 570b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 571b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 572b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 573b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "PR", NULL, NULL, &request); 574b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", NULL, NULL, NULL, &config1); 575b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "001", NULL, NULL, &config2); 576b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent. 577b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 578b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 579b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 580b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "DE", NULL, NULL, &request); 581b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "150", NULL, NULL, &config1); 582b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "001", NULL, NULL, &config2); 583b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer parent is better. 584b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 585b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 586b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 587b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "IN", NULL, NULL, &request); 588b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "AU", NULL, NULL, &config1); 589b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "US", NULL, NULL, &config2); 590b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer locale is better. 591b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 592b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 593b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 594b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "PR", NULL, NULL, &request); 595b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "001", NULL, NULL, &config1); 596b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "GB", NULL, NULL, &config2); 597b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer locale is better. 598b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 599b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 600b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 601b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "IN", NULL, NULL, &request); 602b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "GB", NULL, NULL, &config1); 603b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "AU", NULL, NULL, &config2); 604b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A representative locale is better if they are equidistant. 605b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 606b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 607b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 608b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "IN", NULL, NULL, &request); 609b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "AU", NULL, NULL, &config1); 610b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("en", "CA", NULL, NULL, &config2); 611b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If all is equal, the locale earlier in the dictionary is better. 612b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 613b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 614b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 615b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", "MZ", NULL, NULL, &request); 616b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", "PT", NULL, NULL, &config1); 617b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", NULL, NULL, NULL, &config2); 618b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer parent is better. 619b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 620b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 621b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 622b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", "MZ", NULL, NULL, &request); 623b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", "PT", NULL, NULL, &config1); 624b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("pt", "BR", NULL, NULL, &config2); 625b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent. 626b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 627b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 628b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 629b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "MO", "Hant", NULL, &request); 630b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "HK", "Hant", NULL, &config1); 631b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "TW", "Hant", NULL, &config2); 632b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent. 633b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 634b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 635b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 636b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "US", "Hant", NULL, &request); 637b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "TW", "Hant", NULL, &config1); 638b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("zh", "HK", "Hant", NULL, &config2); 639b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A representative locale is better if they are equidistant. 640b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 641b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 642b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 643b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "DZ", NULL, NULL, &request); 644b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "015", NULL, NULL, &config1); 645b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", NULL, NULL, NULL, &config2); 646b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A closer parent is better. 647b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 648b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 649b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 650b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "EG", NULL, NULL, &request); 651b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", NULL, NULL, NULL, &config1); 652b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "015", NULL, NULL, &config2); 653b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A parent is better than a non-parent. 654b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 655b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 656b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 657b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "QA", NULL, NULL, &request); 658b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "EG", NULL, NULL, &config1); 659b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "BH", NULL, NULL, &config2); 660b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // A representative locale is better if they are equidistant. 661b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 662b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 663b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader 664b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "QA", NULL, NULL, &request); 665b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "SA", NULL, NULL, &config1); 666b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader fillIn("ar", "015", NULL, NULL, &config2); 667b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // If all is equal, the locale earlier in the dictionary is better and 668b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader // letters are better than numbers. 669b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 670b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 67191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath} 672378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath 67327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// Default resources are considered better matches for US English 67427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// and US-like English locales than International English locales 67527953c349fa1c46698f57ae5f26339560c21adacRoozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_UsEnglishIsSpecial) { 67627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader ResTable_config config1, config2, request; 67727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 67827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "US", NULL, NULL, &request); 67927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config1); 68027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "001", NULL, NULL, &config2); 68127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // default is better than International English 68227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 68327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 68427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 68527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "US", NULL, NULL, &request); 68627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config1); 68727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "GB", NULL, NULL, &config2); 68827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // default is better than British English 68927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 69027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 69127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 69227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "PR", NULL, NULL, &request); 69327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config1); 69427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "001", NULL, NULL, &config2); 69527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // Even for Puerto Rico, default is better than International English 69627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 69727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 69827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 69927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "US", NULL, NULL, &request); 70027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", NULL, NULL, NULL, &config1); 70127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config2); 70227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // "English" is better than default, since it's a parent of US English 70327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 70427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 70527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 70627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "PR", NULL, NULL, &request); 70727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", NULL, NULL, NULL, &config1); 70827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config2); 70927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // "English" is better than default, since it's a parent of Puerto Rico English 71027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 71127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 71227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 71327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "US", NULL, NULL, &request); 71427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn(NULL, NULL, NULL, NULL, &config1); 71527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader fillIn("en", "PR", NULL, NULL, &config2); 71627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader // For US English itself, we prefer default to its siblings in the parent tree 71727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); 71827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); 71927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader} 72027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader 721b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader} // namespace android 722