| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "DominatorTree.h" |
| |
| #include <sstream> |
| #include <string> |
| #include <vector> |
| |
| #include "test/Test.h" |
| #include "util/Util.h" |
| |
| using ::android::ConfigDescription; |
| |
| namespace aapt { |
| |
| namespace { |
| |
| class PrettyPrinter : public DominatorTree::Visitor { |
| public: |
| explicit PrettyPrinter(const int indent = 2) : indent_(indent) {} |
| |
| void VisitTree(const std::string& product, |
| DominatorTree::Node* root) override { |
| for (auto& child : root->children()) { |
| VisitNode(child.get(), 0); |
| } |
| } |
| |
| std::string ToString(DominatorTree* tree) { |
| buffer_.str(""); |
| buffer_.clear(); |
| tree->Accept(this); |
| return buffer_.str(); |
| } |
| |
| private: |
| void VisitConfig(const DominatorTree::Node* node, const int indent) { |
| auto config_string = node->value()->config.toString(); |
| buffer_ << std::string(indent, ' ') |
| << (config_string.empty() ? "<default>" : config_string.c_str()) << std::endl; |
| } |
| |
| void VisitNode(const DominatorTree::Node* node, const int indent) { |
| VisitConfig(node, indent); |
| for (const auto& child : node->children()) { |
| VisitNode(child.get(), indent + indent_); |
| } |
| } |
| |
| std::stringstream buffer_; |
| const int indent_ = 2; |
| }; |
| |
| } // namespace |
| |
| TEST(DominatorTreeTest, DefaultDominatesEverything) { |
| const ConfigDescription default_config = {}; |
| const ConfigDescription land_config = test::ParseConfigOrDie("land"); |
| const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land-v13"); |
| |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(land_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, "")); |
| |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| |
| std::string expected = |
| "<default>\n" |
| " land\n" |
| " sw600dp-land-v13\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| TEST(DominatorTreeTest, ProductsAreDominatedSeparately) { |
| const ConfigDescription default_config = {}; |
| const ConfigDescription land_config = test::ParseConfigOrDie("land"); |
| const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land-v13"); |
| |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(land_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "phablet")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, "phablet")); |
| |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| |
| std::string expected = |
| "<default>\n" |
| " land\n" |
| "<default>\n" |
| " sw600dp-land-v13\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| TEST(DominatorTreeTest, MoreSpecificConfigurationsAreDominated) { |
| const ConfigDescription default_config = {}; |
| const ConfigDescription en_config = test::ParseConfigOrDie("en"); |
| const ConfigDescription en_v21_config = test::ParseConfigOrDie("en-v21"); |
| const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl-v4"); |
| const ConfigDescription ldrtl_xhdpi_config = test::ParseConfigOrDie("ldrtl-xhdpi-v4"); |
| const ConfigDescription sw300dp_config = test::ParseConfigOrDie("sw300dp-v13"); |
| const ConfigDescription sw540dp_config = test::ParseConfigOrDie("sw540dp-v14"); |
| const ConfigDescription sw600dp_config = test::ParseConfigOrDie("sw600dp-v14"); |
| const ConfigDescription sw720dp_config = test::ParseConfigOrDie("sw720dp-v13"); |
| const ConfigDescription v20_config = test::ParseConfigOrDie("v20"); |
| |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(en_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(en_v21_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(ldrtl_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(ldrtl_xhdpi_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw300dp_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw540dp_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw720dp_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(v20_config, "")); |
| |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| |
| std::string expected = |
| "<default>\n" |
| " ldrtl-v4\n" |
| " ldrtl-xhdpi-v4\n" |
| " sw300dp-v13\n" |
| " sw540dp-v14\n" |
| " sw600dp-v14\n" |
| " sw720dp-v13\n" |
| " v20\n" |
| "en\n" |
| " en-v21\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| TEST(DominatorTreeTest, LocalesAreNeverDominated) { |
| const ConfigDescription fr_config = test::ParseConfigOrDie("fr"); |
| const ConfigDescription fr_rCA_config = test::ParseConfigOrDie("fr-rCA"); |
| const ConfigDescription fr_rFR_config = test::ParseConfigOrDie("fr-rFR"); |
| |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(fr_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(fr_rCA_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(fr_rFR_config, "")); |
| |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| |
| std::string expected = |
| "<default>\n" |
| "fr\n" |
| "fr-rCA\n" |
| "fr-rFR\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| TEST(DominatorTreeTest, NonZeroDensitiesMatch) { |
| const ConfigDescription sw600_config = test::ParseConfigOrDie("sw600dp"); |
| const ConfigDescription sw600_hdpi_config = test::ParseConfigOrDie("sw600dp-hdpi"); |
| const ConfigDescription sw800_hdpi_config = test::ParseConfigOrDie("sw800dp-hdpi"); |
| const ConfigDescription sw800_xxhdpi_config = test::ParseConfigOrDie("sw800dp-xxhdpi"); |
| |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600_hdpi_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw800_hdpi_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw800_xxhdpi_config, "")); |
| |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| |
| std::string expected = |
| "<default>\n" |
| " sw600dp-v13\n" |
| " sw600dp-hdpi-v13\n" |
| " sw800dp-hdpi-v13\n" |
| " sw800dp-xxhdpi-v13\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| TEST(DominatorTreeTest, MccMncIsPeertoLocale) { |
| const ConfigDescription default_config = {}; |
| const ConfigDescription de_config = test::ParseConfigOrDie("de"); |
| const ConfigDescription fr_config = test::ParseConfigOrDie("fr"); |
| const ConfigDescription mcc_config = test::ParseConfigOrDie("mcc262"); |
| const ConfigDescription mcc_fr_config = test::ParseConfigOrDie("mcc262-fr"); |
| const ConfigDescription mnc_config = test::ParseConfigOrDie("mnc2"); |
| const ConfigDescription mnc_fr_config = test::ParseConfigOrDie("mnc2-fr"); |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; |
| configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(de_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(fr_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(mcc_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(mcc_fr_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(mnc_config, "")); |
| configs.push_back(util::make_unique<ResourceConfigValue>(mnc_fr_config, "")); |
| DominatorTree tree(configs); |
| PrettyPrinter printer; |
| std::string expected = |
| "<default>\n" |
| "de\n" |
| "fr\n" |
| "mcc262\n" |
| "mcc262-fr\n" |
| "mnc2\n" |
| "mnc2-fr\n"; |
| EXPECT_EQ(expected, printer.ToString(&tree)); |
| } |
| |
| } // namespace aapt |