16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "Diagnostics.h" 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ResourceTable.h" 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ResourceValues.h" 201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Util.h" 211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 22e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski#include "test/Builders.h" 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <algorithm> 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h> 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream> 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 31cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(ResourceTableTest, FailToAddResourceWithBadName) { 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ResourceTable table; 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_FALSE(table.addResource( 35e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski ResourceNameRef(u"android", ResourceType::kId, u"hey,there"), 36e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski ConfigDescription{}, "", 37e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>().setSource("test.xml", 21u).build(), 38cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_FALSE(table.addResource( 41e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski ResourceNameRef(u"android", ResourceType::kId, u"hey:there"), 42e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski ConfigDescription{}, "", 43e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>().setSource("test.xml", 21u).build(), 44cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 47cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(ResourceTableTest, AddOneResource) { 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ResourceTable table; 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 50e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/id"), 51e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski ConfigDescription{}, 52e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "", 53e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>() 54e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski .setSource("test/path/file.xml", 23u).build(), 55cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/id")); 586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 60cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(ResourceTableTest, AddMultipleResources) { 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ResourceTable table; 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ConfigDescription config; 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ConfigDescription languageConfig; 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski memcpy(languageConfig.language, "pl", sizeof(languageConfig.language)); 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_TRUE(table.addResource( 681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseNameOrDie(u"@android:attr/layout_width"), 69e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski config, 70e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "", 71e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(), 72cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_TRUE(table.addResource( 751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseNameOrDie(u"@android:attr/id"), 76e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski config, 77e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "", 78e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(), 79cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_TRUE(table.addResource( 821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseNameOrDie(u"@android:string/ok"), 83e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski config, 84e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "", 85e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(), 86cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_TRUE(table.addResource( 891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseNameOrDie(u"@android:string/ok"), 90e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski languageConfig, 91e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "", 92e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski test::ValueBuilder<BinaryPrimitive>(android::Res_value{}) 93e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski .setSource("test/path/file.xml", 20u) 94e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski .build(), 95cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/layout_width")); 981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:attr/id")); 991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, test::getValue<Id>(&table, u"@android:string/ok")); 1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(&table, u"@android:string/ok", 1011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski languageConfig)); 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 104cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(ResourceTableTest, OverrideWeakResourceValue) { 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ResourceTable table; 1061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 107e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski ASSERT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/foo"), ConfigDescription{}, 108cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski "", util::make_unique<Attribute>(true), test::getDiagnostics())); 1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Attribute* attr = test::getValue<Attribute>(&table, u"@android:attr/foo"); 1111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, attr); 1121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(attr->isWeak()); 1131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 114e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski ASSERT_TRUE(table.addResource(test::parseNameOrDie(u"@android:attr/foo"), ConfigDescription{}, 115cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski "", util::make_unique<Attribute>(false), test::getDiagnostics())); 1161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski attr = test::getValue<Attribute>(&table, u"@android:attr/foo"); 1181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(nullptr, attr); 1191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(attr->isWeak()); 1206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 122cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(ResourceTableTest, ProductVaryingValues) { 123e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski ResourceTable table; 124e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 125e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:string/foo"), 126e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseConfigOrDie("land"), 127e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "tablet", 128e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski util::make_unique<Id>(), 129cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 130e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_TRUE(table.addResource(test::parseNameOrDie(u"@android:string/foo"), 131e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseConfigOrDie("land"), 132e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "phone", 133e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski util::make_unique<Id>(), 134cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski test::getDiagnostics())); 135e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 136e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, u"@android:string/foo", 137e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseConfigOrDie("land"), 138e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "tablet")); 139e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, u"@android:string/foo", 140e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseConfigOrDie("land"), 141e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski "phone")); 142e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 143e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski Maybe<ResourceTable::SearchResult> sr = table.findResource( 144e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseNameOrDie(u"@android:string/foo")); 145e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski AAPT_ASSERT_TRUE(sr); 146e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski std::vector<ResourceConfigValue*> values = sr.value().entry->findAllValues( 147e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski test::parseConfigOrDie("land")); 148e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski ASSERT_EQ(2u, values.size()); 149e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_EQ(std::string("phone"), values[0]->product); 150e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski EXPECT_EQ(std::string("tablet"), values[1]->product); 151e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski} 152e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 1536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 154