HELLO·Android
系统源代码
IT资讯
技术文章
我的收藏
注册
登录
-
我收藏的文章
创建代码块
我的代码块
我的账号
Android 10
|
10.0.0_r6
下载
查看原文件
收藏
根目录
external
google-breakpad
src
testing
test
gmock-matchers_test.cc
// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Mock - a framework for writing C++ mock classes. // // This file tests some commonly used argument matchers. #include "gmock/gmock-matchers.h" #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "gmock/gmock.h" #include "gtest/gtest.h" #include "gtest/gtest-spi.h" namespace testing { namespace internal { GTEST_API_ string JoinAsTuple(const Strings& fields); } // namespace internal namespace gmock_matchers_test { using std::greater; using std::less; using std::list; using std::make_pair; using std::map; using std::multimap; using std::multiset; using std::ostream; using std::pair; using std::set; using std::stringstream; using std::tr1::get; using std::tr1::make_tuple; using std::tr1::tuple; using std::vector; using testing::A; using testing::AllArgs; using testing::AllOf; using testing::An; using testing::AnyOf; using testing::ByRef; using testing::ContainsRegex; using testing::DoubleEq; using testing::EndsWith; using testing::Eq; using testing::ExplainMatchResult; using testing::Field; using testing::FloatEq; using testing::Ge; using testing::Gt; using testing::HasSubstr; using testing::IsNull; using testing::Key; using testing::Le; using testing::Lt; using testing::MakeMatcher; using testing::MakePolymorphicMatcher; using testing::MatchResultListener; using testing::Matcher; using testing::MatcherCast; using testing::MatcherInterface; using testing::Matches; using testing::MatchesRegex; using testing::NanSensitiveDoubleEq; using testing::NanSensitiveFloatEq; using testing::Ne; using testing::Not; using testing::NotNull; using testing::Pair; using testing::Pointee; using testing::Pointwise; using testing::PolymorphicMatcher; using testing::Property; using testing::Ref; using testing::ResultOf; using testing::StartsWith; using testing::StrCaseEq; using testing::StrCaseNe; using testing::StrEq; using testing::StrNe; using testing::Truly; using testing::TypedEq; using testing::Value; using testing::WhenSorted; using testing::WhenSortedBy; using testing::_; using testing::internal::DummyMatchResultListener; using testing::internal::ExplainMatchFailureTupleTo; using testing::internal::FloatingEqMatcher; using testing::internal::FormatMatcherDescription; using testing::internal::IsReadableTypeName; using testing::internal::JoinAsTuple; using testing::internal::RE; using testing::internal::StreamMatchResultListener; using testing::internal::String; using testing::internal::StringMatchResultListener; using testing::internal::Strings; using testing::internal::linked_ptr; using testing::internal::scoped_ptr; using testing::internal::string; // For testing ExplainMatchResultTo(). class GreaterThanMatcher : public MatcherInterface
{ public: explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} virtual void DescribeTo(ostream* os) const { *os << "is > " << rhs_; } virtual bool MatchAndExplain(int lhs, MatchResultListener* listener) const { const int diff = lhs - rhs_; if (diff > 0) { *listener << "which is " << diff << " more than " << rhs_; } else if (diff == 0) { *listener << "which is the same as " << rhs_; } else { *listener << "which is " << -diff << " less than " << rhs_; } return lhs > rhs_; } private: int rhs_; }; Matcher
GreaterThan(int n) { return MakeMatcher(new GreaterThanMatcher(n)); } string OfType(const string& type_name) { #if GTEST_HAS_RTTI return " (of type " + type_name + ")"; #else return ""; #endif } // Returns the description of the given matcher. template
string Describe(const Matcher
& m) { stringstream ss; m.DescribeTo(&ss); return ss.str(); } // Returns the description of the negation of the given matcher. template
string DescribeNegation(const Matcher
& m) { stringstream ss; m.DescribeNegationTo(&ss); return ss.str(); } // Returns the reason why x matches, or doesn't match, m. template
string Explain(const MatcherType& m, const Value& x) { StringMatchResultListener listener; ExplainMatchResult(m, x, &listener); return listener.str(); } TEST(MatchResultListenerTest, StreamingWorks) { StringMatchResultListener listener; listener << "hi" << 5; EXPECT_EQ("hi5", listener.str()); // Streaming shouldn't crash when the underlying ostream is NULL. DummyMatchResultListener dummy; dummy << "hi" << 5; } TEST(MatchResultListenerTest, CanAccessUnderlyingStream) { EXPECT_TRUE(DummyMatchResultListener().stream() == NULL); EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL); EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); } TEST(MatchResultListenerTest, IsInterestedWorks) { EXPECT_TRUE(StringMatchResultListener().IsInterested()); EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); EXPECT_FALSE(DummyMatchResultListener().IsInterested()); EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested()); } // Makes sure that the MatcherInterface
interface doesn't // change. class EvenMatcherImpl : public MatcherInterface
{ public: virtual bool MatchAndExplain(int x, MatchResultListener* /* listener */) const { return x % 2 == 0; } virtual void DescribeTo(ostream* os) const { *os << "is an even number"; } // We deliberately don't define DescribeNegationTo() and // ExplainMatchResultTo() here, to make sure the definition of these // two methods is optional. }; // Makes sure that the MatcherInterface API doesn't change. TEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { EvenMatcherImpl m; } // Tests implementing a monomorphic matcher using MatchAndExplain(). class NewEvenMatcherImpl : public MatcherInterface
{ public: virtual bool MatchAndExplain(int x, MatchResultListener* listener) const { const bool match = x % 2 == 0; // Verifies that we can stream to a listener directly. *listener << "value % " << 2; if (listener->stream() != NULL) { // Verifies that we can stream to a listener's underlying stream // too. *listener->stream() << " == " << (x % 2); } return match; } virtual void DescribeTo(ostream* os) const { *os << "is an even number"; } }; TEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { Matcher
m = MakeMatcher(new NewEvenMatcherImpl); EXPECT_TRUE(m.Matches(2)); EXPECT_FALSE(m.Matches(3)); EXPECT_EQ("value % 2 == 0", Explain(m, 2)); EXPECT_EQ("value % 2 == 1", Explain(m, 3)); } // Tests default-constructing a matcher. TEST(MatcherTest, CanBeDefaultConstructed) { Matcher
m; } // Tests that Matcher
can be constructed from a MatcherInterface
*. TEST(MatcherTest, CanBeConstructedFromMatcherInterface) { const MatcherInterface
* impl = new EvenMatcherImpl; Matcher
m(impl); EXPECT_TRUE(m.Matches(4)); EXPECT_FALSE(m.Matches(5)); } // Tests that value can be used in place of Eq(value). TEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { Matcher
m1 = 5; EXPECT_TRUE(m1.Matches(5)); EXPECT_FALSE(m1.Matches(6)); } // Tests that NULL can be used in place of Eq(NULL). TEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { Matcher
m1 = NULL; EXPECT_TRUE(m1.Matches(NULL)); int n = 0; EXPECT_FALSE(m1.Matches(&n)); } // Tests that matchers are copyable. TEST(MatcherTest, IsCopyable) { // Tests the copy constructor. Matcher
m1 = Eq(false); EXPECT_TRUE(m1.Matches(false)); EXPECT_FALSE(m1.Matches(true)); // Tests the assignment operator. m1 = Eq(true); EXPECT_TRUE(m1.Matches(true)); EXPECT_FALSE(m1.Matches(false)); } // Tests that Matcher
::DescribeTo() calls // MatcherInterface
::DescribeTo(). TEST(MatcherTest, CanDescribeItself) { EXPECT_EQ("is an even number", Describe(Matcher
(new EvenMatcherImpl))); } // Tests Matcher
::MatchAndExplain(). TEST(MatcherTest, MatchAndExplain) { Matcher
m = GreaterThan(0); StringMatchResultListener listener1; EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); EXPECT_EQ("which is 42 more than 0", listener1.str()); StringMatchResultListener listener2; EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); EXPECT_EQ("which is 9 less than 0", listener2.str()); } // Tests that a C-string literal can be implicitly converted to a // Matcher
or Matcher
. TEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { Matcher
m1 = "hi"; EXPECT_TRUE(m1.Matches("hi")); EXPECT_FALSE(m1.Matches("hello")); Matcher
m2 = "hi"; EXPECT_TRUE(m2.Matches("hi")); EXPECT_FALSE(m2.Matches("hello")); } // Tests that a string object can be implicitly converted to a // Matcher
or Matcher
. TEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { Matcher
m1 = string("hi"); EXPECT_TRUE(m1.Matches("hi")); EXPECT_FALSE(m1.Matches("hello")); Matcher
m2 = string("hi"); EXPECT_TRUE(m2.Matches("hi")); EXPECT_FALSE(m2.Matches("hello")); } // Tests that MakeMatcher() constructs a Matcher
from a // MatcherInterface* without requiring the user to explicitly // write the type. TEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { const MatcherInterface
* dummy_impl = NULL; Matcher
m = MakeMatcher(dummy_impl); } // Tests that MakePolymorphicMatcher() can construct a polymorphic // matcher from its implementation using the old API. const int g_bar = 1; class ReferencesBarOrIsZeroImpl { public: template
bool MatchAndExplain(const T& x, MatchResultListener* /* listener */) const { const void* p = &x; return p == &g_bar || x == 0; } void DescribeTo(ostream* os) const { *os << "g_bar or zero"; } void DescribeNegationTo(ostream* os) const { *os << "doesn't reference g_bar and is not zero"; } }; // This function verifies that MakePolymorphicMatcher() returns a // PolymorphicMatcher
where T is the argument's type. PolymorphicMatcher
ReferencesBarOrIsZero() { return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); } TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { // Using a polymorphic matcher to match a reference type. Matcher
m1 = ReferencesBarOrIsZero(); EXPECT_TRUE(m1.Matches(0)); // Verifies that the identity of a by-reference argument is preserved. EXPECT_TRUE(m1.Matches(g_bar)); EXPECT_FALSE(m1.Matches(1)); EXPECT_EQ("g_bar or zero", Describe(m1)); // Using a polymorphic matcher to match a value type. Matcher
m2 = ReferencesBarOrIsZero(); EXPECT_TRUE(m2.Matches(0.0)); EXPECT_FALSE(m2.Matches(0.1)); EXPECT_EQ("g_bar or zero", Describe(m2)); } // Tests implementing a polymorphic matcher using MatchAndExplain(). class PolymorphicIsEvenImpl { public: void DescribeTo(ostream* os) const { *os << "is even"; } void DescribeNegationTo(ostream* os) const { *os << "is odd"; } template
bool MatchAndExplain(const T& x, MatchResultListener* listener) const { // Verifies that we can stream to the listener directly. *listener << "% " << 2; if (listener->stream() != NULL) { // Verifies that we can stream to the listener's underlying stream // too. *listener->stream() << " == " << (x % 2); } return (x % 2) == 0; } }; PolymorphicMatcher
PolymorphicIsEven() { return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); } TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { // Using PolymorphicIsEven() as a Matcher
. const Matcher
m1 = PolymorphicIsEven(); EXPECT_TRUE(m1.Matches(42)); EXPECT_FALSE(m1.Matches(43)); EXPECT_EQ("is even", Describe(m1)); const Matcher
not_m1 = Not(m1); EXPECT_EQ("is odd", Describe(not_m1)); EXPECT_EQ("% 2 == 0", Explain(m1, 42)); // Using PolymorphicIsEven() as a Matcher
. const Matcher
m2 = PolymorphicIsEven(); EXPECT_TRUE(m2.Matches('\x42')); EXPECT_FALSE(m2.Matches('\x43')); EXPECT_EQ("is even", Describe(m2)); const Matcher
not_m2 = Not(m2); EXPECT_EQ("is odd", Describe(not_m2)); EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); } // Tests that MatcherCast
(m) works when m is a polymorphic matcher. TEST(MatcherCastTest, FromPolymorphicMatcher) { Matcher
m = MatcherCast
(Eq(5)); EXPECT_TRUE(m.Matches(5)); EXPECT_FALSE(m.Matches(6)); } // For testing casting matchers between compatible types. class IntValue { public: // An int can be statically (although not implicitly) cast to a // IntValue. explicit IntValue(int a_value) : value_(a_value) {} int value() const { return value_; } private: int value_; }; // For testing casting matchers between compatible types. bool IsPositiveIntValue(const IntValue& foo) { return foo.value() > 0; } // Tests that MatcherCast
(m) works when m is a Matcher
where T // can be statically converted to U. TEST(MatcherCastTest, FromCompatibleType) { Matcher
m1 = Eq(2.0); Matcher
m2 = MatcherCast
(m1); EXPECT_TRUE(m2.Matches(2)); EXPECT_FALSE(m2.Matches(3)); Matcher
m3 = Truly(IsPositiveIntValue); Matcher
m4 = MatcherCast
(m3); // In the following, the arguments 1 and 0 are statically converted // to IntValue objects, and then tested by the IsPositiveIntValue() // predicate. EXPECT_TRUE(m4.Matches(1)); EXPECT_FALSE(m4.Matches(0)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(MatcherCastTest, FromConstReferenceToNonReference) { Matcher
m1 = Eq(0); Matcher
m2 = MatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(MatcherCastTest, FromReferenceToNonReference) { Matcher
m1 = Eq(0); Matcher
m2 = MatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(MatcherCastTest, FromNonReferenceToConstReference) { Matcher
m1 = Eq(0); Matcher
m2 = MatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(MatcherCastTest, FromNonReferenceToReference) { Matcher
m1 = Eq(0); Matcher
m2 = MatcherCast
(m1); int n = 0; EXPECT_TRUE(m2.Matches(n)); n = 1; EXPECT_FALSE(m2.Matches(n)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(MatcherCastTest, FromSameType) { Matcher
m1 = Eq(0); Matcher
m2 = MatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } // Implicitly convertible form any type. struct ConvertibleFromAny { ConvertibleFromAny(int a_value) : value(a_value) {} template
ConvertibleFromAny(const T& a_value) : value(-1) { ADD_FAILURE() << "Conversion constructor called"; } int value; }; bool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) { return a.value == b.value; } ostream& operator<<(ostream& os, const ConvertibleFromAny& a) { return os << a.value; } TEST(MatcherCastTest, ConversionConstructorIsUsed) { Matcher
m = MatcherCast
(1); EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); } TEST(MatcherCastTest, FromConvertibleFromAny) { Matcher
m = MatcherCast
(Eq(ConvertibleFromAny(1))); EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); } class Base {}; class Derived : public Base {}; // Tests that SafeMatcherCast
(m) works when m is a polymorphic matcher. TEST(SafeMatcherCastTest, FromPolymorphicMatcher) { Matcher
m2 = SafeMatcherCast
(Eq(32)); EXPECT_TRUE(m2.Matches(' ')); EXPECT_FALSE(m2.Matches('\n')); } // Tests that SafeMatcherCast
(m) works when m is a Matcher
where // T and U are arithmetic types and T can be losslessly converted to // U. TEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { Matcher
m1 = DoubleEq(1.0); Matcher
m2 = SafeMatcherCast
(m1); EXPECT_TRUE(m2.Matches(1.0f)); EXPECT_FALSE(m2.Matches(2.0f)); Matcher
m3 = SafeMatcherCast
(TypedEq
('a')); EXPECT_TRUE(m3.Matches('a')); EXPECT_FALSE(m3.Matches('b')); } // Tests that SafeMatcherCast
(m) works when m is a Matcher
where T and U // are pointers or references to a derived and a base class, correspondingly. TEST(SafeMatcherCastTest, FromBaseClass) { Derived d, d2; Matcher
m1 = Eq(&d); Matcher
m2 = SafeMatcherCast
(m1); EXPECT_TRUE(m2.Matches(&d)); EXPECT_FALSE(m2.Matches(&d2)); Matcher
m3 = Ref(d); Matcher
m4 = SafeMatcherCast
(m3); EXPECT_TRUE(m4.Matches(d)); EXPECT_FALSE(m4.Matches(d2)); } // Tests that SafeMatcherCast
(m) works when m is a Matcher
. TEST(SafeMatcherCastTest, FromConstReferenceToReference) { int n = 0; Matcher
m1 = Ref(n); Matcher
m2 = SafeMatcherCast
(m1); int n1 = 0; EXPECT_TRUE(m2.Matches(n)); EXPECT_FALSE(m2.Matches(n1)); } // Tests that MatcherCast
(m) works when m is a Matcher
. TEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { Matcher
m1 = Eq(0); Matcher
m2 = SafeMatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } // Tests that SafeMatcherCast
(m) works when m is a Matcher
. TEST(SafeMatcherCastTest, FromNonReferenceToReference) { Matcher
m1 = Eq(0); Matcher
m2 = SafeMatcherCast
(m1); int n = 0; EXPECT_TRUE(m2.Matches(n)); n = 1; EXPECT_FALSE(m2.Matches(n)); } // Tests that SafeMatcherCast
(m) works when m is a Matcher
. TEST(SafeMatcherCastTest, FromSameType) { Matcher
m1 = Eq(0); Matcher
m2 = SafeMatcherCast
(m1); EXPECT_TRUE(m2.Matches(0)); EXPECT_FALSE(m2.Matches(1)); } TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) { Matcher
m = SafeMatcherCast
(1); EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); } TEST(SafeMatcherCastTest, FromConvertibleFromAny) { Matcher
m = SafeMatcherCast
(Eq(ConvertibleFromAny(1))); EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); } // Tests that A
() matches any value of type T. TEST(ATest, MatchesAnyValue) { // Tests a matcher for a value type. Matcher
m1 = A
(); EXPECT_TRUE(m1.Matches(91.43)); EXPECT_TRUE(m1.Matches(-15.32)); // Tests a matcher for a reference type. int a = 2; int b = -6; Matcher
m2 = A
(); EXPECT_TRUE(m2.Matches(a)); EXPECT_TRUE(m2.Matches(b)); } // Tests that A
() describes itself properly. TEST(ATest, CanDescribeSelf) { EXPECT_EQ("is anything", Describe(A
())); } // Tests that An
() matches any value of type T. TEST(AnTest, MatchesAnyValue) { // Tests a matcher for a value type. Matcher
m1 = An
(); EXPECT_TRUE(m1.Matches(9143)); EXPECT_TRUE(m1.Matches(-1532)); // Tests a matcher for a reference type. int a = 2; int b = -6; Matcher
m2 = An
(); EXPECT_TRUE(m2.Matches(a)); EXPECT_TRUE(m2.Matches(b)); } // Tests that An
() describes itself properly. TEST(AnTest, CanDescribeSelf) { EXPECT_EQ("is anything", Describe(An
())); } // Tests that _ can be used as a matcher for any type and matches any // value of that type. TEST(UnderscoreTest, MatchesAnyValue) { // Uses _ as a matcher for a value type. Matcher
m1 = _; EXPECT_TRUE(m1.Matches(123)); EXPECT_TRUE(m1.Matches(-242)); // Uses _ as a matcher for a reference type. bool a = false; const bool b = true; Matcher
m2 = _; EXPECT_TRUE(m2.Matches(a)); EXPECT_TRUE(m2.Matches(b)); } // Tests that _ describes itself properly. TEST(UnderscoreTest, CanDescribeSelf) { Matcher
m = _; EXPECT_EQ("is anything", Describe(m)); } // Tests that Eq(x) matches any value equal to x. TEST(EqTest, MatchesEqualValue) { // 2 C-strings with same content but different addresses. const char a1[] = "hi"; const char a2[] = "hi"; Matcher
m1 = Eq(a1); EXPECT_TRUE(m1.Matches(a1)); EXPECT_FALSE(m1.Matches(a2)); } // Tests that Eq(v) describes itself properly. class Unprintable { public: Unprintable() : c_('a') {} bool operator==(const Unprintable& /* rhs */) { return true; } private: char c_; }; TEST(EqTest, CanDescribeSelf) { Matcher
m = Eq(Unprintable()); EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); } // Tests that Eq(v) can be used to match any type that supports // comparing with type T, where T is v's type. TEST(EqTest, IsPolymorphic) { Matcher
m1 = Eq(1); EXPECT_TRUE(m1.Matches(1)); EXPECT_FALSE(m1.Matches(2)); Matcher
m2 = Eq(1); EXPECT_TRUE(m2.Matches('\1')); EXPECT_FALSE(m2.Matches('a')); } // Tests that TypedEq
(v) matches values of type T that's equal to v. TEST(TypedEqTest, ChecksEqualityForGivenType) { Matcher
m1 = TypedEq
('a'); EXPECT_TRUE(m1.Matches('a')); EXPECT_FALSE(m1.Matches('b')); Matcher
m2 = TypedEq
(6); EXPECT_TRUE(m2.Matches(6)); EXPECT_FALSE(m2.Matches(7)); } // Tests that TypedEq(v) describes itself properly. TEST(TypedEqTest, CanDescribeSelf) { EXPECT_EQ("is equal to 2", Describe(TypedEq
(2))); } // Tests that TypedEq
(v) has type Matcher
. // Type
::IsTypeOf(v) compiles iff the type of value v is T, where T // is a "bare" type (i.e. not in the form of const U or U&). If v's // type is not T, the compiler will generate a message about // "undefined referece". template
struct Type { static bool IsTypeOf(const T& /* v */) { return true; } template
static void IsTypeOf(T2 v); }; TEST(TypedEqTest, HasSpecifiedType) { // Verfies that the type of TypedEq
(v) is Matcher
. Type
>::IsTypeOf(TypedEq
(5)); Type
>::IsTypeOf(TypedEq
(5)); } // Tests that Ge(v) matches anything >= v. TEST(GeTest, ImplementsGreaterThanOrEqual) { Matcher
m1 = Ge(0); EXPECT_TRUE(m1.Matches(1)); EXPECT_TRUE(m1.Matches(0)); EXPECT_FALSE(m1.Matches(-1)); } // Tests that Ge(v) describes itself properly. TEST(GeTest, CanDescribeSelf) { Matcher
m = Ge(5); EXPECT_EQ("is >= 5", Describe(m)); } // Tests that Gt(v) matches anything > v. TEST(GtTest, ImplementsGreaterThan) { Matcher
m1 = Gt(0); EXPECT_TRUE(m1.Matches(1.0)); EXPECT_FALSE(m1.Matches(0.0)); EXPECT_FALSE(m1.Matches(-1.0)); } // Tests that Gt(v) describes itself properly. TEST(GtTest, CanDescribeSelf) { Matcher
m = Gt(5); EXPECT_EQ("is > 5", Describe(m)); } // Tests that Le(v) matches anything <= v. TEST(LeTest, ImplementsLessThanOrEqual) { Matcher
m1 = Le('b'); EXPECT_TRUE(m1.Matches('a')); EXPECT_TRUE(m1.Matches('b')); EXPECT_FALSE(m1.Matches('c')); } // Tests that Le(v) describes itself properly. TEST(LeTest, CanDescribeSelf) { Matcher
m = Le(5); EXPECT_EQ("is <= 5", Describe(m)); } // Tests that Lt(v) matches anything < v. TEST(LtTest, ImplementsLessThan) { Matcher
m1 = Lt("Hello"); EXPECT_TRUE(m1.Matches("Abc")); EXPECT_FALSE(m1.Matches("Hello")); EXPECT_FALSE(m1.Matches("Hello, world!")); } // Tests that Lt(v) describes itself properly. TEST(LtTest, CanDescribeSelf) { Matcher
m = Lt(5); EXPECT_EQ("is < 5", Describe(m)); } // Tests that Ne(v) matches anything != v. TEST(NeTest, ImplementsNotEqual) { Matcher
m1 = Ne(0); EXPECT_TRUE(m1.Matches(1)); EXPECT_TRUE(m1.Matches(-1)); EXPECT_FALSE(m1.Matches(0)); } // Tests that Ne(v) describes itself properly. TEST(NeTest, CanDescribeSelf) { Matcher
m = Ne(5); EXPECT_EQ("isn't equal to 5", Describe(m)); } // Tests that IsNull() matches any NULL pointer of any type. TEST(IsNullTest, MatchesNullPointer) { Matcher
m1 = IsNull(); int* p1 = NULL; int n = 0; EXPECT_TRUE(m1.Matches(p1)); EXPECT_FALSE(m1.Matches(&n)); Matcher
m2 = IsNull(); const char* p2 = NULL; EXPECT_TRUE(m2.Matches(p2)); EXPECT_FALSE(m2.Matches("hi")); #if !GTEST_OS_SYMBIAN // Nokia's Symbian compiler generates: // gmock-matchers.h: ambiguous access to overloaded function // gmock-matchers.h: 'testing::Matcher
::Matcher(void *)' // gmock-matchers.h: 'testing::Matcher
::Matcher(const testing:: // MatcherInterface
*)' // gmock-matchers.h: (point of instantiation: 'testing:: // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()') // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc Matcher
m3 = IsNull(); void* p3 = NULL; EXPECT_TRUE(m3.Matches(p3)); EXPECT_FALSE(m3.Matches(reinterpret_cast
(0xbeef))); #endif } TEST(IsNullTest, LinkedPtr) { const Matcher
> m = IsNull(); const linked_ptr
null_p; const linked_ptr
non_null_p(new int); EXPECT_TRUE(m.Matches(null_p)); EXPECT_FALSE(m.Matches(non_null_p)); } TEST(IsNullTest, ReferenceToConstLinkedPtr) { const Matcher
&> m = IsNull(); const linked_ptr
null_p; const linked_ptr
non_null_p(new double); EXPECT_TRUE(m.Matches(null_p)); EXPECT_FALSE(m.Matches(non_null_p)); } TEST(IsNullTest, ReferenceToConstScopedPtr) { const Matcher
&> m = IsNull(); const scoped_ptr
null_p; const scoped_ptr
non_null_p(new double); EXPECT_TRUE(m.Matches(null_p)); EXPECT_FALSE(m.Matches(non_null_p)); } // Tests that IsNull() describes itself properly. TEST(IsNullTest, CanDescribeSelf) { Matcher
m = IsNull(); EXPECT_EQ("is NULL", Describe(m)); EXPECT_EQ("isn't NULL", DescribeNegation(m)); } // Tests that NotNull() matches any non-NULL pointer of any type. TEST(NotNullTest, MatchesNonNullPointer) { Matcher
m1 = NotNull(); int* p1 = NULL; int n = 0; EXPECT_FALSE(m1.Matches(p1)); EXPECT_TRUE(m1.Matches(&n)); Matcher
m2 = NotNull(); const char* p2 = NULL; EXPECT_FALSE(m2.Matches(p2)); EXPECT_TRUE(m2.Matches("hi")); } TEST(NotNullTest, LinkedPtr) { const Matcher
> m = NotNull(); const linked_ptr
null_p; const linked_ptr
non_null_p(new int); EXPECT_FALSE(m.Matches(null_p)); EXPECT_TRUE(m.Matches(non_null_p)); } TEST(NotNullTest, ReferenceToConstLinkedPtr) { const Matcher
&> m = NotNull(); const linked_ptr
null_p; const linked_ptr
non_null_p(new double); EXPECT_FALSE(m.Matches(null_p)); EXPECT_TRUE(m.Matches(non_null_p)); } TEST(NotNullTest, ReferenceToConstScopedPtr) { const Matcher
&> m = NotNull(); const scoped_ptr
null_p; const scoped_ptr
non_null_p(new double); EXPECT_FALSE(m.Matches(null_p)); EXPECT_TRUE(m.Matches(non_null_p)); } // Tests that NotNull() describes itself properly. TEST(NotNullTest, CanDescribeSelf) { Matcher
m = NotNull(); EXPECT_EQ("isn't NULL", Describe(m)); } // Tests that Ref(variable) matches an argument that references // 'variable'. TEST(RefTest, MatchesSameVariable) { int a = 0; int b = 0; Matcher
m = Ref(a); EXPECT_TRUE(m.Matches(a)); EXPECT_FALSE(m.Matches(b)); } // Tests that Ref(variable) describes itself properly. TEST(RefTest, CanDescribeSelf) { int n = 5; Matcher
m = Ref(n); stringstream ss; ss << "references the variable @" << &n << " 5"; EXPECT_EQ(string(ss.str()), Describe(m)); } // Test that Ref(non_const_varialbe) can be used as a matcher for a // const reference. TEST(RefTest, CanBeUsedAsMatcherForConstReference) { int a = 0; int b = 0; Matcher
m = Ref(a); EXPECT_TRUE(m.Matches(a)); EXPECT_FALSE(m.Matches(b)); } // Tests that Ref(variable) is covariant, i.e. Ref(derived) can be // used wherever Ref(base) can be used (Ref(derived) is a sub-type // of Ref(base), but not vice versa. TEST(RefTest, IsCovariant) { Base base, base2; Derived derived; Matcher
m1 = Ref(base); EXPECT_TRUE(m1.Matches(base)); EXPECT_FALSE(m1.Matches(base2)); EXPECT_FALSE(m1.Matches(derived)); m1 = Ref(derived); EXPECT_TRUE(m1.Matches(derived)); EXPECT_FALSE(m1.Matches(base)); EXPECT_FALSE(m1.Matches(base2)); } TEST(RefTest, ExplainsResult) { int n = 0; EXPECT_THAT(Explain(Matcher
(Ref(n)), n), StartsWith("which is located @")); int m = 0; EXPECT_THAT(Explain(Matcher
(Ref(n)), m), StartsWith("which is located @")); } // Tests string comparison matchers. TEST(StrEqTest, MatchesEqualString) { Matcher
m = StrEq(string("Hello")); EXPECT_TRUE(m.Matches("Hello")); EXPECT_FALSE(m.Matches("hello")); EXPECT_FALSE(m.Matches(NULL)); Matcher
m2 = StrEq("Hello"); EXPECT_TRUE(m2.Matches("Hello")); EXPECT_FALSE(m2.Matches("Hi")); } TEST(StrEqTest, CanDescribeSelf) { Matcher
m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3"); EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", Describe(m)); string str("01204500800"); str[3] = '\0'; Matcher
m2 = StrEq(str); EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; Matcher
m3 = StrEq(str); EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); } TEST(StrNeTest, MatchesUnequalString) { Matcher
m = StrNe("Hello"); EXPECT_TRUE(m.Matches("")); EXPECT_TRUE(m.Matches(NULL)); EXPECT_FALSE(m.Matches("Hello")); Matcher
m2 = StrNe(string("Hello")); EXPECT_TRUE(m2.Matches("hello")); EXPECT_FALSE(m2.Matches("Hello")); } TEST(StrNeTest, CanDescribeSelf) { Matcher
m = StrNe("Hi"); EXPECT_EQ("isn't equal to \"Hi\"", Describe(m)); } TEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { Matcher
m = StrCaseEq(string("Hello")); EXPECT_TRUE(m.Matches("Hello")); EXPECT_TRUE(m.Matches("hello")); EXPECT_FALSE(m.Matches("Hi")); EXPECT_FALSE(m.Matches(NULL)); Matcher
m2 = StrCaseEq("Hello"); EXPECT_TRUE(m2.Matches("hello")); EXPECT_FALSE(m2.Matches("Hi")); } TEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { string str1("oabocdooeoo"); string str2("OABOCDOOEOO"); Matcher
m0 = StrCaseEq(str1); EXPECT_FALSE(m0.Matches(str2 + string(1, '\0'))); str1[3] = str2[3] = '\0'; Matcher
m1 = StrCaseEq(str1); EXPECT_TRUE(m1.Matches(str2)); str1[0] = str1[6] = str1[7] = str1[10] = '\0'; str2[0] = str2[6] = str2[7] = str2[10] = '\0'; Matcher
m2 = StrCaseEq(str1); str1[9] = str2[9] = '\0'; EXPECT_FALSE(m2.Matches(str2)); Matcher
m3 = StrCaseEq(str1); EXPECT_TRUE(m3.Matches(str2)); EXPECT_FALSE(m3.Matches(str2 + "x")); str2.append(1, '\0'); EXPECT_FALSE(m3.Matches(str2)); EXPECT_FALSE(m3.Matches(string(str2, 0, 9))); } TEST(StrCaseEqTest, CanDescribeSelf) { Matcher
m = StrCaseEq("Hi"); EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); } TEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { Matcher
m = StrCaseNe("Hello"); EXPECT_TRUE(m.Matches("Hi")); EXPECT_TRUE(m.Matches(NULL)); EXPECT_FALSE(m.Matches("Hello")); EXPECT_FALSE(m.Matches("hello")); Matcher
m2 = StrCaseNe(string("Hello")); EXPECT_TRUE(m2.Matches("")); EXPECT_FALSE(m2.Matches("Hello")); } TEST(StrCaseNeTest, CanDescribeSelf) { Matcher
m = StrCaseNe("Hi"); EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m)); } // Tests that HasSubstr() works for matching string-typed values. TEST(HasSubstrTest, WorksForStringClasses) { const Matcher
m1 = HasSubstr("foo"); EXPECT_TRUE(m1.Matches(string("I love food."))); EXPECT_FALSE(m1.Matches(string("tofo"))); const Matcher
m2 = HasSubstr("foo"); EXPECT_TRUE(m2.Matches(std::string("I love food."))); EXPECT_FALSE(m2.Matches(std::string("tofo"))); } // Tests that HasSubstr() works for matching C-string-typed values. TEST(HasSubstrTest, WorksForCStrings) { const Matcher
m1 = HasSubstr("foo"); EXPECT_TRUE(m1.Matches(const_cast
("I love food."))); EXPECT_FALSE(m1.Matches(const_cast
("tofo"))); EXPECT_FALSE(m1.Matches(NULL)); const Matcher
m2 = HasSubstr("foo"); EXPECT_TRUE(m2.Matches("I love food.")); EXPECT_FALSE(m2.Matches("tofo")); EXPECT_FALSE(m2.Matches(NULL)); } // Tests that HasSubstr(s) describes itself properly. TEST(HasSubstrTest, CanDescribeSelf) { Matcher
m = HasSubstr("foo\n\""); EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); } TEST(KeyTest, CanDescribeSelf) { Matcher
&> m = Key("foo"); EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m)); } TEST(KeyTest, ExplainsResult) { Matcher
> m = Key(GreaterThan(10)); EXPECT_EQ("whose first field is a value which is 5 less than 10", Explain(m, make_pair(5, true))); EXPECT_EQ("whose first field is a value which is 5 more than 10", Explain(m, make_pair(15, true))); } TEST(KeyTest, MatchesCorrectly) { pair
p(25, "foo"); EXPECT_THAT(p, Key(25)); EXPECT_THAT(p, Not(Key(42))); EXPECT_THAT(p, Key(Ge(20))); EXPECT_THAT(p, Not(Key(Lt(25)))); } TEST(KeyTest, SafelyCastsInnerMatcher) { Matcher
is_positive = Gt(0); Matcher
is_negative = Lt(0); pair