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));
1767ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
1777ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "EG", NULL, NULL, &l);
1787ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "EG", NULL, NULL, &r);
1797ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&r.localeNumberingSystem, "latn", 4);
1807ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_FALSE(l.isMoreSpecificThan(r));
1817ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_TRUE(r.isMoreSpecificThan(l));
1827ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
1837ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("en", "US", NULL, NULL, &l);
1847ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("es", "ES", NULL, NULL, &r);
1857ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
1867ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_FALSE(l.isMoreSpecificThan(r));
1877ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_FALSE(r.isMoreSpecificThan(l));
188378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
189378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
19031245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigLocaleTest, setLocale) {
19191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    ResTable_config test;
19291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("en-US");
19391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', test.language[0]);
19491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', test.language[1]);
19591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('U', test.country[0]);
19691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('S', test.country[1]);
1977960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    EXPECT_TRUE(test.localeScriptWasComputed);
198b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
19991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, test.localeVariant[0]);
200e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
20191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
20291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("eng-419");
203b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    char out[4] = {1, 1, 1, 1};
20491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackLanguage(out);
20591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', out[0]);
20691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', out[1]);
20791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('g', out[2]);
20891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, out[3]);
20991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    memset(out, 1, 4);
21091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackRegion(out);
21191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('4', out[0]);
21291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('1', out[1]);
21391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('9', out[2]);
214e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
21591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
21691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("en-Latn-419");
21791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', test.language[0]);
21891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', test.language[1]);
21991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
2207960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    EXPECT_FALSE(test.localeScriptWasComputed);
221b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    memset(out, 1, 4);
22291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackRegion(out);
22391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('4', out[0]);
22491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('1', out[1]);
22591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('9', out[2]);
226e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
227b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
228b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.setBcp47Locale("de-1901");
229b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    memset(out, 1, 4);
230b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.unpackLanguage(out);
231b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('d', out[0]);
232b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('e', out[1]);
233b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('\0', out[2]);
2347960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    EXPECT_TRUE(test.localeScriptWasComputed);
235b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
236b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    memset(out, 1, 4);
237b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.unpackRegion(out);
238b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('\0', out[0]);
239b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("1901", test.localeVariant));
240e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
241b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
242b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.setBcp47Locale("de-Latn-1901");
243b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    memset(out, 1, 4);
244b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.unpackLanguage(out);
245b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('d', out[0]);
246b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('e', out[1]);
247b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('\0', out[2]);
2487960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    EXPECT_FALSE(test.localeScriptWasComputed);
249b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
250b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    memset(out, 1, 4);
251b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    test.unpackRegion(out);
252b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ('\0', out[0]);
253b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("1901", test.localeVariant));
254e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
255e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
256e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-nu-latn");
257e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ('a', test.language[0]);
258e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ('r', test.language[1]);
259e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ('E', test.country[0]);
260e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ('G', test.country[1]);
261e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_TRUE(test.localeScriptWasComputed);
262e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("Arab", test.localeScript, 4));
263e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeVariant[0]);
264e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("latn", test.localeNumberingSystem, 4));
265e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
266e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u");
267e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
268e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
269e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-nu");
270e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
271e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
272e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-attr-nu-latn");
273e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("latn", test.localeNumberingSystem, 4));
274e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
275e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-ca-gregory-nu-latn");
276e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("latn", test.localeNumberingSystem, 4));
277e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
278e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-nu-latn-ca-gregory");
279e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("latn", test.localeNumberingSystem, 4));
280e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
281e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-nu-toolongnumsys");
282e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
283e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
284e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-nu-latn-nu-arab");
285e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, memcmp("latn", test.localeNumberingSystem, 4));
286e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
287e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-EG-u-co-nu-latn");
288e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
289e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk
290e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    test.setBcp47Locale("ar-u-co-abcd-attr-nu-latn");
291e7bc60a954cfed8b4377a9f9b8601208781d5393Igor Viarheichyk    EXPECT_EQ(0, test.localeNumberingSystem[0]);
292b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
293b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
294b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, computeScript) {
295b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config;
296b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
297b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config);
298b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4));
299b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
300b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", NULL, NULL, &config);
301b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Hant", config.localeScript, 4));
302b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
303b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "CN", NULL, NULL, &config);
304b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Hans", config.localeScript, 4));
305b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
306b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &config);
307b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4));
308b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
309b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "AZ", NULL, NULL, &config);
310b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Latn", config.localeScript, 4));
311b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
312b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &config);
313b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Arab", config.localeScript, 4));
314b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
315b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("peo", NULL, NULL, NULL, &config);
316b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("Xpeo", config.localeScript, 4));
317b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
318b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", NULL, NULL, NULL, &config);
319b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, memcmp("\0\0\0\0", config.localeScript, 4));
320b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
321b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
322b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, getBcp47Locale_script) {
323b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config;
324b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, "Latn", NULL, &config);
325b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
326b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    char out[RESTABLE_MAX_LOCALE_LEN];
3277960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    config.localeScriptWasComputed = false;
328b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.getBcp47Locale(out);
329b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("en-Latn", out));
330b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
3317960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    config.localeScriptWasComputed = true;
332b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.getBcp47Locale(out);
333b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("en", out));
334b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
335b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
3367ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor ViarheichykTEST(ConfigLocaleTest, getBcp47Locale_numberingSystem) {
3377ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    ResTable_config config;
3387ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("en", NULL, NULL, NULL, &config);
3397ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
3407ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    char out[RESTABLE_MAX_LOCALE_LEN];
3417ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
3427ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&config.localeNumberingSystem, "latn", 4);
3437ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    config.getBcp47Locale(out);
3447ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_EQ(0, strcmp("en-u-nu-latn", out));
3457ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
3467ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("sr", "SR", "Latn", NULL, &config);
3477ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&config.localeNumberingSystem, "latn", 4);
3487ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    config.getBcp47Locale(out);
3497ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_EQ(0, strcmp("sr-Latn-SR-u-nu-latn", out));
3507ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk}
3517ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
3527e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh PournaderTEST(ConfigLocaleTest, getBcp47Locale_canonicalize) {
3537e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    ResTable_config config;
3547e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    char out[RESTABLE_MAX_LOCALE_LEN];
3557e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
3567e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", NULL, NULL, NULL, &config);
3577e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out);
3587e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("tl", out));
3597e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out, true /* canonicalize */);
3607e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("fil", out));
3617e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
3627e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config);
3637e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out);
3647e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("tl-PH", out));
3657e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out, true /* canonicalize */);
3667e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("fil-PH", out));
3677e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader}
3687e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
369b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, match) {
370b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config supported, requested;
371b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
372b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &supported);
373b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
374b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Empty locale matches everything (as a default).
375b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
376b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
377b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &supported);
378b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
379b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Different languages don't match.
380b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
381b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
3827e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &supported);
3837e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &requested);
3847e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    // Equivalent languages match.
3857e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
3867e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
387b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
388b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
389b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer the scripts, different regions don't match.
390b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
391b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
392b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", "Latn", NULL, &supported);
393b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
394b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
395b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
396b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
397b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
398b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", "Latn", NULL, &requested);
399b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
400b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
401b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
402b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", NULL, NULL, NULL, &supported);
403b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
404b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // language-only resources still support language+region requests, even if we can't infer the
405b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // script.
406b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
407b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
408b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &supported);
409b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
410b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if we can't infer the scripts, exactly equal locales match.
411b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
412b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
413b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
414b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Latn", NULL, &requested);
415b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
416b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
417b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
418b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
419b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
420b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Cyrl", NULL, &requested);
421b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
422b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
423b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
424b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
425b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &requested);
426b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
427b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
428b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
429b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &supported);
430b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Arab", NULL, &requested);
431b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
432b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
433b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
434b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
435b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &supported);
436b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
437b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and English resources are not a match for it.
438b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
439b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
440b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
441b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &requested);
442b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and its resources don't support English locales.
443b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
444b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
445b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
446b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
447b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
448b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
449b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
450b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &supported);
451b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
452b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and Arabic resources are not a match for it.
453b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
454b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
455b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
456b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &requested);
457b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and its resources don't support Arabic locales.
458b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
459b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
460b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
461b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
462b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
463b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
4647ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
4657ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "EG", NULL, NULL, &supported);
4667ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "TN", NULL, NULL, &requested);
4677ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&supported.localeNumberingSystem, "latn", 4);
4687ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_TRUE(supported.match(requested));
4694de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader}
4704de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4714de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh PournaderTEST(ConfigLocaleTest, match_emptyScript) {
4724de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    ResTable_config supported, requested;
4734de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4744de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &supported);
4754de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
4764de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4774de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    // emulate packages built with older AAPT
4784de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    memset(supported.localeScript, '\0', 4);
4797960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    supported.localeScriptWasComputed = false;
4804de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4814de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
482b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
483b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
484b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_basics) {
485b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
486b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
487b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &request);
488b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
489b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &config2);
490b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
491b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
492b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
493b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
494b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
495b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
496b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
497b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
498b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
499b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
500b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
501b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
502b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
503b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
504b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
505b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &request);
5067e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config1);
5077e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config2);
5087e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
5097e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
5107e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
5117e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &request);
512b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
513b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config2);
514b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
515b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
516b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
517b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
518b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
519b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
520b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
521b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
522b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
523b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
524b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config1);
525b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
526b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
527b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
5287e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
5297e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &request);
5307e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config1);
5317e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "US", NULL, NULL, &config2);
5327e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
5337e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
5347e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
5357e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, "fonipa", &request);
5367e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, "fonipa", &config1);
5377e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &config2);
5387e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
5397e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
5407e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
5417e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &request);
5427e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &config1);
5437e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config2);
5447e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
5457e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
546b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
547b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
548b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) {
549b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
550b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
551b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
552b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
553b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
554b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Both supported locales are the same, so none is better than the other.
555b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
556b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
557b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
558b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
559b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &config1);
560b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
561b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // An exact locale match is better than a parent.
562b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
563b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
564b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
565b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
566b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
567b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
568b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
569b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
570b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
571b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
572b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
573b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
574b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
575b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
576b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
577b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
578b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
579b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
580b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config1);
581b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
582b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
583b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
584b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
585b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
586b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
587b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "PE", NULL, NULL, &config1);
588b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
589b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
590b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
591b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
592b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
593b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
594a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config1);
595a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
596a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
597a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
598a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
599a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
600a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
601a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &request);
602a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config1);
603a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
604a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
605a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
606a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
607a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
608a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
609a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
610a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
611a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
612a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
613a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
614a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
615a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
616a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
617a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &request);
618a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
619a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
620a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
621a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
622a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
623a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
624a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
625a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
626a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
627a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config2);
628a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan
629a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Spanish locales, es-419 is a closer parent.
630a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
631a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
632a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
633a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &request);
634a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
635a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config2);
636a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan
637a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Spanish locales, es-419 is a closer parent.
638a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
639a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
640a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
641a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &request);
642a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
643a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config2);
644a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan
645a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Spanish locales, es-419 is a closer parent.
646a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
647a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
648a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
649a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
650b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
651b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
652a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
653a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
654b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
655b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
656b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
657b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
658b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config1);
659b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
660a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // Special case for Latin American Spanish: es-MX and es-US are
661a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    // pseudo-parents of all Latin Ameircan Spanish locales.
662a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
663a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
664a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader
665a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "IC", NULL, NULL, &request);
666a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config1);
667a192a8ced65ceea8bfe44f0eac6a394cbf80d936Roozbeh Pournader    fillIn("es", "GQ", NULL, NULL, &config2);
668b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
669b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
670b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
671b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
672b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
673b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
674b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config2);
675b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
676b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
677b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
678b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
679b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "GQ", NULL, NULL, &request);
680b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "IC", NULL, NULL, &config1);
681b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
682b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
683b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
684b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
685b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
686b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
687b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &request);
688b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
689b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config2);
690b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
691b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
692b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
693b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
694b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
695b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
696b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
697b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
698b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
699b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
700b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
701b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "DE", NULL, NULL, &request);
702b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "150", NULL, NULL, &config1);
703b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
704b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
705b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
706b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
707b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
708b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
709b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
710b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "US", NULL, NULL, &config2);
711b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
712b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
713b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
714b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
715b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
716b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
717b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config2);
718b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
719b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
720b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
721b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
722b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
723b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config1);
724b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config2);
725b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
726b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
727b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
728b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
729b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
730b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
731b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &config2);
732b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
733b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
734b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
735b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
736b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
737b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
738b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", NULL, NULL, NULL, &config2);
739b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
740b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
741b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
742b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
743b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
744b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
745b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "BR", NULL, NULL, &config2);
746b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
747b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
748b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
749b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
750b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "MO", "Hant", NULL, &request);
751b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config1);
752b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config2);
753b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
754b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
755b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
756b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
757b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "US", "Hant", NULL, &request);
758b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config1);
759b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config2);
760b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
761b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
762b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
763b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
764b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "DZ", NULL, NULL, &request);
765b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config1);
766b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &config2);
767b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
768b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
769b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
770b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
771b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "EG", NULL, NULL, &request);
772b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &config1);
773b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
774b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
775b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
776b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
777b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
778b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
779b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "EG", NULL, NULL, &config1);
780b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "BH", NULL, NULL, &config2);
781b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
782b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
783b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
784b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
785b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
786b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "SA", NULL, NULL, &config1);
787b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
788b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
789b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
790b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
791b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
79291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
793378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
7947ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor ViarheichykTEST(ConfigLocaleTest, isLocaleBetterThan_numberingSystem) {
7957ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    ResTable_config config1, config2, request;
7967ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
7977ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "EG", NULL, NULL, &request);
7987ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&request.localeNumberingSystem, "latn", 4);
7997ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", NULL, NULL, NULL, &config1);
8007ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&config1.localeNumberingSystem, "latn", 4);
8017ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", NULL, NULL, NULL, &config2);
8027ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
8037ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
8047ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
8057ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "EG", NULL, NULL, &request);
8067ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&request.localeNumberingSystem, "latn", 4);
8077ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", "TN", NULL, NULL, &config1);
8087ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    memcpy(&config1.localeNumberingSystem, "latn", 4);
8097ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    fillIn("ar", NULL, NULL, NULL, &config2);
8107ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_TRUE(config2.isLocaleBetterThan(config1, &request));
8117ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
8127ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk}
8137ec28a888c7e59af02aeb0e0a9b078037d317e2eIgor Viarheichyk
81427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// Default resources are considered better matches for US English
81527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// and US-like English locales than International English locales
81627953c349fa1c46698f57ae5f26339560c21adacRoozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_UsEnglishIsSpecial) {
81727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    ResTable_config config1, config2, request;
81827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
81927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
82027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
82127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
82227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // default is better than International English
82327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
82427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
82527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
82627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
82727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
82827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config2);
82927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // default is better than British English
83027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
83127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
83227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
83327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
83427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
83527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
83627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // Even for Puerto Rico, default is better than International English
83727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
83827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
83927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
84027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
84127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
84227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
84327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // "English" is better than default, since it's a parent of US English
84427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
84527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
84627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
84727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
84827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
84927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
85027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // "English" is better than default, since it's a parent of Puerto Rico English
85127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
85227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
85327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
85427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
85527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
85627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &config2);
85727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // For US English itself, we prefer default to its siblings in the parent tree
85827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
85927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
86027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader}
86127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
862b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}  // namespace android
863