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