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