11ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/* 21ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 31ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * 41ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 51ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * you may not use this file except in compliance with the License. 61ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * You may obtain a copy of the License at 71ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * 81ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 91ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * 101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Unless required by applicable law or agreed to in writing, software 111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * See the License for the specific language governing permissions and 141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * limitations under the License. 151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */ 161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#ifndef AAPT_TEST_COMMON_H 181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#define AAPT_TEST_COMMON_H 191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <iostream> 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/logging.h" 23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/macros.h" 24d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h" 255924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski#include "gmock/gmock.h" 26ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "gtest/gtest.h" 27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ConfigDescription.h" 299ba47d813075fcb05c5e1532c137c93b394631cbAdam Lesinski#include "Debug.h" 301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ResourceTable.h" 311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ResourceUtils.h" 325924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski#include "ResourceValues.h" 331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ValueVisitor.h" 34a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "io/File.h" 351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "process/IResourceTableConsumer.h" 361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt { 381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace test { 391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 40bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam LesinskiIDiagnostics* GetDiagnostics(); 41e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 42d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiinline ResourceName ParseNameOrDie(const android::StringPiece& str) { 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ResourceNameRef ref; 440a5b201156f1dd01a7da7b7674798ed57cfafc5aShane Farmer CHECK(ResourceUtils::ParseResourceName(str, &ref)) << "invalid resource name: " << str; 45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return ref.ToResourceName(); 461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 48d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiinline ConfigDescription ParseConfigOrDie(const android::StringPiece& str) { 49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ConfigDescription config; 50efe45392c300f922e8328281a0aab8260c1d171dShane Farmer CHECK(ConfigDescription::Parse(str, &config)) << "invalid configuration: " << str; 51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return config; 521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 54bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinskitemplate <typename T = Value> 55d5083f6f6b9bc76bbe64052bcec639eee752a321Adam LesinskiT* GetValueForConfigAndProduct(ResourceTable* table, const android::StringPiece& res_name, 56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const ConfigDescription& config, 57d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski const android::StringPiece& product) { 585924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski Maybe<ResourceTable::SearchResult> result = table->FindResource(ParseNameOrDie(res_name)); 59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski if (result) { 605924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski ResourceConfigValue* config_value = result.value().entry->FindValue(config, product); 61ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (config_value) { 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return ValueCast<T>(config_value->value.get()); 631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return nullptr; 661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 68bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinskitemplate <> 69bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam LesinskiValue* GetValueForConfigAndProduct<Value>(ResourceTable* table, 70bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinski const android::StringPiece& res_name, 71bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinski const ConfigDescription& config, 72bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinski const android::StringPiece& product); 73bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinski 74bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinskitemplate <typename T = Value> 75d5083f6f6b9bc76bbe64052bcec639eee752a321Adam LesinskiT* GetValueForConfig(ResourceTable* table, const android::StringPiece& res_name, 76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const ConfigDescription& config) { 77ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return GetValueForConfigAndProduct<T>(table, res_name, config, {}); 78e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski} 79e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski 80bab4ef56d7803f3a50ccfaca2729509338fcbb23Adam Lesinskitemplate <typename T = Value> 81d5083f6f6b9bc76bbe64052bcec639eee752a321Adam LesinskiT* GetValue(ResourceTable* table, const android::StringPiece& res_name) { 82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return GetValueForConfig<T>(table, res_name, {}); 831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 85a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskiclass TestFile : public io::IFile { 86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 87d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski explicit TestFile(const android::StringPiece& path) : source_(path) {} 88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 895924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski std::unique_ptr<io::IData> OpenAsData() override { 905924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski return {}; 915924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski } 92a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski 93004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski std::unique_ptr<io::InputStream> OpenInputStream() override { 94004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return OpenAsData(); 95004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 96004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 975924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski const Source& GetSource() const override { 985924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski return source_; 995924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski } 100ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski private: 102ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DISALLOW_COPY_AND_ASSIGN(TestFile); 103a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski 104ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Source source_; 105a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}; 106a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace test 1085924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 1095924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski// Workaround gtest bug (https://github.com/google/googletest/issues/443) 1105924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski// that does not select base class operator<< for derived class T. 1115924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate <typename T> 1125924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitypename std::enable_if<std::is_base_of<Value, T>::value, std::ostream&>::type operator<<( 1135924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski std::ostream& out, const T& value) { 1145924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski value.Print(&out); 1155924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski return out; 1165924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski} 1175924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 1185924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Item>(std::ostream&, const Item&); 1195924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Reference>(std::ostream&, const Reference&); 1205924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Id>(std::ostream&, const Id&); 1215924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<RawString>(std::ostream&, const RawString&); 1225924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<String>(std::ostream&, const String&); 1235924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<StyledString>(std::ostream&, const StyledString&); 1245924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<FileReference>(std::ostream&, const FileReference&); 1255924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<BinaryPrimitive>(std::ostream&, const BinaryPrimitive&); 1265924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Attribute>(std::ostream&, const Attribute&); 1275924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Style>(std::ostream&, const Style&); 1285924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Array>(std::ostream&, const Array&); 1295924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate std::ostream& operator<<<Plural>(std::ostream&, const Plural&); 1305924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 1315924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski// Add a print method to Maybe. 1325924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskitemplate <typename T> 1335924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskivoid PrintTo(const Maybe<T>& value, std::ostream* out) { 1345924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski if (value) { 1355924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski *out << ::testing::PrintToString(value.value()); 1365924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski } else { 1375924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski *out << "Nothing"; 1385924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski } 1395924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski} 1405924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 1415924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinskinamespace test { 1425924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 143fba0cf2950a91726e475fb180090cc25bcb11a7aAdam LesinskiMATCHER_P(StrEq, a, 144fba0cf2950a91726e475fb180090cc25bcb11a7aAdam Lesinski std::string(negation ? "isn't" : "is") + " equal to " + 145fba0cf2950a91726e475fb180090cc25bcb11a7aAdam Lesinski ::testing::PrintToString(android::StringPiece16(a))) { 146fba0cf2950a91726e475fb180090cc25bcb11a7aAdam Lesinski return android::StringPiece16(arg) == a; 147fba0cf2950a91726e475fb180090cc25bcb11a7aAdam Lesinski} 148fba0cf2950a91726e475fb180090cc25bcb11a7aAdam Lesinski 149bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskitemplate <typename T> 150bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskiclass ValueEqImpl : public ::testing::MatcherInterface<T> { 1516b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski public: 152bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski explicit ValueEqImpl(const Value* expected) : expected_(expected) { 153bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1546b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 155bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski bool MatchAndExplain(T x, ::testing::MatchResultListener* listener) const override { 156bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski return expected_->Equals(&x); 157bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1586b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 159bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski void DescribeTo(::std::ostream* os) const override { 160bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski *os << "is equal to " << *expected_; 161bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1626b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 163bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski void DescribeNegationTo(::std::ostream* os) const override { 164bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski *os << "is not equal to " << *expected_; 165bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1666b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 167bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski private: 168bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski DISALLOW_COPY_AND_ASSIGN(ValueEqImpl); 1696b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 170bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski const Value* expected_; 171bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski}; 1726b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 173bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskitemplate <typename TValue> 174bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskiclass ValueEqMatcher { 175bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski public: 176bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski ValueEqMatcher(TValue expected) : expected_(std::move(expected)) { 177bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1786b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1796b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski template <typename T> 180bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski operator ::testing::Matcher<T>() const { 181bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski return ::testing::Matcher<T>(new ValueEqImpl<T>(&expected_)); 182bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski } 1836b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 184bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski private: 185bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski TValue expected_; 186bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski}; 1876b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 188bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskitemplate <typename TValue> 189bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskiclass ValueEqPointerMatcher { 190bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski public: 191bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski ValueEqPointerMatcher(const TValue* expected) : expected_(expected) { 1926b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 1936b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1946b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski template <typename T> 1956b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski operator ::testing::Matcher<T>() const { 196bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski return ::testing::Matcher<T>(new ValueEqImpl<T>(expected_)); 1976b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 1986b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1996b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski private: 200bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski const TValue* expected_; 2016b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski}; 2026b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 203bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskitemplate <typename TValue, 204bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski typename = typename std::enable_if<!std::is_pointer<TValue>::value, void>::type> 205bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskiinline ValueEqMatcher<TValue> ValueEq(TValue value) { 206bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski return ValueEqMatcher<TValue>(std::move(value)); 207bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski} 208bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski 209bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskitemplate <typename TValue> 210bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinskiinline ValueEqPointerMatcher<TValue> ValueEq(const TValue* value) { 211bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski return ValueEqPointerMatcher<TValue>(value); 212bbf429795d0558797e7ac8d1024fa5c16552e96cAdam Lesinski} 2135924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski 214e38567480be67ac83a8f8f090704bb0d49e2eed2Adam LesinskiMATCHER_P(StrValueEq, a, 215e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski std::string(negation ? "isn't" : "is") + " equal to " + ::testing::PrintToString(a)) { 216a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski return *(arg.value) == a; 217a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski} 218a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski 219e38567480be67ac83a8f8f090704bb0d49e2eed2Adam LesinskiMATCHER_P(HasValue, name, 220e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski std::string(negation ? "does not have" : "has") + " value " + 221e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski ::testing::PrintToString(name)) { 222e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski return GetValueForConfig<Value>(&(*arg), name, {}) != nullptr; 223e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski} 224e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski 225e38567480be67ac83a8f8f090704bb0d49e2eed2Adam LesinskiMATCHER_P2(HasValue, name, config, 226e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski std::string(negation ? "does not have" : "has") + " value " + 227e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski ::testing::PrintToString(name) + " for config " + ::testing::PrintToString(config)) { 228e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski return GetValueForConfig<Value>(&(*arg), name, config) != nullptr; 229e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski} 230e38567480be67ac83a8f8f090704bb0d49e2eed2Adam Lesinski 2315924d8c9ab7bd8614e8bd99864903ce9d50f3bf7Adam Lesinski} // namespace test 232cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 2331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 2341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#endif /* AAPT_TEST_COMMON_H */ 235