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 "Diagnostics.h" 18 #include "ResourceTable.h" 19 #include "ResourceValues.h" 20 #include "util/Util.h" 21 22 #include "test/Builders.h" 23 24 #include <algorithm> 25 #include <gtest/gtest.h> 26 #include <ostream> 27 #include <string> 28 29 namespace aapt { 30 31 TEST(ResourceTableTest, FailToAddResourceWithBadName) { 32 ResourceTable table; 33 34 EXPECT_FALSE(table.addResource( 35 ResourceNameRef(u"android", ResourceType::kId, u"hey,there"), 36 ConfigDescription{}, "", 37 test::ValueBuilder<Id>().setSource("test.xml", 21u).build(), 38 test::getDiagnostics())); 39 40 EXPECT_FALSE(table.addResource( 41 ResourceNameRef(u"android", ResourceType::kId, u"hey:there"), 42 ConfigDescription{}, "", 43 test::ValueBuilder<Id>().setSource("test.xml", 21u).build(), 44 test::getDiagnostics())); 45 } 46 47 TEST(ResourceTableTest, AddOneResource) { 48 ResourceTable table; 49 50 EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/id"), 51 ConfigDescription{}, 52 "", 53 test::ValueBuilder<Id>() 54 .setSource("test/path/file.xml", 23u).build(), 55 test::getDiagnostics())); 56 57 ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/id")); 58 } 59 60 TEST(ResourceTableTest, AddMultipleResources) { 61 ResourceTable table; 62 63 ConfigDescription config; 64 ConfigDescription languageConfig; 65 memcpy(languageConfig.language, "pl", sizeof(languageConfig.language)); 66 67 EXPECT_TRUE(table.addResource( 68 test::parseNameOrDie(u"@android:attr/layout_width"), 69 config, 70 "", 71 test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(), 72 test::getDiagnostics())); 73 74 EXPECT_TRUE(table.addResource( 75 test::parseNameOrDie(u"@android:attr/id"), 76 config, 77 "", 78 test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(), 79 test::getDiagnostics())); 80 81 EXPECT_TRUE(table.addResource( 82 test::parseNameOrDie(u"@android:string/ok"), 83 config, 84 "", 85 test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(), 86 test::getDiagnostics())); 87 88 EXPECT_TRUE(table.addResource( 89 test::parseNameOrDie(u"@android:string/ok"), 90 languageConfig, 91 "", 92 test::ValueBuilder<BinaryPrimitive>(android::Res_value{}) 93 .setSource("test/path/file.xml", 20u) 94 .build(), 95 test::getDiagnostics())); 96 97 ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/layout_width")); 98 ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/id")); 99 ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:string/ok")); 100 ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(&table, u"@android:string/ok", 101 languageConfig)); 102 } 103 104 TEST(ResourceTableTest, OverrideWeakResourceValue) { 105 ResourceTable table; 106 107 ASSERT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/foo"), ConfigDescription{}, 108 "", util::make_unique<Attribute>(true), test::getDiagnostics())); 109 110 Attribute* attr = test::getValue<Attribute>(&table, u"@android:attr/foo"); 111 ASSERT_NE(nullptr, attr); 112 EXPECT_TRUE(attr->isWeak()); 113 114 ASSERT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/foo"), ConfigDescription{}, 115 "", util::make_unique<Attribute>(false), test::getDiagnostics())); 116 117 attr = test::getValue<Attribute>(&table, u"@android:attr/foo"); 118 ASSERT_NE(nullptr, attr); 119 EXPECT_FALSE(attr->isWeak()); 120 } 121 122 TEST(ResourceTableTest, ProductVaryingValues) { 123 ResourceTable table; 124 125 EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:string/foo"), 126 test::parseConfigOrDie("land"), 127 "tablet", 128 util::make_unique<Id>(), 129 test::getDiagnostics())); 130 EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:string/foo"), 131 test::parseConfigOrDie("land"), 132 "phone", 133 util::make_unique<Id>(), 134 test::getDiagnostics())); 135 136 EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, u"@android:string/foo", 137 test::parseConfigOrDie("land"), 138 "tablet")); 139 EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, u"@android:string/foo", 140 test::parseConfigOrDie("land"), 141 "phone")); 142 143 Maybe<ResourceTable::SearchResult> sr = table.findResource( 144 test::parseNameOrDie(u"@android:string/foo")); 145 AAPT_ASSERT_TRUE(sr); 146 std::vector<ResourceConfigValue*> values = sr.value().entry->findAllValues( 147 test::parseConfigOrDie("land")); 148 ASSERT_EQ(2u, values.size()); 149 EXPECT_EQ(std::string("phone"), values[0]->product); 150 EXPECT_EQ(std::string("tablet"), values[1]->product); 151 } 152 153 } // namespace aapt 154