| OLD | NEW |
| 1 // Copyright 2007, Google Inc. | 1 // Copyright 2007, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 // Author: wan@google.com (Zhanyong Wan) | 30 // Author: wan@google.com (Zhanyong Wan) |
| 31 | 31 |
| 32 // Google Mock - a framework for writing C++ mock classes. | 32 // Google Mock - a framework for writing C++ mock classes. |
| 33 // | 33 // |
| 34 // This file tests some commonly used argument matchers. | 34 // This file tests some commonly used argument matchers. |
| 35 | 35 |
| 36 #include <gmock/gmock-matchers.h> | 36 #include <gmock/gmock-matchers.h> |
| 37 | 37 |
| 38 #include <string.h> | 38 #include <string.h> |
| 39 #include <functional> | 39 #include <functional> |
| 40 #include <iostream> |
| 40 #include <list> | 41 #include <list> |
| 41 #include <map> | 42 #include <map> |
| 42 #include <set> | 43 #include <set> |
| 43 #include <sstream> | 44 #include <sstream> |
| 44 #include <string> | 45 #include <string> |
| 45 #include <utility> | 46 #include <utility> |
| 46 #include <vector> | 47 #include <vector> |
| 47 #include <gmock/gmock.h> | 48 #include <gmock/gmock.h> |
| 48 #include <gtest/gtest.h> | 49 #include <gtest/gtest.h> |
| 49 #include <gtest/gtest-spi.h> | 50 #include <gtest/gtest-spi.h> |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 using testing::IsNull; | 82 using testing::IsNull; |
| 82 using testing::Key; | 83 using testing::Key; |
| 83 using testing::Le; | 84 using testing::Le; |
| 84 using testing::Lt; | 85 using testing::Lt; |
| 85 using testing::MakeMatcher; | 86 using testing::MakeMatcher; |
| 86 using testing::MakePolymorphicMatcher; | 87 using testing::MakePolymorphicMatcher; |
| 87 using testing::Matcher; | 88 using testing::Matcher; |
| 88 using testing::MatcherCast; | 89 using testing::MatcherCast; |
| 89 using testing::MatcherInterface; | 90 using testing::MatcherInterface; |
| 90 using testing::Matches; | 91 using testing::Matches; |
| 92 using testing::ExplainMatchResult; |
| 93 using testing::MatchResultListener; |
| 91 using testing::NanSensitiveDoubleEq; | 94 using testing::NanSensitiveDoubleEq; |
| 92 using testing::NanSensitiveFloatEq; | 95 using testing::NanSensitiveFloatEq; |
| 93 using testing::Ne; | 96 using testing::Ne; |
| 94 using testing::Not; | 97 using testing::Not; |
| 95 using testing::NotNull; | 98 using testing::NotNull; |
| 96 using testing::Pair; | 99 using testing::Pair; |
| 97 using testing::Pointee; | 100 using testing::Pointee; |
| 98 using testing::PolymorphicMatcher; | 101 using testing::PolymorphicMatcher; |
| 99 using testing::Property; | 102 using testing::Property; |
| 100 using testing::Ref; | 103 using testing::Ref; |
| 101 using testing::ResultOf; | 104 using testing::ResultOf; |
| 102 using testing::StartsWith; | 105 using testing::StartsWith; |
| 103 using testing::StrCaseEq; | 106 using testing::StrCaseEq; |
| 104 using testing::StrCaseNe; | 107 using testing::StrCaseNe; |
| 105 using testing::StrEq; | 108 using testing::StrEq; |
| 106 using testing::StrNe; | 109 using testing::StrNe; |
| 107 using testing::Truly; | 110 using testing::Truly; |
| 108 using testing::TypedEq; | 111 using testing::TypedEq; |
| 109 using testing::Value; | 112 using testing::Value; |
| 110 using testing::_; | 113 using testing::_; |
| 114 using testing::internal::DummyMatchResultListener; |
| 111 using testing::internal::FloatingEqMatcher; | 115 using testing::internal::FloatingEqMatcher; |
| 112 using testing::internal::FormatMatcherDescriptionSyntaxError; | 116 using testing::internal::FormatMatcherDescriptionSyntaxError; |
| 113 using testing::internal::GetParamIndex; | 117 using testing::internal::GetParamIndex; |
| 114 using testing::internal::Interpolation; | 118 using testing::internal::Interpolation; |
| 115 using testing::internal::Interpolations; | 119 using testing::internal::Interpolations; |
| 116 using testing::internal::JoinAsTuple; | 120 using testing::internal::JoinAsTuple; |
| 117 using testing::internal::SkipPrefix; | 121 using testing::internal::SkipPrefix; |
| 122 using testing::internal::StreamMatchResultListener; |
| 118 using testing::internal::String; | 123 using testing::internal::String; |
| 119 using testing::internal::Strings; | 124 using testing::internal::Strings; |
| 125 using testing::internal::StringMatchResultListener; |
| 120 using testing::internal::ValidateMatcherDescription; | 126 using testing::internal::ValidateMatcherDescription; |
| 121 using testing::internal::kInvalidInterpolation; | 127 using testing::internal::kInvalidInterpolation; |
| 122 using testing::internal::kPercentInterpolation; | 128 using testing::internal::kPercentInterpolation; |
| 123 using testing::internal::kTupleInterpolation; | 129 using testing::internal::kTupleInterpolation; |
| 124 using testing::internal::linked_ptr; | 130 using testing::internal::linked_ptr; |
| 125 using testing::internal::scoped_ptr; | 131 using testing::internal::scoped_ptr; |
| 126 using testing::internal::string; | 132 using testing::internal::string; |
| 127 | 133 |
| 128 #ifdef GMOCK_HAS_REGEX | |
| 129 using testing::ContainsRegex; | 134 using testing::ContainsRegex; |
| 130 using testing::MatchesRegex; | 135 using testing::MatchesRegex; |
| 131 using testing::internal::RE; | 136 using testing::internal::RE; |
| 132 #endif // GMOCK_HAS_REGEX | |
| 133 | 137 |
| 134 // For testing ExplainMatchResultTo(). | 138 // For testing ExplainMatchResultTo(). |
| 135 class GreaterThanMatcher : public MatcherInterface<int> { | 139 class GreaterThanMatcher : public MatcherInterface<int> { |
| 136 public: | 140 public: |
| 137 explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} | 141 explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} |
| 138 | 142 |
| 139 virtual bool Matches(int lhs) const { return lhs > rhs_; } | |
| 140 | |
| 141 virtual void DescribeTo(::std::ostream* os) const { | 143 virtual void DescribeTo(::std::ostream* os) const { |
| 142 *os << "is greater than " << rhs_; | 144 *os << "is greater than " << rhs_; |
| 143 } | 145 } |
| 144 | 146 |
| 145 virtual void ExplainMatchResultTo(int lhs, ::std::ostream* os) const { | 147 virtual bool MatchAndExplain(int lhs, |
| 148 MatchResultListener* listener) const { |
| 146 const int diff = lhs - rhs_; | 149 const int diff = lhs - rhs_; |
| 147 if (diff > 0) { | 150 if (diff > 0) { |
| 148 *os << "is " << diff << " more than " << rhs_; | 151 *listener << "which is " << diff << " more than " << rhs_; |
| 149 } else if (diff == 0) { | 152 } else if (diff == 0) { |
| 150 *os << "is the same as " << rhs_; | 153 *listener << "which is the same as " << rhs_; |
| 151 } else { | 154 } else { |
| 152 *os << "is " << -diff << " less than " << rhs_; | 155 *listener << "which is " << -diff << " less than " << rhs_; |
| 153 } | 156 } |
| 157 |
| 158 return lhs > rhs_; |
| 154 } | 159 } |
| 155 | 160 |
| 156 private: | 161 private: |
| 157 int rhs_; | 162 int rhs_; |
| 158 }; | 163 }; |
| 159 | 164 |
| 160 Matcher<int> GreaterThan(int n) { | 165 Matcher<int> GreaterThan(int n) { |
| 161 return MakeMatcher(new GreaterThanMatcher(n)); | 166 return MakeMatcher(new GreaterThanMatcher(n)); |
| 162 } | 167 } |
| 163 | 168 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 178 } | 183 } |
| 179 | 184 |
| 180 // Returns the reason why x matches, or doesn't match, m. | 185 // Returns the reason why x matches, or doesn't match, m. |
| 181 template <typename MatcherType, typename Value> | 186 template <typename MatcherType, typename Value> |
| 182 string Explain(const MatcherType& m, const Value& x) { | 187 string Explain(const MatcherType& m, const Value& x) { |
| 183 stringstream ss; | 188 stringstream ss; |
| 184 m.ExplainMatchResultTo(x, &ss); | 189 m.ExplainMatchResultTo(x, &ss); |
| 185 return ss.str(); | 190 return ss.str(); |
| 186 } | 191 } |
| 187 | 192 |
| 193 TEST(MatchResultListenerTest, StreamingWorks) { |
| 194 StringMatchResultListener listener; |
| 195 listener << "hi" << 5; |
| 196 EXPECT_EQ("hi5", listener.str()); |
| 197 |
| 198 // Streaming shouldn't crash when the underlying ostream is NULL. |
| 199 DummyMatchResultListener dummy; |
| 200 dummy << "hi" << 5; |
| 201 } |
| 202 |
| 203 TEST(MatchResultListenerTest, CanAccessUnderlyingStream) { |
| 204 EXPECT_TRUE(DummyMatchResultListener().stream() == NULL); |
| 205 EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL); |
| 206 |
| 207 EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); |
| 208 } |
| 209 |
| 210 TEST(MatchResultListenerTest, IsInterestedWorks) { |
| 211 EXPECT_TRUE(StringMatchResultListener().IsInterested()); |
| 212 EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); |
| 213 |
| 214 EXPECT_FALSE(DummyMatchResultListener().IsInterested()); |
| 215 EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested()); |
| 216 } |
| 217 |
| 188 // Makes sure that the MatcherInterface<T> interface doesn't | 218 // Makes sure that the MatcherInterface<T> interface doesn't |
| 189 // change. | 219 // change. |
| 190 class EvenMatcherImpl : public MatcherInterface<int> { | 220 class EvenMatcherImpl : public MatcherInterface<int> { |
| 191 public: | 221 public: |
| 192 virtual bool Matches(int x) const { return x % 2 == 0; } | 222 virtual bool MatchAndExplain(int x, |
| 223 MatchResultListener* /* listener */) const { |
| 224 return x % 2 == 0; |
| 225 } |
| 193 | 226 |
| 194 virtual void DescribeTo(::std::ostream* os) const { | 227 virtual void DescribeTo(::std::ostream* os) const { |
| 195 *os << "is an even number"; | 228 *os << "is an even number"; |
| 196 } | 229 } |
| 197 | 230 |
| 198 // We deliberately don't define DescribeNegationTo() and | 231 // We deliberately don't define DescribeNegationTo() and |
| 199 // ExplainMatchResultTo() here, to make sure the definition of these | 232 // ExplainMatchResultTo() here, to make sure the definition of these |
| 200 // two methods is optional. | 233 // two methods is optional. |
| 201 }; | 234 }; |
| 202 | 235 |
| 203 TEST(MatcherInterfaceTest, CanBeImplemented) { | 236 // Makes sure that the MatcherInterface API doesn't change. |
| 237 TEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { |
| 204 EvenMatcherImpl m; | 238 EvenMatcherImpl m; |
| 205 } | 239 } |
| 206 | 240 |
| 241 // Tests implementing a monomorphic matcher using MatchAndExplain(). |
| 242 |
| 243 class NewEvenMatcherImpl : public MatcherInterface<int> { |
| 244 public: |
| 245 virtual bool MatchAndExplain(int x, MatchResultListener* listener) const { |
| 246 const bool match = x % 2 == 0; |
| 247 // Verifies that we can stream to a listener directly. |
| 248 *listener << "value % " << 2; |
| 249 if (listener->stream() != NULL) { |
| 250 // Verifies that we can stream to a listener's underlying stream |
| 251 // too. |
| 252 *listener->stream() << " == " << (x % 2); |
| 253 } |
| 254 return match; |
| 255 } |
| 256 |
| 257 virtual void DescribeTo(::std::ostream* os) const { |
| 258 *os << "is an even number"; |
| 259 } |
| 260 }; |
| 261 |
| 262 TEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { |
| 263 Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl); |
| 264 EXPECT_TRUE(m.Matches(2)); |
| 265 EXPECT_FALSE(m.Matches(3)); |
| 266 EXPECT_EQ("value % 2 == 0", Explain(m, 2)); |
| 267 EXPECT_EQ("value % 2 == 1", Explain(m, 3)); |
| 268 } |
| 269 |
| 207 // Tests default-constructing a matcher. | 270 // Tests default-constructing a matcher. |
| 208 TEST(MatcherTest, CanBeDefaultConstructed) { | 271 TEST(MatcherTest, CanBeDefaultConstructed) { |
| 209 Matcher<double> m; | 272 Matcher<double> m; |
| 210 } | 273 } |
| 211 | 274 |
| 212 // Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. | 275 // Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. |
| 213 TEST(MatcherTest, CanBeConstructedFromMatcherInterface) { | 276 TEST(MatcherTest, CanBeConstructedFromMatcherInterface) { |
| 214 const MatcherInterface<int>* impl = new EvenMatcherImpl; | 277 const MatcherInterface<int>* impl = new EvenMatcherImpl; |
| 215 Matcher<int> m(impl); | 278 Matcher<int> m(impl); |
| 216 EXPECT_TRUE(m.Matches(4)); | 279 EXPECT_TRUE(m.Matches(4)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 245 EXPECT_FALSE(m1.Matches(false)); | 308 EXPECT_FALSE(m1.Matches(false)); |
| 246 } | 309 } |
| 247 | 310 |
| 248 // Tests that Matcher<T>::DescribeTo() calls | 311 // Tests that Matcher<T>::DescribeTo() calls |
| 249 // MatcherInterface<T>::DescribeTo(). | 312 // MatcherInterface<T>::DescribeTo(). |
| 250 TEST(MatcherTest, CanDescribeItself) { | 313 TEST(MatcherTest, CanDescribeItself) { |
| 251 EXPECT_EQ("is an even number", | 314 EXPECT_EQ("is an even number", |
| 252 Describe(Matcher<int>(new EvenMatcherImpl))); | 315 Describe(Matcher<int>(new EvenMatcherImpl))); |
| 253 } | 316 } |
| 254 | 317 |
| 318 // Tests Matcher<T>::MatchAndExplain(). |
| 319 TEST(MatcherTest, MatchAndExplain) { |
| 320 Matcher<int> m = GreaterThan(0); |
| 321 StringMatchResultListener listener1; |
| 322 EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); |
| 323 EXPECT_EQ("which is 42 more than 0", listener1.str()); |
| 324 |
| 325 StringMatchResultListener listener2; |
| 326 EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); |
| 327 EXPECT_EQ("which is 9 less than 0", listener2.str()); |
| 328 } |
| 329 |
| 255 // Tests that a C-string literal can be implicitly converted to a | 330 // Tests that a C-string literal can be implicitly converted to a |
| 256 // Matcher<string> or Matcher<const string&>. | 331 // Matcher<string> or Matcher<const string&>. |
| 257 TEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { | 332 TEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { |
| 258 Matcher<string> m1 = "hi"; | 333 Matcher<string> m1 = "hi"; |
| 259 EXPECT_TRUE(m1.Matches("hi")); | 334 EXPECT_TRUE(m1.Matches("hi")); |
| 260 EXPECT_FALSE(m1.Matches("hello")); | 335 EXPECT_FALSE(m1.Matches("hello")); |
| 261 | 336 |
| 262 Matcher<const string&> m2 = "hi"; | 337 Matcher<const string&> m2 = "hi"; |
| 263 EXPECT_TRUE(m2.Matches("hi")); | 338 EXPECT_TRUE(m2.Matches("hi")); |
| 264 EXPECT_FALSE(m2.Matches("hello")); | 339 EXPECT_FALSE(m2.Matches("hello")); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 277 } | 352 } |
| 278 | 353 |
| 279 // Tests that MakeMatcher() constructs a Matcher<T> from a | 354 // Tests that MakeMatcher() constructs a Matcher<T> from a |
| 280 // MatcherInterface* without requiring the user to explicitly | 355 // MatcherInterface* without requiring the user to explicitly |
| 281 // write the type. | 356 // write the type. |
| 282 TEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { | 357 TEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { |
| 283 const MatcherInterface<int>* dummy_impl = NULL; | 358 const MatcherInterface<int>* dummy_impl = NULL; |
| 284 Matcher<int> m = MakeMatcher(dummy_impl); | 359 Matcher<int> m = MakeMatcher(dummy_impl); |
| 285 } | 360 } |
| 286 | 361 |
| 287 // Tests that MakePolymorphicMatcher() constructs a polymorphic | 362 // Tests that MakePolymorphicMatcher() can construct a polymorphic |
| 288 // matcher from its implementation. | 363 // matcher from its implementation using the old API. |
| 289 const int bar = 1; | 364 const int bar = 1; |
| 290 class ReferencesBarOrIsZeroImpl { | 365 class ReferencesBarOrIsZeroImpl { |
| 291 public: | 366 public: |
| 292 template <typename T> | 367 template <typename T> |
| 293 bool Matches(const T& x) const { | 368 bool MatchAndExplain(const T& x, |
| 369 MatchResultListener* /* listener */) const { |
| 294 const void* p = &x; | 370 const void* p = &x; |
| 295 return p == &bar || x == 0; | 371 return p == &bar || x == 0; |
| 296 } | 372 } |
| 297 | 373 |
| 298 void DescribeTo(::std::ostream* os) const { *os << "bar or zero"; } | 374 void DescribeTo(::std::ostream* os) const { *os << "bar or zero"; } |
| 299 | 375 |
| 300 void DescribeNegationTo(::std::ostream* os) const { | 376 void DescribeNegationTo(::std::ostream* os) const { |
| 301 *os << "doesn't reference bar and is not zero"; | 377 *os << "doesn't reference bar and is not zero"; |
| 302 } | 378 } |
| 303 }; | 379 }; |
| 304 | 380 |
| 305 // This function verifies that MakePolymorphicMatcher() returns a | 381 // This function verifies that MakePolymorphicMatcher() returns a |
| 306 // PolymorphicMatcher<T> where T is the argument's type. | 382 // PolymorphicMatcher<T> where T is the argument's type. |
| 307 PolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { | 383 PolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { |
| 308 return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); | 384 return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); |
| 309 } | 385 } |
| 310 | 386 |
| 311 TEST(MakePolymorphicMatcherTest, ConstructsMatcherFromImpl) { | 387 TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { |
| 312 // Using a polymorphic matcher to match a reference type. | 388 // Using a polymorphic matcher to match a reference type. |
| 313 Matcher<const int&> m1 = ReferencesBarOrIsZero(); | 389 Matcher<const int&> m1 = ReferencesBarOrIsZero(); |
| 314 EXPECT_TRUE(m1.Matches(0)); | 390 EXPECT_TRUE(m1.Matches(0)); |
| 315 // Verifies that the identity of a by-reference argument is preserved. | 391 // Verifies that the identity of a by-reference argument is preserved. |
| 316 EXPECT_TRUE(m1.Matches(bar)); | 392 EXPECT_TRUE(m1.Matches(bar)); |
| 317 EXPECT_FALSE(m1.Matches(1)); | 393 EXPECT_FALSE(m1.Matches(1)); |
| 318 EXPECT_EQ("bar or zero", Describe(m1)); | 394 EXPECT_EQ("bar or zero", Describe(m1)); |
| 319 | 395 |
| 320 // Using a polymorphic matcher to match a value type. | 396 // Using a polymorphic matcher to match a value type. |
| 321 Matcher<double> m2 = ReferencesBarOrIsZero(); | 397 Matcher<double> m2 = ReferencesBarOrIsZero(); |
| 322 EXPECT_TRUE(m2.Matches(0.0)); | 398 EXPECT_TRUE(m2.Matches(0.0)); |
| 323 EXPECT_FALSE(m2.Matches(0.1)); | 399 EXPECT_FALSE(m2.Matches(0.1)); |
| 324 EXPECT_EQ("bar or zero", Describe(m2)); | 400 EXPECT_EQ("bar or zero", Describe(m2)); |
| 325 } | 401 } |
| 326 | 402 |
| 403 // Tests implementing a polymorphic matcher using MatchAndExplain(). |
| 404 |
| 405 class PolymorphicIsEvenImpl { |
| 406 public: |
| 407 void DescribeTo(::std::ostream* os) const { *os << "is even"; } |
| 408 |
| 409 void DescribeNegationTo(::std::ostream* os) const { |
| 410 *os << "is odd"; |
| 411 } |
| 412 |
| 413 template <typename T> |
| 414 bool MatchAndExplain(const T& x, MatchResultListener* listener) const { |
| 415 // Verifies that we can stream to the listener directly. |
| 416 *listener << "% " << 2; |
| 417 if (listener->stream() != NULL) { |
| 418 // Verifies that we can stream to the listener's underlying stream |
| 419 // too. |
| 420 *listener->stream() << " == " << (x % 2); |
| 421 } |
| 422 return (x % 2) == 0; |
| 423 } |
| 424 }; |
| 425 |
| 426 PolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() { |
| 427 return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); |
| 428 } |
| 429 |
| 430 TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { |
| 431 // Using PolymorphicIsEven() as a Matcher<int>. |
| 432 const Matcher<int> m1 = PolymorphicIsEven(); |
| 433 EXPECT_TRUE(m1.Matches(42)); |
| 434 EXPECT_FALSE(m1.Matches(43)); |
| 435 EXPECT_EQ("is even", Describe(m1)); |
| 436 |
| 437 const Matcher<int> not_m1 = Not(m1); |
| 438 EXPECT_EQ("is odd", Describe(not_m1)); |
| 439 |
| 440 EXPECT_EQ("% 2 == 0", Explain(m1, 42)); |
| 441 |
| 442 // Using PolymorphicIsEven() as a Matcher<char>. |
| 443 const Matcher<char> m2 = PolymorphicIsEven(); |
| 444 EXPECT_TRUE(m2.Matches('\x42')); |
| 445 EXPECT_FALSE(m2.Matches('\x43')); |
| 446 EXPECT_EQ("is even", Describe(m2)); |
| 447 |
| 448 const Matcher<char> not_m2 = Not(m2); |
| 449 EXPECT_EQ("is odd", Describe(not_m2)); |
| 450 |
| 451 EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); |
| 452 } |
| 453 |
| 327 // Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. | 454 // Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. |
| 328 TEST(MatcherCastTest, FromPolymorphicMatcher) { | 455 TEST(MatcherCastTest, FromPolymorphicMatcher) { |
| 329 Matcher<int> m = MatcherCast<int>(Eq(5)); | 456 Matcher<int> m = MatcherCast<int>(Eq(5)); |
| 330 EXPECT_TRUE(m.Matches(5)); | 457 EXPECT_TRUE(m.Matches(5)); |
| 331 EXPECT_FALSE(m.Matches(6)); | 458 EXPECT_FALSE(m.Matches(6)); |
| 332 } | 459 } |
| 333 | 460 |
| 334 // For testing casting matchers between compatible types. | 461 // For testing casting matchers between compatible types. |
| 335 class IntValue { | 462 class IntValue { |
| 336 public: | 463 public: |
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 ", or has a second field that is not equal to 42", | 1170 ", or has a second field that is not equal to 42", |
| 1044 DescribeNegation(m1)); | 1171 DescribeNegation(m1)); |
| 1045 // Double and triple negation (1 or 2 times not and description of negation). | 1172 // Double and triple negation (1 or 2 times not and description of negation). |
| 1046 Matcher<const std::pair<int, int>&> m2 = Not(Pair(Not(13), 42)); | 1173 Matcher<const std::pair<int, int>&> m2 = Not(Pair(Not(13), 42)); |
| 1047 EXPECT_EQ("has a first field that is not equal to 13" | 1174 EXPECT_EQ("has a first field that is not equal to 13" |
| 1048 ", and has a second field that is equal to 42", | 1175 ", and has a second field that is equal to 42", |
| 1049 DescribeNegation(m2)); | 1176 DescribeNegation(m2)); |
| 1050 } | 1177 } |
| 1051 | 1178 |
| 1052 TEST(PairTest, CanExplainMatchResultTo) { | 1179 TEST(PairTest, CanExplainMatchResultTo) { |
| 1053 const Matcher<std::pair<int, int> > m0 = Pair(0, 0); | 1180 // If neither field matches, Pair() should explain about the first |
| 1054 EXPECT_EQ("", Explain(m0, std::make_pair(25, 42))); | 1181 // field. |
| 1182 const Matcher<std::pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0)); |
| 1183 EXPECT_EQ("whose first field does not match, which is 1 less than 0", |
| 1184 Explain(m, std::make_pair(-1, -2))); |
| 1055 | 1185 |
| 1056 const Matcher<std::pair<int, int> > m1 = Pair(GreaterThan(0), 0); | 1186 // If the first field matches but the second doesn't, Pair() should |
| 1057 EXPECT_EQ("the first field is 25 more than 0", | 1187 // explain about the second field. |
| 1058 Explain(m1, std::make_pair(25, 42))); | 1188 EXPECT_EQ("whose second field does not match, which is 2 less than 0", |
| 1189 Explain(m, std::make_pair(1, -2))); |
| 1059 | 1190 |
| 1060 const Matcher<std::pair<int, int> > m2 = Pair(0, GreaterThan(0)); | 1191 // If the first field doesn't match but the second does, Pair() |
| 1061 EXPECT_EQ("the second field is 42 more than 0", | 1192 // should explain about the first field. |
| 1062 Explain(m2, std::make_pair(25, 42))); | 1193 EXPECT_EQ("whose first field does not match, which is 1 less than 0", |
| 1194 Explain(m, std::make_pair(-1, 2))); |
| 1063 | 1195 |
| 1064 const Matcher<std::pair<int, int> > m3 = Pair(GreaterThan(0), GreaterThan(0)); | 1196 // If both fields match, Pair() should explain about them both. |
| 1065 EXPECT_EQ("the first field is 25 more than 0" | 1197 EXPECT_EQ("whose both fields match, where the first field is a value " |
| 1066 ", and the second field is 42 more than 0", | 1198 "which is 1 more than 0, and the second field is a value " |
| 1067 Explain(m3, std::make_pair(25, 42))); | 1199 "which is 2 more than 0", |
| 1200 Explain(m, std::make_pair(1, 2))); |
| 1201 |
| 1202 // If only the first match has an explanation, only this explanation should |
| 1203 // be printed. |
| 1204 const Matcher<std::pair<int, int> > explain_first = Pair(GreaterThan(0), 0); |
| 1205 EXPECT_EQ("whose both fields match, where the first field is a value " |
| 1206 "which is 1 more than 0", |
| 1207 Explain(explain_first, std::make_pair(1, 0))); |
| 1208 |
| 1209 // If only the second match has an explanation, only this explanation should |
| 1210 // be printed. |
| 1211 const Matcher<std::pair<int, int> > explain_second = Pair(0, GreaterThan(0)); |
| 1212 EXPECT_EQ("whose both fields match, where the second field is a value " |
| 1213 "which is 1 more than 0", |
| 1214 Explain(explain_second, std::make_pair(0, 1))); |
| 1068 } | 1215 } |
| 1069 | 1216 |
| 1070 TEST(PairTest, MatchesCorrectly) { | 1217 TEST(PairTest, MatchesCorrectly) { |
| 1071 std::pair<int, std::string> p(25, "foo"); | 1218 std::pair<int, std::string> p(25, "foo"); |
| 1072 | 1219 |
| 1073 // Both fields match. | 1220 // Both fields match. |
| 1074 EXPECT_THAT(p, Pair(25, "foo")); | 1221 EXPECT_THAT(p, Pair(25, "foo")); |
| 1075 EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); | 1222 EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); |
| 1076 | 1223 |
| 1077 // 'first' doesnt' match, but 'second' matches. | 1224 // 'first' doesnt' match, but 'second' matches. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 EXPECT_TRUE(m2.Matches("Super Hi")); | 1290 EXPECT_TRUE(m2.Matches("Super Hi")); |
| 1144 EXPECT_FALSE(m2.Matches("i")); | 1291 EXPECT_FALSE(m2.Matches("i")); |
| 1145 EXPECT_FALSE(m2.Matches("Hi ")); | 1292 EXPECT_FALSE(m2.Matches("Hi ")); |
| 1146 } | 1293 } |
| 1147 | 1294 |
| 1148 TEST(EndsWithTest, CanDescribeSelf) { | 1295 TEST(EndsWithTest, CanDescribeSelf) { |
| 1149 Matcher<const std::string> m = EndsWith("Hi"); | 1296 Matcher<const std::string> m = EndsWith("Hi"); |
| 1150 EXPECT_EQ("ends with \"Hi\"", Describe(m)); | 1297 EXPECT_EQ("ends with \"Hi\"", Describe(m)); |
| 1151 } | 1298 } |
| 1152 | 1299 |
| 1153 #ifdef GMOCK_HAS_REGEX | |
| 1154 | |
| 1155 // Tests MatchesRegex(). | 1300 // Tests MatchesRegex(). |
| 1156 | 1301 |
| 1157 TEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { | 1302 TEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { |
| 1158 const Matcher<const char*> m1 = MatchesRegex("a.*z"); | 1303 const Matcher<const char*> m1 = MatchesRegex("a.*z"); |
| 1159 EXPECT_TRUE(m1.Matches("az")); | 1304 EXPECT_TRUE(m1.Matches("az")); |
| 1160 EXPECT_TRUE(m1.Matches("abcz")); | 1305 EXPECT_TRUE(m1.Matches("abcz")); |
| 1161 EXPECT_FALSE(m1.Matches(NULL)); | 1306 EXPECT_FALSE(m1.Matches(NULL)); |
| 1162 | 1307 |
| 1163 const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); | 1308 const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); |
| 1164 EXPECT_TRUE(m2.Matches("azbz")); | 1309 EXPECT_TRUE(m2.Matches("azbz")); |
| 1165 EXPECT_FALSE(m2.Matches("az1")); | 1310 EXPECT_FALSE(m2.Matches("az1")); |
| 1166 EXPECT_FALSE(m2.Matches("1az")); | 1311 EXPECT_FALSE(m2.Matches("1az")); |
| 1167 } | 1312 } |
| 1168 | 1313 |
| 1169 TEST(MatchesRegexTest, CanDescribeSelf) { | 1314 TEST(MatchesRegexTest, CanDescribeSelf) { |
| 1170 Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); | 1315 Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); |
| 1171 EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); | 1316 EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); |
| 1172 | 1317 |
| 1173 Matcher<const char*> m2 = MatchesRegex(new RE("[a-z].*")); | 1318 Matcher<const char*> m2 = MatchesRegex(new RE("a.*")); |
| 1174 EXPECT_EQ("matches regular expression \"[a-z].*\"", Describe(m2)); | 1319 EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2)); |
| 1175 } | 1320 } |
| 1176 | 1321 |
| 1177 // Tests ContainsRegex(). | 1322 // Tests ContainsRegex(). |
| 1178 | 1323 |
| 1179 TEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { | 1324 TEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { |
| 1180 const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); | 1325 const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); |
| 1181 EXPECT_TRUE(m1.Matches("az")); | 1326 EXPECT_TRUE(m1.Matches("az")); |
| 1182 EXPECT_TRUE(m1.Matches("0abcz1")); | 1327 EXPECT_TRUE(m1.Matches("0abcz1")); |
| 1183 EXPECT_FALSE(m1.Matches(NULL)); | 1328 EXPECT_FALSE(m1.Matches(NULL)); |
| 1184 | 1329 |
| 1185 const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); | 1330 const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); |
| 1186 EXPECT_TRUE(m2.Matches("azbz")); | 1331 EXPECT_TRUE(m2.Matches("azbz")); |
| 1187 EXPECT_TRUE(m2.Matches("az1")); | 1332 EXPECT_TRUE(m2.Matches("az1")); |
| 1188 EXPECT_FALSE(m2.Matches("1a")); | 1333 EXPECT_FALSE(m2.Matches("1a")); |
| 1189 } | 1334 } |
| 1190 | 1335 |
| 1191 TEST(ContainsRegexTest, CanDescribeSelf) { | 1336 TEST(ContainsRegexTest, CanDescribeSelf) { |
| 1192 Matcher<const std::string> m1 = ContainsRegex("Hi.*"); | 1337 Matcher<const std::string> m1 = ContainsRegex("Hi.*"); |
| 1193 EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); | 1338 EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); |
| 1194 | 1339 |
| 1195 Matcher<const char*> m2 = ContainsRegex(new RE("[a-z].*")); | 1340 Matcher<const char*> m2 = ContainsRegex(new RE("a.*")); |
| 1196 EXPECT_EQ("contains regular expression \"[a-z].*\"", Describe(m2)); | 1341 EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2)); |
| 1197 } | 1342 } |
| 1198 #endif // GMOCK_HAS_REGEX | |
| 1199 | 1343 |
| 1200 // Tests for wide strings. | 1344 // Tests for wide strings. |
| 1201 #if GTEST_HAS_STD_WSTRING | 1345 #if GTEST_HAS_STD_WSTRING |
| 1202 TEST(StdWideStrEqTest, MatchesEqual) { | 1346 TEST(StdWideStrEqTest, MatchesEqual) { |
| 1203 Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); | 1347 Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); |
| 1204 EXPECT_TRUE(m.Matches(L"Hello")); | 1348 EXPECT_TRUE(m.Matches(L"Hello")); |
| 1205 EXPECT_FALSE(m.Matches(L"hello")); | 1349 EXPECT_FALSE(m.Matches(L"hello")); |
| 1206 EXPECT_FALSE(m.Matches(NULL)); | 1350 EXPECT_FALSE(m.Matches(NULL)); |
| 1207 | 1351 |
| 1208 Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); | 1352 Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1942 const Matcher<int> is_zero = Eq(0); | 2086 const Matcher<int> is_zero = Eq(0); |
| 1943 EXPECT_TRUE(Value(0, is_zero)); | 2087 EXPECT_TRUE(Value(0, is_zero)); |
| 1944 EXPECT_FALSE(Value('a', is_zero)); | 2088 EXPECT_FALSE(Value('a', is_zero)); |
| 1945 | 2089 |
| 1946 int n = 0; | 2090 int n = 0; |
| 1947 const Matcher<const int&> ref_n = Ref(n); | 2091 const Matcher<const int&> ref_n = Ref(n); |
| 1948 EXPECT_TRUE(Value(n, ref_n)); | 2092 EXPECT_TRUE(Value(n, ref_n)); |
| 1949 EXPECT_FALSE(Value(1, ref_n)); | 2093 EXPECT_FALSE(Value(1, ref_n)); |
| 1950 } | 2094 } |
| 1951 | 2095 |
| 2096 TEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) { |
| 2097 StringMatchResultListener listener1; |
| 2098 EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1)); |
| 2099 EXPECT_EQ("% 2 == 0", listener1.str()); |
| 2100 |
| 2101 StringMatchResultListener listener2; |
| 2102 EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2)); |
| 2103 EXPECT_EQ("", listener2.str()); |
| 2104 } |
| 2105 |
| 2106 TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) { |
| 2107 const Matcher<int> is_even = PolymorphicIsEven(); |
| 2108 StringMatchResultListener listener1; |
| 2109 EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1)); |
| 2110 EXPECT_EQ("% 2 == 0", listener1.str()); |
| 2111 |
| 2112 const Matcher<const double&> is_zero = Eq(0); |
| 2113 StringMatchResultListener listener2; |
| 2114 EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2)); |
| 2115 EXPECT_EQ("", listener2.str()); |
| 2116 } |
| 2117 |
| 2118 MATCHER_P(Really, inner_matcher, "") { |
| 2119 return ExplainMatchResult(inner_matcher, arg, result_listener); |
| 2120 } |
| 2121 |
| 2122 TEST(ExplainMatchResultTest, WorksInsideMATCHER) { |
| 2123 EXPECT_THAT(0, Really(Eq(0))); |
| 2124 } |
| 2125 |
| 1952 TEST(AllArgsTest, WorksForTuple) { | 2126 TEST(AllArgsTest, WorksForTuple) { |
| 1953 EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); | 2127 EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); |
| 1954 EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); | 2128 EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); |
| 1955 } | 2129 } |
| 1956 | 2130 |
| 1957 TEST(AllArgsTest, WorksForNonTuple) { | 2131 TEST(AllArgsTest, WorksForNonTuple) { |
| 1958 EXPECT_THAT(42, AllArgs(Gt(0))); | 2132 EXPECT_THAT(42, AllArgs(Gt(0))); |
| 1959 EXPECT_THAT('a', Not(AllArgs(Eq('b')))); | 2133 EXPECT_THAT('a', Not(AllArgs(Eq('b')))); |
| 1960 } | 2134 } |
| 1961 | 2135 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2034 "Actual: 0 (is located @"); | 2208 "Actual: 0 (is located @"); |
| 2035 } | 2209 } |
| 2036 | 2210 |
| 2037 #if !GTEST_OS_SYMBIAN | 2211 #if !GTEST_OS_SYMBIAN |
| 2038 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is | 2212 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is |
| 2039 // monomorphic. | 2213 // monomorphic. |
| 2040 | 2214 |
| 2041 // ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's | 2215 // ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's |
| 2042 // Symbian compiler: it tries to compile | 2216 // Symbian compiler: it tries to compile |
| 2043 // template<T, U> class MatcherCastImpl { ... | 2217 // template<T, U> class MatcherCastImpl { ... |
| 2044 // virtual bool Matches(T x) const { | 2218 // virtual bool MatchAndExplain(T x, ...) const { |
| 2045 // return source_matcher_.Matches(static_cast<U>(x)); | 2219 // return source_matcher_.MatchAndExplain(static_cast<U>(x), ...); |
| 2046 // with U == string and T == const char* | 2220 // with U == string and T == const char* |
| 2047 // With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... ) | 2221 // With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... ) |
| 2048 // the compiler silently crashes with no output. | 2222 // the compiler silently crashes with no output. |
| 2049 // If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x) | 2223 // If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x) |
| 2050 // the code compiles but the converted string is bogus. | 2224 // the code compiles but the converted string is bogus. |
| 2051 TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { | 2225 TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { |
| 2052 Matcher<const char*> starts_with_he = StartsWith("he"); | 2226 Matcher<const char*> starts_with_he = StartsWith("he"); |
| 2053 ASSERT_THAT("hello", starts_with_he); | 2227 ASSERT_THAT("hello", starts_with_he); |
| 2054 | 2228 |
| 2055 Matcher<const string&> ends_with_ok = EndsWith("ok"); | 2229 Matcher<const string&> ends_with_ok = EndsWith("ok"); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2378 DescribeNegation(m)); | 2552 DescribeNegation(m)); |
| 2379 } | 2553 } |
| 2380 | 2554 |
| 2381 TEST(PointeeTest, CanExplainMatchResult) { | 2555 TEST(PointeeTest, CanExplainMatchResult) { |
| 2382 const Matcher<const string*> m = Pointee(StartsWith("Hi")); | 2556 const Matcher<const string*> m = Pointee(StartsWith("Hi")); |
| 2383 | 2557 |
| 2384 EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); | 2558 EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); |
| 2385 | 2559 |
| 2386 const Matcher<int*> m2 = Pointee(GreaterThan(1)); | 2560 const Matcher<int*> m2 = Pointee(GreaterThan(1)); |
| 2387 int n = 3; | 2561 int n = 3; |
| 2388 EXPECT_EQ("points to a value that is 2 more than 1", Explain(m2, &n)); | 2562 EXPECT_EQ("which points to 3, which is 2 more than 1", |
| 2563 Explain(m2, &n)); |
| 2564 } |
| 2565 |
| 2566 TEST(PointeeTest, AlwaysExplainsPointee) { |
| 2567 const Matcher<int*> m = Pointee(0); |
| 2568 int n = 42; |
| 2569 EXPECT_EQ("which points to 42", Explain(m, &n)); |
| 2389 } | 2570 } |
| 2390 | 2571 |
| 2391 // An uncopyable class. | 2572 // An uncopyable class. |
| 2392 class Uncopyable { | 2573 class Uncopyable { |
| 2393 public: | 2574 public: |
| 2394 explicit Uncopyable(int a_value) : value_(a_value) {} | 2575 explicit Uncopyable(int a_value) : value_(a_value) {} |
| 2395 | 2576 |
| 2396 int value() const { return value_; } | 2577 int value() const { return value_; } |
| 2397 private: | 2578 private: |
| 2398 const int value_; | 2579 const int value_; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2505 AStruct a; | 2686 AStruct a; |
| 2506 EXPECT_TRUE(m.Matches(a)); | 2687 EXPECT_TRUE(m.Matches(a)); |
| 2507 a.x = -1; | 2688 a.x = -1; |
| 2508 EXPECT_FALSE(m.Matches(a)); | 2689 EXPECT_FALSE(m.Matches(a)); |
| 2509 } | 2690 } |
| 2510 | 2691 |
| 2511 // Tests that Field() can describe itself. | 2692 // Tests that Field() can describe itself. |
| 2512 TEST(FieldTest, CanDescribeSelf) { | 2693 TEST(FieldTest, CanDescribeSelf) { |
| 2513 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); | 2694 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); |
| 2514 | 2695 |
| 2515 EXPECT_EQ("the given field is greater than or equal to 0", Describe(m)); | 2696 EXPECT_EQ("is an object whose given field is greater than or equal to 0", |
| 2516 EXPECT_EQ("the given field is not greater than or equal to 0", | 2697 Describe(m)); |
| 2698 EXPECT_EQ("is an object whose given field is not greater than or equal to 0", |
| 2517 DescribeNegation(m)); | 2699 DescribeNegation(m)); |
| 2518 } | 2700 } |
| 2519 | 2701 |
| 2520 // Tests that Field() can explain the match result. | 2702 // Tests that Field() can explain the match result. |
| 2521 TEST(FieldTest, CanExplainMatchResult) { | 2703 TEST(FieldTest, CanExplainMatchResult) { |
| 2522 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); | 2704 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); |
| 2523 | 2705 |
| 2524 AStruct a; | 2706 AStruct a; |
| 2525 a.x = 1; | 2707 a.x = 1; |
| 2526 EXPECT_EQ("", Explain(m, a)); | 2708 EXPECT_EQ("whose given field is 1", Explain(m, a)); |
| 2527 | 2709 |
| 2528 m = Field(&AStruct::x, GreaterThan(0)); | 2710 m = Field(&AStruct::x, GreaterThan(0)); |
| 2529 EXPECT_EQ("the given field is 1 more than 0", Explain(m, a)); | 2711 EXPECT_EQ("whose given field is 1, which is 1 more than 0", Explain(m, a)); |
| 2530 } | 2712 } |
| 2531 | 2713 |
| 2532 // Tests that Field() works when the argument is a pointer to const. | 2714 // Tests that Field() works when the argument is a pointer to const. |
| 2533 TEST(FieldForPointerTest, WorksForPointerToConst) { | 2715 TEST(FieldForPointerTest, WorksForPointerToConst) { |
| 2534 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); | 2716 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); |
| 2535 | 2717 |
| 2536 AStruct a; | 2718 AStruct a; |
| 2537 EXPECT_TRUE(m.Matches(&a)); | 2719 EXPECT_TRUE(m.Matches(&a)); |
| 2538 a.x = -1; | 2720 a.x = -1; |
| 2539 EXPECT_FALSE(m.Matches(&a)); | 2721 EXPECT_FALSE(m.Matches(&a)); |
| 2540 } | 2722 } |
| 2541 | 2723 |
| 2542 // Tests that Field() works when the argument is a pointer to non-const. | 2724 // Tests that Field() works when the argument is a pointer to non-const. |
| 2543 TEST(FieldForPointerTest, WorksForPointerToNonConst) { | 2725 TEST(FieldForPointerTest, WorksForPointerToNonConst) { |
| 2544 Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); | 2726 Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); |
| 2545 | 2727 |
| 2546 AStruct a; | 2728 AStruct a; |
| 2547 EXPECT_TRUE(m.Matches(&a)); | 2729 EXPECT_TRUE(m.Matches(&a)); |
| 2548 a.x = -1; | 2730 a.x = -1; |
| 2549 EXPECT_FALSE(m.Matches(&a)); | 2731 EXPECT_FALSE(m.Matches(&a)); |
| 2550 } | 2732 } |
| 2551 | 2733 |
| 2734 // Tests that Field() works when the argument is a reference to a const pointer. |
| 2735 TEST(FieldForPointerTest, WorksForReferenceToConstPointer) { |
| 2736 Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0)); |
| 2737 |
| 2738 AStruct a; |
| 2739 EXPECT_TRUE(m.Matches(&a)); |
| 2740 a.x = -1; |
| 2741 EXPECT_FALSE(m.Matches(&a)); |
| 2742 } |
| 2743 |
| 2552 // Tests that Field() does not match the NULL pointer. | 2744 // Tests that Field() does not match the NULL pointer. |
| 2553 TEST(FieldForPointerTest, DoesNotMatchNull) { | 2745 TEST(FieldForPointerTest, DoesNotMatchNull) { |
| 2554 Matcher<const AStruct*> m = Field(&AStruct::x, _); | 2746 Matcher<const AStruct*> m = Field(&AStruct::x, _); |
| 2555 EXPECT_FALSE(m.Matches(NULL)); | 2747 EXPECT_FALSE(m.Matches(NULL)); |
| 2556 } | 2748 } |
| 2557 | 2749 |
| 2558 // Tests that Field(&Foo::field, ...) works when the argument's type | 2750 // Tests that Field(&Foo::field, ...) works when the argument's type |
| 2559 // is a sub-type of const Foo*. | 2751 // is a sub-type of const Foo*. |
| 2560 TEST(FieldForPointerTest, WorksForArgumentOfSubType) { | 2752 TEST(FieldForPointerTest, WorksForArgumentOfSubType) { |
| 2561 // Note that the matcher expects DerivedStruct but we say AStruct | 2753 // Note that the matcher expects DerivedStruct but we say AStruct |
| 2562 // inside Field(). | 2754 // inside Field(). |
| 2563 Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); | 2755 Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); |
| 2564 | 2756 |
| 2565 DerivedStruct d; | 2757 DerivedStruct d; |
| 2566 EXPECT_TRUE(m.Matches(&d)); | 2758 EXPECT_TRUE(m.Matches(&d)); |
| 2567 d.x = -1; | 2759 d.x = -1; |
| 2568 EXPECT_FALSE(m.Matches(&d)); | 2760 EXPECT_FALSE(m.Matches(&d)); |
| 2569 } | 2761 } |
| 2570 | 2762 |
| 2571 // Tests that Field() can describe itself when used to match a pointer. | 2763 // Tests that Field() can describe itself when used to match a pointer. |
| 2572 TEST(FieldForPointerTest, CanDescribeSelf) { | 2764 TEST(FieldForPointerTest, CanDescribeSelf) { |
| 2573 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); | 2765 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); |
| 2574 | 2766 |
| 2575 EXPECT_EQ("the given field is greater than or equal to 0", Describe(m)); | 2767 EXPECT_EQ("is an object whose given field is greater than or equal to 0", |
| 2576 EXPECT_EQ("the given field is not greater than or equal to 0", | 2768 Describe(m)); |
| 2769 EXPECT_EQ("is an object whose given field is not greater than or equal to 0", |
| 2577 DescribeNegation(m)); | 2770 DescribeNegation(m)); |
| 2578 } | 2771 } |
| 2579 | 2772 |
| 2580 // Tests that Field() can explain the result of matching a pointer. | 2773 // Tests that Field() can explain the result of matching a pointer. |
| 2581 TEST(FieldForPointerTest, CanExplainMatchResult) { | 2774 TEST(FieldForPointerTest, CanExplainMatchResult) { |
| 2582 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); | 2775 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); |
| 2583 | 2776 |
| 2584 AStruct a; | 2777 AStruct a; |
| 2585 a.x = 1; | 2778 a.x = 1; |
| 2586 EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); | 2779 EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); |
| 2587 EXPECT_EQ("", Explain(m, &a)); | 2780 EXPECT_EQ("which points to an object whose given field is 1", Explain(m, &a)); |
| 2588 | 2781 |
| 2589 m = Field(&AStruct::x, GreaterThan(0)); | 2782 m = Field(&AStruct::x, GreaterThan(0)); |
| 2590 EXPECT_EQ("the given field is 1 more than 0", Explain(m, &a)); | 2783 EXPECT_EQ("which points to an object whose given field is 1, " |
| 2784 "which is 1 more than 0", Explain(m, &a)); |
| 2591 } | 2785 } |
| 2592 | 2786 |
| 2593 // A user-defined class for testing Property(). | 2787 // A user-defined class for testing Property(). |
| 2594 class AClass { | 2788 class AClass { |
| 2595 public: | 2789 public: |
| 2596 AClass() : n_(0) {} | 2790 AClass() : n_(0) {} |
| 2597 | 2791 |
| 2598 // A getter that returns a non-reference. | 2792 // A getter that returns a non-reference. |
| 2599 int n() const { return n_; } | 2793 int n() const { return n_; } |
| 2600 | 2794 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2699 AClass a; | 2893 AClass a; |
| 2700 EXPECT_TRUE(m.Matches(a)); | 2894 EXPECT_TRUE(m.Matches(a)); |
| 2701 a.set_n(-1); | 2895 a.set_n(-1); |
| 2702 EXPECT_FALSE(m.Matches(a)); | 2896 EXPECT_FALSE(m.Matches(a)); |
| 2703 } | 2897 } |
| 2704 | 2898 |
| 2705 // Tests that Property() can describe itself. | 2899 // Tests that Property() can describe itself. |
| 2706 TEST(PropertyTest, CanDescribeSelf) { | 2900 TEST(PropertyTest, CanDescribeSelf) { |
| 2707 Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); | 2901 Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); |
| 2708 | 2902 |
| 2709 EXPECT_EQ("the given property is greater than or equal to 0", Describe(m)); | 2903 EXPECT_EQ("is an object whose given property is greater than or equal to 0", |
| 2710 EXPECT_EQ("the given property is not greater than or equal to 0", | 2904 Describe(m)); |
| 2711 DescribeNegation(m)); | 2905 EXPECT_EQ("is an object whose given property " |
| 2906 "is not greater than or equal to 0", DescribeNegation(m)); |
| 2712 } | 2907 } |
| 2713 | 2908 |
| 2714 // Tests that Property() can explain the match result. | 2909 // Tests that Property() can explain the match result. |
| 2715 TEST(PropertyTest, CanExplainMatchResult) { | 2910 TEST(PropertyTest, CanExplainMatchResult) { |
| 2716 Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); | 2911 Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); |
| 2717 | 2912 |
| 2718 AClass a; | 2913 AClass a; |
| 2719 a.set_n(1); | 2914 a.set_n(1); |
| 2720 EXPECT_EQ("", Explain(m, a)); | 2915 EXPECT_EQ("whose given property is 1", Explain(m, a)); |
| 2721 | 2916 |
| 2722 m = Property(&AClass::n, GreaterThan(0)); | 2917 m = Property(&AClass::n, GreaterThan(0)); |
| 2723 EXPECT_EQ("the given property is 1 more than 0", Explain(m, a)); | 2918 EXPECT_EQ("whose given property is 1, which is 1 more than 0", Explain(m, a)); |
| 2724 } | 2919 } |
| 2725 | 2920 |
| 2726 // Tests that Property() works when the argument is a pointer to const. | 2921 // Tests that Property() works when the argument is a pointer to const. |
| 2727 TEST(PropertyForPointerTest, WorksForPointerToConst) { | 2922 TEST(PropertyForPointerTest, WorksForPointerToConst) { |
| 2728 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); | 2923 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); |
| 2729 | 2924 |
| 2730 AClass a; | 2925 AClass a; |
| 2731 a.set_n(1); | 2926 a.set_n(1); |
| 2732 EXPECT_TRUE(m.Matches(&a)); | 2927 EXPECT_TRUE(m.Matches(&a)); |
| 2733 | 2928 |
| 2734 a.set_n(-1); | 2929 a.set_n(-1); |
| 2735 EXPECT_FALSE(m.Matches(&a)); | 2930 EXPECT_FALSE(m.Matches(&a)); |
| 2736 } | 2931 } |
| 2737 | 2932 |
| 2738 // Tests that Property() works when the argument is a pointer to non-const. | 2933 // Tests that Property() works when the argument is a pointer to non-const. |
| 2739 TEST(PropertyForPointerTest, WorksForPointerToNonConst) { | 2934 TEST(PropertyForPointerTest, WorksForPointerToNonConst) { |
| 2740 Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); | 2935 Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); |
| 2741 | 2936 |
| 2742 AClass a; | 2937 AClass a; |
| 2743 a.set_s("hill"); | 2938 a.set_s("hill"); |
| 2744 EXPECT_TRUE(m.Matches(&a)); | 2939 EXPECT_TRUE(m.Matches(&a)); |
| 2745 | 2940 |
| 2746 a.set_s("hole"); | 2941 a.set_s("hole"); |
| 2747 EXPECT_FALSE(m.Matches(&a)); | 2942 EXPECT_FALSE(m.Matches(&a)); |
| 2748 } | 2943 } |
| 2749 | 2944 |
| 2945 // Tests that Property() works when the argument is a reference to a |
| 2946 // const pointer. |
| 2947 TEST(PropertyForPointerTest, WorksForReferenceToConstPointer) { |
| 2948 Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi")); |
| 2949 |
| 2950 AClass a; |
| 2951 a.set_s("hill"); |
| 2952 EXPECT_TRUE(m.Matches(&a)); |
| 2953 |
| 2954 a.set_s("hole"); |
| 2955 EXPECT_FALSE(m.Matches(&a)); |
| 2956 } |
| 2957 |
| 2750 // Tests that Property() does not match the NULL pointer. | 2958 // Tests that Property() does not match the NULL pointer. |
| 2751 TEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { | 2959 TEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { |
| 2752 Matcher<const AClass*> m = Property(&AClass::x, _); | 2960 Matcher<const AClass*> m = Property(&AClass::x, _); |
| 2753 EXPECT_FALSE(m.Matches(NULL)); | 2961 EXPECT_FALSE(m.Matches(NULL)); |
| 2754 } | 2962 } |
| 2755 | 2963 |
| 2756 // Tests that Property(&Foo::property, ...) works when the argument's | 2964 // Tests that Property(&Foo::property, ...) works when the argument's |
| 2757 // type is a sub-type of const Foo*. | 2965 // type is a sub-type of const Foo*. |
| 2758 TEST(PropertyForPointerTest, WorksForArgumentOfSubType) { | 2966 TEST(PropertyForPointerTest, WorksForArgumentOfSubType) { |
| 2759 // The matcher expects a DerivedClass, but inside the Property() we | 2967 // The matcher expects a DerivedClass, but inside the Property() we |
| 2760 // say AClass. | 2968 // say AClass. |
| 2761 Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); | 2969 Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); |
| 2762 | 2970 |
| 2763 DerivedClass d; | 2971 DerivedClass d; |
| 2764 d.set_n(1); | 2972 d.set_n(1); |
| 2765 EXPECT_TRUE(m.Matches(&d)); | 2973 EXPECT_TRUE(m.Matches(&d)); |
| 2766 | 2974 |
| 2767 d.set_n(-1); | 2975 d.set_n(-1); |
| 2768 EXPECT_FALSE(m.Matches(&d)); | 2976 EXPECT_FALSE(m.Matches(&d)); |
| 2769 } | 2977 } |
| 2770 | 2978 |
| 2771 // Tests that Property() can describe itself when used to match a pointer. | 2979 // Tests that Property() can describe itself when used to match a pointer. |
| 2772 TEST(PropertyForPointerTest, CanDescribeSelf) { | 2980 TEST(PropertyForPointerTest, CanDescribeSelf) { |
| 2773 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); | 2981 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); |
| 2774 | 2982 |
| 2775 EXPECT_EQ("the given property is greater than or equal to 0", Describe(m)); | 2983 EXPECT_EQ("is an object whose given property is greater than or equal to 0", |
| 2776 EXPECT_EQ("the given property is not greater than or equal to 0", | 2984 Describe(m)); |
| 2777 DescribeNegation(m)); | 2985 EXPECT_EQ("is an object whose given property " |
| 2986 "is not greater than or equal to 0", DescribeNegation(m)); |
| 2778 } | 2987 } |
| 2779 | 2988 |
| 2780 // Tests that Property() can explain the result of matching a pointer. | 2989 // Tests that Property() can explain the result of matching a pointer. |
| 2781 TEST(PropertyForPointerTest, CanExplainMatchResult) { | 2990 TEST(PropertyForPointerTest, CanExplainMatchResult) { |
| 2782 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); | 2991 Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); |
| 2783 | 2992 |
| 2784 AClass a; | 2993 AClass a; |
| 2785 a.set_n(1); | 2994 a.set_n(1); |
| 2786 EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); | 2995 EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); |
| 2787 EXPECT_EQ("", Explain(m, &a)); | 2996 EXPECT_EQ("which points to an object whose given property is 1", |
| 2997 Explain(m, &a)); |
| 2788 | 2998 |
| 2789 m = Property(&AClass::n, GreaterThan(0)); | 2999 m = Property(&AClass::n, GreaterThan(0)); |
| 2790 EXPECT_EQ("the given property is 1 more than 0", Explain(m, &a)); | 3000 EXPECT_EQ("which points to an object whose given property is 1, " |
| 3001 "which is 1 more than 0", Explain(m, &a)); |
| 2791 } | 3002 } |
| 2792 | 3003 |
| 2793 // Tests ResultOf. | 3004 // Tests ResultOf. |
| 2794 | 3005 |
| 2795 // Tests that ResultOf(f, ...) compiles and works as expected when f is a | 3006 // Tests that ResultOf(f, ...) compiles and works as expected when f is a |
| 2796 // function pointer. | 3007 // function pointer. |
| 2797 string IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } | 3008 string IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } |
| 2798 | 3009 |
| 2799 TEST(ResultOfTest, WorksForFunctionPointers) { | 3010 TEST(ResultOfTest, WorksForFunctionPointers) { |
| 2800 Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); | 3011 Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); |
| 2801 | 3012 |
| 2802 EXPECT_TRUE(matcher.Matches(1)); | 3013 EXPECT_TRUE(matcher.Matches(1)); |
| 2803 EXPECT_FALSE(matcher.Matches(2)); | 3014 EXPECT_FALSE(matcher.Matches(2)); |
| 2804 } | 3015 } |
| 2805 | 3016 |
| 2806 // Tests that ResultOf() can describe itself. | 3017 // Tests that ResultOf() can describe itself. |
| 2807 TEST(ResultOfTest, CanDescribeItself) { | 3018 TEST(ResultOfTest, CanDescribeItself) { |
| 2808 Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); | 3019 Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); |
| 2809 | 3020 |
| 2810 EXPECT_EQ("result of the given callable is equal to \"foo\"", | 3021 EXPECT_EQ("is mapped by the given callable to a value that " |
| 2811 Describe(matcher)); | 3022 "is equal to \"foo\"", Describe(matcher)); |
| 2812 EXPECT_EQ("result of the given callable is not equal to \"foo\"", | 3023 EXPECT_EQ("is mapped by the given callable to a value that " |
| 2813 DescribeNegation(matcher)); | 3024 "is not equal to \"foo\"", DescribeNegation(matcher)); |
| 2814 } | 3025 } |
| 2815 | 3026 |
| 2816 // Tests that ResultOf() can explain the match result. | 3027 // Tests that ResultOf() can explain the match result. |
| 2817 int IntFunction(int input) { return input == 42 ? 80 : 90; } | 3028 int IntFunction(int input) { return input == 42 ? 80 : 90; } |
| 2818 | 3029 |
| 2819 TEST(ResultOfTest, CanExplainMatchResult) { | 3030 TEST(ResultOfTest, CanExplainMatchResult) { |
| 2820 Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); | 3031 Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); |
| 2821 EXPECT_EQ("", Explain(matcher, 36)); | 3032 EXPECT_EQ("which is mapped by the given callable to 90", |
| 3033 Explain(matcher, 36)); |
| 2822 | 3034 |
| 2823 matcher = ResultOf(&IntFunction, GreaterThan(85)); | 3035 matcher = ResultOf(&IntFunction, GreaterThan(85)); |
| 2824 EXPECT_EQ("result of the given callable is 5 more than 85", | 3036 EXPECT_EQ("which is mapped by the given callable to 90, " |
| 2825 Explain(matcher, 36)); | 3037 "which is 5 more than 85", Explain(matcher, 36)); |
| 2826 } | 3038 } |
| 2827 | 3039 |
| 2828 // Tests that ResultOf(f, ...) compiles and works as expected when f(x) | 3040 // Tests that ResultOf(f, ...) compiles and works as expected when f(x) |
| 2829 // returns a non-reference. | 3041 // returns a non-reference. |
| 2830 TEST(ResultOfTest, WorksForNonReferenceResults) { | 3042 TEST(ResultOfTest, WorksForNonReferenceResults) { |
| 2831 Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); | 3043 Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); |
| 2832 | 3044 |
| 2833 EXPECT_TRUE(matcher.Matches(42)); | 3045 EXPECT_TRUE(matcher.Matches(42)); |
| 2834 EXPECT_FALSE(matcher.Matches(36)); | 3046 EXPECT_FALSE(matcher.Matches(36)); |
| 2835 } | 3047 } |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2951 | 3163 |
| 2952 Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); | 3164 Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); |
| 2953 EXPECT_TRUE(matcher3.Matches(n)); | 3165 EXPECT_TRUE(matcher3.Matches(n)); |
| 2954 EXPECT_FALSE(matcher3.Matches(n2)); | 3166 EXPECT_FALSE(matcher3.Matches(n2)); |
| 2955 } | 3167 } |
| 2956 | 3168 |
| 2957 class DivisibleByImpl { | 3169 class DivisibleByImpl { |
| 2958 public: | 3170 public: |
| 2959 explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} | 3171 explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} |
| 2960 | 3172 |
| 3173 // For testing using ExplainMatchResultTo() with polymorphic matchers. |
| 2961 template <typename T> | 3174 template <typename T> |
| 2962 bool Matches(const T& n) const { | 3175 bool MatchAndExplain(const T& n, MatchResultListener* listener) const { |
| 3176 *listener << "is " << (n % divider_) << " modulo " |
| 3177 << divider_; |
| 2963 return (n % divider_) == 0; | 3178 return (n % divider_) == 0; |
| 2964 } | 3179 } |
| 2965 | 3180 |
| 2966 void DescribeTo(::std::ostream* os) const { | 3181 void DescribeTo(::std::ostream* os) const { |
| 2967 *os << "is divisible by " << divider_; | 3182 *os << "is divisible by " << divider_; |
| 2968 } | 3183 } |
| 2969 | 3184 |
| 2970 void DescribeNegationTo(::std::ostream* os) const { | 3185 void DescribeNegationTo(::std::ostream* os) const { |
| 2971 *os << "is not divisible by " << divider_; | 3186 *os << "is not divisible by " << divider_; |
| 2972 } | 3187 } |
| 2973 | 3188 |
| 2974 void set_divider(int a_divider) { divider_ = a_divider; } | 3189 void set_divider(int a_divider) { divider_ = a_divider; } |
| 2975 int divider() const { return divider_; } | 3190 int divider() const { return divider_; } |
| 2976 | 3191 |
| 2977 private: | 3192 private: |
| 2978 int divider_; | 3193 int divider_; |
| 2979 }; | 3194 }; |
| 2980 | 3195 |
| 2981 // For testing using ExplainMatchResultTo() with polymorphic matchers. | |
| 2982 template <typename T> | |
| 2983 void ExplainMatchResultTo(const DivisibleByImpl& impl, const T& n, | |
| 2984 ::std::ostream* os) { | |
| 2985 *os << "is " << (n % impl.divider()) << " modulo " | |
| 2986 << impl.divider(); | |
| 2987 } | |
| 2988 | |
| 2989 PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { | 3196 PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { |
| 2990 return MakePolymorphicMatcher(DivisibleByImpl(n)); | 3197 return MakePolymorphicMatcher(DivisibleByImpl(n)); |
| 2991 } | 3198 } |
| 2992 | 3199 |
| 2993 // Tests that when AllOf() fails, only the first failing matcher is | 3200 // Tests that when AllOf() fails, only the first failing matcher is |
| 2994 // asked to explain why. | 3201 // asked to explain why. |
| 2995 TEST(ExplainMatchResultTest, AllOf_False_False) { | 3202 TEST(ExplainMatchResultTest, AllOf_False_False) { |
| 2996 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); | 3203 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); |
| 2997 EXPECT_EQ("is 1 modulo 4", Explain(m, 5)); | 3204 EXPECT_EQ("is 1 modulo 4", Explain(m, 5)); |
| 2998 } | 3205 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3018 EXPECT_EQ("is 0 modulo 2; is 0 modulo 3", Explain(m, 6)); | 3225 EXPECT_EQ("is 0 modulo 2; is 0 modulo 3", Explain(m, 6)); |
| 3019 } | 3226 } |
| 3020 | 3227 |
| 3021 TEST(ExplainMatchResultTest, AllOf_True_True_2) { | 3228 TEST(ExplainMatchResultTest, AllOf_True_True_2) { |
| 3022 const Matcher<int> m = AllOf(Ge(2), Le(3)); | 3229 const Matcher<int> m = AllOf(Ge(2), Le(3)); |
| 3023 EXPECT_EQ("", Explain(m, 2)); | 3230 EXPECT_EQ("", Explain(m, 2)); |
| 3024 } | 3231 } |
| 3025 | 3232 |
| 3026 TEST(ExplainmatcherResultTest, MonomorphicMatcher) { | 3233 TEST(ExplainmatcherResultTest, MonomorphicMatcher) { |
| 3027 const Matcher<int> m = GreaterThan(5); | 3234 const Matcher<int> m = GreaterThan(5); |
| 3028 EXPECT_EQ("is 1 more than 5", Explain(m, 6)); | 3235 EXPECT_EQ("which is 1 more than 5", Explain(m, 6)); |
| 3029 } | 3236 } |
| 3030 | 3237 |
| 3031 // The following two tests verify that values without a public copy | 3238 // The following two tests verify that values without a public copy |
| 3032 // ctor can be used as arguments to matchers like Eq(), Ge(), and etc | 3239 // ctor can be used as arguments to matchers like Eq(), Ge(), and etc |
| 3033 // with the help of ByRef(). | 3240 // with the help of ByRef(). |
| 3034 | 3241 |
| 3035 class NotCopyable { | 3242 class NotCopyable { |
| 3036 public: | 3243 public: |
| 3037 explicit NotCopyable(int a_value) : value_(a_value) {} | 3244 explicit NotCopyable(int a_value) : value_(a_value) {} |
| 3038 | 3245 |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3328 ElementsAre()); | 3535 ElementsAre()); |
| 3329 } | 3536 } |
| 3330 | 3537 |
| 3331 TEST(ValidateMatcherDescriptionTest, | 3538 TEST(ValidateMatcherDescriptionTest, |
| 3332 AcceptsNonEmptyDescriptionWithNoInterpolation) { | 3539 AcceptsNonEmptyDescriptionWithNoInterpolation) { |
| 3333 const char* params[] = { "foo", "bar", NULL }; | 3540 const char* params[] = { "foo", "bar", NULL }; |
| 3334 EXPECT_THAT(ValidateMatcherDescription(params, "a simple description"), | 3541 EXPECT_THAT(ValidateMatcherDescription(params, "a simple description"), |
| 3335 ElementsAre()); | 3542 ElementsAre()); |
| 3336 } | 3543 } |
| 3337 | 3544 |
| 3545 // The MATCHER*() macros trigger warning C4100 (unreferenced formal |
| 3546 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in |
| 3547 // the macro definition, as the warnings are generated when the macro |
| 3548 // is expanded and macro expansion cannot contain #pragma. Therefore |
| 3549 // we suppress them here. |
| 3550 #ifdef _MSC_VER |
| 3551 #pragma warning(push) |
| 3552 #pragma warning(disable:4100) |
| 3553 #endif |
| 3554 |
| 3338 // We use MATCHER_P3() to define a matcher for testing | 3555 // We use MATCHER_P3() to define a matcher for testing |
| 3339 // ValidateMatcherDescription(); otherwise we'll end up with much | 3556 // ValidateMatcherDescription(); otherwise we'll end up with much |
| 3340 // plumbing code. This is not circular as | 3557 // plumbing code. This is not circular as |
| 3341 // ValidateMatcherDescription() doesn't affect whether the matcher | 3558 // ValidateMatcherDescription() doesn't affect whether the matcher |
| 3342 // matches a value or not. | 3559 // matches a value or not. |
| 3343 MATCHER_P3(EqInterpolation, start, end, index, "equals Interpolation%(*)s") { | 3560 MATCHER_P3(EqInterpolation, start, end, index, "equals Interpolation%(*)s") { |
| 3344 return arg.start_pos == start && arg.end_pos == end && | 3561 return arg.start_pos == start && arg.end_pos == end && |
| 3345 arg.param_index == index; | 3562 arg.param_index == index; |
| 3346 } | 3563 } |
| 3347 | 3564 |
| 3565 #ifdef _MSC_VER |
| 3566 #pragma warning(pop) |
| 3567 #endif |
| 3568 |
| 3348 TEST(ValidateMatcherDescriptionTest, AcceptsPercentInterpolation) { | 3569 TEST(ValidateMatcherDescriptionTest, AcceptsPercentInterpolation) { |
| 3349 const char* params[] = { "foo", NULL }; | 3570 const char* params[] = { "foo", NULL }; |
| 3350 const char* const desc = "one %%"; | 3571 const char* const desc = "one %%"; |
| 3351 EXPECT_THAT(ValidateMatcherDescription(params, desc), | 3572 EXPECT_THAT(ValidateMatcherDescription(params, desc), |
| 3352 ElementsAre(EqInterpolation(desc + 4, desc + 6, | 3573 ElementsAre(EqInterpolation(desc + 4, desc + 6, |
| 3353 kPercentInterpolation))); | 3574 kPercentInterpolation))); |
| 3354 } | 3575 } |
| 3355 | 3576 |
| 3356 TEST(ValidateMatcherDescriptionTest, AcceptsTupleInterpolation) { | 3577 TEST(ValidateMatcherDescriptionTest, AcceptsTupleInterpolation) { |
| 3357 const char* params[] = { "foo", "bar", "baz", NULL }; | 3578 const char* params[] = { "foo", "bar", "baz", NULL }; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3569 | 3790 |
| 3570 // Tests PolymorphicMatcher::impl(). | 3791 // Tests PolymorphicMatcher::impl(). |
| 3571 TEST(PolymorphicMatcherTest, CanAccessImpl) { | 3792 TEST(PolymorphicMatcherTest, CanAccessImpl) { |
| 3572 const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); | 3793 const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); |
| 3573 const DivisibleByImpl& impl = m.impl(); | 3794 const DivisibleByImpl& impl = m.impl(); |
| 3574 EXPECT_EQ(42, impl.divider()); | 3795 EXPECT_EQ(42, impl.divider()); |
| 3575 } | 3796 } |
| 3576 | 3797 |
| 3577 } // namespace gmock_matchers_test | 3798 } // namespace gmock_matchers_test |
| 3578 } // namespace testing | 3799 } // namespace testing |
| OLD | NEW |