ResourceUtils_test.cpp revision 52364f7ae31716d7827ea8f8566f4a28bd30a921
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "Resource.h"
18#include "ResourceUtils.h"
19#include "test/Builders.h"
20#include "test/Common.h"
21
22#include <gtest/gtest.h>
23
24namespace aapt {
25
26TEST(ResourceUtilsTest, ParseBool) {
27    bool val = false;
28    EXPECT_TRUE(ResourceUtils::tryParseBool(u"true", &val));
29    EXPECT_TRUE(val);
30
31    EXPECT_TRUE(ResourceUtils::tryParseBool(u"TRUE", &val));
32    EXPECT_TRUE(val);
33
34    EXPECT_TRUE(ResourceUtils::tryParseBool(u"True", &val));
35    EXPECT_TRUE(val);
36
37    EXPECT_TRUE(ResourceUtils::tryParseBool(u"false", &val));
38    EXPECT_FALSE(val);
39
40    EXPECT_TRUE(ResourceUtils::tryParseBool(u"FALSE", &val));
41    EXPECT_FALSE(val);
42
43    EXPECT_TRUE(ResourceUtils::tryParseBool(u"False", &val));
44    EXPECT_FALSE(val);
45}
46
47TEST(ResourceUtilsTest, ParseResourceName) {
48    ResourceNameRef actual;
49    bool actualPriv = false;
50    EXPECT_TRUE(ResourceUtils::parseResourceName(u"android:color/foo", &actual, &actualPriv));
51    EXPECT_EQ(ResourceNameRef(u"android", ResourceType::kColor, u"foo"), actual);
52    EXPECT_FALSE(actualPriv);
53
54    EXPECT_TRUE(ResourceUtils::parseResourceName(u"color/foo", &actual, &actualPriv));
55    EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, u"foo"), actual);
56    EXPECT_FALSE(actualPriv);
57
58    EXPECT_TRUE(ResourceUtils::parseResourceName(u"*android:color/foo", &actual, &actualPriv));
59    EXPECT_EQ(ResourceNameRef(u"android", ResourceType::kColor, u"foo"), actual);
60    EXPECT_TRUE(actualPriv);
61}
62
63TEST(ResourceUtilsTest, ParseReferenceWithNoPackage) {
64    ResourceNameRef expected({}, ResourceType::kColor, u"foo");
65    ResourceNameRef actual;
66    bool create = false;
67    bool privateRef = false;
68    EXPECT_TRUE(ResourceUtils::tryParseReference(u"@color/foo", &actual, &create, &privateRef));
69    EXPECT_EQ(expected, actual);
70    EXPECT_FALSE(create);
71    EXPECT_FALSE(privateRef);
72}
73
74TEST(ResourceUtilsTest, ParseReferenceWithPackage) {
75    ResourceNameRef expected(u"android", ResourceType::kColor, u"foo");
76    ResourceNameRef actual;
77    bool create = false;
78    bool privateRef = false;
79    EXPECT_TRUE(ResourceUtils::tryParseReference(u"@android:color/foo", &actual, &create,
80                                                 &privateRef));
81    EXPECT_EQ(expected, actual);
82    EXPECT_FALSE(create);
83    EXPECT_FALSE(privateRef);
84}
85
86TEST(ResourceUtilsTest, ParseReferenceWithSurroundingWhitespace) {
87    ResourceNameRef expected(u"android", ResourceType::kColor, u"foo");
88    ResourceNameRef actual;
89    bool create = false;
90    bool privateRef = false;
91    EXPECT_TRUE(ResourceUtils::tryParseReference(u"\t @android:color/foo\n \n\t", &actual,
92                                                 &create, &privateRef));
93    EXPECT_EQ(expected, actual);
94    EXPECT_FALSE(create);
95    EXPECT_FALSE(privateRef);
96}
97
98TEST(ResourceUtilsTest, ParseAutoCreateIdReference) {
99    ResourceNameRef expected(u"android", ResourceType::kId, u"foo");
100    ResourceNameRef actual;
101    bool create = false;
102    bool privateRef = false;
103    EXPECT_TRUE(ResourceUtils::tryParseReference(u"@+android:id/foo", &actual, &create,
104                                                 &privateRef));
105    EXPECT_EQ(expected, actual);
106    EXPECT_TRUE(create);
107    EXPECT_FALSE(privateRef);
108}
109
110TEST(ResourceUtilsTest, ParsePrivateReference) {
111    ResourceNameRef expected(u"android", ResourceType::kId, u"foo");
112    ResourceNameRef actual;
113    bool create = false;
114    bool privateRef = false;
115    EXPECT_TRUE(ResourceUtils::tryParseReference(u"@*android:id/foo", &actual, &create,
116                                                 &privateRef));
117    EXPECT_EQ(expected, actual);
118    EXPECT_FALSE(create);
119    EXPECT_TRUE(privateRef);
120}
121
122TEST(ResourceUtilsTest, FailToParseAutoCreateNonIdReference) {
123    bool create = false;
124    bool privateRef = false;
125    ResourceNameRef actual;
126    EXPECT_FALSE(ResourceUtils::tryParseReference(u"@+android:color/foo", &actual, &create,
127                                                  &privateRef));
128}
129
130TEST(ResourceUtilsTest, ParseAttributeReferences) {
131    EXPECT_TRUE(ResourceUtils::isAttributeReference(u"?android"));
132    EXPECT_TRUE(ResourceUtils::isAttributeReference(u"?android:foo"));
133    EXPECT_TRUE(ResourceUtils::isAttributeReference(u"?attr/foo"));
134    EXPECT_TRUE(ResourceUtils::isAttributeReference(u"?android:attr/foo"));
135}
136
137TEST(ResourceUtilsTest, FailParseIncompleteReference) {
138    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?style/foo"));
139    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?android:style/foo"));
140    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?android:"));
141    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?android:attr/"));
142    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?:attr/"));
143    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?:attr/foo"));
144    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?:/"));
145    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?:/foo"));
146    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?attr/"));
147    EXPECT_FALSE(ResourceUtils::isAttributeReference(u"?/foo"));
148}
149
150TEST(ResourceUtilsTest, ParseStyleParentReference) {
151    const ResourceName kAndroidStyleFooName(u"android", ResourceType::kStyle, u"foo");
152    const ResourceName kStyleFooName({}, ResourceType::kStyle, u"foo");
153
154    std::string errStr;
155    Maybe<Reference> ref = ResourceUtils::parseStyleParentReference(u"@android:style/foo", &errStr);
156    AAPT_ASSERT_TRUE(ref);
157    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
158
159    ref = ResourceUtils::parseStyleParentReference(u"@style/foo", &errStr);
160    AAPT_ASSERT_TRUE(ref);
161    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
162
163    ref = ResourceUtils::parseStyleParentReference(u"?android:style/foo", &errStr);
164    AAPT_ASSERT_TRUE(ref);
165    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
166
167    ref = ResourceUtils::parseStyleParentReference(u"?style/foo", &errStr);
168    AAPT_ASSERT_TRUE(ref);
169    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
170
171    ref = ResourceUtils::parseStyleParentReference(u"android:style/foo", &errStr);
172    AAPT_ASSERT_TRUE(ref);
173    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
174
175    ref = ResourceUtils::parseStyleParentReference(u"android:foo", &errStr);
176    AAPT_ASSERT_TRUE(ref);
177    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
178
179    ref = ResourceUtils::parseStyleParentReference(u"@android:foo", &errStr);
180    AAPT_ASSERT_TRUE(ref);
181    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
182
183    ref = ResourceUtils::parseStyleParentReference(u"foo", &errStr);
184    AAPT_ASSERT_TRUE(ref);
185    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
186
187    ref = ResourceUtils::parseStyleParentReference(u"*android:style/foo", &errStr);
188    AAPT_ASSERT_TRUE(ref);
189    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
190    EXPECT_TRUE(ref.value().privateReference);
191}
192
193TEST(ResourceUtilsTest, ParseEmptyFlag) {
194    std::unique_ptr<Attribute> attr = test::AttributeBuilder(false)
195            .setTypeMask(android::ResTable_map::TYPE_FLAGS)
196            .addItem(u"one", 0x01)
197            .addItem(u"two", 0x02)
198            .build();
199
200    std::unique_ptr<BinaryPrimitive> result = ResourceUtils::tryParseFlagSymbol(attr.get(), u"");
201    ASSERT_NE(nullptr, result);
202    EXPECT_EQ(0u, result->value.data);
203}
204
205} // namespace aapt
206