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