Home | History | Annotate | Download | only in aapt2
      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