/* * Copyright (C) 2015 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. */ #ifndef AAPT_TEST_COMMON_H #define AAPT_TEST_COMMON_H #include "ConfigDescription.h" #include "ResourceTable.h" #include "ResourceUtils.h" #include "ValueVisitor.h" #include "process/IResourceTableConsumer.h" #include "util/StringPiece.h" #include #include // // GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to fail to compile. // #define AAPT_ASSERT_TRUE(v) ASSERT_TRUE(bool(v)) #define AAPT_ASSERT_FALSE(v) ASSERT_FALSE(bool(v)) #define AAPT_EXPECT_TRUE(v) EXPECT_TRUE(bool(v)) #define AAPT_EXPECT_FALSE(v) EXPECT_FALSE(bool(v)) namespace aapt { namespace test { struct DummyDiagnosticsImpl : public IDiagnostics { void error(const DiagMessage& message) override { DiagMessageActual actual = message.build(); std::cerr << actual.source << ": error: " << actual.message << "." << std::endl; } void warn(const DiagMessage& message) override { DiagMessageActual actual = message.build(); std::cerr << actual.source << ": warn: " << actual.message << "." << std::endl; } void note(const DiagMessage& message) override {} }; inline ResourceName parseNameOrDie(const StringPiece16& str) { ResourceNameRef ref; bool result = ResourceUtils::tryParseReference(str, &ref); assert(result && "invalid resource name"); return ref.toResourceName(); } inline ConfigDescription parseConfigOrDie(const StringPiece& str) { ConfigDescription config; bool result = ConfigDescription::parse(str, &config); assert(result && "invalid configuration"); return config; } template T* getValueForConfig(ResourceTable* table, const StringPiece16& resName, const ConfigDescription& config) { Maybe result = table->findResource(parseNameOrDie(resName)); if (result) { ResourceEntry* entry = result.value().entry; auto iter = std::lower_bound(entry->values.begin(), entry->values.end(), config, [](const ResourceConfigValue& a, const ConfigDescription& b) -> bool { return a.config < b; }); if (iter != entry->values.end() && iter->config == config) { return valueCast(iter->value.get()); } } return nullptr; } template T* getValue(ResourceTable* table, const StringPiece16& resName) { return getValueForConfig(table, resName, {}); } } // namespace test } // namespace aapt #endif /* AAPT_TEST_COMMON_H */