ConfigLocale_test.cpp revision f90f2f8dc36e7243b85e0b6a7fd5a590893c827e
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
17378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <androidfw/ResourceTypes.h>
18378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <utils/Log.h>
19378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <utils/String8.h>
20378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
21378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath#include <gtest/gtest.h>
22378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamathnamespace android {
23378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
24378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan KamathTEST(ResourceTypesTest, ResourceConfig_packAndUnpack2LetterLanguage) {
25378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     ResTable_config config;
26378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.packLanguage("en");
27378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
28378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('e', config.language[0]);
29378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('n', config.language[1]);
30378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
31378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     char out[4] = { 1, 1, 1, 1};
32378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.unpackLanguage(out);
33378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('e', out[0]);
34378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('n', out[1]);
35378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[2]);
36378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[3]);
37378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
38378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     memset(out, 1, sizeof(out));
39378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.locale = 0;
40378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.unpackLanguage(out);
41378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[0]);
42378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[1]);
43378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[2]);
44378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[3]);
45378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
46378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
47378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan KamathTEST(ResourceTypesTest, ResourceConfig_packAndUnpack2LetterRegion) {
48378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     ResTable_config config;
49378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.packRegion("US");
50378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
51378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('U', config.country[0]);
52378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('S', config.country[1]);
53378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
54378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     char out[4] = { 1, 1, 1, 1};
55378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.unpackRegion(out);
56378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('U', out[0]);
57378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('S', out[1]);
58378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[2]);
59378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[3]);
60378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
61378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
62378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan KamathTEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguage) {
63378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     ResTable_config config;
64378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.packLanguage("eng");
65378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
66378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     // 1-00110-01 101-00100
67f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski     EXPECT_EQ('\x99', config.language[0]);
68f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski     EXPECT_EQ('\xA4', config.language[1]);
69378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
70378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     char out[4] = { 1, 1, 1, 1};
71378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.unpackLanguage(out);
72378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('e', out[0]);
73378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('n', out[1]);
74378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('g', out[2]);
75378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ(0, out[3]);
76378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
77378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
78378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan KamathTEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterRegion) {
79378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     ResTable_config config;
80378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.packRegion("419");
81378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
82378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     char out[4] = { 1, 1, 1, 1};
83378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     config.unpackRegion(out);
84378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
85378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('4', out[0]);
86378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('1', out[1]);
87378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     EXPECT_EQ('9', out[2]);
88378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
89378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
90378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath/* static */ void fillIn(const char* lang, const char* country,
91378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath        const char* script, const char* variant, ResTable_config* out) {
92378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     memset(out, 0, sizeof(ResTable_config));
93378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     if (lang != NULL) {
94378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath         out->packLanguage(lang);
95378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     }
96378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
97378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     if (country != NULL) {
98378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath         out->packRegion(country);
99378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     }
100378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
101378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     if (script != NULL) {
102378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath         memcpy(out->localeScript, script, 4);
103378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     }
104378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
105378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     if (variant != NULL) {
106378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath         memcpy(out->localeVariant, variant, strlen(variant));
107378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath     }
108378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
109378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
110378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan KamathTEST(ResourceTypesTest, IsMoreSpecificThan) {
111378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    ResTable_config l;
112378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    ResTable_config r;
113378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
114378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", NULL, NULL, NULL, &l);
115378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn(NULL, NULL, NULL, NULL, &r);
116378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
117378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(l.isMoreSpecificThan(r));
118378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(r.isMoreSpecificThan(l));
119378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
120378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("eng", NULL, NULL, NULL, &l);
121378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(l.isMoreSpecificThan(r));
122378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(r.isMoreSpecificThan(l));
123378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
124378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("eng", "419", NULL, NULL, &r);
125378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(l.isMoreSpecificThan(r));
126378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(r.isMoreSpecificThan(l));
127378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
128378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", NULL, NULL, NULL, &l);
129378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", NULL, NULL, &r);
130378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(l.isMoreSpecificThan(r));
131378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(r.isMoreSpecificThan(l));
132378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
133378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", NULL, NULL, &l);
134378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", "Latn", NULL, &r);
135378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(l.isMoreSpecificThan(r));
136378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(r.isMoreSpecificThan(l));
137378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
138378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", NULL, NULL, &l);
139378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", NULL, "POSIX", &r);
140378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(l.isMoreSpecificThan(r));
141378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(r.isMoreSpecificThan(l));
142378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
143378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", "Latn", NULL, &l);
144378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    fillIn("en", "US", NULL, "POSIX", &r);
145378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_FALSE(l.isMoreSpecificThan(r));
146378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath    EXPECT_TRUE(r.isMoreSpecificThan(l));
147378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}
148378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
14991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan KamathTEST(ResourceTypesTest, setLocale) {
15091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    ResTable_config test;
15191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("en-US");
15291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', test.language[0]);
15391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', test.language[1]);
15491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('U', test.country[0]);
15591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('S', test.country[1]);
15691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, test.localeScript[0]);
15791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, test.localeVariant[0]);
15891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
15991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("eng-419");
16091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    char out[4] = { 1, 1, 1, 1};
16191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackLanguage(out);
16291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', out[0]);
16391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', out[1]);
16491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('g', out[2]);
16591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, out[3]);
16691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    memset(out, 1, 4);
16791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackRegion(out);
16891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('4', out[0]);
16991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('1', out[1]);
17091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('9', out[2]);
17191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
17291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
17391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.setBcp47Locale("en-Latn-419");
17491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    memset(out, 1, 4);
17591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('e', test.language[0]);
17691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('n', test.language[1]);
17791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
17891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
17991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    test.unpackRegion(out);
18091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('4', out[0]);
18191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('1', out[1]);
18291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    EXPECT_EQ('9', out[2]);
18391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
184378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath
185378c6775a62d9c461cde51f06c1b14bb014c78fdNarayan Kamath}  // namespace android.
186