ConfigLocale_test.cpp revision b927c559e1ef8530b08712507f320502627db298
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);
128b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader         out->localeScriptWasProvided = true;
129b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader     } else {
130b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader         out->computeScript();
131b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader         out->localeScriptWasProvided = false;
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]);
185b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(test.localeScriptWasProvided);
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));
206b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(test.localeScriptWasProvided);
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]);
219b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(test.localeScriptWasProvided);
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]);
232b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(test.localeScriptWasProvided);
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];
273b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.localeScriptWasProvided = true;
274b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.getBcp47Locale(out);
275b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("en-Latn", out));
276b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
277b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.localeScriptWasProvided = false;
278b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    config.getBcp47Locale(out);
279b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_EQ(0, strcmp("en", out));
280b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
281b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
282b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, match) {
283b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config supported, requested;
284b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
285b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &supported);
286b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
287b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Empty locale matches everything (as a default).
288b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
289b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
290b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &supported);
291b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &requested);
292b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Different languages don't match.
293b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
294b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
295b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
296b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
297b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer the scripts, different regions don't match.
298b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
299b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
300b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", "Latn", NULL, &supported);
301b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
302b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
303b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
304b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
305b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "FR", NULL, NULL, &supported);
306b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", "Latn", NULL, &requested);
307b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If we can't infer any of the scripts, different regions don't match.
308b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
309b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
310b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", NULL, NULL, NULL, &supported);
311b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
312b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // language-only resources still support language+region requests, even if we can't infer the
313b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // script.
314b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
315b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
316b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &supported);
317b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("qaa", "CA", NULL, NULL, &requested);
318b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if we can't infer the scripts, exactly equal locales match.
319b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
320b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
321b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
322b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Latn", NULL, &requested);
323b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
324b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
325b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
326b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
327b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
328b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Cyrl", NULL, &requested);
329b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
330b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
331b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
332b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, NULL, NULL, &supported);
333b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &requested);
334b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are different, they don't match.
335b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
336b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
337b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", "IR", NULL, NULL, &supported);
338b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("az", NULL, "Arab", NULL, &requested);
339b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If the resolved scripts are the same, it doesn't matter if they were explicitly provided
340b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // or not, and they match.
341b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
342b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
343b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &supported);
344b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
345b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and English resources are not a match for it.
346b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
347b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
348b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
349b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &requested);
350b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // en-XA is a pseudo-locale, and its resources don't support English locales.
351b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
352b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
353b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &supported);
354b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "XA", NULL, NULL, &requested);
355b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
356b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
357b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
358b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &supported);
359b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
360b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and Arabic resources are not a match for it.
361b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
362b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
363b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
364b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &requested);
365b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // ar-XB is a pseudo-locale, and its resources don't support Arabic locales.
366b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(supported.match(requested));
367b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
368b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &supported);
369b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "XB", NULL, NULL, &requested);
370b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Even if they are pseudo-locales, exactly equal locales match.
371b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(supported.match(requested));
372b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
373b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
374b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_basics) {
375b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
376b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
377b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &request);
378b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
379b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &config2);
380b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
381b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
382b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
383b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
384b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config1);
385b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
386b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
387b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
388b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
389b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "CA", NULL, NULL, &request);
390b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("fr", "FR", NULL, NULL, &config1);
391b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn(NULL, NULL, NULL, NULL, &config2);
392b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
393b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
394b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
395b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &request);
396b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
397b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config2);
398b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
399b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
400b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
401b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
402b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &config1);
403b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
404b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
405b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
406b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
407b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1901", &request);
408b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, "1996", &config1);
409b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("de", "DE", NULL, NULL, &config2);
410b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
411b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
412b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}
413b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
414b927c559e1ef8530b08712507f320502627db298Roozbeh PournaderTEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) {
415b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    ResTable_config config1, config2, request;
416b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
417b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
418b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
419b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
420b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // Both supported locales are the same, so none is better than the other.
421b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config1.isLocaleBetterThan(config2, &request));
422b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
423b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
424b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
425b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &config1);
426b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
427b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // An exact locale match is better than a parent.
428b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
429b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
430b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
431b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
432b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
433b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config2);
434b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
435b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
436b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
437b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
438b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
439b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config1);
440b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
441b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
442b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
443b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
444b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
445b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
446b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", NULL, NULL, NULL, &config1);
447b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
448b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent representative locale.
449b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
450b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
451b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
452b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
453b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "PE", NULL, NULL, &config1);
454b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "ES", NULL, NULL, &config2);
455b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
456b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
457b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
458b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
459b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
460b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
461b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
462b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
463b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
464b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
465b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
466b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
467b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config1);
468b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "BO", NULL, NULL, &config2);
469b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
470b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
471b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
472b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
473b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "AR", NULL, NULL, &request);
474b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "MX", NULL, NULL, &config1);
475b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "US", NULL, NULL, &config2);
476b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
477b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
478b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
479b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
480b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "GQ", NULL, NULL, &request);
481b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "IC", NULL, NULL, &config1);
482b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("es", "419", NULL, NULL, &config2);
483b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
484b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
485b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
486b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
487b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
488b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &request);
489b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
490b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config2);
491b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
492b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
493b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
494b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
495b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
496b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", NULL, NULL, NULL, &config1);
497b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
498b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
499b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
500b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
501b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
502b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "DE", NULL, NULL, &request);
503b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "150", NULL, NULL, &config1);
504b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config2);
505b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
506b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
507b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
508b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
509b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
510b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
511b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "US", NULL, NULL, &config2);
512b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
513b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
514b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
515b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
516b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "PR", NULL, NULL, &request);
517b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "001", NULL, NULL, &config1);
518b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config2);
519b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer locale is better.
520b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
521b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
522b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
523b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
524b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "GB", NULL, NULL, &config1);
525b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config2);
526b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
527b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
528b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
529b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
530b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "IN", NULL, NULL, &request);
531b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "AU", NULL, NULL, &config1);
532b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("en", "CA", NULL, NULL, &config2);
533b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better.
534b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
535b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
536b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
537b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
538b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
539b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", NULL, NULL, NULL, &config2);
540b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A closer parent is better.
541b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
542b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
543b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
544b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "MZ", NULL, NULL, &request);
545b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "PT", NULL, NULL, &config1);
546b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("pt", "BR", NULL, NULL, &config2);
547b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
548b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
549b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
550b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
551b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "MO", "Hant", NULL, &request);
552b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config1);
553b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config2);
554b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
555b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
556b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
557b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
558b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "US", "Hant", NULL, &request);
559b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "TW", "Hant", NULL, &config1);
560b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("zh", "HK", "Hant", NULL, &config2);
561b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
562b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
563b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
564b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
565b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "DZ", NULL, NULL, &request);
566b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config1);
567b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", 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("ar", "EG", NULL, NULL, &request);
573b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", NULL, NULL, NULL, &config1);
574b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
575b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A parent is better than a non-parent.
576b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
577b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
578b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
579b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
580b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "EG", NULL, NULL, &config1);
581b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "BH", NULL, NULL, &config2);
582b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // A representative locale is better if they are equidistant.
583b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
584b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
585b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader
586b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "QA", NULL, NULL, &request);
587b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "SA", NULL, NULL, &config1);
588b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    fillIn("ar", "015", NULL, NULL, &config2);
589b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // If all is equal, the locale earlier in the dictionary is better and
590b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    // letters are better than numbers.
591b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request));
592b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader    EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request));
59391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
594378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
595b927c559e1ef8530b08712507f320502627db298Roozbeh Pournader}  // namespace android
596