| /* | |
| * 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 "test/Test.h" | |
| #include "util/Util.h" | |
| #include <sstream> | |
| #include <string> | |
| #include <vector> | |
| namespace aapt { | |
| namespace { | |
| class PrettyPrinter : public DominatorTree::Visitor { | |
| public: | |
| explicit PrettyPrinter(const int indent = 2) : mIndent(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) { | |
| mBuffer.str(""); | |
| mBuffer.clear(); | |
| tree->accept(this); | |
| return mBuffer.str(); | |
| } | |
| private: | |
| void visitConfig(const DominatorTree::Node* node, const int indent) { | |
| auto configString = node->value()->config.toString(); | |
| mBuffer << std::string(indent, ' ') | |
| << (configString.isEmpty() ? "<default>" : configString) | |
| << std::endl; | |
| } | |
| void visitNode(const DominatorTree::Node* node, const int indent) { | |
| visitConfig(node, indent); | |
| for (const auto& child : node->children()) { | |
| visitNode(child.get(), indent + mIndent); | |
| } | |
| } | |
| std::stringstream mBuffer; | |
| const int mIndent = 2; | |
| }; | |
| } // namespace | |
| TEST(DominatorTreeTest, DefaultDominatesEverything) { | |
| const ConfigDescription defaultConfig = {}; | |
| const ConfigDescription landConfig = test::parseConfigOrDie("land"); | |
| const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13"); | |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; | |
| configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "")); | |
| 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 defaultConfig = {}; | |
| const ConfigDescription landConfig = test::parseConfigOrDie("land"); | |
| const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13"); | |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; | |
| configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "phablet")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "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 defaultConfig = {}; | |
| const ConfigDescription enConfig = test::parseConfigOrDie("en"); | |
| const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21"); | |
| const ConfigDescription ldrtlConfig = test::parseConfigOrDie("ldrtl-v4"); | |
| const ConfigDescription ldrtlXhdpiConfig = test::parseConfigOrDie("ldrtl-xhdpi-v4"); | |
| const ConfigDescription sw300dpConfig = test::parseConfigOrDie("sw300dp-v13"); | |
| const ConfigDescription sw540dpConfig = test::parseConfigOrDie("sw540dp-v14"); | |
| const ConfigDescription sw600dpConfig = test::parseConfigOrDie("sw600dp-v14"); | |
| const ConfigDescription sw720dpConfig = test::parseConfigOrDie("sw720dp-v13"); | |
| const ConfigDescription v20Config = test::parseConfigOrDie("v20"); | |
| std::vector<std::unique_ptr<ResourceConfigValue>> configs; | |
| configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(enConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(enV21Config, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlXhdpiConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw300dpConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw540dpConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(sw720dpConfig, "")); | |
| configs.push_back(util::make_unique<ResourceConfigValue>(v20Config, "")); | |
| DominatorTree tree(configs); | |
| PrettyPrinter printer; | |
| std::string expected = | |
| "<default>\n" | |
| " en\n" | |
| " en-v21\n" | |
| " ldrtl-v4\n" | |
| " ldrtl-xhdpi-v4\n" | |
| " sw300dp-v13\n" | |
| " sw540dp-v14\n" | |
| " sw600dp-v14\n" | |
| " sw720dp-v13\n" | |
| " v20\n"; | |
| EXPECT_EQ(expected, printer.toString(&tree)); | |
| } | |
| } // namespace aapt |