gmock-matchers_test.cc revision 2d970ee3bad530703ff24bc3a011390b45cdd293
1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc. 2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved. 3e35fdd936d133bf8a48de140a3c666897588a05shiqian// 4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without 5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are 6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met: 7e35fdd936d133bf8a48de140a3c666897588a05shiqian// 8e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions of source code must retain the above copyright 9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer. 10e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions in binary form must reproduce the above 11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer 12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the 13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution. 14e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Neither the name of Google Inc. nor the names of its 15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from 16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission. 17e35fdd936d133bf8a48de140a3c666897588a05shiqian// 18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e35fdd936d133bf8a48de140a3c666897588a05shiqian// 30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan) 31e35fdd936d133bf8a48de140a3c666897588a05shiqian 32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes. 33e35fdd936d133bf8a48de140a3c666897588a05shiqian// 34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests some commonly used argument matchers. 35e35fdd936d133bf8a48de140a3c666897588a05shiqian 36e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gmock/gmock-matchers.h> 37e35fdd936d133bf8a48de140a3c666897588a05shiqian 38e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string.h> 39e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional> 406a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <list> 416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <map> 426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <set> 43e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <sstream> 446a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <string> 45f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan#include <utility> 466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <vector> 47e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gmock/gmock.h> 48e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gtest/gtest.h> 49e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gtest/gtest-spi.h> 50e35fdd936d133bf8a48de140a3c666897588a05shiqian 51e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing { 524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wannamespace internal { 544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanstring FormatMatcherDescriptionSyntaxError(const char* description, 554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* error_pos); 564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanint GetParamIndex(const char* param_names[], const string& param_name); 574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanstring JoinAsTuple(const Strings& fields); 584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanbool SkipPrefix(const char* prefix, const char** pstr); 594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} // namespace internal 604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 61e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_matchers_test { 62e35fdd936d133bf8a48de140a3c666897588a05shiqian 63b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::map; 64b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::multimap; 65e35fdd936d133bf8a48de140a3c666897588a05shiqianusing std::stringstream; 66b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing std::tr1::make_tuple; 67e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::A; 68bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanusing testing::AllArgs; 69e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AllOf; 70e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::An; 71e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AnyOf; 72e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef; 73e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoubleEq; 74e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::EndsWith; 75e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Eq; 76e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Field; 77e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::FloatEq; 78e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ge; 79e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Gt; 80e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::HasSubstr; 812d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanusing testing::IsNull; 82b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing testing::Key; 83e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Le; 84e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Lt; 85e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakeMatcher; 86e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakePolymorphicMatcher; 87e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matcher; 88e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherCast; 89e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherInterface; 90e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matches; 91e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveDoubleEq; 92e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveFloatEq; 93e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ne; 94e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Not; 95e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NotNull; 96f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanusing testing::Pair; 97e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Pointee; 98e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::PolymorphicMatcher; 99e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Property; 100e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ref; 101e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ResultOf; 102e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StartsWith; 103e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseEq; 104e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseNe; 105e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrEq; 106e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrNe; 107e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Truly; 108e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::TypedEq; 109b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing testing::Value; 110e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_; 111e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::FloatingEqMatcher; 1124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::FormatMatcherDescriptionSyntaxError; 1134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::GetParamIndex; 1144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::Interpolation; 1154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::Interpolations; 1164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::JoinAsTuple; 1174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::SkipPrefix; 118e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::String; 1194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::Strings; 1204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::ValidateMatcherDescription; 1214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kInvalidInterpolation; 1224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kPercentInterpolation; 1234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kTupleInterpolation; 124e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::string; 125e35fdd936d133bf8a48de140a3c666897588a05shiqian 126e35fdd936d133bf8a48de140a3c666897588a05shiqian#ifdef GMOCK_HAS_REGEX 127e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ContainsRegex; 128e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatchesRegex; 129e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::RE; 130e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GMOCK_HAS_REGEX 131e35fdd936d133bf8a48de140a3c666897588a05shiqian 132f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// For testing ExplainMatchResultTo(). 133f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass GreaterThanMatcher : public MatcherInterface<int> { 134f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 135f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 136f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 137f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual bool Matches(int lhs) const { return lhs > rhs_; } 138f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 139f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 140f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "is greater than " << rhs_; 141f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 142f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 143f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void ExplainMatchResultTo(int lhs, ::std::ostream* os) const { 144f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const int diff = lhs - rhs_; 145f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan if (diff > 0) { 146f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "is " << diff << " more than " << rhs_; 147f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } else if (diff == 0) { 148f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "is the same as " << rhs_; 149f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } else { 150f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "is " << -diff << " less than " << rhs_; 151f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 152f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 153f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 154f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const int rhs_; 155f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 156f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 157f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanMatcher<int> GreaterThan(int n) { 158f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return MakeMatcher(new GreaterThanMatcher(n)); 159f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 160f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 161e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the given matcher. 162e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 163e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Describe(const Matcher<T>& m) { 164e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 165e35fdd936d133bf8a48de140a3c666897588a05shiqian m.DescribeTo(&ss); 166e35fdd936d133bf8a48de140a3c666897588a05shiqian return ss.str(); 167e35fdd936d133bf8a48de140a3c666897588a05shiqian} 168e35fdd936d133bf8a48de140a3c666897588a05shiqian 169e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the negation of the given matcher. 170e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 171e35fdd936d133bf8a48de140a3c666897588a05shiqianstring DescribeNegation(const Matcher<T>& m) { 172e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 173e35fdd936d133bf8a48de140a3c666897588a05shiqian m.DescribeNegationTo(&ss); 174e35fdd936d133bf8a48de140a3c666897588a05shiqian return ss.str(); 175e35fdd936d133bf8a48de140a3c666897588a05shiqian} 176e35fdd936d133bf8a48de140a3c666897588a05shiqian 177e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reason why x matches, or doesn't match, m. 178e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherType, typename Value> 179e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Explain(const MatcherType& m, const Value& x) { 180e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 181e35fdd936d133bf8a48de140a3c666897588a05shiqian m.ExplainMatchResultTo(x, &ss); 182e35fdd936d133bf8a48de140a3c666897588a05shiqian return ss.str(); 183e35fdd936d133bf8a48de140a3c666897588a05shiqian} 184e35fdd936d133bf8a48de140a3c666897588a05shiqian 185e35fdd936d133bf8a48de140a3c666897588a05shiqian// Makes sure that the MatcherInterface<T> interface doesn't 186e35fdd936d133bf8a48de140a3c666897588a05shiqian// change. 187e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EvenMatcherImpl : public MatcherInterface<int> { 188e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 189e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual bool Matches(int x) const { return x % 2 == 0; } 190e35fdd936d133bf8a48de140a3c666897588a05shiqian 191e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 192e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is an even number"; 193e35fdd936d133bf8a48de140a3c666897588a05shiqian } 194e35fdd936d133bf8a48de140a3c666897588a05shiqian 195e35fdd936d133bf8a48de140a3c666897588a05shiqian // We deliberately don't define DescribeNegationTo() and 196e35fdd936d133bf8a48de140a3c666897588a05shiqian // ExplainMatchResultTo() here, to make sure the definition of these 197e35fdd936d133bf8a48de140a3c666897588a05shiqian // two methods is optional. 198e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 199e35fdd936d133bf8a48de140a3c666897588a05shiqian 200e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherInterfaceTest, CanBeImplemented) { 201e35fdd936d133bf8a48de140a3c666897588a05shiqian EvenMatcherImpl m; 202e35fdd936d133bf8a48de140a3c666897588a05shiqian} 203e35fdd936d133bf8a48de140a3c666897588a05shiqian 204e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests default-constructing a matcher. 205e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeDefaultConstructed) { 206e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m; 207e35fdd936d133bf8a48de140a3c666897588a05shiqian} 208e35fdd936d133bf8a48de140a3c666897588a05shiqian 209e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. 210e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeConstructedFromMatcherInterface) { 211e35fdd936d133bf8a48de140a3c666897588a05shiqian const MatcherInterface<int>* impl = new EvenMatcherImpl; 212e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m(impl); 213e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 214e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(5)); 215e35fdd936d133bf8a48de140a3c666897588a05shiqian} 216e35fdd936d133bf8a48de140a3c666897588a05shiqian 217e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that value can be used in place of Eq(value). 218e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { 219e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = 5; 220e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(5)); 221e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(6)); 222e35fdd936d133bf8a48de140a3c666897588a05shiqian} 223e35fdd936d133bf8a48de140a3c666897588a05shiqian 224e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NULL can be used in place of Eq(NULL). 225e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { 226e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m1 = NULL; 227e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(NULL)); 228e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 229e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(&n)); 230e35fdd936d133bf8a48de140a3c666897588a05shiqian} 231e35fdd936d133bf8a48de140a3c666897588a05shiqian 232e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that matchers are copyable. 233e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, IsCopyable) { 234e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the copy constructor. 235e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<bool> m1 = Eq(false); 236e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(false)); 237e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(true)); 238e35fdd936d133bf8a48de140a3c666897588a05shiqian 239e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the assignment operator. 240e35fdd936d133bf8a48de140a3c666897588a05shiqian m1 = Eq(true); 241e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(true)); 242e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(false)); 243e35fdd936d133bf8a48de140a3c666897588a05shiqian} 244e35fdd936d133bf8a48de140a3c666897588a05shiqian 245e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T>::DescribeTo() calls 246e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>::DescribeTo(). 247e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanDescribeItself) { 248e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is an even number", 249e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(Matcher<int>(new EvenMatcherImpl))); 250e35fdd936d133bf8a48de140a3c666897588a05shiqian} 251e35fdd936d133bf8a48de140a3c666897588a05shiqian 252e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a C-string literal can be implicitly converted to a 253e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>. 254e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 255e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m1 = "hi"; 256e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("hi")); 257e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("hello")); 258e35fdd936d133bf8a48de140a3c666897588a05shiqian 259e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = "hi"; 260e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 261e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("hello")); 262e35fdd936d133bf8a48de140a3c666897588a05shiqian} 263e35fdd936d133bf8a48de140a3c666897588a05shiqian 264e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a string object can be implicitly converted to a 265e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>. 266e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { 267e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m1 = string("hi"); 268e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("hi")); 269e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("hello")); 270e35fdd936d133bf8a48de140a3c666897588a05shiqian 271e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = string("hi"); 272e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 273e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("hello")); 274e35fdd936d133bf8a48de140a3c666897588a05shiqian} 275e35fdd936d133bf8a48de140a3c666897588a05shiqian 276e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakeMatcher() constructs a Matcher<T> from a 277e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface* without requiring the user to explicitly 278e35fdd936d133bf8a48de140a3c666897588a05shiqian// write the type. 279e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { 280e35fdd936d133bf8a48de140a3c666897588a05shiqian const MatcherInterface<int>* dummy_impl = NULL; 281e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = MakeMatcher(dummy_impl); 282e35fdd936d133bf8a48de140a3c666897588a05shiqian} 283e35fdd936d133bf8a48de140a3c666897588a05shiqian 284e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakePolymorphicMatcher() constructs a polymorphic 285e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher from its implementation. 286e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int bar = 1; 287e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReferencesBarOrIsZeroImpl { 288e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 289e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 290e35fdd936d133bf8a48de140a3c666897588a05shiqian bool Matches(const T& x) const { 291e35fdd936d133bf8a48de140a3c666897588a05shiqian const void* p = &x; 292e35fdd936d133bf8a48de140a3c666897588a05shiqian return p == &bar || x == 0; 293e35fdd936d133bf8a48de140a3c666897588a05shiqian } 294e35fdd936d133bf8a48de140a3c666897588a05shiqian 295e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { *os << "bar or zero"; } 296e35fdd936d133bf8a48de140a3c666897588a05shiqian 297e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 298e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't reference bar and is not zero"; 299e35fdd936d133bf8a48de140a3c666897588a05shiqian } 300e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 301e35fdd936d133bf8a48de140a3c666897588a05shiqian 302e35fdd936d133bf8a48de140a3c666897588a05shiqian// This function verifies that MakePolymorphicMatcher() returns a 303e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<T> where T is the argument's type. 304e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { 305e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); 306e35fdd936d133bf8a48de140a3c666897588a05shiqian} 307e35fdd936d133bf8a48de140a3c666897588a05shiqian 308e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakePolymorphicMatcherTest, ConstructsMatcherFromImpl) { 309e35fdd936d133bf8a48de140a3c666897588a05shiqian // Using a polymorphic matcher to match a reference type. 310e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m1 = ReferencesBarOrIsZero(); 311e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(0)); 312e35fdd936d133bf8a48de140a3c666897588a05shiqian // Verifies that the identity of a by-reference argument is preserved. 313e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(bar)); 314e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(1)); 315e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("bar or zero", Describe(m1)); 316e35fdd936d133bf8a48de140a3c666897588a05shiqian 317e35fdd936d133bf8a48de140a3c666897588a05shiqian // Using a polymorphic matcher to match a value type. 318e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = ReferencesBarOrIsZero(); 319e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0.0)); 320e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(0.1)); 321e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("bar or zero", Describe(m2)); 322e35fdd936d133bf8a48de140a3c666897588a05shiqian} 323e35fdd936d133bf8a48de140a3c666897588a05shiqian 324e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. 325e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromPolymorphicMatcher) { 326e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = MatcherCast<int>(Eq(5)); 327e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(5)); 328e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(6)); 329e35fdd936d133bf8a48de140a3c666897588a05shiqian} 330e35fdd936d133bf8a48de140a3c666897588a05shiqian 331e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types. 332e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IntValue { 333e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 334e35fdd936d133bf8a48de140a3c666897588a05shiqian // An int can be statically (although not implicitly) cast to a 335e35fdd936d133bf8a48de140a3c666897588a05shiqian // IntValue. 336e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit IntValue(int value) : value_(value) {} 337e35fdd936d133bf8a48de140a3c666897588a05shiqian 338e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 339e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 340e35fdd936d133bf8a48de140a3c666897588a05shiqian int value_; 341e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 342e35fdd936d133bf8a48de140a3c666897588a05shiqian 343e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types. 344e35fdd936d133bf8a48de140a3c666897588a05shiqianbool IsPositiveIntValue(const IntValue& foo) { 345e35fdd936d133bf8a48de140a3c666897588a05shiqian return foo.value() > 0; 346e35fdd936d133bf8a48de140a3c666897588a05shiqian} 347e35fdd936d133bf8a48de140a3c666897588a05shiqian 348e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T 349e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be statically converted to U. 350e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromCompatibleType) { 351e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = Eq(2.0); 352e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 353e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(2)); 354e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(3)); 355e35fdd936d133bf8a48de140a3c666897588a05shiqian 356e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<IntValue> m3 = Truly(IsPositiveIntValue); 357e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m4 = MatcherCast<int>(m3); 358e35fdd936d133bf8a48de140a3c666897588a05shiqian // In the following, the arguments 1 and 0 are statically converted 359e35fdd936d133bf8a48de140a3c666897588a05shiqian // to IntValue objects, and then tested by the IsPositiveIntValue() 360e35fdd936d133bf8a48de140a3c666897588a05shiqian // predicate. 361e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(1)); 362e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m4.Matches(0)); 363e35fdd936d133bf8a48de140a3c666897588a05shiqian} 364e35fdd936d133bf8a48de140a3c666897588a05shiqian 365e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>. 366e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromConstReferenceToNonReference) { 367e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m1 = Eq(0); 368e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 369e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 370e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 371e35fdd936d133bf8a48de140a3c666897588a05shiqian} 372e35fdd936d133bf8a48de140a3c666897588a05shiqian 373e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>. 374e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromReferenceToNonReference) { 375e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m1 = Eq(0); 376e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 377e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 378e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 379e35fdd936d133bf8a48de140a3c666897588a05shiqian} 380e35fdd936d133bf8a48de140a3c666897588a05shiqian 381e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 382e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToConstReference) { 383e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 384e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m2 = MatcherCast<const int&>(m1); 385e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 386e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 387e35fdd936d133bf8a48de140a3c666897588a05shiqian} 388e35fdd936d133bf8a48de140a3c666897588a05shiqian 389e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>. 390e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToReference) { 391e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 392e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = MatcherCast<int&>(m1); 393e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 394e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(n)); 395e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 1; 396e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(n)); 397e35fdd936d133bf8a48de140a3c666897588a05shiqian} 398e35fdd936d133bf8a48de140a3c666897588a05shiqian 399e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T>. 400e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromSameType) { 401e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 402e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 403e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 404e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 405e35fdd936d133bf8a48de140a3c666897588a05shiqian} 406e35fdd936d133bf8a48de140a3c666897588a05shiqian 40718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass Base {}; 40818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass Derived : public Base {}; 40918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 41018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher. 41118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromPolymorphicMatcher) { 41218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<char> m2 = SafeMatcherCast<char>(Eq(32)); 41318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(' ')); 41418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches('\n')); 41518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 41618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 41716cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where 41816cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// T and U are arithmetic types and T can be losslessly converted to 41916cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// U. 42016cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wanTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { 42118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<double> m1 = DoubleEq(1.0); 42216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan Matcher<float> m2 = SafeMatcherCast<float>(m1); 42316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_TRUE(m2.Matches(1.0f)); 42416cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_FALSE(m2.Matches(2.0f)); 42516cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan 42616cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a')); 42716cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_TRUE(m3.Matches('a')); 42816cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_FALSE(m3.Matches('b')); 42918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 43018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 43118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U 43218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// are pointers or references to a derived and a base class, correspondingly. 43318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromBaseClass) { 43418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Derived d, d2; 43518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Base*> m1 = Eq(&d); 43618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1); 43718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(&d)); 43818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(&d2)); 43918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 44018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Base&> m3 = Ref(d); 44118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3); 44218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m4.Matches(d)); 44318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m4.Matches(d2)); 44418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 44518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 44618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>. 44718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromConstReferenceToReference) { 44818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n = 0; 44918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m1 = Ref(n); 45018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 45118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n1 = 0; 45218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(n)); 45318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(n1)); 45418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 45518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 45618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 45718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { 45818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 45918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1); 46018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(0)); 46118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(1)); 46218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 46318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 46418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>. 46518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToReference) { 46618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 46718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 46818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n = 0; 46918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(n)); 47018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan n = 1; 47118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(n)); 47218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 47318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 47418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>. 47518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromSameType) { 47618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 47718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m2 = SafeMatcherCast<int>(m1); 47818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(0)); 47918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(1)); 48018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 48118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 482e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() matches any value of type T. 483e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, MatchesAnyValue) { 484e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a value type. 485e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = A<double>(); 486e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(91.43)); 487e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-15.32)); 488e35fdd936d133bf8a48de140a3c666897588a05shiqian 489e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a reference type. 490e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 2; 491e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = -6; 492e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = A<int&>(); 493e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 494e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 495e35fdd936d133bf8a48de140a3c666897588a05shiqian} 496e35fdd936d133bf8a48de140a3c666897588a05shiqian 497e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() describes itself properly. 498e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, CanDescribeSelf) { 499e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(A<bool>())); 500e35fdd936d133bf8a48de140a3c666897588a05shiqian} 501e35fdd936d133bf8a48de140a3c666897588a05shiqian 502e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() matches any value of type T. 503e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, MatchesAnyValue) { 504e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a value type. 505e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = An<int>(); 506e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(9143)); 507e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-1532)); 508e35fdd936d133bf8a48de140a3c666897588a05shiqian 509e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a reference type. 510e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 2; 511e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = -6; 512e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = An<int&>(); 513e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 514e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 515e35fdd936d133bf8a48de140a3c666897588a05shiqian} 516e35fdd936d133bf8a48de140a3c666897588a05shiqian 517e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() describes itself properly. 518e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, CanDescribeSelf) { 519e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(An<int>())); 520e35fdd936d133bf8a48de140a3c666897588a05shiqian} 521e35fdd936d133bf8a48de140a3c666897588a05shiqian 522e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ can be used as a matcher for any type and matches any 523e35fdd936d133bf8a48de140a3c666897588a05shiqian// value of that type. 524e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, MatchesAnyValue) { 525e35fdd936d133bf8a48de140a3c666897588a05shiqian // Uses _ as a matcher for a value type. 526e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = _; 527e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(123)); 528e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-242)); 529e35fdd936d133bf8a48de140a3c666897588a05shiqian 530e35fdd936d133bf8a48de140a3c666897588a05shiqian // Uses _ as a matcher for a reference type. 531e35fdd936d133bf8a48de140a3c666897588a05shiqian bool a = false; 532e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool b = true; 533e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const bool&> m2 = _; 534e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 535e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 536e35fdd936d133bf8a48de140a3c666897588a05shiqian} 537e35fdd936d133bf8a48de140a3c666897588a05shiqian 538e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ describes itself properly. 539e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, CanDescribeSelf) { 540e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = _; 541e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(m)); 542e35fdd936d133bf8a48de140a3c666897588a05shiqian} 543e35fdd936d133bf8a48de140a3c666897588a05shiqian 544e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(x) matches any value equal to x. 545e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, MatchesEqualValue) { 546e35fdd936d133bf8a48de140a3c666897588a05shiqian // 2 C-strings with same content but different addresses. 547e35fdd936d133bf8a48de140a3c666897588a05shiqian const char a1[] = "hi"; 548e35fdd936d133bf8a48de140a3c666897588a05shiqian const char a2[] = "hi"; 549e35fdd936d133bf8a48de140a3c666897588a05shiqian 550e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m1 = Eq(a1); 551e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(a1)); 552e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(a2)); 553e35fdd936d133bf8a48de140a3c666897588a05shiqian} 554e35fdd936d133bf8a48de140a3c666897588a05shiqian 555e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) describes itself properly. 556e35fdd936d133bf8a48de140a3c666897588a05shiqian 557e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Unprintable { 558e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 559e35fdd936d133bf8a48de140a3c666897588a05shiqian Unprintable() : c_('a') {} 560e35fdd936d133bf8a48de140a3c666897588a05shiqian 561e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator==(const Unprintable& rhs) { return true; } 562e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 563e35fdd936d133bf8a48de140a3c666897588a05shiqian char c_; 564e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 565e35fdd936d133bf8a48de140a3c666897588a05shiqian 566e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, CanDescribeSelf) { 567e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<Unprintable> m = Eq(Unprintable()); 568e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); 569e35fdd936d133bf8a48de140a3c666897588a05shiqian} 570e35fdd936d133bf8a48de140a3c666897588a05shiqian 571e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) can be used to match any type that supports 572e35fdd936d133bf8a48de140a3c666897588a05shiqian// comparing with type T, where T is v's type. 573e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, IsPolymorphic) { 574e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(1); 575e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 576e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(2)); 577e35fdd936d133bf8a48de140a3c666897588a05shiqian 578e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m2 = Eq(1); 579e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches('\1')); 580e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches('a')); 581e35fdd936d133bf8a48de140a3c666897588a05shiqian} 582e35fdd936d133bf8a48de140a3c666897588a05shiqian 583e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) matches values of type T that's equal to v. 584e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, ChecksEqualityForGivenType) { 585e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m1 = TypedEq<char>('a'); 586e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('a')); 587e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches('b')); 588e35fdd936d133bf8a48de140a3c666897588a05shiqian 589e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = TypedEq<int>(6); 590e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(6)); 591e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(7)); 592e35fdd936d133bf8a48de140a3c666897588a05shiqian} 593e35fdd936d133bf8a48de140a3c666897588a05shiqian 594e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq(v) describes itself properly. 595e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, CanDescribeSelf) { 596e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2))); 597e35fdd936d133bf8a48de140a3c666897588a05shiqian} 598e35fdd936d133bf8a48de140a3c666897588a05shiqian 599e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) has type Matcher<T>. 600e35fdd936d133bf8a48de140a3c666897588a05shiqian 601e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T 602e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a "bare" type (i.e. not in the form of const U or U&). If v's 603e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is not T, the compiler will generate a message about 604e35fdd936d133bf8a48de140a3c666897588a05shiqian// "undefined referece". 605e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 606e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Type { 607e35fdd936d133bf8a48de140a3c666897588a05shiqian static bool IsTypeOf(const T& v) { return true; } 608e35fdd936d133bf8a48de140a3c666897588a05shiqian 609e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T2> 610e35fdd936d133bf8a48de140a3c666897588a05shiqian static void IsTypeOf(T2 v); 611e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 612e35fdd936d133bf8a48de140a3c666897588a05shiqian 613e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, HasSpecifiedType) { 614e35fdd936d133bf8a48de140a3c666897588a05shiqian // Verfies that the type of TypedEq<T>(v) is Matcher<T>. 615e35fdd936d133bf8a48de140a3c666897588a05shiqian Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5)); 616e35fdd936d133bf8a48de140a3c666897588a05shiqian Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5)); 617e35fdd936d133bf8a48de140a3c666897588a05shiqian} 618e35fdd936d133bf8a48de140a3c666897588a05shiqian 619e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) matches anything >= v. 620e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, ImplementsGreaterThanOrEqual) { 621e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Ge(0); 622e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 623e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(0)); 624e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(-1)); 625e35fdd936d133bf8a48de140a3c666897588a05shiqian} 626e35fdd936d133bf8a48de140a3c666897588a05shiqian 627e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) describes itself properly. 628e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, CanDescribeSelf) { 629e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Ge(5); 630e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is greater than or equal to 5", Describe(m)); 631e35fdd936d133bf8a48de140a3c666897588a05shiqian} 632e35fdd936d133bf8a48de140a3c666897588a05shiqian 633e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) matches anything > v. 634e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, ImplementsGreaterThan) { 635e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = Gt(0); 636e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1.0)); 637e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(0.0)); 638e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(-1.0)); 639e35fdd936d133bf8a48de140a3c666897588a05shiqian} 640e35fdd936d133bf8a48de140a3c666897588a05shiqian 641e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) describes itself properly. 642e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, CanDescribeSelf) { 643e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Gt(5); 644e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is greater than 5", Describe(m)); 645e35fdd936d133bf8a48de140a3c666897588a05shiqian} 646e35fdd936d133bf8a48de140a3c666897588a05shiqian 647e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) matches anything <= v. 648e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, ImplementsLessThanOrEqual) { 649e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m1 = Le('b'); 650e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('a')); 651e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('b')); 652e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches('c')); 653e35fdd936d133bf8a48de140a3c666897588a05shiqian} 654e35fdd936d133bf8a48de140a3c666897588a05shiqian 655e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) describes itself properly. 656e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, CanDescribeSelf) { 657e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Le(5); 658e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is less than or equal to 5", Describe(m)); 659e35fdd936d133bf8a48de140a3c666897588a05shiqian} 660e35fdd936d133bf8a48de140a3c666897588a05shiqian 661e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) matches anything < v. 662e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, ImplementsLessThan) { 663e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m1 = Lt("Hello"); 664e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Abc")); 665e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("Hello")); 666e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("Hello, world!")); 667e35fdd936d133bf8a48de140a3c666897588a05shiqian} 668e35fdd936d133bf8a48de140a3c666897588a05shiqian 669e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) describes itself properly. 670e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, CanDescribeSelf) { 671e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Lt(5); 672e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is less than 5", Describe(m)); 673e35fdd936d133bf8a48de140a3c666897588a05shiqian} 674e35fdd936d133bf8a48de140a3c666897588a05shiqian 675e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) matches anything != v. 676e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, ImplementsNotEqual) { 677e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Ne(0); 678e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 679e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-1)); 680e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(0)); 681e35fdd936d133bf8a48de140a3c666897588a05shiqian} 682e35fdd936d133bf8a48de140a3c666897588a05shiqian 683e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) describes itself properly. 684e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, CanDescribeSelf) { 685e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Ne(5); 686e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to 5", Describe(m)); 687e35fdd936d133bf8a48de140a3c666897588a05shiqian} 688e35fdd936d133bf8a48de140a3c666897588a05shiqian 6892d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() matches any NULL pointer of any type. 6902d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, MatchesNullPointer) { 6912d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<int*> m1 = IsNull(); 6922d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan int* p1 = NULL; 6932d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan int n = 0; 6942d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m1.Matches(p1)); 6952d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m1.Matches(&n)); 6962d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 6972d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<const char*> m2 = IsNull(); 6982d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan const char* p2 = NULL; 6992d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m2.Matches(p2)); 7002d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m2.Matches("hi")); 7012d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 7022d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<void*> m3 = IsNull(); 7032d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void* p3 = NULL; 7042d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m3.Matches(p3)); 7052d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef))); 7062d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 7072d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 7082d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() describes itself properly. 7092d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, CanDescribeSelf) { 7102d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<int*> m = IsNull(); 7112d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_EQ("is NULL", Describe(m)); 7122d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_EQ("is not NULL", DescribeNegation(m)); 7132d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 7142d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 715e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() matches any non-NULL pointer of any type. 716e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, MatchesNonNullPointer) { 717e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m1 = NotNull(); 718e35fdd936d133bf8a48de140a3c666897588a05shiqian int* p1 = NULL; 719e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 720e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(p1)); 721e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(&n)); 722e35fdd936d133bf8a48de140a3c666897588a05shiqian 723e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m2 = NotNull(); 724e35fdd936d133bf8a48de140a3c666897588a05shiqian const char* p2 = NULL; 725e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(p2)); 726e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 727e35fdd936d133bf8a48de140a3c666897588a05shiqian} 728e35fdd936d133bf8a48de140a3c666897588a05shiqian 729e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() describes itself properly. 730e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, CanDescribeSelf) { 731e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m = NotNull(); 732e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not NULL", Describe(m)); 733e35fdd936d133bf8a48de140a3c666897588a05shiqian} 734e35fdd936d133bf8a48de140a3c666897588a05shiqian 735e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) matches an argument that references 736e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'. 737e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, MatchesSameVariable) { 738e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 0; 739e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = 0; 740e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m = Ref(a); 741e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 742e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(b)); 743e35fdd936d133bf8a48de140a3c666897588a05shiqian} 744e35fdd936d133bf8a48de140a3c666897588a05shiqian 745e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) describes itself properly. 746e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanDescribeSelf) { 747e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 5; 748e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m = Ref(n); 749e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 750e35fdd936d133bf8a48de140a3c666897588a05shiqian ss << "references the variable @" << &n << " 5"; 751e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(string(ss.str()), Describe(m)); 752e35fdd936d133bf8a48de140a3c666897588a05shiqian} 753e35fdd936d133bf8a48de140a3c666897588a05shiqian 754e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test that Ref(non_const_varialbe) can be used as a matcher for a 755e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference. 756e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanBeUsedAsMatcherForConstReference) { 757e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 0; 758e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = 0; 759e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m = Ref(a); 760e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 761e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(b)); 762e35fdd936d133bf8a48de140a3c666897588a05shiqian} 763e35fdd936d133bf8a48de140a3c666897588a05shiqian 764e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be 765e35fdd936d133bf8a48de140a3c666897588a05shiqian// used wherever Ref(base) can be used (Ref(derived) is a sub-type 766e35fdd936d133bf8a48de140a3c666897588a05shiqian// of Ref(base), but not vice versa. 767e35fdd936d133bf8a48de140a3c666897588a05shiqian 768e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, IsCovariant) { 769e35fdd936d133bf8a48de140a3c666897588a05shiqian Base base, base2; 770e35fdd936d133bf8a48de140a3c666897588a05shiqian Derived derived; 771e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Base&> m1 = Ref(base); 772e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(base)); 773e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base2)); 774e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(derived)); 775e35fdd936d133bf8a48de140a3c666897588a05shiqian 776e35fdd936d133bf8a48de140a3c666897588a05shiqian m1 = Ref(derived); 777e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(derived)); 778e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base)); 779e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base2)); 780e35fdd936d133bf8a48de140a3c666897588a05shiqian} 781e35fdd936d133bf8a48de140a3c666897588a05shiqian 782e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests string comparison matchers. 783e35fdd936d133bf8a48de140a3c666897588a05shiqian 784e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, MatchesEqualString) { 785e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrEq(string("Hello")); 786e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hello")); 787e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("hello")); 788e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 789e35fdd936d133bf8a48de140a3c666897588a05shiqian 790e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrEq("Hello"); 791e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hello")); 792e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi")); 793e35fdd936d133bf8a48de140a3c666897588a05shiqian} 794e35fdd936d133bf8a48de140a3c666897588a05shiqian 795e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, CanDescribeSelf) { 796e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m = StrEq("Hi-\'\"\?\\\a\b\f\n\r\t\v\xD3"); 797e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to \"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", 798e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 799e35fdd936d133bf8a48de140a3c666897588a05shiqian 800e35fdd936d133bf8a48de140a3c666897588a05shiqian string str("01204500800"); 801e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = '\0'; 802e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrEq(str); 803e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); 804e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; 805e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m3 = StrEq(str); 806e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); 807e35fdd936d133bf8a48de140a3c666897588a05shiqian} 808e35fdd936d133bf8a48de140a3c666897588a05shiqian 809e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, MatchesUnequalString) { 810e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrNe("Hello"); 811e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("")); 812e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 813e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hello")); 814e35fdd936d133bf8a48de140a3c666897588a05shiqian 815e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrNe(string("Hello")); 816e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hello")); 817e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hello")); 818e35fdd936d133bf8a48de140a3c666897588a05shiqian} 819e35fdd936d133bf8a48de140a3c666897588a05shiqian 820e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, CanDescribeSelf) { 821e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrNe("Hi"); 822e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to \"Hi\"", Describe(m)); 823e35fdd936d133bf8a48de140a3c666897588a05shiqian} 824e35fdd936d133bf8a48de140a3c666897588a05shiqian 825e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { 826e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseEq(string("Hello")); 827e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hello")); 828e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("hello")); 829e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hi")); 830e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 831e35fdd936d133bf8a48de140a3c666897588a05shiqian 832e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrCaseEq("Hello"); 833e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hello")); 834e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi")); 835e35fdd936d133bf8a48de140a3c666897588a05shiqian} 836e35fdd936d133bf8a48de140a3c666897588a05shiqian 837e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 838e35fdd936d133bf8a48de140a3c666897588a05shiqian string str1("oabocdooeoo"); 839e35fdd936d133bf8a48de140a3c666897588a05shiqian string str2("OABOCDOOEOO"); 840e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m0 = StrCaseEq(str1); 841e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + string(1, '\0'))); 842e35fdd936d133bf8a48de140a3c666897588a05shiqian 843e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = '\0'; 844e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m1 = StrCaseEq(str1); 845e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 846e35fdd936d133bf8a48de140a3c666897588a05shiqian 847e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = '\0'; 848e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = '\0'; 849e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrCaseEq(str1); 850e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = '\0'; 851e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 852e35fdd936d133bf8a48de140a3c666897588a05shiqian 853e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m3 = StrCaseEq(str1); 854e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 855e35fdd936d133bf8a48de140a3c666897588a05shiqian 856e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + "x")); 857e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, '\0'); 858e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 859e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(string(str2, 0, 9))); 860e35fdd936d133bf8a48de140a3c666897588a05shiqian} 861e35fdd936d133bf8a48de140a3c666897588a05shiqian 862e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, CanDescribeSelf) { 863e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m = StrCaseEq("Hi"); 864e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); 865e35fdd936d133bf8a48de140a3c666897588a05shiqian} 866e35fdd936d133bf8a48de140a3c666897588a05shiqian 867e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { 868e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseNe("Hello"); 869e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hi")); 870e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 871e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hello")); 872e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("hello")); 873e35fdd936d133bf8a48de140a3c666897588a05shiqian 874e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrCaseNe(string("Hello")); 875e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("")); 876e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hello")); 877e35fdd936d133bf8a48de140a3c666897588a05shiqian} 878e35fdd936d133bf8a48de140a3c666897588a05shiqian 879e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, CanDescribeSelf) { 880e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseNe("Hi"); 881e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to (ignoring case) \"Hi\"", Describe(m)); 882e35fdd936d133bf8a48de140a3c666897588a05shiqian} 883e35fdd936d133bf8a48de140a3c666897588a05shiqian 884e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching string-typed values. 885e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForStringClasses) { 886e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<string> m1 = HasSubstr("foo"); 887e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(string("I love food."))); 888e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(string("tofo"))); 889e35fdd936d133bf8a48de140a3c666897588a05shiqian 890e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const std::string&> m2 = HasSubstr("foo"); 891e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(std::string("I love food."))); 892e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(std::string("tofo"))); 893e35fdd936d133bf8a48de140a3c666897588a05shiqian} 894e35fdd936d133bf8a48de140a3c666897588a05shiqian 895e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-string-typed values. 896e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForCStrings) { 897e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<char*> m1 = HasSubstr("foo"); 898e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food."))); 899e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo"))); 900e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 901e35fdd936d133bf8a48de140a3c666897588a05shiqian 902e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m2 = HasSubstr("foo"); 903e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("I love food.")); 904e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("tofo")); 905e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 906e35fdd936d133bf8a48de140a3c666897588a05shiqian} 907e35fdd936d133bf8a48de140a3c666897588a05shiqian 908e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 909e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, CanDescribeSelf) { 910e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m = HasSubstr("foo\n\""); 911e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); 912e35fdd936d133bf8a48de140a3c666897588a05shiqian} 913e35fdd936d133bf8a48de140a3c666897588a05shiqian 914b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, CanDescribeSelf) { 915b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan Matcher<const std::pair<std::string, int>&> m = Key("foo"); 916b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); 917b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 918b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 919b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, MatchesCorrectly) { 920b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan std::pair<int, std::string> p(25, "foo"); 921b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(25)); 922b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(42))); 923b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(Ge(20))); 924b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(Lt(25)))); 925b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 926b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 927b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, SafelyCastsInnerMatcher) { 928b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan Matcher<int> is_positive = Gt(0); 929b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan Matcher<int> is_negative = Lt(0); 930b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan std::pair<char, bool> p('a', true); 931b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(is_positive)); 932b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(is_negative))); 933b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 934b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 935b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMap) { 936b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan std::map<int, std::string> container; 937b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(1, "foo")); 938b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(2, "bar")); 939b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(4, "baz")); 940b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(1))); 941b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(3)))); 942b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 943b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 944b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMultimap) { 945b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan std::multimap<int, std::string> container; 946b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(1, "foo")); 947b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(2, "bar")); 948b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(4, "baz")); 949b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 950b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(25)))); 951b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(25, "more foo")); 952b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(25))); 953b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan container.insert(std::make_pair(25, "more bar")); 954b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(25))); 955b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 956b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(1))); 957b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(3)))); 958b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 959b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 960f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, Typing) { 961f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Test verifies the following type conversions can be compiled. 962f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<const std::pair<const char*, int>&> m1 = Pair("foo", 42); 963f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<const std::pair<const char*, int> > m2 = Pair("foo", 42); 964f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<std::pair<const char*, int> > m3 = Pair("foo", 42); 965f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 966f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<std::pair<int, const std::string> > m4 = Pair(25, "42"); 967f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<std::pair<const std::string, int> > m5 = Pair("25", 42); 968f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 969f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 970f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanDescribeSelf) { 971f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<const std::pair<std::string, int>&> m1 = Pair("foo", 42); 972f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("has a first field that is equal to \"foo\"" 973f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", and has a second field that is equal to 42", 974f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Describe(m1)); 975f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("has a first field that is not equal to \"foo\"" 976f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", or has a second field that is not equal to 42", 977f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan DescribeNegation(m1)); 978f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Double and triple negation (1 or 2 times not and description of negation). 979f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<const std::pair<int, int>&> m2 = Not(Pair(Not(13), 42)); 980f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("has a first field that is not equal to 13" 981f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", and has a second field that is equal to 42", 982f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan DescribeNegation(m2)); 983f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 984f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 985f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanExplainMatchResultTo) { 986f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<std::pair<int, int> > m0 = Pair(0, 0); 987f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("", Explain(m0, std::make_pair(25, 42))); 988f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 989f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<std::pair<int, int> > m1 = Pair(GreaterThan(0), 0); 990f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("the first field is 25 more than 0", 991f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Explain(m1, std::make_pair(25, 42))); 992f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 993f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<std::pair<int, int> > m2 = Pair(0, GreaterThan(0)); 994f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("the second field is 42 more than 0", 995f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Explain(m2, std::make_pair(25, 42))); 996f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 997f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<std::pair<int, int> > m3 = Pair(GreaterThan(0), GreaterThan(0)); 998f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("the first field is 25 more than 0" 999f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", and the second field is 42 more than 0", 1000f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Explain(m3, std::make_pair(25, 42))); 1001f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1002f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1003f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, MatchesCorrectly) { 1004f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan std::pair<int, std::string> p(25, "foo"); 1005f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1006f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Both fields match. 1007f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(25, "foo")); 1008f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); 1009f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1010f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // 'first' doesnt' match, but 'second' matches. 1011f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(42, "foo"))); 1012f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(Lt(25), "foo"))); 1013f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1014f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // 'first' matches, but 'second' doesn't match. 1015f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(25, "bar"))); 1016f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(25, Not("foo")))); 1017f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1018f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Neither field matches. 1019f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(13, "bar"))); 1020f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a")))); 1021f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1022f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1023f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, SafelyCastsInnerMatchers) { 1024f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<int> is_positive = Gt(0); 1025f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<int> is_negative = Lt(0); 1026f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan std::pair<char, bool> p('a', true); 1027f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(is_positive, _)); 1028f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(is_negative, _))); 1029f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(_, is_positive)); 1030f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(_, is_negative))); 1031f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1032f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1033f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, InsideContainsUsingMap) { 1034f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan std::map<int, std::string> container; 1035f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan container.insert(std::make_pair(1, "foo")); 1036f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan container.insert(std::make_pair(2, "bar")); 1037f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan container.insert(std::make_pair(4, "baz")); 1038f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Contains(Pair(1, "foo"))); 1039f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Contains(Pair(1, _))); 1040f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Contains(Pair(_, "foo"))); 1041f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Not(Contains(Pair(3, _)))); 1042f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1043f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1044e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1045e35fdd936d133bf8a48de140a3c666897588a05shiqian 1046e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, MatchesStringWithGivenPrefix) { 1047e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = StartsWith(string("")); 1048e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Hi")); 1049e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("")); 1050e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1051e35fdd936d133bf8a48de140a3c666897588a05shiqian 1052e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = StartsWith("Hi"); 1053e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi")); 1054e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi Hi!")); 1055e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("High")); 1056e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("H")); 1057e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(" Hi")); 1058e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1059e35fdd936d133bf8a48de140a3c666897588a05shiqian 1060e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, CanDescribeSelf) { 1061e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m = StartsWith("Hi"); 1062e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with \"Hi\"", Describe(m)); 1063e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1064e35fdd936d133bf8a48de140a3c666897588a05shiqian 1065e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1066e35fdd936d133bf8a48de140a3c666897588a05shiqian 1067e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, MatchesStringWithGivenSuffix) { 1068e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = EndsWith(""); 1069e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Hi")); 1070e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("")); 1071e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1072e35fdd936d133bf8a48de140a3c666897588a05shiqian 1073e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = EndsWith(string("Hi")); 1074e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi")); 1075e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Wow Hi Hi")); 1076e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Super Hi")); 1077e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("i")); 1078e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi ")); 1079e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1080e35fdd936d133bf8a48de140a3c666897588a05shiqian 1081e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, CanDescribeSelf) { 1082e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m = EndsWith("Hi"); 1083e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with \"Hi\"", Describe(m)); 1084e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1085e35fdd936d133bf8a48de140a3c666897588a05shiqian 1086e35fdd936d133bf8a48de140a3c666897588a05shiqian#ifdef GMOCK_HAS_REGEX 1087e35fdd936d133bf8a48de140a3c666897588a05shiqian 1088e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests MatchesRegex(). 1089e35fdd936d133bf8a48de140a3c666897588a05shiqian 1090e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { 1091e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = MatchesRegex("a.*z"); 1092e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("az")); 1093e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("abcz")); 1094e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1095e35fdd936d133bf8a48de140a3c666897588a05shiqian 1096e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); 1097e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("azbz")); 1098e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("az1")); 1099e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("1az")); 1100e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1101e35fdd936d133bf8a48de140a3c666897588a05shiqian 1102e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, CanDescribeSelf) { 1103e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); 1104e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); 1105e35fdd936d133bf8a48de140a3c666897588a05shiqian 1106e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m2 = MatchesRegex(new RE("[a-z].*")); 1107e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("matches regular expression \"[a-z].*\"", Describe(m2)); 1108e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1109e35fdd936d133bf8a48de140a3c666897588a05shiqian 1110e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ContainsRegex(). 1111e35fdd936d133bf8a48de140a3c666897588a05shiqian 1112e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { 1113e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); 1114e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("az")); 1115e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("0abcz1")); 1116e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1117e35fdd936d133bf8a48de140a3c666897588a05shiqian 1118e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); 1119e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("azbz")); 1120e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("az1")); 1121e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("1a")); 1122e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1123e35fdd936d133bf8a48de140a3c666897588a05shiqian 1124e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, CanDescribeSelf) { 1125e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m1 = ContainsRegex("Hi.*"); 1126e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); 1127e35fdd936d133bf8a48de140a3c666897588a05shiqian 1128e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m2 = ContainsRegex(new RE("[a-z].*")); 1129e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("contains regular expression \"[a-z].*\"", Describe(m2)); 1130e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1131e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GMOCK_HAS_REGEX 1132e35fdd936d133bf8a48de140a3c666897588a05shiqian 1133e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests for wide strings. 1134e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_STD_WSTRING 1135e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, MatchesEqual) { 1136e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); 1137e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1138e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1139e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1140e35fdd936d133bf8a48de140a3c666897588a05shiqian 1141e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); 1142e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hello")); 1143e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1144e35fdd936d133bf8a48de140a3c666897588a05shiqian 1145e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1146e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1147e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1148e35fdd936d133bf8a48de140a3c666897588a05shiqian 1149e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str(L"01204500800"); 1150e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1151e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m4 = StrEq(str); 1152e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(str)); 1153e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1154e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m5 = StrEq(str); 1155e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(str)); 1156e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1157e35fdd936d133bf8a48de140a3c666897588a05shiqian 1158e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, CanDescribeSelf) { 1159e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"\?\\\a\b\f\n\r\t\v"); 1160e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1161e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1162e35fdd936d133bf8a48de140a3c666897588a05shiqian 1163e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1164e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1165e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m2)); 1166e35fdd936d133bf8a48de140a3c666897588a05shiqian 1167e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str(L"01204500800"); 1168e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1169e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m4 = StrEq(str); 1170e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1171e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1172e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m5 = StrEq(str); 1173e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1174e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1175e35fdd936d133bf8a48de140a3c666897588a05shiqian 1176e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, MatchesUnequalString) { 1177e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hello"); 1178e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"")); 1179e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1180e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1181e35fdd936d133bf8a48de140a3c666897588a05shiqian 1182e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello")); 1183e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1184e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1185e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1186e35fdd936d133bf8a48de140a3c666897588a05shiqian 1187e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, CanDescribeSelf) { 1188e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hi"); 1189e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to L\"Hi\"", Describe(m)); 1190e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1191e35fdd936d133bf8a48de140a3c666897588a05shiqian 1192e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1193e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello")); 1194e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1195e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"hello")); 1196e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hi")); 1197e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1198e35fdd936d133bf8a48de140a3c666897588a05shiqian 1199e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello"); 1200e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1201e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1202e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1203e35fdd936d133bf8a48de140a3c666897588a05shiqian 1204e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1205e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str1(L"oabocdooeoo"); 1206e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str2(L"OABOCDOOEOO"); 1207e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m0 = StrCaseEq(str1); 1208e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0'))); 1209e35fdd936d133bf8a48de140a3c666897588a05shiqian 1210e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = L'\0'; 1211e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m1 = StrCaseEq(str1); 1212e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 1213e35fdd936d133bf8a48de140a3c666897588a05shiqian 1214e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1215e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1216e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrCaseEq(str1); 1217e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = L'\0'; 1218e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 1219e35fdd936d133bf8a48de140a3c666897588a05shiqian 1220e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m3 = StrCaseEq(str1); 1221e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 1222e35fdd936d133bf8a48de140a3c666897588a05shiqian 1223e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + L"x")); 1224e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, L'\0'); 1225e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 1226e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9))); 1227e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1228e35fdd936d133bf8a48de140a3c666897588a05shiqian 1229e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, CanDescribeSelf) { 1230e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m = StrCaseEq(L"Hi"); 1231e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1232e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1233e35fdd936d133bf8a48de140a3c666897588a05shiqian 1234e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1235e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1236e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hi")); 1237e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1238e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1239e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1240e35fdd936d133bf8a48de140a3c666897588a05shiqian 1241e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello")); 1242e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"")); 1243e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1244e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1245e35fdd936d133bf8a48de140a3c666897588a05shiqian 1246e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, CanDescribeSelf) { 1247e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 1248e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to (ignoring case) L\"Hi\"", Describe(m)); 1249e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1250e35fdd936d133bf8a48de140a3c666897588a05shiqian 1251e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values. 1252e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForStringClasses) { 1253e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher< ::std::wstring> m1 = HasSubstr(L"foo"); 1254e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food."))); 1255e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo"))); 1256e35fdd936d133bf8a48de140a3c666897588a05shiqian 1257e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo"); 1258e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food."))); 1259e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo"))); 1260e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1261e35fdd936d133bf8a48de140a3c666897588a05shiqian 1262e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values. 1263e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForCStrings) { 1264e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1265e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1266e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1267e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1268e35fdd936d133bf8a48de140a3c666897588a05shiqian 1269e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1270e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"I love food.")); 1271e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"tofo")); 1272e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 1273e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1274e35fdd936d133bf8a48de140a3c666897588a05shiqian 1275e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 1276e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, CanDescribeSelf) { 1277e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m = HasSubstr(L"foo\n\""); 1278e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1279e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1280e35fdd936d133bf8a48de140a3c666897588a05shiqian 1281e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1282e35fdd936d133bf8a48de140a3c666897588a05shiqian 1283e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) { 1284e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L"")); 1285e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1286e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1287e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1288e35fdd936d133bf8a48de140a3c666897588a05shiqian 1289e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi"); 1290e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1291e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1292e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"High")); 1293e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"H")); 1294e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L" Hi")); 1295e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1296e35fdd936d133bf8a48de140a3c666897588a05shiqian 1297e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, CanDescribeSelf) { 1298e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring> m = StartsWith(L"Hi"); 1299e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1300e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1301e35fdd936d133bf8a48de140a3c666897588a05shiqian 1302e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1303e35fdd936d133bf8a48de140a3c666897588a05shiqian 1304e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) { 1305e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = EndsWith(L""); 1306e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1307e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1308e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1309e35fdd936d133bf8a48de140a3c666897588a05shiqian 1310e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi")); 1311e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1312e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1313e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Super Hi")); 1314e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"i")); 1315e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi ")); 1316e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1317e35fdd936d133bf8a48de140a3c666897588a05shiqian 1318e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, CanDescribeSelf) { 1319e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring> m = EndsWith(L"Hi"); 1320e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1321e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1322e35fdd936d133bf8a48de140a3c666897588a05shiqian 1323e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_STD_WSTRING 1324e35fdd936d133bf8a48de140a3c666897588a05shiqian 1325e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING 1326e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, MatchesEqual) { 1327e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello")); 1328e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1329e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1330e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1331e35fdd936d133bf8a48de140a3c666897588a05shiqian 1332e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrEq(L"Hello"); 1333e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hello")); 1334e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1335e35fdd936d133bf8a48de140a3c666897588a05shiqian 1336e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1337e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1338e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1339e35fdd936d133bf8a48de140a3c666897588a05shiqian 1340e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str(L"01204500800"); 1341e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1342e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m4 = StrEq(str); 1343e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(str)); 1344e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1345e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m5 = StrEq(str); 1346e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(str)); 1347e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1348e35fdd936d133bf8a48de140a3c666897588a05shiqian 1349e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, CanDescribeSelf) { 1350e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m = StrEq(L"Hi-\'\"\?\\\a\b\f\n\r\t\v"); 1351e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1352e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1353e35fdd936d133bf8a48de140a3c666897588a05shiqian 1354e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1355e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1356e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m2)); 1357e35fdd936d133bf8a48de140a3c666897588a05shiqian 1358e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str(L"01204500800"); 1359e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1360e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m4 = StrEq(str); 1361e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1362e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1363e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m5 = StrEq(str); 1364e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1365e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1366e35fdd936d133bf8a48de140a3c666897588a05shiqian 1367e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, MatchesUnequalString) { 1368e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hello"); 1369e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"")); 1370e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1371e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1372e35fdd936d133bf8a48de140a3c666897588a05shiqian 1373e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello")); 1374e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1375e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1376e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1377e35fdd936d133bf8a48de140a3c666897588a05shiqian 1378e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, CanDescribeSelf) { 1379e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hi"); 1380e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to L\"Hi\"", Describe(m)); 1381e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1382e35fdd936d133bf8a48de140a3c666897588a05shiqian 1383e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1384e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello")); 1385e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1386e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"hello")); 1387e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hi")); 1388e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1389e35fdd936d133bf8a48de140a3c666897588a05shiqian 1390e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello"); 1391e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1392e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1393e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1394e35fdd936d133bf8a48de140a3c666897588a05shiqian 1395e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1396e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str1(L"oabocdooeoo"); 1397e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str2(L"OABOCDOOEOO"); 1398e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m0 = StrCaseEq(str1); 1399e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0'))); 1400e35fdd936d133bf8a48de140a3c666897588a05shiqian 1401e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = L'\0'; 1402e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m1 = StrCaseEq(str1); 1403e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 1404e35fdd936d133bf8a48de140a3c666897588a05shiqian 1405e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1406e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1407e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrCaseEq(str1); 1408e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = L'\0'; 1409e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 1410e35fdd936d133bf8a48de140a3c666897588a05shiqian 1411e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m3 = StrCaseEq(str1); 1412e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 1413e35fdd936d133bf8a48de140a3c666897588a05shiqian 1414e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + L"x")); 1415e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, L'\0'); 1416e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 1417e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9))); 1418e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1419e35fdd936d133bf8a48de140a3c666897588a05shiqian 1420e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) { 1421e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m = StrCaseEq(L"Hi"); 1422e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1423e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1424e35fdd936d133bf8a48de140a3c666897588a05shiqian 1425e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1426e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1427e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hi")); 1428e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1429e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1430e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1431e35fdd936d133bf8a48de140a3c666897588a05shiqian 1432e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello")); 1433e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"")); 1434e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1435e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1436e35fdd936d133bf8a48de140a3c666897588a05shiqian 1437e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) { 1438e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 1439e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to (ignoring case) L\"Hi\"", Describe(m)); 1440e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1441e35fdd936d133bf8a48de140a3c666897588a05shiqian 1442e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values. 1443e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForStringClasses) { 1444e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher< ::wstring> m1 = HasSubstr(L"foo"); 1445e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(::wstring(L"I love food."))); 1446e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(::wstring(L"tofo"))); 1447e35fdd936d133bf8a48de140a3c666897588a05shiqian 1448e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = HasSubstr(L"foo"); 1449e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(::wstring(L"I love food."))); 1450e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(::wstring(L"tofo"))); 1451e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1452e35fdd936d133bf8a48de140a3c666897588a05shiqian 1453e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values. 1454e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForCStrings) { 1455e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1456e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1457e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1458e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1459e35fdd936d133bf8a48de140a3c666897588a05shiqian 1460e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1461e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"I love food.")); 1462e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"tofo")); 1463e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 1464e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1465e35fdd936d133bf8a48de140a3c666897588a05shiqian 1466e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 1467e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, CanDescribeSelf) { 1468e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m = HasSubstr(L"foo\n\""); 1469e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1470e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1471e35fdd936d133bf8a48de140a3c666897588a05shiqian 1472e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1473e35fdd936d133bf8a48de140a3c666897588a05shiqian 1474e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) { 1475e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L"")); 1476e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1477e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1478e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1479e35fdd936d133bf8a48de140a3c666897588a05shiqian 1480e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = StartsWith(L"Hi"); 1481e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1482e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1483e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"High")); 1484e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"H")); 1485e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L" Hi")); 1486e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1487e35fdd936d133bf8a48de140a3c666897588a05shiqian 1488e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, CanDescribeSelf) { 1489e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring> m = StartsWith(L"Hi"); 1490e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1491e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1492e35fdd936d133bf8a48de140a3c666897588a05shiqian 1493e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1494e35fdd936d133bf8a48de140a3c666897588a05shiqian 1495e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) { 1496e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = EndsWith(L""); 1497e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1498e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1499e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1500e35fdd936d133bf8a48de140a3c666897588a05shiqian 1501e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi")); 1502e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1503e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1504e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Super Hi")); 1505e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"i")); 1506e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi ")); 1507e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1508e35fdd936d133bf8a48de140a3c666897588a05shiqian 1509e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, CanDescribeSelf) { 1510e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring> m = EndsWith(L"Hi"); 1511e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1512e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1513e35fdd936d133bf8a48de140a3c666897588a05shiqian 1514e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_GLOBAL_WSTRING 1515e35fdd936d133bf8a48de140a3c666897588a05shiqian 1516e35fdd936d133bf8a48de140a3c666897588a05shiqian 1517e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef ::std::tr1::tuple<long, int> Tuple2; // NOLINT 1518e35fdd936d133bf8a48de140a3c666897588a05shiqian 1519e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() matches a 2-tuple where the first field == the 1520e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1521e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, MatchesEqualArguments) { 1522e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Eq(); 1523e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1524e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1525e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1526e35fdd936d133bf8a48de140a3c666897588a05shiqian 1527e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() describes itself properly. 1528e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, CanDescribeSelf) { 1529e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Eq(); 15302661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x == y", Describe(m)); 1531e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1532e35fdd936d133bf8a48de140a3c666897588a05shiqian 1533e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() matches a 2-tuple where the first field >= the 1534e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1535e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) { 1536e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ge(); 1537e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1538e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1539e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1540e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1541e35fdd936d133bf8a48de140a3c666897588a05shiqian 1542e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() describes itself properly. 1543e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, CanDescribeSelf) { 1544e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ge(); 15452661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x >= y", Describe(m)); 1546e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1547e35fdd936d133bf8a48de140a3c666897588a05shiqian 1548e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() matches a 2-tuple where the first field > the 1549e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1550e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, MatchesGreaterThanArguments) { 1551e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Gt(); 1552e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1553e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1554e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1555e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1556e35fdd936d133bf8a48de140a3c666897588a05shiqian 1557e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() describes itself properly. 1558e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, CanDescribeSelf) { 1559e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Gt(); 15602661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x > y", Describe(m)); 1561e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1562e35fdd936d133bf8a48de140a3c666897588a05shiqian 1563e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() matches a 2-tuple where the first field <= the 1564e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1565e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, MatchesLessThanOrEqualArguments) { 1566e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Le(); 1567e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1568e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1569e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1570e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1571e35fdd936d133bf8a48de140a3c666897588a05shiqian 1572e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() describes itself properly. 1573e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, CanDescribeSelf) { 1574e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Le(); 15752661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x <= y", Describe(m)); 1576e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1577e35fdd936d133bf8a48de140a3c666897588a05shiqian 1578e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() matches a 2-tuple where the first field < the 1579e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1580e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, MatchesLessThanArguments) { 1581e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Lt(); 1582e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1583e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1584e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1585e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1586e35fdd936d133bf8a48de140a3c666897588a05shiqian 1587e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() describes itself properly. 1588e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, CanDescribeSelf) { 1589e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Lt(); 15902661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x < y", Describe(m)); 1591e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1592e35fdd936d133bf8a48de140a3c666897588a05shiqian 1593e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() matches a 2-tuple where the first field != the 1594e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1595e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, MatchesUnequalArguments) { 1596e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ne(); 1597e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1598e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1599e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1600e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1601e35fdd936d133bf8a48de140a3c666897588a05shiqian 1602e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() describes itself properly. 1603e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, CanDescribeSelf) { 1604e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ne(); 16052661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_EQ("are a pair (x, y) where x != y", Describe(m)); 1606e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1607e35fdd936d133bf8a48de140a3c666897588a05shiqian 1608e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) matches any value that doesn't match m. 1609e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, NegatesMatcher) { 1610e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 1611e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Not(Eq(2)); 1612e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 1613e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 1614e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1615e35fdd936d133bf8a48de140a3c666897588a05shiqian 1616e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) describes itself properly. 1617e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, CanDescribeSelf) { 1618e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Not(Eq(5)); 1619e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not equal to 5", Describe(m)); 1620e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1621e35fdd936d133bf8a48de140a3c666897588a05shiqian 162218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the Not matcher. 162318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) { 162418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 is a monomorphic matcher. 162518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 162618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 162718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = Not(greater_than_5); 162818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = Not(greater_than_5); 162918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = Not(m); 163018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 163118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 1632e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) matches any value that matches all of 1633e35fdd936d133bf8a48de140a3c666897588a05shiqian// the given matchers. 1634e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, MatchesWhenAllMatch) { 1635e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 1636e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Le(2), Ge(1)); 1637e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 1638e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 1639e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 1640e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 1641e35fdd936d133bf8a48de140a3c666897588a05shiqian 1642e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2)); 1643e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 1644e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 1645e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1)); 1646e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 1647e35fdd936d133bf8a48de140a3c666897588a05shiqian 1648e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 1649e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 1650e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 1651e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 1652e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1)); 1653e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 1654e35fdd936d133bf8a48de140a3c666897588a05shiqian 1655e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 1656e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(0)); 1657e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 1658e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 1659e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1660e35fdd936d133bf8a48de140a3c666897588a05shiqian 1661e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) describes itself properly. 1662e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, CanDescribeSelf) { 1663e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 1664e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Le(2), Ge(1)); 1665e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is less than or equal to 2) and " 1666e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is greater than or equal to 1)", 1667e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1668e35fdd936d133bf8a48de140a3c666897588a05shiqian 1669e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2)); 1670e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is greater than 0) and " 1671e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is not equal to 1) and " 1672e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is not equal to 2))", 1673e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1674e35fdd936d133bf8a48de140a3c666897588a05shiqian 1675e35fdd936d133bf8a48de140a3c666897588a05shiqian 1676e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 1677e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is greater than 0) and " 1678e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is not equal to 1) and " 1679e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is not equal to 2) and " 1680e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is not equal to 3)))", 1681e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1682e35fdd936d133bf8a48de140a3c666897588a05shiqian 1683e35fdd936d133bf8a48de140a3c666897588a05shiqian 1684e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 1685e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is greater than or equal to 0) and " 1686e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is less than 10) and " 1687e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is not equal to 3) and " 1688e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is not equal to 5) and " 1689e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is not equal to 7))))", Describe(m)); 1690e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1691e35fdd936d133bf8a48de140a3c666897588a05shiqian 169218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AllOf matcher. 169318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) { 169418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 and less_than_10 are monomorphic matchers. 169518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 169618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> less_than_10 = Lt(10); 169718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 169818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = AllOf(greater_than_5, less_than_10); 169918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = AllOf(greater_than_5, less_than_10); 170018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = AllOf(greater_than_5, m2); 170118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 170218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Tests that BothOf works when composing itself. 170318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10); 170418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10); 170518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 170618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 1707e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) matches any value that matches at 1708e35fdd936d133bf8a48de140a3c666897588a05shiqian// least one of the given matchers. 1709e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, MatchesWhenAnyMatches) { 1710e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 1711e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(1), Ge(3)); 1712e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 1713e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 1714e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 1715e35fdd936d133bf8a48de140a3c666897588a05shiqian 1716e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2)); 1717e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(-1)); 1718e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 1719e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 1720e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 1721e35fdd936d133bf8a48de140a3c666897588a05shiqian 1722e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 1723e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(-1)); 1724e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 1725e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 1726e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 1727e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 1728e35fdd936d133bf8a48de140a3c666897588a05shiqian 1729e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(0), Gt(10), 3, 5, 7); 1730e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(0)); 1731e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(11)); 1732e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 1733e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 1734e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1735e35fdd936d133bf8a48de140a3c666897588a05shiqian 1736e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) describes itself properly. 1737e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, CanDescribeSelf) { 1738e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 1739e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(1), Ge(3)); 1740e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is less than or equal to 1) or " 1741e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is greater than or equal to 3)", 1742e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1743e35fdd936d133bf8a48de140a3c666897588a05shiqian 1744e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2)); 1745e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is less than 0) or " 1746e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 1) or (is equal to 2))", 1747e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1748e35fdd936d133bf8a48de140a3c666897588a05shiqian 1749e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 1750e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is less than 0) or " 1751e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 1) or " 1752e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 2) or " 1753e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is equal to 3)))", 1754e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1755e35fdd936d133bf8a48de140a3c666897588a05shiqian 1756e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(0), Gt(10), 3, 5, 7); 1757e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("(is less than or equal to 0) or " 1758e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is greater than 10) or " 1759e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 3) or " 1760e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 5) or " 1761e35fdd936d133bf8a48de140a3c666897588a05shiqian "(is equal to 7))))", 1762e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1763e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1764e35fdd936d133bf8a48de140a3c666897588a05shiqian 176518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AnyOf matcher. 176618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) { 176718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 and less_than_10 are monomorphic matchers. 176818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 176918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> less_than_10 = Lt(10); 177018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 177118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = AnyOf(greater_than_5, less_than_10); 177218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10); 177318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = AnyOf(greater_than_5, m2); 177418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 177518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Tests that EitherOf works when composing itself. 177618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10); 177718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10); 177818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 177918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 1780e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following predicate function and predicate functor are for 1781e35fdd936d133bf8a48de140a3c666897588a05shiqian// testing the Truly(predicate) matcher. 1782e35fdd936d133bf8a48de140a3c666897588a05shiqian 1783e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns non-zero if the input is positive. Note that the return 1784e35fdd936d133bf8a48de140a3c666897588a05shiqian// type of this function is not bool. It's OK as Truly() accepts any 1785e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function or functor whose return type can be implicitly 1786e35fdd936d133bf8a48de140a3c666897588a05shiqian// converted to bool. 1787e35fdd936d133bf8a48de140a3c666897588a05shiqianint IsPositive(double x) { 1788e35fdd936d133bf8a48de140a3c666897588a05shiqian return x > 0 ? 1 : 0; 1789e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1790e35fdd936d133bf8a48de140a3c666897588a05shiqian 1791e35fdd936d133bf8a48de140a3c666897588a05shiqian// This functor returns true if the input is greater than the given 1792e35fdd936d133bf8a48de140a3c666897588a05shiqian// number. 1793e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IsGreaterThan { 1794e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1795e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit IsGreaterThan(int threshold) : threshold_(threshold) {} 1796e35fdd936d133bf8a48de140a3c666897588a05shiqian 1797e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator()(int n) const { return n > threshold_; } 1798e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1799e35fdd936d133bf8a48de140a3c666897588a05shiqian const int threshold_; 1800e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1801e35fdd936d133bf8a48de140a3c666897588a05shiqian 1802e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing Truly(). 1803e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int foo = 0; 1804e35fdd936d133bf8a48de140a3c666897588a05shiqian 1805e35fdd936d133bf8a48de140a3c666897588a05shiqian// This predicate returns true iff the argument references foo and has 1806e35fdd936d133bf8a48de140a3c666897588a05shiqian// a zero value. 1807e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesFooAndIsZero(const int& n) { 1808e35fdd936d133bf8a48de140a3c666897588a05shiqian return (&n == &foo) && (n == 0); 1809e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1810e35fdd936d133bf8a48de140a3c666897588a05shiqian 1811e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) matches what satisfies the given 1812e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate. 1813e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) { 1814e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = Truly(IsPositive); 1815e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2.0)); 1816e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(-1.5)); 1817e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1818e35fdd936d133bf8a48de140a3c666897588a05shiqian 1819e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate_functor) works too. 1820e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanBeUsedWithFunctor) { 1821e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Truly(IsGreaterThan(5)); 1822e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(6)); 1823e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(4)); 1824e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1825e35fdd936d133bf8a48de140a3c666897588a05shiqian 1826e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) can describe itself properly. 1827e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanDescribeSelf) { 1828e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = Truly(IsPositive); 1829e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("satisfies the given predicate", 1830e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1831e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1832e35fdd936d133bf8a48de140a3c666897588a05shiqian 1833e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) works when the matcher takes its 1834e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument by reference. 1835e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, WorksForByRefArguments) { 1836e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m = Truly(ReferencesFooAndIsZero); 1837e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(foo)); 1838e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 1839e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n)); 1840e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1841e35fdd936d133bf8a48de140a3c666897588a05shiqian 1842e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) is a predicate satisfied by whatever that 1843e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches matcher m. 1844e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) { 1845e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(Ge(0))(1)); 1846e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(Eq('a'))('b')); 1847e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1848e35fdd936d133bf8a48de140a3c666897588a05shiqian 1849e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) works when the matcher takes its argument by 1850e35fdd936d133bf8a48de140a3c666897588a05shiqian// reference. 1851e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksOnByRefArguments) { 1852e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 1853e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n)); 1854e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(Ref(m))(n)); 1855e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1856e35fdd936d133bf8a48de140a3c666897588a05shiqian 1857e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a Matcher on non-reference type can be used in 1858e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches(). 1859e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksWithMatcherOnNonRefType) { 1860e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> eq5 = Eq(5); 1861e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(eq5)(5)); 1862e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(eq5)(2)); 1863e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1864e35fdd936d133bf8a48de140a3c666897588a05shiqian 1865b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Tests Value(value, matcher). Since Value() is a simple wrapper for 1866b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches(), which has been tested already, we don't spend a lot of 1867b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// effort on testing Value(). 1868b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithPolymorphicMatcher) { 1869b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value("hi", StartsWith("h"))); 1870b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value(5, Gt(10))); 1871b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 1872b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 1873b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithMonomorphicMatcher) { 1874b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<int> is_zero = Eq(0); 1875b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value(0, is_zero)); 1876b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value('a', is_zero)); 1877b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 1878b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan int n = 0; 1879b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<const int&> ref_n = Ref(n); 1880b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value(n, ref_n)); 1881b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value(1, ref_n)); 1882b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 1883b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 1884bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForTuple) { 1885bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); 1886bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); 1887bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 1888bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 1889bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForNonTuple) { 1890bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(42, AllArgs(Gt(0))); 1891bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT('a', Not(AllArgs(Eq('b')))); 1892bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 1893bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 1894bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanclass AllArgsHelper { 1895bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan public: 1896bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan MOCK_METHOD2(Helper, int(char x, int y)); 1897bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}; 1898bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 1899bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksInWithClause) { 1900bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan AllArgsHelper helper; 1901bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan ON_CALL(helper, Helper(_, _)) 1902bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .With(AllArgs(Lt())) 1903bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .WillByDefault(Return(1)); 1904bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_CALL(helper, Helper(_, _)); 1905bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_CALL(helper, Helper(_, _)) 1906bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .With(AllArgs(Gt())) 1907bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .WillOnce(Return(2)); 1908bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 1909bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_EQ(1, helper.Helper('\1', 2)); 1910bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_EQ(2, helper.Helper('a', 1)); 1911bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 1912bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 1913e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 1914e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches the matcher. 1915e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) { 1916e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT(5, Ge(2)) << "This should succeed."; 1917e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("Foo", EndsWith("oo")); 1918e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too."; 1919e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT("Hello", StartsWith("Hell")); 1920e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1921e35fdd936d133bf8a48de140a3c666897588a05shiqian 1922e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 1923e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't match the matcher. 1924e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) { 1925e35fdd936d133bf8a48de140a3c666897588a05shiqian // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(), 1926e35fdd936d133bf8a48de140a3c666897588a05shiqian // which cannot reference auto variables. 1927e35fdd936d133bf8a48de140a3c666897588a05shiqian static int n; 1928e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 5; 19292b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 19302b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // VC++ prior to version 8.0 SP1 has a bug where it will not see any 19312b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // functions declared in the namespace scope from within nested classes. 19322b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all 19332b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // namespace-level functions invoked inside them need to be explicitly 19342b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // resolved. 19352b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)), 1936e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: n\n" 1937e35fdd936d133bf8a48de140a3c666897588a05shiqian "Expected: is greater than 10\n" 19382b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan " Actual: 5"); 1939e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 0; 19402b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_NONFATAL_FAILURE( 19412b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))), 19422b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan "Value of: n\n" 19432b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan "Expected: (is less than or equal to 7) and " 19442b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan "(is greater than or equal to 5)\n" 19452b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan " Actual: 0"); 1946e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1947e35fdd936d133bf8a48de140a3c666897588a05shiqian 1948e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument 1949e35fdd936d133bf8a48de140a3c666897588a05shiqian// has a reference type. 1950e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForByRefArguments) { 1951e35fdd936d133bf8a48de140a3c666897588a05shiqian // We use a static variable here as EXPECT_FATAL_FAILURE() cannot 1952e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference auto variables. 1953e35fdd936d133bf8a48de140a3c666897588a05shiqian static int n; 1954e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 0; 1955e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT(n, AllOf(Le(7), Ref(n))); 19562b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 1957e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: n\n" 1958e35fdd936d133bf8a48de140a3c666897588a05shiqian "Expected: does not reference the variable @"); 1959e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the "Actual" part. 19602b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 1961e35fdd936d133bf8a48de140a3c666897588a05shiqian "Actual: 0 (is located @"); 1962e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1963e35fdd936d133bf8a48de140a3c666897588a05shiqian 1964e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is 1965e35fdd936d133bf8a48de140a3c666897588a05shiqian// monomorphic. 1966e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { 1967e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> starts_with_he = StartsWith("he"); 1968e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("hello", starts_with_he); 1969e35fdd936d133bf8a48de140a3c666897588a05shiqian 1970e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> ends_with_ok = EndsWith("ok"); 1971e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("book", ends_with_ok); 1972e35fdd936d133bf8a48de140a3c666897588a05shiqian 1973e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> is_greater_than_5 = Gt(5); 1974e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5), 1975e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: 5\n" 1976e35fdd936d133bf8a48de140a3c666897588a05shiqian "Expected: is greater than 5\n" 1977e35fdd936d133bf8a48de140a3c666897588a05shiqian " Actual: 5"); 1978e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1979e35fdd936d133bf8a48de140a3c666897588a05shiqian 1980e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests floating-point matchers. 1981e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 1982e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingPointTest : public testing::Test { 1983e35fdd936d133bf8a48de140a3c666897588a05shiqian protected: 1984e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename testing::internal::FloatingPoint<RawType> Floating; 1985e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename Floating::Bits Bits; 1986e35fdd936d133bf8a48de140a3c666897588a05shiqian 1987e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void SetUp() { 1988e35fdd936d133bf8a48de140a3c666897588a05shiqian const size_t max_ulps = Floating::kMaxUlps; 1989e35fdd936d133bf8a48de140a3c666897588a05shiqian 1990e35fdd936d133bf8a48de140a3c666897588a05shiqian // The bits that represent 0.0. 1991e35fdd936d133bf8a48de140a3c666897588a05shiqian const Bits zero_bits = Floating(0).bits(); 1992e35fdd936d133bf8a48de140a3c666897588a05shiqian 1993e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes some numbers close to 0.0. 1994e35fdd936d133bf8a48de140a3c666897588a05shiqian close_to_positive_zero_ = Floating::ReinterpretBits(zero_bits + max_ulps/2); 1995e35fdd936d133bf8a48de140a3c666897588a05shiqian close_to_negative_zero_ = -Floating::ReinterpretBits( 1996e35fdd936d133bf8a48de140a3c666897588a05shiqian zero_bits + max_ulps - max_ulps/2); 1997e35fdd936d133bf8a48de140a3c666897588a05shiqian further_from_negative_zero_ = -Floating::ReinterpretBits( 1998e35fdd936d133bf8a48de140a3c666897588a05shiqian zero_bits + max_ulps + 1 - max_ulps/2); 1999e35fdd936d133bf8a48de140a3c666897588a05shiqian 2000e35fdd936d133bf8a48de140a3c666897588a05shiqian // The bits that represent 1.0. 2001e35fdd936d133bf8a48de140a3c666897588a05shiqian const Bits one_bits = Floating(1).bits(); 2002e35fdd936d133bf8a48de140a3c666897588a05shiqian 2003e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes some numbers close to 1.0. 2004e35fdd936d133bf8a48de140a3c666897588a05shiqian close_to_one_ = Floating::ReinterpretBits(one_bits + max_ulps); 2005e35fdd936d133bf8a48de140a3c666897588a05shiqian further_from_one_ = Floating::ReinterpretBits(one_bits + max_ulps + 1); 2006e35fdd936d133bf8a48de140a3c666897588a05shiqian 2007e35fdd936d133bf8a48de140a3c666897588a05shiqian // +infinity. 2008e35fdd936d133bf8a48de140a3c666897588a05shiqian infinity_ = Floating::Infinity(); 2009e35fdd936d133bf8a48de140a3c666897588a05shiqian 2010e35fdd936d133bf8a48de140a3c666897588a05shiqian // The bits that represent +infinity. 2011e35fdd936d133bf8a48de140a3c666897588a05shiqian const Bits infinity_bits = Floating(infinity_).bits(); 2012e35fdd936d133bf8a48de140a3c666897588a05shiqian 2013e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes some numbers close to infinity. 2014e35fdd936d133bf8a48de140a3c666897588a05shiqian close_to_infinity_ = Floating::ReinterpretBits(infinity_bits - max_ulps); 2015e35fdd936d133bf8a48de140a3c666897588a05shiqian further_from_infinity_ = Floating::ReinterpretBits( 2016e35fdd936d133bf8a48de140a3c666897588a05shiqian infinity_bits - max_ulps - 1); 2017e35fdd936d133bf8a48de140a3c666897588a05shiqian 2018e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes some NAN's. 2019e35fdd936d133bf8a48de140a3c666897588a05shiqian nan1_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 1); 2020e35fdd936d133bf8a48de140a3c666897588a05shiqian nan2_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 200); 2021e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2022e35fdd936d133bf8a48de140a3c666897588a05shiqian 2023e35fdd936d133bf8a48de140a3c666897588a05shiqian void TestSize() { 2024e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(sizeof(RawType), sizeof(Bits)); 2025e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2026e35fdd936d133bf8a48de140a3c666897588a05shiqian 2027e35fdd936d133bf8a48de140a3c666897588a05shiqian // A battery of tests for FloatingEqMatcher::Matches. 2028e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 2029e35fdd936d133bf8a48de140a3c666897588a05shiqian void TestMatches( 2030e35fdd936d133bf8a48de140a3c666897588a05shiqian testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) { 2031e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m1 = matcher_maker(0.0); 2032e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-0.0)); 2033e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(close_to_positive_zero_)); 2034e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(close_to_negative_zero_)); 2035e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(1.0)); 2036e35fdd936d133bf8a48de140a3c666897588a05shiqian 2037e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_); 2038e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(further_from_negative_zero_)); 2039e35fdd936d133bf8a48de140a3c666897588a05shiqian 2040e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m3 = matcher_maker(1.0); 2041e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(close_to_one_)); 2042e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(further_from_one_)); 2043e35fdd936d133bf8a48de140a3c666897588a05shiqian 2044e35fdd936d133bf8a48de140a3c666897588a05shiqian // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above. 2045e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(0.0)); 2046e35fdd936d133bf8a48de140a3c666897588a05shiqian 2047e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m4 = matcher_maker(-infinity_); 2048e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(-close_to_infinity_)); 2049e35fdd936d133bf8a48de140a3c666897588a05shiqian 2050e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m5 = matcher_maker(infinity_); 2051e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(close_to_infinity_)); 2052e35fdd936d133bf8a48de140a3c666897588a05shiqian 2053e35fdd936d133bf8a48de140a3c666897588a05shiqian // This is interesting as the representations of infinity_ and nan1_ 2054e35fdd936d133bf8a48de140a3c666897588a05shiqian // are only 1 DLP apart. 2055e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m5.Matches(nan1_)); 2056e35fdd936d133bf8a48de140a3c666897588a05shiqian 2057e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker can produce a Matcher<const RawType&>, which is needed in 2058e35fdd936d133bf8a48de140a3c666897588a05shiqian // some cases. 2059e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const RawType&> m6 = matcher_maker(0.0); 2060e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m6.Matches(-0.0)); 2061e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m6.Matches(close_to_positive_zero_)); 2062e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m6.Matches(1.0)); 2063e35fdd936d133bf8a48de140a3c666897588a05shiqian 2064e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker can produce a Matcher<RawType&>, which is needed in some 2065e35fdd936d133bf8a48de140a3c666897588a05shiqian // cases. 2066e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType&> m7 = matcher_maker(0.0); 2067e35fdd936d133bf8a48de140a3c666897588a05shiqian RawType x = 0.0; 2068e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m7.Matches(x)); 2069e35fdd936d133bf8a48de140a3c666897588a05shiqian x = 0.01f; 2070e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m7.Matches(x)); 2071e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2072e35fdd936d133bf8a48de140a3c666897588a05shiqian 2073e35fdd936d133bf8a48de140a3c666897588a05shiqian // Pre-calculated numbers to be used by the tests. 2074e35fdd936d133bf8a48de140a3c666897588a05shiqian 2075e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType close_to_positive_zero_; 2076e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType close_to_negative_zero_; 2077e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType further_from_negative_zero_; 2078e35fdd936d133bf8a48de140a3c666897588a05shiqian 2079e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType close_to_one_; 2080e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType further_from_one_; 2081e35fdd936d133bf8a48de140a3c666897588a05shiqian 2082e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType infinity_; 2083e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType close_to_infinity_; 2084e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType further_from_infinity_; 2085e35fdd936d133bf8a48de140a3c666897588a05shiqian 2086e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType nan1_; 2087e35fdd936d133bf8a48de140a3c666897588a05shiqian static RawType nan2_; 2088e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2089e35fdd936d133bf8a48de140a3c666897588a05shiqian 2090e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2091e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_positive_zero_; 2092e35fdd936d133bf8a48de140a3c666897588a05shiqian 2093e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2094e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_negative_zero_; 2095e35fdd936d133bf8a48de140a3c666897588a05shiqian 2096e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2097e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_negative_zero_; 2098e35fdd936d133bf8a48de140a3c666897588a05shiqian 2099e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2100e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_one_; 2101e35fdd936d133bf8a48de140a3c666897588a05shiqian 2102e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2103e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_one_; 2104e35fdd936d133bf8a48de140a3c666897588a05shiqian 2105e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2106e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::infinity_; 2107e35fdd936d133bf8a48de140a3c666897588a05shiqian 2108e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2109e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_infinity_; 2110e35fdd936d133bf8a48de140a3c666897588a05shiqian 2111e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2112e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_infinity_; 2113e35fdd936d133bf8a48de140a3c666897588a05shiqian 2114e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2115e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::nan1_; 2116e35fdd936d133bf8a48de140a3c666897588a05shiqian 2117e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2118e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::nan2_; 2119e35fdd936d133bf8a48de140a3c666897588a05shiqian 2120e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing floats. 2121e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<float> FloatTest; 2122e35fdd936d133bf8a48de140a3c666897588a05shiqian 2123e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) { 2124e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&FloatEq); 2125e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2126e35fdd936d133bf8a48de140a3c666897588a05shiqian 2127e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) { 2128e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&NanSensitiveFloatEq); 2129e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2130e35fdd936d133bf8a48de140a3c666897588a05shiqian 2131e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCannotMatchNaN) { 2132e35fdd936d133bf8a48de140a3c666897588a05shiqian // FloatEq never matches NaN. 2133e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m = FloatEq(nan1_); 2134e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan1_)); 2135e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan2_)); 2136e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2137e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2138e35fdd936d133bf8a48de140a3c666897588a05shiqian 2139e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) { 2140e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveFloatEq will match NaN. 2141e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m = NanSensitiveFloatEq(nan1_); 2142e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan1_)); 2143e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan2_)); 2144e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2145e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2146e35fdd936d133bf8a48de140a3c666897588a05shiqian 2147e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCanDescribeSelf) { 2148e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m1 = FloatEq(2.0f); 2149e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2150e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 2", DescribeNegation(m1)); 2151e35fdd936d133bf8a48de140a3c666897588a05shiqian 2152e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m2 = FloatEq(0.5f); 2153e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2154e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 0.5", DescribeNegation(m2)); 2155e35fdd936d133bf8a48de140a3c666897588a05shiqian 2156e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m3 = FloatEq(nan1_); 2157e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("never matches", Describe(m3)); 2158e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", DescribeNegation(m3)); 2159e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2160e35fdd936d133bf8a48de140a3c666897588a05shiqian 2161e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) { 2162e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m1 = NanSensitiveFloatEq(2.0f); 2163e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2164e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 2", DescribeNegation(m1)); 2165e35fdd936d133bf8a48de140a3c666897588a05shiqian 2166e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m2 = NanSensitiveFloatEq(0.5f); 2167e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2168e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 0.5", DescribeNegation(m2)); 2169e35fdd936d133bf8a48de140a3c666897588a05shiqian 2170e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m3 = NanSensitiveFloatEq(nan1_); 2171e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is NaN", Describe(m3)); 2172e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not NaN", DescribeNegation(m3)); 2173e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2174e35fdd936d133bf8a48de140a3c666897588a05shiqian 2175e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing doubles. 2176e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<double> DoubleTest; 2177e35fdd936d133bf8a48de140a3c666897588a05shiqian 2178e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) { 2179e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&DoubleEq); 2180e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2181e35fdd936d133bf8a48de140a3c666897588a05shiqian 2182e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) { 2183e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&NanSensitiveDoubleEq); 2184e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2185e35fdd936d133bf8a48de140a3c666897588a05shiqian 2186e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCannotMatchNaN) { 2187e35fdd936d133bf8a48de140a3c666897588a05shiqian // DoubleEq never matches NaN. 2188e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = DoubleEq(nan1_); 2189e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan1_)); 2190e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan2_)); 2191e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2192e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2193e35fdd936d133bf8a48de140a3c666897588a05shiqian 2194e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) { 2195e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveDoubleEq will match NaN. 2196e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = NanSensitiveDoubleEq(nan1_); 2197e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan1_)); 2198e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan2_)); 2199e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2200e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2201e35fdd936d133bf8a48de140a3c666897588a05shiqian 2202e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCanDescribeSelf) { 2203e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = DoubleEq(2.0); 2204e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2205e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 2", DescribeNegation(m1)); 2206e35fdd936d133bf8a48de140a3c666897588a05shiqian 2207e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = DoubleEq(0.5); 2208e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2209e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 0.5", DescribeNegation(m2)); 2210e35fdd936d133bf8a48de140a3c666897588a05shiqian 2211e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m3 = DoubleEq(nan1_); 2212e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("never matches", Describe(m3)); 2213e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", DescribeNegation(m3)); 2214e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2215e35fdd936d133bf8a48de140a3c666897588a05shiqian 2216e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) { 2217e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = NanSensitiveDoubleEq(2.0); 2218e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2219e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 2", DescribeNegation(m1)); 2220e35fdd936d133bf8a48de140a3c666897588a05shiqian 2221e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = NanSensitiveDoubleEq(0.5); 2222e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2223e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not approximately 0.5", DescribeNegation(m2)); 2224e35fdd936d133bf8a48de140a3c666897588a05shiqian 2225e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m3 = NanSensitiveDoubleEq(nan1_); 2226e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is NaN", Describe(m3)); 2227e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is not NaN", DescribeNegation(m3)); 2228e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2229e35fdd936d133bf8a48de140a3c666897588a05shiqian 2230e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointer) { 2231e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(Ge(0)); 2232e35fdd936d133bf8a48de140a3c666897588a05shiqian 2233e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 1; 2234e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 2235e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 2236e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 2237e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2238e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2239e35fdd936d133bf8a48de140a3c666897588a05shiqian 2240e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointerToConst) { 2241e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const double*> m = Pointee(Ge(0)); 2242e35fdd936d133bf8a48de140a3c666897588a05shiqian 2243e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 1; 2244e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&x)); 2245e35fdd936d133bf8a48de140a3c666897588a05shiqian x = -1; 2246e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&x)); 2247e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2248e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2249e35fdd936d133bf8a48de140a3c666897588a05shiqian 2250e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToConstRawPointer) { 2251e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int* const &> m = Pointee(Ge(0)); 2252e35fdd936d133bf8a48de140a3c666897588a05shiqian 2253e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 1; 2254e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 2255e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 2256e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 2257e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2258e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2259e35fdd936d133bf8a48de140a3c666897588a05shiqian 2260e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToNonConstRawPointer) { 2261e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<double* &> m = Pointee(Ge(0)); 2262e35fdd936d133bf8a48de140a3c666897588a05shiqian 2263e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 1.0; 2264e35fdd936d133bf8a48de140a3c666897588a05shiqian double* p = &x; 2265e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(p)); 2266e35fdd936d133bf8a48de140a3c666897588a05shiqian x = -1; 2267e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(p)); 2268e35fdd936d133bf8a48de140a3c666897588a05shiqian p = NULL; 2269e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(p)); 2270e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2271e35fdd936d133bf8a48de140a3c666897588a05shiqian 2272e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, NeverMatchesNull) { 2273e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m = Pointee(_); 2274e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2275e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2276e35fdd936d133bf8a48de140a3c666897588a05shiqian 2277e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that we can write Pointee(value) instead of Pointee(Eq(value)). 2278e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, MatchesAgainstAValue) { 2279e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(5); 2280e35fdd936d133bf8a48de140a3c666897588a05shiqian 2281e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 5; 2282e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 2283e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 2284e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 2285e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2286e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2287e35fdd936d133bf8a48de140a3c666897588a05shiqian 2288e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanDescribeSelf) { 2289e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(Gt(3)); 2290e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("points to a value that is greater than 3", Describe(m)); 2291e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("does not point to a value that is greater than 3", 2292e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 2293e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2294e35fdd936d133bf8a48de140a3c666897588a05shiqian 2295e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanExplainMatchResult) { 2296e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string*> m = Pointee(StartsWith("Hi")); 2297e35fdd936d133bf8a48de140a3c666897588a05shiqian 2298e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); 2299e35fdd936d133bf8a48de140a3c666897588a05shiqian 2300e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m2 = Pointee(GreaterThan(1)); 2301e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 3; 2302e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("points to a value that is 2 more than 1", Explain(m2, &n)); 2303e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2304e35fdd936d133bf8a48de140a3c666897588a05shiqian 2305e35fdd936d133bf8a48de140a3c666897588a05shiqian// An uncopyable class. 2306e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Uncopyable { 2307e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 2308e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Uncopyable(int value) : value_(value) {} 2309e35fdd936d133bf8a48de140a3c666897588a05shiqian 2310e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 2311e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 2312e35fdd936d133bf8a48de140a3c666897588a05shiqian const int value_; 2313e35fdd936d133bf8a48de140a3c666897588a05shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable); 2314e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2315e35fdd936d133bf8a48de140a3c666897588a05shiqian 2316e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff x.value() is positive. 2317e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; } 2318e35fdd936d133bf8a48de140a3c666897588a05shiqian 2319e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined struct for testing Field(). 2320e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct AStruct { 2321e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct() : x(0), y(1.0), z(5), p(NULL) {} 2322e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct(const AStruct& rhs) 2323e35fdd936d133bf8a48de140a3c666897588a05shiqian : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {} 2324e35fdd936d133bf8a48de140a3c666897588a05shiqian 2325e35fdd936d133bf8a48de140a3c666897588a05shiqian int x; // A non-const field. 2326e35fdd936d133bf8a48de140a3c666897588a05shiqian const double y; // A const field. 2327e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable z; // An uncopyable field. 2328e35fdd936d133bf8a48de140a3c666897588a05shiqian const char* p; // A pointer field. 2329e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2330e35fdd936d133bf8a48de140a3c666897588a05shiqian 2331e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived struct for testing Field(). 2332e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct DerivedStruct : public AStruct { 2333e35fdd936d133bf8a48de140a3c666897588a05shiqian char ch; 2334e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2335e35fdd936d133bf8a48de140a3c666897588a05shiqian 2336e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is non-const. 2337e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForNonConstField) { 2338e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::x, Ge(0)); 2339e35fdd936d133bf8a48de140a3c666897588a05shiqian 2340e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2341e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2342e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 2343e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2344e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2345e35fdd936d133bf8a48de140a3c666897588a05shiqian 2346e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is const. 2347e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForConstField) { 2348e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2349e35fdd936d133bf8a48de140a3c666897588a05shiqian 2350e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0)); 2351e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2352e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::y, Le(0.0)); 2353e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2354e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2355e35fdd936d133bf8a48de140a3c666897588a05shiqian 2356e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is not copyable. 2357e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForUncopyableField) { 2358e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2359e35fdd936d133bf8a48de140a3c666897588a05shiqian 2360e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive)); 2361e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2362e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::z, Not(Truly(ValueIsPositive))); 2363e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2364e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2365e35fdd936d133bf8a48de140a3c666897588a05shiqian 2366e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is a pointer. 2367e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForPointerField) { 2368e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matching against NULL. 2369e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL)); 2370e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2371e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2372e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hi"; 2373e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2374e35fdd936d133bf8a48de140a3c666897588a05shiqian 2375e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matching a pointer that is not NULL. 2376e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::p, StartsWith("hi")); 2377e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hill"; 2378e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2379e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hole"; 2380e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2381e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2382e35fdd936d133bf8a48de140a3c666897588a05shiqian 2383e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the object is passed by reference. 2384e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForByRefArgument) { 2385e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 2386e35fdd936d133bf8a48de140a3c666897588a05shiqian 2387e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2388e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2389e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 2390e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2391e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2392e35fdd936d133bf8a48de140a3c666897588a05shiqian 2393e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type 2394e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of Foo. 2395e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForArgumentOfSubType) { 2396e35fdd936d133bf8a48de140a3c666897588a05shiqian // Note that the matcher expects DerivedStruct but we say AStruct 2397e35fdd936d133bf8a48de140a3c666897588a05shiqian // inside Field(). 2398e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0)); 2399e35fdd936d133bf8a48de140a3c666897588a05shiqian 2400e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedStruct d; 2401e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(d)); 2402e35fdd936d133bf8a48de140a3c666897588a05shiqian d.x = -1; 2403e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(d)); 2404e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2405e35fdd936d133bf8a48de140a3c666897588a05shiqian 2406e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, m) works when field's type and m's 2407e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument type are compatible but not the same. 2408e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForCompatibleMatcherType) { 2409e35fdd936d133bf8a48de140a3c666897588a05shiqian // The field is an int, but the inner matcher expects a signed char. 2410e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, 2411e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<signed char>(Ge(0))); 2412e35fdd936d133bf8a48de140a3c666897588a05shiqian 2413e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2414e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2415e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 2416e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2417e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2418e35fdd936d133bf8a48de140a3c666897588a05shiqian 2419e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself. 2420e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanDescribeSelf) { 2421e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 2422e35fdd936d133bf8a48de140a3c666897588a05shiqian 2423e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is greater than or equal to 0", Describe(m)); 2424e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is not greater than or equal to 0", 2425e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 2426e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2427e35fdd936d133bf8a48de140a3c666897588a05shiqian 2428e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the match result. 2429e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanExplainMatchResult) { 2430e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 2431e35fdd936d133bf8a48de140a3c666897588a05shiqian 2432e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2433e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = 1; 2434e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, a)); 2435e35fdd936d133bf8a48de140a3c666897588a05shiqian 2436e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::x, GreaterThan(0)); 2437e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is 1 more than 0", Explain(m, a)); 2438e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2439e35fdd936d133bf8a48de140a3c666897588a05shiqian 2440e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to const. 2441e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToConst) { 2442e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 2443e35fdd936d133bf8a48de140a3c666897588a05shiqian 2444e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2445e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 2446e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 2447e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 2448e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2449e35fdd936d133bf8a48de140a3c666897588a05shiqian 2450e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to non-const. 2451e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToNonConst) { 2452e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); 2453e35fdd936d133bf8a48de140a3c666897588a05shiqian 2454e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2455e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 2456e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 2457e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 2458e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2459e35fdd936d133bf8a48de140a3c666897588a05shiqian 2460e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() does not match the NULL pointer. 2461e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, DoesNotMatchNull) { 2462e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, _); 2463e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2464e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2465e35fdd936d133bf8a48de140a3c666897588a05shiqian 2466e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type 2467e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of const Foo*. 2468e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForArgumentOfSubType) { 2469e35fdd936d133bf8a48de140a3c666897588a05shiqian // Note that the matcher expects DerivedStruct but we say AStruct 2470e35fdd936d133bf8a48de140a3c666897588a05shiqian // inside Field(). 2471e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); 2472e35fdd936d133bf8a48de140a3c666897588a05shiqian 2473e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedStruct d; 2474e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&d)); 2475e35fdd936d133bf8a48de140a3c666897588a05shiqian d.x = -1; 2476e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&d)); 2477e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2478e35fdd936d133bf8a48de140a3c666897588a05shiqian 2479e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself when used to match a pointer. 2480e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanDescribeSelf) { 2481e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 2482e35fdd936d133bf8a48de140a3c666897588a05shiqian 2483e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is greater than or equal to 0", Describe(m)); 2484e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is not greater than or equal to 0", 2485e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 2486e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2487e35fdd936d133bf8a48de140a3c666897588a05shiqian 2488e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the result of matching a pointer. 2489e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanExplainMatchResult) { 2490e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 2491e35fdd936d133bf8a48de140a3c666897588a05shiqian 2492e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 2493e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = 1; 2494e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); 2495e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, &a)); 2496e35fdd936d133bf8a48de140a3c666897588a05shiqian 2497e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::x, GreaterThan(0)); 2498e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given field is 1 more than 0", Explain(m, &a)); 2499e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2500e35fdd936d133bf8a48de140a3c666897588a05shiqian 2501e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined class for testing Property(). 2502e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AClass { 2503e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 2504e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass() : n_(0) {} 2505e35fdd936d133bf8a48de140a3c666897588a05shiqian 2506e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a non-reference. 2507e35fdd936d133bf8a48de140a3c666897588a05shiqian int n() const { return n_; } 2508e35fdd936d133bf8a48de140a3c666897588a05shiqian 2509e35fdd936d133bf8a48de140a3c666897588a05shiqian void set_n(int new_n) { n_ = new_n; } 2510e35fdd936d133bf8a48de140a3c666897588a05shiqian 2511e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a reference to const. 2512e35fdd936d133bf8a48de140a3c666897588a05shiqian const string& s() const { return s_; } 2513e35fdd936d133bf8a48de140a3c666897588a05shiqian 2514e35fdd936d133bf8a48de140a3c666897588a05shiqian void set_s(const string& new_s) { s_ = new_s; } 2515e35fdd936d133bf8a48de140a3c666897588a05shiqian 2516e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a reference to non-const. 2517e35fdd936d133bf8a48de140a3c666897588a05shiqian double& x() const { return x_; } 2518e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 2519e35fdd936d133bf8a48de140a3c666897588a05shiqian int n_; 2520e35fdd936d133bf8a48de140a3c666897588a05shiqian string s_; 2521e35fdd936d133bf8a48de140a3c666897588a05shiqian 2522e35fdd936d133bf8a48de140a3c666897588a05shiqian static double x_; 2523e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2524e35fdd936d133bf8a48de140a3c666897588a05shiqian 2525e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble AClass::x_ = 0.0; 2526e35fdd936d133bf8a48de140a3c666897588a05shiqian 2527e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived class for testing Property(). 2528e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DerivedClass : public AClass { 2529e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 2530e35fdd936d133bf8a48de140a3c666897588a05shiqian int k_; 2531e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2532e35fdd936d133bf8a48de140a3c666897588a05shiqian 2533e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 2534e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference. 2535e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForNonReferenceProperty) { 2536e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 2537e35fdd936d133bf8a48de140a3c666897588a05shiqian 2538e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2539e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 2540e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2541e35fdd936d133bf8a48de140a3c666897588a05shiqian 2542e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 2543e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2544e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2545e35fdd936d133bf8a48de140a3c666897588a05shiqian 2546e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 2547e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const. 2548e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToConstProperty) { 2549e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi")); 2550e35fdd936d133bf8a48de140a3c666897588a05shiqian 2551e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2552e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 2553e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2554e35fdd936d133bf8a48de140a3c666897588a05shiqian 2555e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 2556e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2557e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2558e35fdd936d133bf8a48de140a3c666897588a05shiqian 2559e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 2560e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const. 2561e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToNonConstProperty) { 2562e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 0.0; 2563e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2564e35fdd936d133bf8a48de140a3c666897588a05shiqian 2565e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::x, Ref(x)); 2566e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2567e35fdd936d133bf8a48de140a3c666897588a05shiqian 2568e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::x, Not(Ref(x))); 2569e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2570e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2571e35fdd936d133bf8a48de140a3c666897588a05shiqian 2572e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument is 2573e35fdd936d133bf8a48de140a3c666897588a05shiqian// passed by value. 2574e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForByValueArgument) { 2575e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AClass> m = Property(&AClass::s, StartsWith("hi")); 2576e35fdd936d133bf8a48de140a3c666897588a05shiqian 2577e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2578e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 2579e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2580e35fdd936d133bf8a48de140a3c666897588a05shiqian 2581e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 2582e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2583e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2584e35fdd936d133bf8a48de140a3c666897588a05shiqian 2585e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's 2586e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of Foo. 2587e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForArgumentOfSubType) { 2588e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher expects a DerivedClass, but inside the Property() we 2589e35fdd936d133bf8a48de140a3c666897588a05shiqian // say AClass. 2590e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0)); 2591e35fdd936d133bf8a48de140a3c666897588a05shiqian 2592e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedClass d; 2593e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(1); 2594e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(d)); 2595e35fdd936d133bf8a48de140a3c666897588a05shiqian 2596e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(-1); 2597e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(d)); 2598e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2599e35fdd936d133bf8a48de140a3c666897588a05shiqian 2600e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, m) works when property()'s type 2601e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m's argument type are compatible but different. 2602e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForCompatibleMatcherType) { 2603e35fdd936d133bf8a48de140a3c666897588a05shiqian // n() returns an int but the inner matcher expects a signed char. 2604e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, 2605e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<signed char>(Ge(0))); 2606e35fdd936d133bf8a48de140a3c666897588a05shiqian 2607e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2608e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 2609e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 2610e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 2611e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2612e35fdd936d133bf8a48de140a3c666897588a05shiqian 2613e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself. 2614e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanDescribeSelf) { 2615e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 2616e35fdd936d133bf8a48de140a3c666897588a05shiqian 2617e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is greater than or equal to 0", Describe(m)); 2618e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is not greater than or equal to 0", 2619e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 2620e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2621e35fdd936d133bf8a48de140a3c666897588a05shiqian 2622e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the match result. 2623e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanExplainMatchResult) { 2624e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 2625e35fdd936d133bf8a48de140a3c666897588a05shiqian 2626e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2627e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 2628e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, a)); 2629e35fdd936d133bf8a48de140a3c666897588a05shiqian 2630e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::n, GreaterThan(0)); 2631e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is 1 more than 0", Explain(m, a)); 2632e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2633e35fdd936d133bf8a48de140a3c666897588a05shiqian 2634e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to const. 2635e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToConst) { 2636e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 2637e35fdd936d133bf8a48de140a3c666897588a05shiqian 2638e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2639e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 2640e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 2641e35fdd936d133bf8a48de140a3c666897588a05shiqian 2642e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 2643e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 2644e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2645e35fdd936d133bf8a48de140a3c666897588a05shiqian 2646e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to non-const. 2647e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToNonConst) { 2648e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); 2649e35fdd936d133bf8a48de140a3c666897588a05shiqian 2650e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2651e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 2652e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 2653e35fdd936d133bf8a48de140a3c666897588a05shiqian 2654e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 2655e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 2656e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2657e35fdd936d133bf8a48de140a3c666897588a05shiqian 2658e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() does not match the NULL pointer. 2659e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { 2660e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::x, _); 2661e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 2662e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2663e35fdd936d133bf8a48de140a3c666897588a05shiqian 2664e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's 2665e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of const Foo*. 2666e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForArgumentOfSubType) { 2667e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher expects a DerivedClass, but inside the Property() we 2668e35fdd936d133bf8a48de140a3c666897588a05shiqian // say AClass. 2669e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); 2670e35fdd936d133bf8a48de140a3c666897588a05shiqian 2671e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedClass d; 2672e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(1); 2673e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&d)); 2674e35fdd936d133bf8a48de140a3c666897588a05shiqian 2675e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(-1); 2676e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&d)); 2677e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2678e35fdd936d133bf8a48de140a3c666897588a05shiqian 2679e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself when used to match a pointer. 2680e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanDescribeSelf) { 2681e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 2682e35fdd936d133bf8a48de140a3c666897588a05shiqian 2683e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is greater than or equal to 0", Describe(m)); 2684e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is not greater than or equal to 0", 2685e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 2686e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2687e35fdd936d133bf8a48de140a3c666897588a05shiqian 2688e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the result of matching a pointer. 2689e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanExplainMatchResult) { 2690e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 2691e35fdd936d133bf8a48de140a3c666897588a05shiqian 2692e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 2693e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 2694e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); 2695e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, &a)); 2696e35fdd936d133bf8a48de140a3c666897588a05shiqian 2697e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::n, GreaterThan(0)); 2698e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("the given property is 1 more than 0", Explain(m, &a)); 2699e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2700e35fdd936d133bf8a48de140a3c666897588a05shiqian 2701e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ResultOf. 2702e35fdd936d133bf8a48de140a3c666897588a05shiqian 2703e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 2704e35fdd936d133bf8a48de140a3c666897588a05shiqian// function pointer. 2705e35fdd936d133bf8a48de140a3c666897588a05shiqianstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } 2706e35fdd936d133bf8a48de140a3c666897588a05shiqian 2707e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionPointers) { 2708e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); 2709e35fdd936d133bf8a48de140a3c666897588a05shiqian 2710e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 2711e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 2712e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2713e35fdd936d133bf8a48de140a3c666897588a05shiqian 2714e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can describe itself. 2715e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanDescribeItself) { 2716e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); 2717e35fdd936d133bf8a48de140a3c666897588a05shiqian 2718e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("result of the given callable is equal to \"foo\"", 2719e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(matcher)); 2720e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("result of the given callable is not equal to \"foo\"", 2721e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(matcher)); 2722e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2723e35fdd936d133bf8a48de140a3c666897588a05shiqian 2724e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can explain the match result. 2725e35fdd936d133bf8a48de140a3c666897588a05shiqianint IntFunction(int input) { return input == 42 ? 80 : 90; } 2726e35fdd936d133bf8a48de140a3c666897588a05shiqian 2727e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanExplainMatchResult) { 2728e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); 2729e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(matcher, 36)); 2730e35fdd936d133bf8a48de140a3c666897588a05shiqian 2731e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher = ResultOf(&IntFunction, GreaterThan(85)); 2732e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("result of the given callable is 5 more than 85", 2733e35fdd936d133bf8a48de140a3c666897588a05shiqian Explain(matcher, 36)); 2734e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2735e35fdd936d133bf8a48de140a3c666897588a05shiqian 2736e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 2737e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference. 2738e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForNonReferenceResults) { 2739e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); 2740e35fdd936d133bf8a48de140a3c666897588a05shiqian 2741e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(42)); 2742e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(36)); 2743e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2744e35fdd936d133bf8a48de140a3c666897588a05shiqian 2745e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 2746e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const. 2747e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble& DoubleFunction(double& input) { return input; } 2748e35fdd936d133bf8a48de140a3c666897588a05shiqian 2749e35fdd936d133bf8a48de140a3c666897588a05shiqianUncopyable& RefUncopyableFunction(Uncopyable& obj) { 2750e35fdd936d133bf8a48de140a3c666897588a05shiqian return obj; 2751e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2752e35fdd936d133bf8a48de140a3c666897588a05shiqian 2753e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToNonConstResults) { 2754e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 3.14; 2755e35fdd936d133bf8a48de140a3c666897588a05shiqian double x2 = x; 2756e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x)); 2757e35fdd936d133bf8a48de140a3c666897588a05shiqian 2758e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(x)); 2759e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(x2)); 2760e35fdd936d133bf8a48de140a3c666897588a05shiqian 2761e35fdd936d133bf8a48de140a3c666897588a05shiqian // Test that ResultOf works with uncopyable objects 2762e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable obj(0); 2763e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable obj2(0); 2764e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<Uncopyable&> matcher2 = 2765e35fdd936d133bf8a48de140a3c666897588a05shiqian ResultOf(&RefUncopyableFunction, Ref(obj)); 2766e35fdd936d133bf8a48de140a3c666897588a05shiqian 2767e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher2.Matches(obj)); 2768e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher2.Matches(obj2)); 2769e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2770e35fdd936d133bf8a48de140a3c666897588a05shiqian 2771e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 2772e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const. 2773e35fdd936d133bf8a48de140a3c666897588a05shiqianconst string& StringFunction(const string& input) { return input; } 2774e35fdd936d133bf8a48de140a3c666897588a05shiqian 2775e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToConstResults) { 2776e35fdd936d133bf8a48de140a3c666897588a05shiqian string s = "foo"; 2777e35fdd936d133bf8a48de140a3c666897588a05shiqian string s2 = s; 2778e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s)); 2779e35fdd936d133bf8a48de140a3c666897588a05shiqian 2780e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(s)); 2781e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(s2)); 2782e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2783e35fdd936d133bf8a48de140a3c666897588a05shiqian 2784e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, m) works when f(x) and m's 2785e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument types are compatible but different. 2786e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForCompatibleMatcherTypes) { 2787e35fdd936d133bf8a48de140a3c666897588a05shiqian // IntFunction() returns int but the inner matcher expects a signed char. 2788e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85))); 2789e35fdd936d133bf8a48de140a3c666897588a05shiqian 2790e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(36)); 2791e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(42)); 2792e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2793e35fdd936d133bf8a48de140a3c666897588a05shiqian 2794e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that the program aborts when ResultOf is passed 2795e35fdd936d133bf8a48de140a3c666897588a05shiqian// a NULL function pointer. 2796e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) { 279704d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED( 2798e35fdd936d133bf8a48de140a3c666897588a05shiqian ResultOf(static_cast<string(*)(int)>(NULL), Eq(string("foo"))), 2799e35fdd936d133bf8a48de140a3c666897588a05shiqian "NULL function pointer is passed into ResultOf\\(\\)\\."); 2800e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2801e35fdd936d133bf8a48de140a3c666897588a05shiqian 2802e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 2803e35fdd936d133bf8a48de140a3c666897588a05shiqian// function reference. 2804e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionReferences) { 2805e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo")); 2806e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 2807e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 2808e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2809e35fdd936d133bf8a48de140a3c666897588a05shiqian 2810e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 2811e35fdd936d133bf8a48de140a3c666897588a05shiqian// function object. 2812e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Functor : public ::std::unary_function<int, string> { 2813e35fdd936d133bf8a48de140a3c666897588a05shiqian result_type operator()(argument_type input) const { 2814e35fdd936d133bf8a48de140a3c666897588a05shiqian return IntToStringFunction(input); 2815e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2816e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2817e35fdd936d133bf8a48de140a3c666897588a05shiqian 2818e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctors) { 2819e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo"))); 2820e35fdd936d133bf8a48de140a3c666897588a05shiqian 2821e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 2822e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 2823e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2824e35fdd936d133bf8a48de140a3c666897588a05shiqian 2825e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 2826e35fdd936d133bf8a48de140a3c666897588a05shiqian// functor with more then one operator() defined. ResultOf() must work 2827e35fdd936d133bf8a48de140a3c666897588a05shiqian// for each defined operator(). 2828e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct PolymorphicFunctor { 2829e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef int result_type; 2830e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(int n) { return n; } 2831e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(const char* s) { return static_cast<int>(strlen(s)); } 2832e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2833e35fdd936d133bf8a48de140a3c666897588a05shiqian 2834e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForPolymorphicFunctors) { 2835e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5)); 2836e35fdd936d133bf8a48de140a3c666897588a05shiqian 2837e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher_int.Matches(10)); 2838e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher_int.Matches(2)); 2839e35fdd936d133bf8a48de140a3c666897588a05shiqian 2840e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5)); 2841e35fdd936d133bf8a48de140a3c666897588a05shiqian 2842e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher_string.Matches("long string")); 2843e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher_string.Matches("shrt")); 2844e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2845e35fdd936d133bf8a48de140a3c666897588a05shiqian 2846e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int* ReferencingFunction(const int& n) { return &n; } 2847e35fdd936d133bf8a48de140a3c666897588a05shiqian 2848e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct ReferencingFunctor { 2849e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef const int* result_type; 2850e35fdd936d133bf8a48de140a3c666897588a05shiqian result_type operator()(const int& n) { return &n; } 2851e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2852e35fdd936d133bf8a48de140a3c666897588a05shiqian 2853e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferencingCallables) { 2854e35fdd936d133bf8a48de140a3c666897588a05shiqian const int n = 1; 2855e35fdd936d133bf8a48de140a3c666897588a05shiqian const int n2 = 1; 2856e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n)); 2857e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher2.Matches(n)); 2858e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher2.Matches(n2)); 2859e35fdd936d133bf8a48de140a3c666897588a05shiqian 2860e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); 2861e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher3.Matches(n)); 2862e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher3.Matches(n2)); 2863e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2864e35fdd936d133bf8a48de140a3c666897588a05shiqian 2865e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DivisibleByImpl { 2866e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 2867e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit DivisibleByImpl(int divider) : divider_(divider) {} 2868e35fdd936d133bf8a48de140a3c666897588a05shiqian 2869e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 2870e35fdd936d133bf8a48de140a3c666897588a05shiqian bool Matches(const T& n) const { 2871e35fdd936d133bf8a48de140a3c666897588a05shiqian return (n % divider_) == 0; 2872e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2873e35fdd936d133bf8a48de140a3c666897588a05shiqian 2874e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 2875e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is divisible by " << divider_; 2876e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2877e35fdd936d133bf8a48de140a3c666897588a05shiqian 2878e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 2879e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is not divisible by " << divider_; 2880e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2881e35fdd936d133bf8a48de140a3c666897588a05shiqian 28822b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan void set_divider(int divider) { divider_ = divider; } 2883e35fdd936d133bf8a48de140a3c666897588a05shiqian int divider() const { return divider_; } 28842b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 2885e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 28862b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan int divider_; 2887e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2888e35fdd936d133bf8a48de140a3c666897588a05shiqian 2889e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing using ExplainMatchResultTo() with polymorphic matchers. 2890e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2891e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ExplainMatchResultTo(const DivisibleByImpl& impl, const T& n, 2892e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::ostream* os) { 2893e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is " << (n % impl.divider()) << " modulo " 2894e35fdd936d133bf8a48de140a3c666897588a05shiqian << impl.divider(); 2895e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2896e35fdd936d133bf8a48de140a3c666897588a05shiqian 2897e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { 2898e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(DivisibleByImpl(n)); 2899e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2900e35fdd936d133bf8a48de140a3c666897588a05shiqian 2901e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 2902e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 2903e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_False) { 2904e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 2905e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is 1 modulo 4", Explain(m, 5)); 2906e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2907e35fdd936d133bf8a48de140a3c666897588a05shiqian 2908e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 2909e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 2910e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_True) { 2911e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 2912e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is 2 modulo 4", Explain(m, 6)); 2913e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2914e35fdd936d133bf8a48de140a3c666897588a05shiqian 2915e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 2916e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 2917e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_False) { 2918e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3)); 2919e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is 2 modulo 3", Explain(m, 5)); 2920e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2921e35fdd936d133bf8a48de140a3c666897588a05shiqian 2922e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() succeeds, all matchers are asked to explain 2923e35fdd936d133bf8a48de140a3c666897588a05shiqian// why. 2924e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True) { 2925e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3)); 2926e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is 0 modulo 2; is 0 modulo 3", Explain(m, 6)); 2927e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2928e35fdd936d133bf8a48de140a3c666897588a05shiqian 2929e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True_2) { 2930e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(Ge(2), Le(3)); 2931e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, 2)); 2932e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2933e35fdd936d133bf8a48de140a3c666897588a05shiqian 2934e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainmatcherResultTest, MonomorphicMatcher) { 2935e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = GreaterThan(5); 2936e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is 1 more than 5", Explain(m, 6)); 2937e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2938e35fdd936d133bf8a48de140a3c666897588a05shiqian 2939e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two tests verify that values without a public copy 2940e35fdd936d133bf8a48de140a3c666897588a05shiqian// ctor can be used as arguments to matchers like Eq(), Ge(), and etc 2941e35fdd936d133bf8a48de140a3c666897588a05shiqian// with the help of ByRef(). 2942e35fdd936d133bf8a48de140a3c666897588a05shiqian 2943e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotCopyable { 2944e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 2945e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit NotCopyable(int value) : value_(value) {} 2946e35fdd936d133bf8a48de140a3c666897588a05shiqian 2947e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 2948e35fdd936d133bf8a48de140a3c666897588a05shiqian 2949e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator==(const NotCopyable& rhs) const { 2950e35fdd936d133bf8a48de140a3c666897588a05shiqian return value() == rhs.value(); 2951e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2952e35fdd936d133bf8a48de140a3c666897588a05shiqian 2953e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator>=(const NotCopyable& rhs) const { 2954e35fdd936d133bf8a48de140a3c666897588a05shiqian return value() >= rhs.value(); 2955e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2956e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 2957e35fdd936d133bf8a48de140a3c666897588a05shiqian int value_; 2958e35fdd936d133bf8a48de140a3c666897588a05shiqian 2959e35fdd936d133bf8a48de140a3c666897588a05shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable); 2960e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2961e35fdd936d133bf8a48de140a3c666897588a05shiqian 2962e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) { 2963e35fdd936d133bf8a48de140a3c666897588a05shiqian const NotCopyable const_value1(1); 2964e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1)); 2965e35fdd936d133bf8a48de140a3c666897588a05shiqian 2966e35fdd936d133bf8a48de140a3c666897588a05shiqian const NotCopyable n1(1), n2(2); 2967e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(n1)); 2968e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n2)); 2969e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2970e35fdd936d133bf8a48de140a3c666897588a05shiqian 2971e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableValueInMatchers) { 2972e35fdd936d133bf8a48de140a3c666897588a05shiqian NotCopyable value2(2); 2973e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<NotCopyable&> m = Ge(ByRef(value2)); 2974e35fdd936d133bf8a48de140a3c666897588a05shiqian 2975e35fdd936d133bf8a48de140a3c666897588a05shiqian NotCopyable n1(1), n2(2); 2976e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n1)); 2977e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(n2)); 2978e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2979e35fdd936d133bf8a48de140a3c666897588a05shiqian 29802b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#if GTEST_HAS_TYPED_TEST 29816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests ContainerEq with different container types, and 29826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// different element types. 29836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 29846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename T> 2985b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainerEqTest : public testing::Test {}; 29866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 29876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantypedef testing::Types< 29886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::set<int>, 29896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::vector<size_t>, 29906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::multiset<size_t>, 29916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::list<int> > 29926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan ContainerEqTestTypes; 29936a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 29946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes); 29956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 29966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that the filled container is equal to itself. 29976a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, EqualsSelf) { 29986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 29996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 30006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 30016a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_set)); 30026a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, my_set)); 30036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that missing values are reported. 30066a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueMissing) { 30076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {2, 1, 8, 5}; 30096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 30106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 4); 30116a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 30126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Not in actual: 3", Explain(m, test_set)); 30146a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30156a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30166a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported. 30176a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAdded) { 30186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8, 46}; 30206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 30216a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 6); 30226a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const TypeParam&> m = ContainerEq(my_set); 30236a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30246a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Only in actual: 46", Explain(m, test_set)); 30256a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30266a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30276a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together. 30286a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) { 30296a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30306a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 8, 46}; 30316a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 30326a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 5); 30336a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 30346a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30356a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Only in actual: 46; not in actual: 5", Explain(m, test_set)); 30366a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30376a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30386a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests duplicated value -- expect no explanation. 30396a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, DuplicateDifference) { 30406a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8}; 30426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 30436a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 5); 30446a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const TypeParam&> m = ContainerEq(my_set); 30456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // Depending on the container, match may be true or false 30466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // But in any case there should be no explanation. 30476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, test_set)); 30486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30492b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#endif // GTEST_HAS_TYPED_TEST 30506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30516a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that mutliple missing values are reported. 30526a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble. 30536a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesMissing) { 30546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30556a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {2, 1, 5}; 30566a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::vector<int> my_set(vals, vals + 6); 30576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::vector<int> test_set(test_vals, test_vals + 3); 30586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<std::vector<int> > m = ContainerEq(my_set); 30596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Not in actual: 3, 8", Explain(m, test_set)); 30616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30636a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported. 30646a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble. 30656a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAdded) { 30666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30676a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46}; 30686a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::list<size_t> my_set(vals, vals + 6); 30696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::list<size_t> test_set(test_vals, test_vals + 7); 30706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const std::list<size_t>&> m = ContainerEq(my_set); 30716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Only in actual: 92, 46", Explain(m, test_set)); 30736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together. 30766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) { 30776a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 92, 46}; 30796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::list<size_t> my_set(vals, vals + 6); 30806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::list<size_t> test_set(test_vals, test_vals + 5); 30816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const std::list<size_t> > m = ContainerEq(my_set); 30826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Only in actual: 92, 46; not in actual: 5, 8", 30846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan Explain(m, test_set)); 30856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 30866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 30876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests to see that duplicate elements are detected, 30886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// but (as above) not reported in the explanation. 30896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) { 30906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 30916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8}; 30926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::vector<int> my_set(vals, vals + 6); 30936a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::vector<int> test_set(test_vals, test_vals + 5); 30946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<std::vector<int> > m = ContainerEq(my_set); 30956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_set)); 30966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 30976a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // There is nothing to report when both sets contain all the same values. 30986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, test_set)); 30996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 31006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 31016a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that ContainerEq works for non-trivial associative containers, 31026a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// like maps. 31036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, WorksForMaps) { 31046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::map<int, std::string> my_map; 31056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan my_map[0] = "a"; 31066a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan my_map[1] = "b"; 31076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 31086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan std::map<int, std::string> test_map; 31096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan test_map[0] = "aa"; 31106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan test_map[1] = "b"; 31116a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 31126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const std::map<int, std::string>&> m = ContainerEq(my_map); 31136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_map)); 31146a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_map)); 31156a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 31166a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("Only in actual: (0, \"aa\"); not in actual: (0, \"a\")", 31176a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan Explain(m, test_map)); 31186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 31196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 3120b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArray) { 3121b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan int a1[] = { 1, 2, 3 }; 3122b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan int a2[] = { 1, 2, 3 }; 3123b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan int b[] = { 1, 2, 4 }; 3124b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3125b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ContainerEq(a2)); 3126b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, Not(ContainerEq(b))); 3127b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3128b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3129b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) { 3130b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const char a1[][3] = { "hi", "lo" }; 3131b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const char a2[][3] = { "hi", "lo" }; 3132b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const char b[][3] = { "lo", "hi" }; 3133b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3134b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Tests using ContainerEq() in the first dimension. 3135b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ContainerEq(a2)); 3136b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, Not(ContainerEq(b))); 3137b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3138b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Tests using ContainerEq() in the second dimension. 3139b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1]))); 3140b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1]))); 3141b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3142b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3143b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) { 3144b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const int a1[] = { 1, 2, 3 }; 3145b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const int a2[] = { 1, 2, 3 }; 3146b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const int b[] = { 1, 2, 3, 4 }; 3147b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 31482661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan const int* const p1 = a1; 31492661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2)); 31502661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b))); 3151b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3152b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const int c[] = { 1, 3, 2 }; 31532661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c))); 3154b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3155b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3156b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) { 3157b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan std::string a1[][3] = { 3158b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan { "hi", "hello", "ciao" }, 3159b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan { "bye", "see you", "ciao" } 3160b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan }; 3161b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3162b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan std::string a2[][3] = { 3163b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan { "hi", "hello", "ciao" }, 3164b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan { "bye", "see you", "ciao" } 3165b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan }; 3166b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3167b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2); 3168b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, m); 3169b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3170b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan a2[0][0] = "ha"; 3171b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, m); 3172b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3173b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 31744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests GetParamIndex(). 31754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 31764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, WorksForEmptyParamList) { 31774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { NULL }; 31784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(kTupleInterpolation, GetParamIndex(params, "*")); 31794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(kInvalidInterpolation, GetParamIndex(params, "a")); 31804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 31814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 31824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RecognizesStar) { 31834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "a", "b", NULL }; 31844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(kTupleInterpolation, GetParamIndex(params, "*")); 31854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 31864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 31874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RecognizesKnownParam) { 31884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", NULL }; 31894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(0, GetParamIndex(params, "foo")); 31904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(1, GetParamIndex(params, "bar")); 31914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 31924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 31934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RejectsUnknownParam) { 31944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", NULL }; 31954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(kInvalidInterpolation, GetParamIndex(params, "foobar")); 31964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 31974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 31984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests SkipPrefix(). 31994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(SkipPrefixTest, SkipsWhenPrefixMatches) { 32014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const str = "hello"; 32024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* p = str; 32044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_TRUE(SkipPrefix("", &p)); 32054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(str, p); 32064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan p = str; 32084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_TRUE(SkipPrefix("hell", &p)); 32094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(str + 4, p); 32104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) { 32134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const str = "world"; 32144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* p = str; 32164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_FALSE(SkipPrefix("W", &p)); 32174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(str, p); 32184a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan p = str; 32204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_FALSE(SkipPrefix("world!", &p)); 32214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ(str, p); 32224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescriptionSyntaxError(). 32254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionSyntaxErrorTest, FormatsCorrectly) { 32264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const description = "hello%world"; 32274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("Syntax error at index 5 in matcher description \"hello%world\": ", 32284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescriptionSyntaxError(description, description + 5)); 32294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests ValidateMatcherDescription(). 32324a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32334a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsEmptyDescription) { 32344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", NULL }; 32354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, ""), 32364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 32374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, 32404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan AcceptsNonEmptyDescriptionWithNoInterpolation) { 32414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", NULL }; 32424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, "a simple description"), 32434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 32444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// We use MATCHER_P3() to define a matcher for testing 32474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// ValidateMatcherDescription(); otherwise we'll end up with much 32484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// plumbing code. This is not circular as 32494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// ValidateMatcherDescription() doesn't affect whether the matcher 32504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// matches a value or not. 32514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanMATCHER_P3(EqInterpolation, start, end, index, "equals Interpolation%(*)s") { 32524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan return arg.start_pos == start && arg.end_pos == end && 32534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan arg.param_index == index; 32544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsPercentInterpolation) { 32574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", NULL }; 32584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "one %%"; 32594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, desc), 32604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre(EqInterpolation(desc + 4, desc + 6, 32614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan kPercentInterpolation))); 32624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsTupleInterpolation) { 32654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", "baz", NULL }; 32664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "%(*)s after"; 32674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, desc), 32684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre(EqInterpolation(desc, desc + 5, 32694a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan kTupleInterpolation))); 32704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32724a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsParamInterpolation) { 32734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", "baz", NULL }; 32744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "a %(bar)s."; 32754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, desc), 32764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre(EqInterpolation(desc + 2, desc + 9, 1))); 32774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsMultiplenterpolations) { 32804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", "baz", NULL }; 32814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "%(baz)s %(foo)s %(bar)s"; 32824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, desc), 32834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre(EqInterpolation(desc, desc + 7, 2), 32844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EqInterpolation(desc + 8, desc + 15, 0), 32854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EqInterpolation(desc + 16, desc + 23, 1))); 32864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsRepeatedParams) { 32894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "foo", "bar", NULL }; 32904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "%(foo)s and %(foo)s"; 32914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, desc), 32924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre(EqInterpolation(desc, desc + 7, 0), 32934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EqInterpolation(desc + 12, desc + 19, 0))); 32944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 32954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 32964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsUnknownParam) { 32974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "a", "bar", NULL }; 32984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_NONFATAL_FAILURE({ 32994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, "%(foo)s"), 33004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 33014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }, "Syntax error at index 2 in matcher description \"%(foo)s\": " 33024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan "\"foo\" is an invalid parameter name."); 33034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsUnfinishedParam) { 33064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "a", "bar", NULL }; 33074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_NONFATAL_FAILURE({ 33084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, "%(foo)"), 33094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 33104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }, "Syntax error at index 0 in matcher description \"%(foo)\": " 33114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan "an interpolation must end with \")s\", but \"%(foo)\" does not."); 33124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_NONFATAL_FAILURE({ 33144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, "x%(a"), 33154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 33164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }, "Syntax error at index 1 in matcher description \"x%(a\": " 33174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan "an interpolation must end with \")s\", but \"%(a\" does not."); 33184a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsSinglePercent) { 33214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "a", NULL }; 33224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_NONFATAL_FAILURE({ 33234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_THAT(ValidateMatcherDescription(params, "a %."), 33244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan ElementsAre()); 33254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }, "Syntax error at index 2 in matcher description \"a %.\": " 33264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan "use \"%%\" instead of \"%\" to print \"%\"."); 33274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests JoinAsTuple(). 33314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33324a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsEmptyTuple) { 33334a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("", JoinAsTuple(Strings())); 33344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsOneTuple) { 33374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* fields[] = { "1" }; 33384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1))); 33394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTwoTuple) { 33424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* fields[] = { "1", "a" }; 33434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2))); 33444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTenTuple) { 33474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* fields[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; 33484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", 33494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan JoinAsTuple(Strings(fields, fields + 10))); 33504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescription(). 33534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) { 33554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is even", 33564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("IsEven", "", Interpolations(), 33574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings())); 33584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5" }; 33604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("equals 5", 33614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Equals", "", Interpolations(), 33624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 33634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params2[] = { "5", "8" }; 33654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is in range (5, 8)", 33664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("IsInRange", "", Interpolations(), 33674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params2, params2 + 2))); 33684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33694a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForDescriptionWithNoInterpolation) { 33714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is positive", 33724a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Gt0", "is positive", Interpolations(), 33734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings())); 33744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5", "6" }; 33764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is negative", 33774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Lt0", "is negative", Interpolations(), 33784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 2))); 33794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 33824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionStartsWithInterpolation) { 33834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5" }; 33844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "%(num)s times bigger"; 33854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { Interpolation(desc, desc + 7, 0) }; 33864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("5 times bigger", 33874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 33884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 1), 33894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 33904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 33914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 33924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 33934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionEndsWithInterpolation) { 33944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5", "6" }; 33954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "is bigger than %(y)s"; 33964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { Interpolation(desc + 15, desc + 20, 1) }; 33974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is bigger than 6", 33984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 33994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 1), 34004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 2))); 34014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 34044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionStartsAndEndsWithInterpolation) { 34054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5", "6" }; 34064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "%(x)s <= arg <= %(y)s"; 34074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { 34084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc, desc + 5, 0), 34094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 16, desc + 21, 1) 34104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }; 34114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("5 <= arg <= 6", 34124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 34134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 2), 34144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 2))); 34154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 34184a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionDoesNotStartOrEndWithInterpolation) { 34194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5.2" }; 34204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "has %(x)s cents"; 34214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { Interpolation(desc + 4, desc + 9, 0) }; 34224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("has 5.2 cents", 34234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 34244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 1), 34254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 34264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 34294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionContainsMultipleInterpolations) { 34304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "5", "6" }; 34314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "in %(*)s or [%(x)s, %(y)s]"; 34324a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { 34334a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 3, desc + 8, kTupleInterpolation), 34344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 13, desc + 18, 0), 34354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 20, desc + 25, 1) 34364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }; 34374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("in (5, 6) or [5, 6]", 34384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 34394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 3), 34404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 2))); 34414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 34444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksWhenDescriptionContainsRepeatedParams) { 34454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "9" }; 34464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "in [-%(x)s, %(x)s]"; 34474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { 34484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 5, desc + 10, 0), 34494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolation(desc + 12, desc + 17, 0) 34504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan }; 34514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("in [-9, 9]", 34524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 34534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 2), 34544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 34554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, 34584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan WorksForDescriptionWithInvalidInterpolation) { 34594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* params[] = { "9" }; 34604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const char* const desc = "> %(x)s %(x)"; 34614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan const Interpolation interp[] = { Interpolation(desc + 2, desc + 7, 0) }; 34624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("> 9 %(x)", 34634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan FormatMatcherDescription("Foo", desc, 34644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Interpolations(interp, interp + 1), 34654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 34664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 34674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 34682b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::mutable_impl(). 34692b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessMutableImpl) { 34702b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 34712b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan DivisibleByImpl& impl = m.mutable_impl(); 34722b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(42, impl.divider()); 34732b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 34742b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan impl.set_divider(0); 34752b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(0, m.mutable_impl().divider()); 34762b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan} 34772b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 34782b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::impl(). 34792b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessImpl) { 34802b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 34812b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const DivisibleByImpl& impl = m.impl(); 34822b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(42, impl.divider()); 34832b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan} 34842b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 3485e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace gmock_matchers_test 3486e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 3487