ConfigLocale_test.cpp revision 7e5f96f1a37e51164a594930ecc862a94cc8c231
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
2827e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh PournaderTEST(ConfigLocaleTest, getBcp47Locale_canonicalize) {
2837e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    ResTable_config config;
2847e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    char out[RESTABLE_MAX_LOCALE_LEN];
2857e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
2867e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", NULL, NULL, NULL, &config);
2877e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out);
2887e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("tl", out));
2897e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out, true /* canonicalize */);
2907e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("fil", out));
2917e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
2927e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config);
2937e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out);
2947e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("tl-PH", out));
2957e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    config.getBcp47Locale(out, true /* canonicalize */);
2967e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_EQ(0, strcmp("fil-PH", out));
2977e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader}
2987e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
299b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, match) {
300b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config supported, requested;
301b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
302b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &supported);
303b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
304b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Empty locale matches everything (as a default).
305b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
306b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
307b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &supported);
308b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
309b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Different languages don't match.
310b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
311b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
3127e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &supported);
3137e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &requested);
3147e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    // Equivalent languages match.
3157e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
3167e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
317b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
318b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
319b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer the scripts, different regions don't match.
320b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
321b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
322b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", "Latn", NULL, &supported);
323b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
324b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
325b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
326b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
327b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
328b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", "Latn", NULL, &requested);
329b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
330b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
331b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
332b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", NULL, NULL, NULL, &supported);
333b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
334b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // language-only resources still support language+region requests, even if we can't infer the
335b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // script.
336b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
337b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
338b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &supported);
339b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
340b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if we can't infer the scripts, exactly equal locales match.
341b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
342b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
343b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
344b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Latn", NULL, &requested);
345b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
346b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
347b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
348b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
349b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
350b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Cyrl", NULL, &requested);
351b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
352b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
353b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
354b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
355b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &requested);
356b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
357b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
358b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
359b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &supported);
360b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Arab", NULL, &requested);
361b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
362b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
363b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
364b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
365b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &supported);
366b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
367b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and English resources are not a match for it.
368b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
369b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
370b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
371b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &requested);
372b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and its resources don't support English locales.
373b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
374b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
375b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
376b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
377b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
378b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
379b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
380b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &supported);
381b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
382b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and Arabic resources are not a match for it.
383b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
384b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
385b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
386b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &requested);
387b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and its resources don't support Arabic locales.
388b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
389b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
390b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
391b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
392b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
393b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
3944de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader}
3954de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
3964de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh PournaderTEST(ConfigLocaleTest, match_emptyScript) {
3974de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    ResTable_config supported, requested;
3984de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
3994de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &supported);
4004de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
4014de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4024de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    // emulate packages built with older AAPT
4034de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    memset(supported.localeScript, '\0', 4);
4047960898f6f886aadda1dd3d7a89106dde9f44217Roozbeh Pournader    supported.localeScriptWasComputed = false;
4054de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader
4064de4596ac1175908657f29cdc2a56529f2ca4b25Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
407b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
408b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
409b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_basics) {
410b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
411b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
412b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &request);
413b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
414b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &config2);
415b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
416b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
417b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
418b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
419b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
420b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
421b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
422b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
423b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
424b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
425b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
426b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
427b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
428b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
429b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
430b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &request);
4317e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config1);
4327e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config2);
4337e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
4347e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
4357e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
4367e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &request);
437b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
438b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config2);
439b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
440b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
441b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
442b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
443b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
444b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
445b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
446b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
447b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
448b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
449b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config1);
450b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
451b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
452b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
4537e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
4547e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &request);
4557e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config1);
4567e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "US", NULL, NULL, &config2);
4577e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
4587e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
4597e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
4607e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, "fonipa", &request);
4617e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, "fonipa", &config1);
4627e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &config2);
4637e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
4647e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
4657e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader
4667e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &request);
4677e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("fil", "PH", NULL, NULL, &config1);
4687e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    fillIn("tl", "PH", NULL, NULL, &config2);
4697e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
4707e5f96f1a37e51164a594930ecc862a94cc8c231Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
471b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
472b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
473b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) {
474b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
475b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
476b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
477b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
478b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
479b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Both supported locales are the same, so none is better than the other.
480b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
481b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
482b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
483b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
484b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &config1);
485b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
486b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // An exact locale match is better than a parent.
487b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
488b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
489b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
490b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
491b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
492b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
493b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
494b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
495b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
496b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
497b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
498b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
499b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
500b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
501b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
502b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
503b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
504b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
505b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config1);
506b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
507b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
508b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
509b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
510b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
511b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
512b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "PE", NULL, NULL, &config1);
513b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
514b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
515b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
516b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
517b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
518b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
519b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
520b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
521b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
522b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
523b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
524b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
525b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
526b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config1);
527b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
528b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
529b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
530b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
531b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
532b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
533b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
534b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config2);
535b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
536b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
537b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
538b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
539b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "GQ", NULL, NULL, &request);
540b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "IC", NULL, NULL, &config1);
541b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
542b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
543b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
544b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
545b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
546b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
547b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &request);
548b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
549b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config2);
550b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
551b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
552b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
553b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
554b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
555b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
556b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
557b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
558b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
559b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
560b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
561b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "DE", NULL, NULL, &request);
562b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "150", NULL, NULL, &config1);
563b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
564b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
565b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
566b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
567b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
568b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
569b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
570b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "US", NULL, NULL, &config2);
571b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
572b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
573b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
574b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
575b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
576b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
577b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config2);
578b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
579b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
580b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
581b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
582b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
583b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config1);
584b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config2);
585b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
586b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
587b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
588b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
589b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
590b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
591b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &config2);
592b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
593b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
594b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
595b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
596b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
597b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
598b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", NULL, NULL, NULL, &config2);
599b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
600b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
601b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
602b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
603b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
604b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
605b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "BR", NULL, NULL, &config2);
606b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
607b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
608b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
609b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
610b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "MO", "Hant", NULL, &request);
611b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config1);
612b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config2);
613b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
614b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
615b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
616b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
617b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "US", "Hant", NULL, &request);
618b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config1);
619b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config2);
620b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
621b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
622b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
623b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
624b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "DZ", NULL, NULL, &request);
625b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config1);
626b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &config2);
627b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
628b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
629b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
630b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
631b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "EG", NULL, NULL, &request);
632b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &config1);
633b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
634b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
635b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
636b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
637b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
638b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
639b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "EG", NULL, NULL, &config1);
640b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "BH", NULL, NULL, &config2);
641b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
642b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
643b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
644b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
645b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
646b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "SA", NULL, NULL, &config1);
647b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
648b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
649b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
650b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
651b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
65291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
653378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
65427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// Default resources are considered better matches for US English
65527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader// and US-like English locales than International English locales
65627953c349fa1c46698f57ae5f26339560c21adacRoozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_UsEnglishIsSpecial) {
65727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    ResTable_config config1, config2, request;
65827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
65927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
66027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
66127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
66227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // default is better than International English
66327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
66427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
66527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
66627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
66727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
66827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config2);
66927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // default is better than British English
67027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
67127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
67227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
67327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
67427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
67527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
67627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // Even for Puerto Rico, default is better than International English
67727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
67827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
67927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
68027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
68127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
68227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
68327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // "English" is better than default, since it's a parent of US English
68427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
68527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
68627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
68727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
68827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
68927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
69027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // "English" is better than default, since it's a parent of Puerto Rico English
69127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
69227953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
69327953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
69427953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "US", NULL, NULL, &request);
69527953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
69627953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    fillIn("en", "PR", NULL, NULL, &config2);
69727953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    // For US English itself, we prefer default to its siblings in the parent tree
69827953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
69927953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
70027953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader}
70127953c349fa1c46698f57ae5f26339560c21adacRoozbeh Pournader
702b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}  // namespace android
703