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