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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 // MatcherInterface<T> interface, and | 57 // MatcherInterface<T> interface, and |
58 // 2. a factory function that creates a Matcher<T> object from a | 58 // 2. a factory function that creates a Matcher<T> object from a |
59 // FooMatcherImpl*. | 59 // FooMatcherImpl*. |
60 // | 60 // |
61 // The two-level delegation design makes it possible to allow a user | 61 // The two-level delegation design makes it possible to allow a user |
62 // to write "v" instead of "Eq(v)" where a Matcher is expected, which | 62 // to write "v" instead of "Eq(v)" where a Matcher is expected, which |
63 // is impossible if we pass matchers by pointers. It also eases | 63 // is impossible if we pass matchers by pointers. It also eases |
64 // ownership management as Matcher objects can now be copied like | 64 // ownership management as Matcher objects can now be copied like |
65 // plain values. | 65 // plain values. |
66 | 66 |
| 67 // MatchResultListener is an abstract class. Its << operator can be |
| 68 // used by a matcher to explain why a value matches or doesn't match. |
| 69 // |
| 70 // TODO(wan@google.com): add method |
| 71 // bool InterestedInWhy(bool result) const; |
| 72 // to indicate whether the listener is interested in why the match |
| 73 // result is 'result'. |
| 74 class MatchResultListener { |
| 75 public: |
| 76 // Creates a listener object with the given underlying ostream. The |
| 77 // listener does not own the ostream. |
| 78 explicit MatchResultListener(::std::ostream* os) : stream_(os) {} |
| 79 virtual ~MatchResultListener() = 0; // Makes this class abstract. |
| 80 |
| 81 // Streams x to the underlying ostream; does nothing if the ostream |
| 82 // is NULL. |
| 83 template <typename T> |
| 84 MatchResultListener& operator<<(const T& x) { |
| 85 if (stream_ != NULL) |
| 86 *stream_ << x; |
| 87 return *this; |
| 88 } |
| 89 |
| 90 // Returns the underlying ostream. |
| 91 ::std::ostream* stream() { return stream_; } |
| 92 |
| 93 // Returns true iff the listener is interested in an explanation of |
| 94 // the match result. A matcher's MatchAndExplain() method can use |
| 95 // this information to avoid generating the explanation when no one |
| 96 // intends to hear it. |
| 97 bool IsInterested() const { return stream_ != NULL; } |
| 98 |
| 99 private: |
| 100 ::std::ostream* const stream_; |
| 101 |
| 102 GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); |
| 103 }; |
| 104 |
| 105 inline MatchResultListener::~MatchResultListener() { |
| 106 } |
| 107 |
67 // The implementation of a matcher. | 108 // The implementation of a matcher. |
68 template <typename T> | 109 template <typename T> |
69 class MatcherInterface { | 110 class MatcherInterface { |
70 public: | 111 public: |
71 virtual ~MatcherInterface() {} | 112 virtual ~MatcherInterface() {} |
72 | 113 |
73 // Returns true iff the matcher matches x. | 114 // Returns true iff the matcher matches x; also explains the match |
74 virtual bool Matches(T x) const = 0; | 115 // result to 'listener', in the form of a non-restrictive relative |
| 116 // clause ("which ...", "whose ...", etc) that describes x. For |
| 117 // example, the MatchAndExplain() method of the Pointee(...) matcher |
| 118 // should generate an explanation like "which points to ...". |
| 119 // |
| 120 // You should override this method when defining a new matcher. |
| 121 // |
| 122 // It's the responsibility of the caller (Google Mock) to guarantee |
| 123 // that 'listener' is not NULL. This helps to simplify a matcher's |
| 124 // implementation when it doesn't care about the performance, as it |
| 125 // can talk to 'listener' without checking its validity first. |
| 126 // However, in order to implement dummy listeners efficiently, |
| 127 // listener->stream() may be NULL. |
| 128 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; |
75 | 129 |
76 // Describes this matcher to an ostream. | 130 // Describes this matcher to an ostream. The function should print |
| 131 // a verb phrase that describes the property a value matching this |
| 132 // matcher should have. The subject of the verb phrase is the value |
| 133 // being matched. For example, the DescribeTo() method of the Gt(7) |
| 134 // matcher prints "is greater than 7". |
77 virtual void DescribeTo(::std::ostream* os) const = 0; | 135 virtual void DescribeTo(::std::ostream* os) const = 0; |
78 | 136 |
79 // Describes the negation of this matcher to an ostream. For | 137 // Describes the negation of this matcher to an ostream. For |
80 // example, if the description of this matcher is "is greater than | 138 // example, if the description of this matcher is "is greater than |
81 // 7", the negated description could be "is not greater than 7". | 139 // 7", the negated description could be "is not greater than 7". |
82 // You are not required to override this when implementing | 140 // You are not required to override this when implementing |
83 // MatcherInterface, but it is highly advised so that your matcher | 141 // MatcherInterface, but it is highly advised so that your matcher |
84 // can produce good error messages. | 142 // can produce good error messages. |
85 virtual void DescribeNegationTo(::std::ostream* os) const { | 143 virtual void DescribeNegationTo(::std::ostream* os) const { |
86 *os << "not ("; | 144 *os << "not ("; |
87 DescribeTo(os); | 145 DescribeTo(os); |
88 *os << ")"; | 146 *os << ")"; |
89 } | 147 } |
90 | |
91 // Explains why x matches, or doesn't match, the matcher. Override | |
92 // this to provide any additional information that helps a user | |
93 // understand the match result. | |
94 virtual void ExplainMatchResultTo(T /* x */, ::std::ostream* /* os */) const { | |
95 // By default, nothing more needs to be explained, as Google Mock | |
96 // has already printed the value of x when this function is | |
97 // called. | |
98 } | |
99 }; | 148 }; |
100 | 149 |
101 namespace internal { | 150 namespace internal { |
102 | 151 |
| 152 // A match result listener that ignores the explanation. |
| 153 class DummyMatchResultListener : public MatchResultListener { |
| 154 public: |
| 155 DummyMatchResultListener() : MatchResultListener(NULL) {} |
| 156 |
| 157 private: |
| 158 GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); |
| 159 }; |
| 160 |
| 161 // A match result listener that forwards the explanation to a given |
| 162 // ostream. The difference between this and MatchResultListener is |
| 163 // that the former is concrete. |
| 164 class StreamMatchResultListener : public MatchResultListener { |
| 165 public: |
| 166 explicit StreamMatchResultListener(::std::ostream* os) |
| 167 : MatchResultListener(os) {} |
| 168 |
| 169 private: |
| 170 GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); |
| 171 }; |
| 172 |
| 173 // A match result listener that stores the explanation in a string. |
| 174 class StringMatchResultListener : public MatchResultListener { |
| 175 public: |
| 176 StringMatchResultListener() : MatchResultListener(&ss_) {} |
| 177 |
| 178 // Returns the explanation heard so far. |
| 179 internal::string str() const { return ss_.str(); } |
| 180 |
| 181 private: |
| 182 ::std::stringstream ss_; |
| 183 |
| 184 GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); |
| 185 }; |
| 186 |
103 // An internal class for implementing Matcher<T>, which will derive | 187 // An internal class for implementing Matcher<T>, which will derive |
104 // from it. We put functionalities common to all Matcher<T> | 188 // from it. We put functionalities common to all Matcher<T> |
105 // specializations here to avoid code duplication. | 189 // specializations here to avoid code duplication. |
106 template <typename T> | 190 template <typename T> |
107 class MatcherBase { | 191 class MatcherBase { |
108 public: | 192 public: |
| 193 // Returns true iff the matcher matches x; also explains the match |
| 194 // result to 'listener'. |
| 195 bool MatchAndExplain(T x, MatchResultListener* listener) const { |
| 196 return impl_->MatchAndExplain(x, listener); |
| 197 } |
| 198 |
109 // Returns true iff this matcher matches x. | 199 // Returns true iff this matcher matches x. |
110 bool Matches(T x) const { return impl_->Matches(x); } | 200 bool Matches(T x) const { |
| 201 DummyMatchResultListener dummy; |
| 202 return MatchAndExplain(x, &dummy); |
| 203 } |
111 | 204 |
112 // Describes this matcher to an ostream. | 205 // Describes this matcher to an ostream. |
113 void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } | 206 void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } |
114 | 207 |
115 // Describes the negation of this matcher to an ostream. | 208 // Describes the negation of this matcher to an ostream. |
116 void DescribeNegationTo(::std::ostream* os) const { | 209 void DescribeNegationTo(::std::ostream* os) const { |
117 impl_->DescribeNegationTo(os); | 210 impl_->DescribeNegationTo(os); |
118 } | 211 } |
119 | 212 |
120 // Explains why x matches, or doesn't match, the matcher. | 213 // Explains why x matches, or doesn't match, the matcher. |
121 void ExplainMatchResultTo(T x, ::std::ostream* os) const { | 214 void ExplainMatchResultTo(T x, ::std::ostream* os) const { |
122 impl_->ExplainMatchResultTo(x, os); | 215 StreamMatchResultListener listener(os); |
| 216 MatchAndExplain(x, &listener); |
123 } | 217 } |
124 | 218 |
125 protected: | 219 protected: |
126 MatcherBase() {} | 220 MatcherBase() {} |
127 | 221 |
128 // Constructs a matcher from its implementation. | 222 // Constructs a matcher from its implementation. |
129 explicit MatcherBase(const MatcherInterface<T>* impl) | 223 explicit MatcherBase(const MatcherInterface<T>* impl) |
130 : impl_(impl) {} | 224 : impl_(impl) {} |
131 | 225 |
132 virtual ~MatcherBase() {} | 226 virtual ~MatcherBase() {} |
133 | 227 |
134 private: | 228 private: |
135 // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar | 229 // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar |
136 // interfaces. The former dynamically allocates a chunk of memory | 230 // interfaces. The former dynamically allocates a chunk of memory |
137 // to hold the reference count, while the latter tracks all | 231 // to hold the reference count, while the latter tracks all |
138 // references using a circular linked list without allocating | 232 // references using a circular linked list without allocating |
139 // memory. It has been observed that linked_ptr performs better in | 233 // memory. It has been observed that linked_ptr performs better in |
140 // typical scenarios. However, shared_ptr can out-perform | 234 // typical scenarios. However, shared_ptr can out-perform |
141 // linked_ptr when there are many more uses of the copy constructor | 235 // linked_ptr when there are many more uses of the copy constructor |
142 // than the default constructor. | 236 // than the default constructor. |
143 // | 237 // |
144 // If performance becomes a problem, we should see if using | 238 // If performance becomes a problem, we should see if using |
145 // shared_ptr helps. | 239 // shared_ptr helps. |
146 ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; | 240 ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; |
147 }; | 241 }; |
148 | 242 |
149 // The default implementation of ExplainMatchResultTo() for | |
150 // polymorphic matchers. | |
151 template <typename PolymorphicMatcherImpl, typename T> | |
152 inline void ExplainMatchResultTo(const PolymorphicMatcherImpl& /* impl */, | |
153 const T& /* x */, | |
154 ::std::ostream* /* os */) { | |
155 // By default, nothing more needs to be said, as Google Mock already | |
156 // prints the value of x elsewhere. | |
157 } | |
158 | |
159 } // namespace internal | 243 } // namespace internal |
160 | 244 |
161 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment) | 245 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment) |
162 // object that can check whether a value of type T matches. The | 246 // object that can check whether a value of type T matches. The |
163 // implementation of Matcher<T> is just a linked_ptr to const | 247 // implementation of Matcher<T> is just a linked_ptr to const |
164 // MatcherInterface<T>, so copying is fairly cheap. Don't inherit | 248 // MatcherInterface<T>, so copying is fairly cheap. Don't inherit |
165 // from Matcher! | 249 // from Matcher! |
166 template <typename T> | 250 template <typename T> |
167 class Matcher : public internal::MatcherBase<T> { | 251 class Matcher : public internal::MatcherBase<T> { |
168 public: | 252 public: |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 Matcher(const internal::string& s); // NOLINT | 297 Matcher(const internal::string& s); // NOLINT |
214 | 298 |
215 // Allows the user to write "foo" instead of Eq("foo") sometimes. | 299 // Allows the user to write "foo" instead of Eq("foo") sometimes. |
216 Matcher(const char* s); // NOLINT | 300 Matcher(const char* s); // NOLINT |
217 }; | 301 }; |
218 | 302 |
219 // The PolymorphicMatcher class template makes it easy to implement a | 303 // The PolymorphicMatcher class template makes it easy to implement a |
220 // polymorphic matcher (i.e. a matcher that can match values of more | 304 // polymorphic matcher (i.e. a matcher that can match values of more |
221 // than one type, e.g. Eq(n) and NotNull()). | 305 // than one type, e.g. Eq(n) and NotNull()). |
222 // | 306 // |
223 // To define a polymorphic matcher, a user first provides a Impl class | 307 // To define a polymorphic matcher, a user should provide an Impl |
224 // that has a Matches() method, a DescribeTo() method, and a | 308 // class that has a DescribeTo() method and a DescribeNegationTo() |
225 // DescribeNegationTo() method. The Matches() method is usually a | 309 // method, and define a member function (or member function template) |
226 // method template (such that it works with multiple types). Then the | |
227 // user creates the polymorphic matcher using | |
228 // MakePolymorphicMatcher(). To provide additional explanation to the | |
229 // match result, define a FREE function (or function template) | |
230 // | 310 // |
231 // void ExplainMatchResultTo(const Impl& matcher, const Value& value, | 311 // bool MatchAndExplain(const Value& value, |
232 // ::std::ostream* os); | 312 // MatchResultListener* listener) const; |
233 // | 313 // |
234 // in the SAME NAME SPACE where Impl is defined. See the definition | 314 // See the definition of NotNull() for a complete example. |
235 // of NotNull() for a complete example. | |
236 template <class Impl> | 315 template <class Impl> |
237 class PolymorphicMatcher { | 316 class PolymorphicMatcher { |
238 public: | 317 public: |
239 explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} | 318 explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} |
240 | 319 |
241 // Returns a mutable reference to the underlying matcher | 320 // Returns a mutable reference to the underlying matcher |
242 // implementation object. | 321 // implementation object. |
243 Impl& mutable_impl() { return impl_; } | 322 Impl& mutable_impl() { return impl_; } |
244 | 323 |
245 // Returns an immutable reference to the underlying matcher | 324 // Returns an immutable reference to the underlying matcher |
246 // implementation object. | 325 // implementation object. |
247 const Impl& impl() const { return impl_; } | 326 const Impl& impl() const { return impl_; } |
248 | 327 |
249 template <typename T> | 328 template <typename T> |
250 operator Matcher<T>() const { | 329 operator Matcher<T>() const { |
251 return Matcher<T>(new MonomorphicImpl<T>(impl_)); | 330 return Matcher<T>(new MonomorphicImpl<T>(impl_)); |
252 } | 331 } |
253 | 332 |
254 private: | 333 private: |
255 template <typename T> | 334 template <typename T> |
256 class MonomorphicImpl : public MatcherInterface<T> { | 335 class MonomorphicImpl : public MatcherInterface<T> { |
257 public: | 336 public: |
258 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} | 337 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} |
259 | 338 |
260 virtual bool Matches(T x) const { return impl_.Matches(x); } | |
261 | |
262 virtual void DescribeTo(::std::ostream* os) const { | 339 virtual void DescribeTo(::std::ostream* os) const { |
263 impl_.DescribeTo(os); | 340 impl_.DescribeTo(os); |
264 } | 341 } |
265 | 342 |
266 virtual void DescribeNegationTo(::std::ostream* os) const { | 343 virtual void DescribeNegationTo(::std::ostream* os) const { |
267 impl_.DescribeNegationTo(os); | 344 impl_.DescribeNegationTo(os); |
268 } | 345 } |
269 | 346 |
270 virtual void ExplainMatchResultTo(T x, ::std::ostream* os) const { | 347 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { |
271 using ::testing::internal::ExplainMatchResultTo; | 348 return impl_.MatchAndExplain(x, listener); |
272 | |
273 // C++ uses Argument-Dependent Look-up (aka Koenig Look-up) to | |
274 // resolve the call to ExplainMatchResultTo() here. This | |
275 // means that if there's a ExplainMatchResultTo() function | |
276 // defined in the name space where class Impl is defined, it | |
277 // will be picked by the compiler as the better match. | |
278 // Otherwise the default implementation of it in | |
279 // ::testing::internal will be picked. | |
280 // | |
281 // This look-up rule lets a writer of a polymorphic matcher | |
282 // customize the behavior of ExplainMatchResultTo() when he | |
283 // cares to. Nothing needs to be done by the writer if he | |
284 // doesn't need to customize it. | |
285 ExplainMatchResultTo(impl_, x, os); | |
286 } | 349 } |
287 | 350 |
288 private: | 351 private: |
289 const Impl impl_; | 352 const Impl impl_; |
290 | 353 |
291 GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); | 354 GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); |
292 }; | 355 }; |
293 | 356 |
294 Impl impl_; | 357 Impl impl_; |
295 | 358 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 } | 446 } |
384 | 447 |
385 // A<T>() returns a matcher that matches any value of type T. | 448 // A<T>() returns a matcher that matches any value of type T. |
386 template <typename T> | 449 template <typename T> |
387 Matcher<T> A(); | 450 Matcher<T> A(); |
388 | 451 |
389 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION | 452 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION |
390 // and MUST NOT BE USED IN USER CODE!!! | 453 // and MUST NOT BE USED IN USER CODE!!! |
391 namespace internal { | 454 namespace internal { |
392 | 455 |
393 // Appends the explanation on the result of matcher.Matches(value) to | 456 // If the explanation is not empty, prints it to the listener. |
394 // os iff the explanation is not empty. | 457 // 'listener' must not be NULL. |
395 template <typename T> | 458 inline void PrintIfNotEmpty( |
396 void ExplainMatchResultAsNeededTo(const Matcher<T>& matcher, T value, | 459 const internal::string& explanation, MatchResultListener* listener) { |
397 ::std::ostream* os) { | 460 if (explanation != "") { |
398 ::std::stringstream reason; | 461 *listener << ", " << explanation; |
399 matcher.ExplainMatchResultTo(value, &reason); | |
400 const internal::string s = reason.str(); | |
401 if (s != "") { | |
402 *os << " (" << s << ")"; | |
403 } | 462 } |
404 } | 463 } |
405 | 464 |
| 465 // Matches the value against the given matcher, prints the value and explains |
| 466 // the match result to the listener. Returns the match result. |
| 467 // 'listener' must not be NULL. |
| 468 // Value cannot be passed by const reference, because some matchers take a |
| 469 // non-const argument. |
| 470 template <typename Value, typename T> |
| 471 bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, |
| 472 MatchResultListener* listener) { |
| 473 if (!listener->IsInterested()) { |
| 474 // If the listener is not interested, we do not need to construct the |
| 475 // inner explanation. |
| 476 return matcher.Matches(value); |
| 477 } |
| 478 |
| 479 StringMatchResultListener inner_listener; |
| 480 const bool match = matcher.MatchAndExplain(value, &inner_listener); |
| 481 |
| 482 UniversalPrint(value, listener->stream()); |
| 483 PrintIfNotEmpty(inner_listener.str(), listener); |
| 484 |
| 485 return match; |
| 486 } |
| 487 |
| 488 // If the given string is not empty and os is not NULL, wraps the |
| 489 // string inside a pair of parentheses and streams the result to os. |
| 490 inline void StreamInParensAsNeeded(const internal::string& str, |
| 491 ::std::ostream* os) { |
| 492 if (!str.empty() && os != NULL) { |
| 493 *os << " (" << str << ")"; |
| 494 } |
| 495 } |
| 496 |
406 // An internal helper class for doing compile-time loop on a tuple's | 497 // An internal helper class for doing compile-time loop on a tuple's |
407 // fields. | 498 // fields. |
408 template <size_t N> | 499 template <size_t N> |
409 class TuplePrefix { | 500 class TuplePrefix { |
410 public: | 501 public: |
411 // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true | 502 // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true |
412 // iff the first N fields of matcher_tuple matches the first N | 503 // iff the first N fields of matcher_tuple matches the first N |
413 // fields of value_tuple, respectively. | 504 // fields of value_tuple, respectively. |
414 template <typename MatcherTuple, typename ValueTuple> | 505 template <typename MatcherTuple, typename ValueTuple> |
415 static bool Matches(const MatcherTuple& matcher_tuple, | 506 static bool Matches(const MatcherTuple& matcher_tuple, |
(...skipping 16 matching lines...) Expand all Loading... |
432 | 523 |
433 // First, describes failures in the first N - 1 fields. | 524 // First, describes failures in the first N - 1 fields. |
434 TuplePrefix<N - 1>::DescribeMatchFailuresTo(matchers, values, os); | 525 TuplePrefix<N - 1>::DescribeMatchFailuresTo(matchers, values, os); |
435 | 526 |
436 // Then describes the failure (if any) in the (N - 1)-th (0-based) | 527 // Then describes the failure (if any) in the (N - 1)-th (0-based) |
437 // field. | 528 // field. |
438 typename tuple_element<N - 1, MatcherTuple>::type matcher = | 529 typename tuple_element<N - 1, MatcherTuple>::type matcher = |
439 get<N - 1>(matchers); | 530 get<N - 1>(matchers); |
440 typedef typename tuple_element<N - 1, ValueTuple>::type Value; | 531 typedef typename tuple_element<N - 1, ValueTuple>::type Value; |
441 Value value = get<N - 1>(values); | 532 Value value = get<N - 1>(values); |
442 if (!matcher.Matches(value)) { | 533 StringMatchResultListener listener; |
| 534 if (!matcher.MatchAndExplain(value, &listener)) { |
443 // TODO(wan): include in the message the name of the parameter | 535 // TODO(wan): include in the message the name of the parameter |
444 // as used in MOCK_METHOD*() when possible. | 536 // as used in MOCK_METHOD*() when possible. |
445 *os << " Expected arg #" << N - 1 << ": "; | 537 *os << " Expected arg #" << N - 1 << ": "; |
446 get<N - 1>(matchers).DescribeTo(os); | 538 get<N - 1>(matchers).DescribeTo(os); |
447 *os << "\n Actual: "; | 539 *os << "\n Actual: "; |
448 // We remove the reference in type Value to prevent the | 540 // We remove the reference in type Value to prevent the |
449 // universal printer from printing the address of value, which | 541 // universal printer from printing the address of value, which |
450 // isn't interesting to the user most of the time. The | 542 // isn't interesting to the user most of the time. The |
451 // matcher's ExplainMatchResultTo() method handles the case when | 543 // matcher's MatchAndExplain() method handles the case when |
452 // the address is interesting. | 544 // the address is interesting. |
453 internal::UniversalPrinter<GMOCK_REMOVE_REFERENCE_(Value)>:: | 545 internal::UniversalPrinter<GMOCK_REMOVE_REFERENCE_(Value)>:: |
454 Print(value, os); | 546 Print(value, os); |
455 ExplainMatchResultAsNeededTo<Value>(matcher, value, os); | 547 |
| 548 StreamInParensAsNeeded(listener.str(), os); |
456 *os << "\n"; | 549 *os << "\n"; |
457 } | 550 } |
458 } | 551 } |
459 }; | 552 }; |
460 | 553 |
461 // The base case. | 554 // The base case. |
462 template <> | 555 template <> |
463 class TuplePrefix<0> { | 556 class TuplePrefix<0> { |
464 public: | 557 public: |
465 template <typename MatcherTuple, typename ValueTuple> | 558 template <typename MatcherTuple, typename ValueTuple> |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 return Matcher<T>(new Impl(source_matcher)); | 623 return Matcher<T>(new Impl(source_matcher)); |
531 } | 624 } |
532 | 625 |
533 private: | 626 private: |
534 class Impl : public MatcherInterface<T> { | 627 class Impl : public MatcherInterface<T> { |
535 public: | 628 public: |
536 explicit Impl(const Matcher<U>& source_matcher) | 629 explicit Impl(const Matcher<U>& source_matcher) |
537 : source_matcher_(source_matcher) {} | 630 : source_matcher_(source_matcher) {} |
538 | 631 |
539 // We delegate the matching logic to the source matcher. | 632 // We delegate the matching logic to the source matcher. |
540 virtual bool Matches(T x) const { | 633 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { |
541 return source_matcher_.Matches(static_cast<U>(x)); | 634 return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); |
542 } | 635 } |
543 | 636 |
544 virtual void DescribeTo(::std::ostream* os) const { | 637 virtual void DescribeTo(::std::ostream* os) const { |
545 source_matcher_.DescribeTo(os); | 638 source_matcher_.DescribeTo(os); |
546 } | 639 } |
547 | 640 |
548 virtual void DescribeNegationTo(::std::ostream* os) const { | 641 virtual void DescribeNegationTo(::std::ostream* os) const { |
549 source_matcher_.DescribeNegationTo(os); | 642 source_matcher_.DescribeNegationTo(os); |
550 } | 643 } |
551 | 644 |
552 virtual void ExplainMatchResultTo(T x, ::std::ostream* os) const { | |
553 source_matcher_.ExplainMatchResultTo(static_cast<U>(x), os); | |
554 } | |
555 | |
556 private: | 645 private: |
557 const Matcher<U> source_matcher_; | 646 const Matcher<U> source_matcher_; |
558 | 647 |
559 GTEST_DISALLOW_ASSIGN_(Impl); | 648 GTEST_DISALLOW_ASSIGN_(Impl); |
560 }; | 649 }; |
561 }; | 650 }; |
562 | 651 |
563 // This even more specialized version is used for efficiently casting | 652 // This even more specialized version is used for efficiently casting |
564 // a matcher to its own type. | 653 // a matcher to its own type. |
565 template <typename T> | 654 template <typename T> |
566 class MatcherCastImpl<T, Matcher<T> > { | 655 class MatcherCastImpl<T, Matcher<T> > { |
567 public: | 656 public: |
568 static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } | 657 static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } |
569 }; | 658 }; |
570 | 659 |
571 // Implements A<T>(). | 660 // Implements A<T>(). |
572 template <typename T> | 661 template <typename T> |
573 class AnyMatcherImpl : public MatcherInterface<T> { | 662 class AnyMatcherImpl : public MatcherInterface<T> { |
574 public: | 663 public: |
575 virtual bool Matches(T /* x */) const { return true; } | 664 virtual bool MatchAndExplain( |
| 665 T /* x */, MatchResultListener* /* listener */) const { return true; } |
576 virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } | 666 virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } |
577 virtual void DescribeNegationTo(::std::ostream* os) const { | 667 virtual void DescribeNegationTo(::std::ostream* os) const { |
578 // This is mostly for completeness' safe, as it's not very useful | 668 // This is mostly for completeness' safe, as it's not very useful |
579 // to write Not(A<bool>()). However we cannot completely rule out | 669 // to write Not(A<bool>()). However we cannot completely rule out |
580 // such a possibility, and it doesn't hurt to be prepared. | 670 // such a possibility, and it doesn't hurt to be prepared. |
581 *os << "never matches"; | 671 *os << "never matches"; |
582 } | 672 } |
583 }; | 673 }; |
584 | 674 |
585 // Implements _, a matcher that matches any value of any | 675 // Implements _, a matcher that matches any value of any |
(...skipping 25 matching lines...) Expand all Loading... |
611 explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ | 701 explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ |
612 template <typename Lhs> \ | 702 template <typename Lhs> \ |
613 operator Matcher<Lhs>() const { \ | 703 operator Matcher<Lhs>() const { \ |
614 return MakeMatcher(new Impl<Lhs>(rhs_)); \ | 704 return MakeMatcher(new Impl<Lhs>(rhs_)); \ |
615 } \ | 705 } \ |
616 private: \ | 706 private: \ |
617 template <typename Lhs> \ | 707 template <typename Lhs> \ |
618 class Impl : public MatcherInterface<Lhs> { \ | 708 class Impl : public MatcherInterface<Lhs> { \ |
619 public: \ | 709 public: \ |
620 explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ | 710 explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ |
621 virtual bool Matches(Lhs lhs) const { return lhs op rhs_; } \ | 711 virtual bool MatchAndExplain(\ |
| 712 Lhs lhs, MatchResultListener* /* listener */) const { \ |
| 713 return lhs op rhs_; \ |
| 714 } \ |
622 virtual void DescribeTo(::std::ostream* os) const { \ | 715 virtual void DescribeTo(::std::ostream* os) const { \ |
623 *os << "is " relation " "; \ | 716 *os << "is " relation " "; \ |
624 UniversalPrinter<Rhs>::Print(rhs_, os); \ | 717 UniversalPrinter<Rhs>::Print(rhs_, os); \ |
625 } \ | 718 } \ |
626 virtual void DescribeNegationTo(::std::ostream* os) const { \ | 719 virtual void DescribeNegationTo(::std::ostream* os) const { \ |
627 *os << "is not " relation " "; \ | 720 *os << "is not " relation " "; \ |
628 UniversalPrinter<Rhs>::Print(rhs_, os); \ | 721 UniversalPrinter<Rhs>::Print(rhs_, os); \ |
629 } \ | 722 } \ |
630 private: \ | 723 private: \ |
631 Rhs rhs_; \ | 724 Rhs rhs_; \ |
(...skipping 12 matching lines...) Expand all Loading... |
644 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "less than"); | 737 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "less than"); |
645 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "not equal to"); | 738 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "not equal to"); |
646 | 739 |
647 #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ | 740 #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ |
648 | 741 |
649 // Implements the polymorphic IsNull() matcher, which matches any raw or smart | 742 // Implements the polymorphic IsNull() matcher, which matches any raw or smart |
650 // pointer that is NULL. | 743 // pointer that is NULL. |
651 class IsNullMatcher { | 744 class IsNullMatcher { |
652 public: | 745 public: |
653 template <typename Pointer> | 746 template <typename Pointer> |
654 bool Matches(const Pointer& p) const { return GetRawPointer(p) == NULL; } | 747 bool MatchAndExplain(const Pointer& p, |
| 748 MatchResultListener* /* listener */) const { |
| 749 return GetRawPointer(p) == NULL; |
| 750 } |
655 | 751 |
656 void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } | 752 void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } |
657 void DescribeNegationTo(::std::ostream* os) const { | 753 void DescribeNegationTo(::std::ostream* os) const { |
658 *os << "is not NULL"; | 754 *os << "is not NULL"; |
659 } | 755 } |
660 }; | 756 }; |
661 | 757 |
662 // Implements the polymorphic NotNull() matcher, which matches any raw or smart | 758 // Implements the polymorphic NotNull() matcher, which matches any raw or smart |
663 // pointer that is not NULL. | 759 // pointer that is not NULL. |
664 class NotNullMatcher { | 760 class NotNullMatcher { |
665 public: | 761 public: |
666 template <typename Pointer> | 762 template <typename Pointer> |
667 bool Matches(const Pointer& p) const { return GetRawPointer(p) != NULL; } | 763 bool MatchAndExplain(const Pointer& p, |
| 764 MatchResultListener* /* listener */) const { |
| 765 return GetRawPointer(p) != NULL; |
| 766 } |
668 | 767 |
669 void DescribeTo(::std::ostream* os) const { *os << "is not NULL"; } | 768 void DescribeTo(::std::ostream* os) const { *os << "is not NULL"; } |
670 void DescribeNegationTo(::std::ostream* os) const { | 769 void DescribeNegationTo(::std::ostream* os) const { |
671 *os << "is NULL"; | 770 *os << "is NULL"; |
672 } | 771 } |
673 }; | 772 }; |
674 | 773 |
675 // Ref(variable) matches any argument that is a reference to | 774 // Ref(variable) matches any argument that is a reference to |
676 // 'variable'. This matcher is polymorphic as it can match any | 775 // 'variable'. This matcher is polymorphic as it can match any |
677 // super type of the type of 'variable'. | 776 // super type of the type of 'variable'. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 // reference to a non-const reference. | 809 // reference to a non-const reference. |
711 return MakeMatcher(new Impl<Super>(object_)); | 810 return MakeMatcher(new Impl<Super>(object_)); |
712 } | 811 } |
713 | 812 |
714 private: | 813 private: |
715 template <typename Super> | 814 template <typename Super> |
716 class Impl : public MatcherInterface<Super&> { | 815 class Impl : public MatcherInterface<Super&> { |
717 public: | 816 public: |
718 explicit Impl(Super& x) : object_(x) {} // NOLINT | 817 explicit Impl(Super& x) : object_(x) {} // NOLINT |
719 | 818 |
720 // Matches() takes a Super& (as opposed to const Super&) in | 819 // MatchAndExplain() takes a Super& (as opposed to const Super&) |
721 // order to match the interface MatcherInterface<Super&>. | 820 // in order to match the interface MatcherInterface<Super&>. |
722 virtual bool Matches(Super& x) const { return &x == &object_; } // NOLINT | 821 virtual bool MatchAndExplain( |
| 822 Super& x, MatchResultListener* listener) const { |
| 823 *listener << "is located @" << static_cast<const void*>(&x); |
| 824 return &x == &object_; |
| 825 } |
723 | 826 |
724 virtual void DescribeTo(::std::ostream* os) const { | 827 virtual void DescribeTo(::std::ostream* os) const { |
725 *os << "references the variable "; | 828 *os << "references the variable "; |
726 UniversalPrinter<Super&>::Print(object_, os); | 829 UniversalPrinter<Super&>::Print(object_, os); |
727 } | 830 } |
728 | 831 |
729 virtual void DescribeNegationTo(::std::ostream* os) const { | 832 virtual void DescribeNegationTo(::std::ostream* os) const { |
730 *os << "does not reference the variable "; | 833 *os << "does not reference the variable "; |
731 UniversalPrinter<Super&>::Print(object_, os); | 834 UniversalPrinter<Super&>::Print(object_, os); |
732 } | 835 } |
733 | 836 |
734 virtual void ExplainMatchResultTo(Super& x, // NOLINT | |
735 ::std::ostream* os) const { | |
736 *os << "is located @" << static_cast<const void*>(&x); | |
737 } | |
738 | |
739 private: | 837 private: |
740 const Super& object_; | 838 const Super& object_; |
741 | 839 |
742 GTEST_DISALLOW_ASSIGN_(Impl); | 840 GTEST_DISALLOW_ASSIGN_(Impl); |
743 }; | 841 }; |
744 | 842 |
745 T& object_; | 843 T& object_; |
746 | 844 |
747 GTEST_DISALLOW_ASSIGN_(RefMatcher); | 845 GTEST_DISALLOW_ASSIGN_(RefMatcher); |
748 }; | 846 }; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 class StrEqualityMatcher { | 885 class StrEqualityMatcher { |
788 public: | 886 public: |
789 typedef typename StringType::const_pointer ConstCharPointer; | 887 typedef typename StringType::const_pointer ConstCharPointer; |
790 | 888 |
791 StrEqualityMatcher(const StringType& str, bool expect_eq, | 889 StrEqualityMatcher(const StringType& str, bool expect_eq, |
792 bool case_sensitive) | 890 bool case_sensitive) |
793 : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} | 891 : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} |
794 | 892 |
795 // When expect_eq_ is true, returns true iff s is equal to string_; | 893 // When expect_eq_ is true, returns true iff s is equal to string_; |
796 // otherwise returns true iff s is not equal to string_. | 894 // otherwise returns true iff s is not equal to string_. |
797 bool Matches(ConstCharPointer s) const { | 895 bool MatchAndExplain(ConstCharPointer s, |
| 896 MatchResultListener* listener) const { |
798 if (s == NULL) { | 897 if (s == NULL) { |
799 return !expect_eq_; | 898 return !expect_eq_; |
800 } | 899 } |
801 return Matches(StringType(s)); | 900 return MatchAndExplain(StringType(s), listener); |
802 } | 901 } |
803 | 902 |
804 bool Matches(const StringType& s) const { | 903 bool MatchAndExplain(const StringType& s, |
| 904 MatchResultListener* /* listener */) const { |
805 const bool eq = case_sensitive_ ? s == string_ : | 905 const bool eq = case_sensitive_ ? s == string_ : |
806 CaseInsensitiveStringEquals(s, string_); | 906 CaseInsensitiveStringEquals(s, string_); |
807 return expect_eq_ == eq; | 907 return expect_eq_ == eq; |
808 } | 908 } |
809 | 909 |
810 void DescribeTo(::std::ostream* os) const { | 910 void DescribeTo(::std::ostream* os) const { |
811 DescribeToHelper(expect_eq_, os); | 911 DescribeToHelper(expect_eq_, os); |
812 } | 912 } |
813 | 913 |
814 void DescribeNegationTo(::std::ostream* os) const { | 914 void DescribeNegationTo(::std::ostream* os) const { |
(...skipping 27 matching lines...) Expand all Loading... |
842 class HasSubstrMatcher { | 942 class HasSubstrMatcher { |
843 public: | 943 public: |
844 typedef typename StringType::const_pointer ConstCharPointer; | 944 typedef typename StringType::const_pointer ConstCharPointer; |
845 | 945 |
846 explicit HasSubstrMatcher(const StringType& substring) | 946 explicit HasSubstrMatcher(const StringType& substring) |
847 : substring_(substring) {} | 947 : substring_(substring) {} |
848 | 948 |
849 // These overloaded methods allow HasSubstr(substring) to be used as a | 949 // These overloaded methods allow HasSubstr(substring) to be used as a |
850 // Matcher<T> as long as T can be converted to string. Returns true | 950 // Matcher<T> as long as T can be converted to string. Returns true |
851 // iff s contains substring_ as a substring. | 951 // iff s contains substring_ as a substring. |
852 bool Matches(ConstCharPointer s) const { | 952 bool MatchAndExplain(ConstCharPointer s, |
853 return s != NULL && Matches(StringType(s)); | 953 MatchResultListener* listener) const { |
| 954 return s != NULL && MatchAndExplain(StringType(s), listener); |
854 } | 955 } |
855 | 956 |
856 bool Matches(const StringType& s) const { | 957 bool MatchAndExplain(const StringType& s, |
| 958 MatchResultListener* /* listener */) const { |
857 return s.find(substring_) != StringType::npos; | 959 return s.find(substring_) != StringType::npos; |
858 } | 960 } |
859 | 961 |
860 // Describes what this matcher matches. | 962 // Describes what this matcher matches. |
861 void DescribeTo(::std::ostream* os) const { | 963 void DescribeTo(::std::ostream* os) const { |
862 *os << "has substring "; | 964 *os << "has substring "; |
863 UniversalPrinter<StringType>::Print(substring_, os); | 965 UniversalPrinter<StringType>::Print(substring_, os); |
864 } | 966 } |
865 | 967 |
866 void DescribeNegationTo(::std::ostream* os) const { | 968 void DescribeNegationTo(::std::ostream* os) const { |
(...skipping 14 matching lines...) Expand all Loading... |
881 class StartsWithMatcher { | 983 class StartsWithMatcher { |
882 public: | 984 public: |
883 typedef typename StringType::const_pointer ConstCharPointer; | 985 typedef typename StringType::const_pointer ConstCharPointer; |
884 | 986 |
885 explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { | 987 explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { |
886 } | 988 } |
887 | 989 |
888 // These overloaded methods allow StartsWith(prefix) to be used as a | 990 // These overloaded methods allow StartsWith(prefix) to be used as a |
889 // Matcher<T> as long as T can be converted to string. Returns true | 991 // Matcher<T> as long as T can be converted to string. Returns true |
890 // iff s starts with prefix_. | 992 // iff s starts with prefix_. |
891 bool Matches(ConstCharPointer s) const { | 993 bool MatchAndExplain(ConstCharPointer s, |
892 return s != NULL && Matches(StringType(s)); | 994 MatchResultListener* listener) const { |
| 995 return s != NULL && MatchAndExplain(StringType(s), listener); |
893 } | 996 } |
894 | 997 |
895 bool Matches(const StringType& s) const { | 998 bool MatchAndExplain(const StringType& s, |
| 999 MatchResultListener* /* listener */) const { |
896 return s.length() >= prefix_.length() && | 1000 return s.length() >= prefix_.length() && |
897 s.substr(0, prefix_.length()) == prefix_; | 1001 s.substr(0, prefix_.length()) == prefix_; |
898 } | 1002 } |
899 | 1003 |
900 void DescribeTo(::std::ostream* os) const { | 1004 void DescribeTo(::std::ostream* os) const { |
901 *os << "starts with "; | 1005 *os << "starts with "; |
902 UniversalPrinter<StringType>::Print(prefix_, os); | 1006 UniversalPrinter<StringType>::Print(prefix_, os); |
903 } | 1007 } |
904 | 1008 |
905 void DescribeNegationTo(::std::ostream* os) const { | 1009 void DescribeNegationTo(::std::ostream* os) const { |
(...skipping 13 matching lines...) Expand all Loading... |
919 template <typename StringType> | 1023 template <typename StringType> |
920 class EndsWithMatcher { | 1024 class EndsWithMatcher { |
921 public: | 1025 public: |
922 typedef typename StringType::const_pointer ConstCharPointer; | 1026 typedef typename StringType::const_pointer ConstCharPointer; |
923 | 1027 |
924 explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} | 1028 explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} |
925 | 1029 |
926 // These overloaded methods allow EndsWith(suffix) to be used as a | 1030 // These overloaded methods allow EndsWith(suffix) to be used as a |
927 // Matcher<T> as long as T can be converted to string. Returns true | 1031 // Matcher<T> as long as T can be converted to string. Returns true |
928 // iff s ends with suffix_. | 1032 // iff s ends with suffix_. |
929 bool Matches(ConstCharPointer s) const { | 1033 bool MatchAndExplain(ConstCharPointer s, |
930 return s != NULL && Matches(StringType(s)); | 1034 MatchResultListener* listener) const { |
| 1035 return s != NULL && MatchAndExplain(StringType(s), listener); |
931 } | 1036 } |
932 | 1037 |
933 bool Matches(const StringType& s) const { | 1038 bool MatchAndExplain(const StringType& s, |
| 1039 MatchResultListener* /* listener */) const { |
934 return s.length() >= suffix_.length() && | 1040 return s.length() >= suffix_.length() && |
935 s.substr(s.length() - suffix_.length()) == suffix_; | 1041 s.substr(s.length() - suffix_.length()) == suffix_; |
936 } | 1042 } |
937 | 1043 |
938 void DescribeTo(::std::ostream* os) const { | 1044 void DescribeTo(::std::ostream* os) const { |
939 *os << "ends with "; | 1045 *os << "ends with "; |
940 UniversalPrinter<StringType>::Print(suffix_, os); | 1046 UniversalPrinter<StringType>::Print(suffix_, os); |
941 } | 1047 } |
942 | 1048 |
943 void DescribeNegationTo(::std::ostream* os) const { | 1049 void DescribeNegationTo(::std::ostream* os) const { |
944 *os << "doesn't end with "; | 1050 *os << "doesn't end with "; |
945 UniversalPrinter<StringType>::Print(suffix_, os); | 1051 UniversalPrinter<StringType>::Print(suffix_, os); |
946 } | 1052 } |
947 | 1053 |
948 private: | 1054 private: |
949 const StringType suffix_; | 1055 const StringType suffix_; |
950 | 1056 |
951 GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); | 1057 GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); |
952 }; | 1058 }; |
953 | 1059 |
954 #if GMOCK_HAS_REGEX | |
955 | |
956 // Implements polymorphic matchers MatchesRegex(regex) and | 1060 // Implements polymorphic matchers MatchesRegex(regex) and |
957 // ContainsRegex(regex), which can be used as a Matcher<T> as long as | 1061 // ContainsRegex(regex), which can be used as a Matcher<T> as long as |
958 // T can be converted to a string. | 1062 // T can be converted to a string. |
959 class MatchesRegexMatcher { | 1063 class MatchesRegexMatcher { |
960 public: | 1064 public: |
961 MatchesRegexMatcher(const RE* regex, bool full_match) | 1065 MatchesRegexMatcher(const RE* regex, bool full_match) |
962 : regex_(regex), full_match_(full_match) {} | 1066 : regex_(regex), full_match_(full_match) {} |
963 | 1067 |
964 // These overloaded methods allow MatchesRegex(regex) to be used as | 1068 // These overloaded methods allow MatchesRegex(regex) to be used as |
965 // a Matcher<T> as long as T can be converted to string. Returns | 1069 // a Matcher<T> as long as T can be converted to string. Returns |
966 // true iff s matches regular expression regex. When full_match_ is | 1070 // true iff s matches regular expression regex. When full_match_ is |
967 // true, a full match is done; otherwise a partial match is done. | 1071 // true, a full match is done; otherwise a partial match is done. |
968 bool Matches(const char* s) const { | 1072 bool MatchAndExplain(const char* s, |
969 return s != NULL && Matches(internal::string(s)); | 1073 MatchResultListener* listener) const { |
| 1074 return s != NULL && MatchAndExplain(internal::string(s), listener); |
970 } | 1075 } |
971 | 1076 |
972 bool Matches(const internal::string& s) const { | 1077 bool MatchAndExplain(const internal::string& s, |
| 1078 MatchResultListener* /* listener */) const { |
973 return full_match_ ? RE::FullMatch(s, *regex_) : | 1079 return full_match_ ? RE::FullMatch(s, *regex_) : |
974 RE::PartialMatch(s, *regex_); | 1080 RE::PartialMatch(s, *regex_); |
975 } | 1081 } |
976 | 1082 |
977 void DescribeTo(::std::ostream* os) const { | 1083 void DescribeTo(::std::ostream* os) const { |
978 *os << (full_match_ ? "matches" : "contains") | 1084 *os << (full_match_ ? "matches" : "contains") |
979 << " regular expression "; | 1085 << " regular expression "; |
980 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); | 1086 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); |
981 } | 1087 } |
982 | 1088 |
983 void DescribeNegationTo(::std::ostream* os) const { | 1089 void DescribeNegationTo(::std::ostream* os) const { |
984 *os << "doesn't " << (full_match_ ? "match" : "contain") | 1090 *os << "doesn't " << (full_match_ ? "match" : "contain") |
985 << " regular expression "; | 1091 << " regular expression "; |
986 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); | 1092 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); |
987 } | 1093 } |
988 | 1094 |
989 private: | 1095 private: |
990 const internal::linked_ptr<const RE> regex_; | 1096 const internal::linked_ptr<const RE> regex_; |
991 const bool full_match_; | 1097 const bool full_match_; |
992 | 1098 |
993 GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); | 1099 GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); |
994 }; | 1100 }; |
995 | 1101 |
996 #endif // GMOCK_HAS_REGEX | |
997 | |
998 // Implements a matcher that compares the two fields of a 2-tuple | 1102 // Implements a matcher that compares the two fields of a 2-tuple |
999 // using one of the ==, <=, <, etc, operators. The two fields being | 1103 // using one of the ==, <=, <, etc, operators. The two fields being |
1000 // compared don't have to have the same type. | 1104 // compared don't have to have the same type. |
1001 // | 1105 // |
1002 // The matcher defined here is polymorphic (for example, Eq() can be | 1106 // The matcher defined here is polymorphic (for example, Eq() can be |
1003 // used to match a tuple<int, short>, a tuple<const long&, double>, | 1107 // used to match a tuple<int, short>, a tuple<const long&, double>, |
1004 // etc). Therefore we use a template type conversion operator in the | 1108 // etc). Therefore we use a template type conversion operator in the |
1005 // implementation. | 1109 // implementation. |
1006 // | 1110 // |
1007 // We define this as a macro in order to eliminate duplicated source | 1111 // We define this as a macro in order to eliminate duplicated source |
1008 // code. | 1112 // code. |
1009 #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op) \ | 1113 #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op) \ |
1010 class name##2Matcher { \ | 1114 class name##2Matcher { \ |
1011 public: \ | 1115 public: \ |
1012 template <typename T1, typename T2> \ | 1116 template <typename T1, typename T2> \ |
1013 operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ | 1117 operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ |
1014 return MakeMatcher(new Impl<T1, T2>); \ | 1118 return MakeMatcher(new Impl<T1, T2>); \ |
1015 } \ | 1119 } \ |
1016 private: \ | 1120 private: \ |
1017 template <typename T1, typename T2> \ | 1121 template <typename T1, typename T2> \ |
1018 class Impl : public MatcherInterface<const ::std::tr1::tuple<T1, T2>&> { \ | 1122 class Impl : public MatcherInterface<const ::std::tr1::tuple<T1, T2>&> { \ |
1019 public: \ | 1123 public: \ |
1020 virtual bool Matches(const ::std::tr1::tuple<T1, T2>& args) const { \ | 1124 virtual bool MatchAndExplain( \ |
| 1125 const ::std::tr1::tuple<T1, T2>& args, \ |
| 1126 MatchResultListener* /* listener */) const { \ |
1021 return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ | 1127 return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ |
1022 } \ | 1128 } \ |
1023 virtual void DescribeTo(::std::ostream* os) const { \ | 1129 virtual void DescribeTo(::std::ostream* os) const { \ |
1024 *os << "are a pair (x, y) where x " #op " y"; \ | 1130 *os << "are a pair (x, y) where x " #op " y"; \ |
1025 } \ | 1131 } \ |
1026 virtual void DescribeNegationTo(::std::ostream* os) const { \ | 1132 virtual void DescribeNegationTo(::std::ostream* os) const { \ |
1027 *os << "are a pair (x, y) where x " #op " y is false"; \ | 1133 *os << "are a pair (x, y) where x " #op " y is false"; \ |
1028 } \ | 1134 } \ |
1029 }; \ | 1135 }; \ |
1030 } | 1136 } |
(...skipping 11 matching lines...) Expand all Loading... |
1042 // Implements the Not(...) matcher for a particular argument type T. | 1148 // Implements the Not(...) matcher for a particular argument type T. |
1043 // We do not nest it inside the NotMatcher class template, as that | 1149 // We do not nest it inside the NotMatcher class template, as that |
1044 // will prevent different instantiations of NotMatcher from sharing | 1150 // will prevent different instantiations of NotMatcher from sharing |
1045 // the same NotMatcherImpl<T> class. | 1151 // the same NotMatcherImpl<T> class. |
1046 template <typename T> | 1152 template <typename T> |
1047 class NotMatcherImpl : public MatcherInterface<T> { | 1153 class NotMatcherImpl : public MatcherInterface<T> { |
1048 public: | 1154 public: |
1049 explicit NotMatcherImpl(const Matcher<T>& matcher) | 1155 explicit NotMatcherImpl(const Matcher<T>& matcher) |
1050 : matcher_(matcher) {} | 1156 : matcher_(matcher) {} |
1051 | 1157 |
1052 virtual bool Matches(T x) const { | 1158 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { |
1053 return !matcher_.Matches(x); | 1159 return !matcher_.MatchAndExplain(x, listener); |
1054 } | 1160 } |
1055 | 1161 |
1056 virtual void DescribeTo(::std::ostream* os) const { | 1162 virtual void DescribeTo(::std::ostream* os) const { |
1057 matcher_.DescribeNegationTo(os); | 1163 matcher_.DescribeNegationTo(os); |
1058 } | 1164 } |
1059 | 1165 |
1060 virtual void DescribeNegationTo(::std::ostream* os) const { | 1166 virtual void DescribeNegationTo(::std::ostream* os) const { |
1061 matcher_.DescribeTo(os); | 1167 matcher_.DescribeTo(os); |
1062 } | 1168 } |
1063 | 1169 |
1064 virtual void ExplainMatchResultTo(T x, ::std::ostream* os) const { | |
1065 matcher_.ExplainMatchResultTo(x, os); | |
1066 } | |
1067 | |
1068 private: | 1170 private: |
1069 const Matcher<T> matcher_; | 1171 const Matcher<T> matcher_; |
1070 | 1172 |
1071 GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); | 1173 GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); |
1072 }; | 1174 }; |
1073 | 1175 |
1074 // Implements the Not(m) matcher, which matches a value that doesn't | 1176 // Implements the Not(m) matcher, which matches a value that doesn't |
1075 // match matcher m. | 1177 // match matcher m. |
1076 template <typename InnerMatcher> | 1178 template <typename InnerMatcher> |
1077 class NotMatcher { | 1179 class NotMatcher { |
(...skipping 16 matching lines...) Expand all Loading... |
1094 // Implements the AllOf(m1, m2) matcher for a particular argument type | 1196 // Implements the AllOf(m1, m2) matcher for a particular argument type |
1095 // T. We do not nest it inside the BothOfMatcher class template, as | 1197 // T. We do not nest it inside the BothOfMatcher class template, as |
1096 // that will prevent different instantiations of BothOfMatcher from | 1198 // that will prevent different instantiations of BothOfMatcher from |
1097 // sharing the same BothOfMatcherImpl<T> class. | 1199 // sharing the same BothOfMatcherImpl<T> class. |
1098 template <typename T> | 1200 template <typename T> |
1099 class BothOfMatcherImpl : public MatcherInterface<T> { | 1201 class BothOfMatcherImpl : public MatcherInterface<T> { |
1100 public: | 1202 public: |
1101 BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) | 1203 BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) |
1102 : matcher1_(matcher1), matcher2_(matcher2) {} | 1204 : matcher1_(matcher1), matcher2_(matcher2) {} |
1103 | 1205 |
1104 virtual bool Matches(T x) const { | |
1105 return matcher1_.Matches(x) && matcher2_.Matches(x); | |
1106 } | |
1107 | |
1108 virtual void DescribeTo(::std::ostream* os) const { | 1206 virtual void DescribeTo(::std::ostream* os) const { |
1109 *os << "("; | 1207 *os << "("; |
1110 matcher1_.DescribeTo(os); | 1208 matcher1_.DescribeTo(os); |
1111 *os << ") and ("; | 1209 *os << ") and ("; |
1112 matcher2_.DescribeTo(os); | 1210 matcher2_.DescribeTo(os); |
1113 *os << ")"; | 1211 *os << ")"; |
1114 } | 1212 } |
1115 | 1213 |
1116 virtual void DescribeNegationTo(::std::ostream* os) const { | 1214 virtual void DescribeNegationTo(::std::ostream* os) const { |
1117 *os << "not "; | 1215 *os << "not "; |
1118 DescribeTo(os); | 1216 DescribeTo(os); |
1119 } | 1217 } |
1120 | 1218 |
1121 virtual void ExplainMatchResultTo(T x, ::std::ostream* os) const { | 1219 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { |
1122 if (Matches(x)) { | 1220 // If either matcher1_ or matcher2_ doesn't match x, we only need |
1123 // When both matcher1_ and matcher2_ match x, we need to | 1221 // to explain why one of them fails. |
1124 // explain why *both* of them match. | 1222 StringMatchResultListener listener1; |
1125 ::std::stringstream ss1; | 1223 if (!matcher1_.MatchAndExplain(x, &listener1)) { |
1126 matcher1_.ExplainMatchResultTo(x, &ss1); | 1224 *listener << listener1.str(); |
1127 const internal::string s1 = ss1.str(); | 1225 return false; |
| 1226 } |
1128 | 1227 |
1129 ::std::stringstream ss2; | 1228 StringMatchResultListener listener2; |
1130 matcher2_.ExplainMatchResultTo(x, &ss2); | 1229 if (!matcher2_.MatchAndExplain(x, &listener2)) { |
1131 const internal::string s2 = ss2.str(); | 1230 *listener << listener2.str(); |
| 1231 return false; |
| 1232 } |
1132 | 1233 |
1133 if (s1 == "") { | 1234 // Otherwise we need to explain why *both* of them match. |
1134 *os << s2; | 1235 const internal::string s1 = listener1.str(); |
1135 } else { | 1236 const internal::string s2 = listener2.str(); |
1136 *os << s1; | 1237 |
1137 if (s2 != "") { | 1238 if (s1 == "") { |
1138 *os << "; " << s2; | 1239 *listener << s2; |
1139 } | |
1140 } | |
1141 } else { | 1240 } else { |
1142 // Otherwise we only need to explain why *one* of them fails | 1241 *listener << s1; |
1143 // to match. | 1242 if (s2 != "") { |
1144 if (!matcher1_.Matches(x)) { | 1243 *listener << "; " << s2; |
1145 matcher1_.ExplainMatchResultTo(x, os); | |
1146 } else { | |
1147 matcher2_.ExplainMatchResultTo(x, os); | |
1148 } | 1244 } |
1149 } | 1245 } |
| 1246 return true; |
1150 } | 1247 } |
1151 | 1248 |
1152 private: | 1249 private: |
1153 const Matcher<T> matcher1_; | 1250 const Matcher<T> matcher1_; |
1154 const Matcher<T> matcher2_; | 1251 const Matcher<T> matcher2_; |
1155 | 1252 |
1156 GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); | 1253 GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); |
1157 }; | 1254 }; |
1158 | 1255 |
1159 // Used for implementing the AllOf(m_1, ..., m_n) matcher, which | 1256 // Used for implementing the AllOf(m_1, ..., m_n) matcher, which |
(...skipping 23 matching lines...) Expand all Loading... |
1183 // Implements the AnyOf(m1, m2) matcher for a particular argument type | 1280 // Implements the AnyOf(m1, m2) matcher for a particular argument type |
1184 // T. We do not nest it inside the AnyOfMatcher class template, as | 1281 // T. We do not nest it inside the AnyOfMatcher class template, as |
1185 // that will prevent different instantiations of AnyOfMatcher from | 1282 // that will prevent different instantiations of AnyOfMatcher from |
1186 // sharing the same EitherOfMatcherImpl<T> class. | 1283 // sharing the same EitherOfMatcherImpl<T> class. |
1187 template <typename T> | 1284 template <typename T> |
1188 class EitherOfMatcherImpl : public MatcherInterface<T> { | 1285 class EitherOfMatcherImpl : public MatcherInterface<T> { |
1189 public: | 1286 public: |
1190 EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) | 1287 EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) |
1191 : matcher1_(matcher1), matcher2_(matcher2) {} | 1288 : matcher1_(matcher1), matcher2_(matcher2) {} |
1192 | 1289 |
1193 virtual bool Matches(T x) const { | |
1194 return matcher1_.Matches(x) || matcher2_.Matches(x); | |
1195 } | |
1196 | |
1197 virtual void DescribeTo(::std::ostream* os) const { | 1290 virtual void DescribeTo(::std::ostream* os) const { |
1198 *os << "("; | 1291 *os << "("; |
1199 matcher1_.DescribeTo(os); | 1292 matcher1_.DescribeTo(os); |
1200 *os << ") or ("; | 1293 *os << ") or ("; |
1201 matcher2_.DescribeTo(os); | 1294 matcher2_.DescribeTo(os); |
1202 *os << ")"; | 1295 *os << ")"; |
1203 } | 1296 } |
1204 | 1297 |
1205 virtual void DescribeNegationTo(::std::ostream* os) const { | 1298 virtual void DescribeNegationTo(::std::ostream* os) const { |
1206 *os << "not "; | 1299 *os << "not "; |
1207 DescribeTo(os); | 1300 DescribeTo(os); |
1208 } | 1301 } |
1209 | 1302 |
1210 virtual void ExplainMatchResultTo(T x, ::std::ostream* os) const { | 1303 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { |
1211 if (Matches(x)) { | 1304 // If either matcher1_ or matcher2_ matches x, we just need to |
1212 // If either matcher1_ or matcher2_ matches x, we just need | 1305 // explain why *one* of them matches. |
1213 // to explain why *one* of them matches. | 1306 StringMatchResultListener listener1; |
1214 if (matcher1_.Matches(x)) { | 1307 if (matcher1_.MatchAndExplain(x, &listener1)) { |
1215 matcher1_.ExplainMatchResultTo(x, os); | 1308 *listener << listener1.str(); |
1216 } else { | 1309 return true; |
1217 matcher2_.ExplainMatchResultTo(x, os); | 1310 } |
1218 } | 1311 |
| 1312 StringMatchResultListener listener2; |
| 1313 if (matcher2_.MatchAndExplain(x, &listener2)) { |
| 1314 *listener << listener2.str(); |
| 1315 return true; |
| 1316 } |
| 1317 |
| 1318 // Otherwise we need to explain why *both* of them fail. |
| 1319 const internal::string s1 = listener1.str(); |
| 1320 const internal::string s2 = listener2.str(); |
| 1321 |
| 1322 if (s1 == "") { |
| 1323 *listener << s2; |
1219 } else { | 1324 } else { |
1220 // Otherwise we need to explain why *neither* matches. | 1325 *listener << s1; |
1221 ::std::stringstream ss1; | 1326 if (s2 != "") { |
1222 matcher1_.ExplainMatchResultTo(x, &ss1); | 1327 *listener << "; " << s2; |
1223 const internal::string s1 = ss1.str(); | |
1224 | |
1225 ::std::stringstream ss2; | |
1226 matcher2_.ExplainMatchResultTo(x, &ss2); | |
1227 const internal::string s2 = ss2.str(); | |
1228 | |
1229 if (s1 == "") { | |
1230 *os << s2; | |
1231 } else { | |
1232 *os << s1; | |
1233 if (s2 != "") { | |
1234 *os << "; " << s2; | |
1235 } | |
1236 } | 1328 } |
1237 } | 1329 } |
| 1330 return false; |
1238 } | 1331 } |
1239 | 1332 |
1240 private: | 1333 private: |
1241 const Matcher<T> matcher1_; | 1334 const Matcher<T> matcher1_; |
1242 const Matcher<T> matcher2_; | 1335 const Matcher<T> matcher2_; |
1243 | 1336 |
1244 GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); | 1337 GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); |
1245 }; | 1338 }; |
1246 | 1339 |
1247 // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which | 1340 // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which |
(...skipping 26 matching lines...) Expand all Loading... |
1274 template <typename Predicate> | 1367 template <typename Predicate> |
1275 class TrulyMatcher { | 1368 class TrulyMatcher { |
1276 public: | 1369 public: |
1277 explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} | 1370 explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} |
1278 | 1371 |
1279 // This method template allows Truly(pred) to be used as a matcher | 1372 // This method template allows Truly(pred) to be used as a matcher |
1280 // for type T where T is the argument type of predicate 'pred'. The | 1373 // for type T where T is the argument type of predicate 'pred'. The |
1281 // argument is passed by reference as the predicate may be | 1374 // argument is passed by reference as the predicate may be |
1282 // interested in the address of the argument. | 1375 // interested in the address of the argument. |
1283 template <typename T> | 1376 template <typename T> |
1284 bool Matches(T& x) const { // NOLINT | 1377 bool MatchAndExplain(T& x, // NOLINT |
| 1378 MatchResultListener* /* listener */) const { |
1285 #if GTEST_OS_WINDOWS | 1379 #if GTEST_OS_WINDOWS |
1286 // MSVC warns about converting a value into bool (warning 4800). | 1380 // MSVC warns about converting a value into bool (warning 4800). |
1287 #pragma warning(push) // Saves the current warning state. | 1381 #pragma warning(push) // Saves the current warning state. |
1288 #pragma warning(disable:4800) // Temporarily disables warning 4800. | 1382 #pragma warning(disable:4800) // Temporarily disables warning 4800. |
1289 #endif // GTEST_OS_WINDOWS | 1383 #endif // GTEST_OS_WINDOWS |
1290 return predicate_(x); | 1384 return predicate_(x); |
1291 #if GTEST_OS_WINDOWS | 1385 #if GTEST_OS_WINDOWS |
1292 #pragma warning(pop) // Restores the warning state. | 1386 #pragma warning(pop) // Restores the warning state. |
1293 #endif // GTEST_OS_WINDOWS | 1387 #endif // GTEST_OS_WINDOWS |
1294 } | 1388 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 // We convert matcher_ to a Matcher<const T&> *now* instead of | 1454 // We convert matcher_ to a Matcher<const T&> *now* instead of |
1361 // when the PredicateFormatterFromMatcher object was constructed, | 1455 // when the PredicateFormatterFromMatcher object was constructed, |
1362 // as matcher_ may be polymorphic (e.g. NotNull()) and we won't | 1456 // as matcher_ may be polymorphic (e.g. NotNull()) and we won't |
1363 // know which type to instantiate it to until we actually see the | 1457 // know which type to instantiate it to until we actually see the |
1364 // type of x here. | 1458 // type of x here. |
1365 // | 1459 // |
1366 // We write MatcherCast<const T&>(matcher_) instead of | 1460 // We write MatcherCast<const T&>(matcher_) instead of |
1367 // Matcher<const T&>(matcher_), as the latter won't compile when | 1461 // Matcher<const T&>(matcher_), as the latter won't compile when |
1368 // matcher_ has type Matcher<T> (e.g. An<int>()). | 1462 // matcher_ has type Matcher<T> (e.g. An<int>()). |
1369 const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); | 1463 const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); |
1370 if (matcher.Matches(x)) { | 1464 StringMatchResultListener listener; |
| 1465 if (matcher.MatchAndExplain(x, &listener)) { |
1371 return AssertionSuccess(); | 1466 return AssertionSuccess(); |
1372 } else { | 1467 } else { |
1373 ::std::stringstream ss; | 1468 ::std::stringstream ss; |
1374 ss << "Value of: " << value_text << "\n" | 1469 ss << "Value of: " << value_text << "\n" |
1375 << "Expected: "; | 1470 << "Expected: "; |
1376 matcher.DescribeTo(&ss); | 1471 matcher.DescribeTo(&ss); |
1377 ss << "\n Actual: "; | 1472 ss << "\n Actual: "; |
1378 UniversalPrinter<T>::Print(x, &ss); | 1473 UniversalPrinter<T>::Print(x, &ss); |
1379 ExplainMatchResultAsNeededTo<const T&>(matcher, x, &ss); | 1474 StreamInParensAsNeeded(listener.str(), &ss); |
1380 return AssertionFailure(Message() << ss.str()); | 1475 return AssertionFailure(Message() << ss.str()); |
1381 } | 1476 } |
1382 } | 1477 } |
1383 | 1478 |
1384 private: | 1479 private: |
1385 const M matcher_; | 1480 const M matcher_; |
1386 | 1481 |
1387 GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); | 1482 GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); |
1388 }; | 1483 }; |
1389 | 1484 |
(...skipping 20 matching lines...) Expand all Loading... |
1410 FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : | 1505 FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : |
1411 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} | 1506 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} |
1412 | 1507 |
1413 // Implements floating point equality matcher as a Matcher<T>. | 1508 // Implements floating point equality matcher as a Matcher<T>. |
1414 template <typename T> | 1509 template <typename T> |
1415 class Impl : public MatcherInterface<T> { | 1510 class Impl : public MatcherInterface<T> { |
1416 public: | 1511 public: |
1417 Impl(FloatType rhs, bool nan_eq_nan) : | 1512 Impl(FloatType rhs, bool nan_eq_nan) : |
1418 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} | 1513 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} |
1419 | 1514 |
1420 virtual bool Matches(T value) const { | 1515 virtual bool MatchAndExplain(T value, |
| 1516 MatchResultListener* /* listener */) const { |
1421 const FloatingPoint<FloatType> lhs(value), rhs(rhs_); | 1517 const FloatingPoint<FloatType> lhs(value), rhs(rhs_); |
1422 | 1518 |
1423 // Compares NaNs first, if nan_eq_nan_ is true. | 1519 // Compares NaNs first, if nan_eq_nan_ is true. |
1424 if (nan_eq_nan_ && lhs.is_nan()) { | 1520 if (nan_eq_nan_ && lhs.is_nan()) { |
1425 return rhs.is_nan(); | 1521 return rhs.is_nan(); |
1426 } | 1522 } |
1427 | 1523 |
1428 return lhs.AlmostEquals(rhs); | 1524 return lhs.AlmostEquals(rhs); |
1429 } | 1525 } |
1430 | 1526 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1518 // The monomorphic implementation that works for a particular pointer type. | 1614 // The monomorphic implementation that works for a particular pointer type. |
1519 template <typename Pointer> | 1615 template <typename Pointer> |
1520 class Impl : public MatcherInterface<Pointer> { | 1616 class Impl : public MatcherInterface<Pointer> { |
1521 public: | 1617 public: |
1522 typedef typename PointeeOf<GMOCK_REMOVE_CONST_( // NOLINT | 1618 typedef typename PointeeOf<GMOCK_REMOVE_CONST_( // NOLINT |
1523 GMOCK_REMOVE_REFERENCE_(Pointer))>::type Pointee; | 1619 GMOCK_REMOVE_REFERENCE_(Pointer))>::type Pointee; |
1524 | 1620 |
1525 explicit Impl(const InnerMatcher& matcher) | 1621 explicit Impl(const InnerMatcher& matcher) |
1526 : matcher_(MatcherCast<const Pointee&>(matcher)) {} | 1622 : matcher_(MatcherCast<const Pointee&>(matcher)) {} |
1527 | 1623 |
1528 virtual bool Matches(Pointer p) const { | |
1529 return GetRawPointer(p) != NULL && matcher_.Matches(*p); | |
1530 } | |
1531 | |
1532 virtual void DescribeTo(::std::ostream* os) const { | 1624 virtual void DescribeTo(::std::ostream* os) const { |
1533 *os << "points to a value that "; | 1625 *os << "points to a value that "; |
1534 matcher_.DescribeTo(os); | 1626 matcher_.DescribeTo(os); |
1535 } | 1627 } |
1536 | 1628 |
1537 virtual void DescribeNegationTo(::std::ostream* os) const { | 1629 virtual void DescribeNegationTo(::std::ostream* os) const { |
1538 *os << "does not point to a value that "; | 1630 *os << "does not point to a value that "; |
1539 matcher_.DescribeTo(os); | 1631 matcher_.DescribeTo(os); |
1540 } | 1632 } |
1541 | 1633 |
1542 virtual void ExplainMatchResultTo(Pointer pointer, | 1634 virtual bool MatchAndExplain(Pointer pointer, |
1543 ::std::ostream* os) const { | 1635 MatchResultListener* listener) const { |
1544 if (GetRawPointer(pointer) == NULL) | 1636 if (GetRawPointer(pointer) == NULL) |
1545 return; | 1637 return false; |
1546 | 1638 |
1547 ::std::stringstream ss; | 1639 *listener << "which points to "; |
1548 matcher_.ExplainMatchResultTo(*pointer, &ss); | 1640 return MatchPrintAndExplain(*pointer, matcher_, listener); |
1549 const internal::string s = ss.str(); | |
1550 if (s != "") { | |
1551 *os << "points to a value that " << s; | |
1552 } | |
1553 } | 1641 } |
1554 | 1642 |
1555 private: | 1643 private: |
1556 const Matcher<const Pointee&> matcher_; | 1644 const Matcher<const Pointee&> matcher_; |
1557 | 1645 |
1558 GTEST_DISALLOW_ASSIGN_(Impl); | 1646 GTEST_DISALLOW_ASSIGN_(Impl); |
1559 }; | 1647 }; |
1560 | 1648 |
1561 const InnerMatcher matcher_; | 1649 const InnerMatcher matcher_; |
1562 | 1650 |
1563 GTEST_DISALLOW_ASSIGN_(PointeeMatcher); | 1651 GTEST_DISALLOW_ASSIGN_(PointeeMatcher); |
1564 }; | 1652 }; |
1565 | 1653 |
1566 // Implements the Field() matcher for matching a field (i.e. member | 1654 // Implements the Field() matcher for matching a field (i.e. member |
1567 // variable) of an object. | 1655 // variable) of an object. |
1568 template <typename Class, typename FieldType> | 1656 template <typename Class, typename FieldType> |
1569 class FieldMatcher { | 1657 class FieldMatcher { |
1570 public: | 1658 public: |
1571 FieldMatcher(FieldType Class::*field, | 1659 FieldMatcher(FieldType Class::*field, |
1572 const Matcher<const FieldType&>& matcher) | 1660 const Matcher<const FieldType&>& matcher) |
1573 : field_(field), matcher_(matcher) {} | 1661 : field_(field), matcher_(matcher) {} |
1574 | 1662 |
1575 // Returns true iff the inner matcher matches obj.field. | |
1576 bool Matches(const Class& obj) const { | |
1577 return matcher_.Matches(obj.*field_); | |
1578 } | |
1579 | |
1580 // Returns true iff the inner matcher matches obj->field. | |
1581 bool Matches(const Class* p) const { | |
1582 return (p != NULL) && matcher_.Matches(p->*field_); | |
1583 } | |
1584 | |
1585 void DescribeTo(::std::ostream* os) const { | 1663 void DescribeTo(::std::ostream* os) const { |
1586 *os << "the given field "; | 1664 *os << "is an object whose given field "; |
1587 matcher_.DescribeTo(os); | 1665 matcher_.DescribeTo(os); |
1588 } | 1666 } |
1589 | 1667 |
1590 void DescribeNegationTo(::std::ostream* os) const { | 1668 void DescribeNegationTo(::std::ostream* os) const { |
1591 *os << "the given field "; | 1669 *os << "is an object whose given field "; |
1592 matcher_.DescribeNegationTo(os); | 1670 matcher_.DescribeNegationTo(os); |
1593 } | 1671 } |
1594 | 1672 |
1595 // The first argument of ExplainMatchResultTo() is needed to help | 1673 template <typename T> |
1596 // Symbian's C++ compiler choose which overload to use. Its type is | 1674 bool MatchAndExplain(const T& value, MatchResultListener* listener) const { |
1597 // true_type iff the Field() matcher is used to match a pointer. | 1675 return MatchAndExplainImpl( |
1598 void ExplainMatchResultTo(false_type /* is_not_pointer */, const Class& obj, | 1676 typename ::testing::internal:: |
1599 ::std::ostream* os) const { | 1677 is_pointer<GMOCK_REMOVE_CONST_(T)>::type(), |
1600 ::std::stringstream ss; | 1678 value, listener); |
1601 matcher_.ExplainMatchResultTo(obj.*field_, &ss); | |
1602 const internal::string s = ss.str(); | |
1603 if (s != "") { | |
1604 *os << "the given field " << s; | |
1605 } | |
1606 } | |
1607 | |
1608 void ExplainMatchResultTo(true_type /* is_pointer */, const Class* p, | |
1609 ::std::ostream* os) const { | |
1610 if (p != NULL) { | |
1611 // Since *p has a field, it must be a class/struct/union type | |
1612 // and thus cannot be a pointer. Therefore we pass false_type() | |
1613 // as the first argument. | |
1614 ExplainMatchResultTo(false_type(), *p, os); | |
1615 } | |
1616 } | 1679 } |
1617 | 1680 |
1618 private: | 1681 private: |
| 1682 // The first argument of MatchAndExplainImpl() is needed to help |
| 1683 // Symbian's C++ compiler choose which overload to use. Its type is |
| 1684 // true_type iff the Field() matcher is used to match a pointer. |
| 1685 bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, |
| 1686 MatchResultListener* listener) const { |
| 1687 *listener << "whose given field is "; |
| 1688 return MatchPrintAndExplain(obj.*field_, matcher_, listener); |
| 1689 } |
| 1690 |
| 1691 bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, |
| 1692 MatchResultListener* listener) const { |
| 1693 if (p == NULL) |
| 1694 return false; |
| 1695 |
| 1696 *listener << "which points to an object "; |
| 1697 // Since *p has a field, it must be a class/struct/union type and |
| 1698 // thus cannot be a pointer. Therefore we pass false_type() as |
| 1699 // the first argument. |
| 1700 return MatchAndExplainImpl(false_type(), *p, listener); |
| 1701 } |
| 1702 |
1619 const FieldType Class::*field_; | 1703 const FieldType Class::*field_; |
1620 const Matcher<const FieldType&> matcher_; | 1704 const Matcher<const FieldType&> matcher_; |
1621 | 1705 |
1622 GTEST_DISALLOW_ASSIGN_(FieldMatcher); | 1706 GTEST_DISALLOW_ASSIGN_(FieldMatcher); |
1623 }; | 1707 }; |
1624 | 1708 |
1625 // Explains the result of matching an object or pointer against a field matcher. | |
1626 template <typename Class, typename FieldType, typename T> | |
1627 void ExplainMatchResultTo(const FieldMatcher<Class, FieldType>& matcher, | |
1628 const T& value, ::std::ostream* os) { | |
1629 matcher.ExplainMatchResultTo( | |
1630 typename ::testing::internal::is_pointer<T>::type(), value, os); | |
1631 } | |
1632 | |
1633 // Implements the Property() matcher for matching a property | 1709 // Implements the Property() matcher for matching a property |
1634 // (i.e. return value of a getter method) of an object. | 1710 // (i.e. return value of a getter method) of an object. |
1635 template <typename Class, typename PropertyType> | 1711 template <typename Class, typename PropertyType> |
1636 class PropertyMatcher { | 1712 class PropertyMatcher { |
1637 public: | 1713 public: |
1638 // The property may have a reference type, so 'const PropertyType&' | 1714 // The property may have a reference type, so 'const PropertyType&' |
1639 // may cause double references and fail to compile. That's why we | 1715 // may cause double references and fail to compile. That's why we |
1640 // need GMOCK_REFERENCE_TO_CONST, which works regardless of | 1716 // need GMOCK_REFERENCE_TO_CONST, which works regardless of |
1641 // PropertyType being a reference or not. | 1717 // PropertyType being a reference or not. |
1642 typedef GMOCK_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; | 1718 typedef GMOCK_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; |
1643 | 1719 |
1644 PropertyMatcher(PropertyType (Class::*property)() const, | 1720 PropertyMatcher(PropertyType (Class::*property)() const, |
1645 const Matcher<RefToConstProperty>& matcher) | 1721 const Matcher<RefToConstProperty>& matcher) |
1646 : property_(property), matcher_(matcher) {} | 1722 : property_(property), matcher_(matcher) {} |
1647 | 1723 |
1648 // Returns true iff obj.property() matches the inner matcher. | |
1649 bool Matches(const Class& obj) const { | |
1650 return matcher_.Matches((obj.*property_)()); | |
1651 } | |
1652 | |
1653 // Returns true iff p->property() matches the inner matcher. | |
1654 bool Matches(const Class* p) const { | |
1655 return (p != NULL) && matcher_.Matches((p->*property_)()); | |
1656 } | |
1657 | |
1658 void DescribeTo(::std::ostream* os) const { | 1724 void DescribeTo(::std::ostream* os) const { |
1659 *os << "the given property "; | 1725 *os << "is an object whose given property "; |
1660 matcher_.DescribeTo(os); | 1726 matcher_.DescribeTo(os); |
1661 } | 1727 } |
1662 | 1728 |
1663 void DescribeNegationTo(::std::ostream* os) const { | 1729 void DescribeNegationTo(::std::ostream* os) const { |
1664 *os << "the given property "; | 1730 *os << "is an object whose given property "; |
1665 matcher_.DescribeNegationTo(os); | 1731 matcher_.DescribeNegationTo(os); |
1666 } | 1732 } |
1667 | 1733 |
1668 // The first argument of ExplainMatchResultTo() is needed to help | 1734 template <typename T> |
1669 // Symbian's C++ compiler choose which overload to use. Its type is | 1735 bool MatchAndExplain(const T&value, MatchResultListener* listener) const { |
1670 // true_type iff the Property() matcher is used to match a pointer. | 1736 return MatchAndExplainImpl( |
1671 void ExplainMatchResultTo(false_type /* is_not_pointer */, const Class& obj, | 1737 typename ::testing::internal:: |
1672 ::std::ostream* os) const { | 1738 is_pointer<GMOCK_REMOVE_CONST_(T)>::type(), |
1673 ::std::stringstream ss; | 1739 value, listener); |
1674 matcher_.ExplainMatchResultTo((obj.*property_)(), &ss); | |
1675 const internal::string s = ss.str(); | |
1676 if (s != "") { | |
1677 *os << "the given property " << s; | |
1678 } | |
1679 } | |
1680 | |
1681 void ExplainMatchResultTo(true_type /* is_pointer */, const Class* p, | |
1682 ::std::ostream* os) const { | |
1683 if (p != NULL) { | |
1684 // Since *p has a property method, it must be a | |
1685 // class/struct/union type and thus cannot be a pointer. | |
1686 // Therefore we pass false_type() as the first argument. | |
1687 ExplainMatchResultTo(false_type(), *p, os); | |
1688 } | |
1689 } | 1740 } |
1690 | 1741 |
1691 private: | 1742 private: |
| 1743 // The first argument of MatchAndExplainImpl() is needed to help |
| 1744 // Symbian's C++ compiler choose which overload to use. Its type is |
| 1745 // true_type iff the Property() matcher is used to match a pointer. |
| 1746 bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, |
| 1747 MatchResultListener* listener) const { |
| 1748 *listener << "whose given property is "; |
| 1749 // Cannot pass the return value (for example, int) to MatchPrintAndExplain, |
| 1750 // which takes a non-const reference as argument. |
| 1751 RefToConstProperty result = (obj.*property_)(); |
| 1752 return MatchPrintAndExplain(result, matcher_, listener); |
| 1753 } |
| 1754 |
| 1755 bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, |
| 1756 MatchResultListener* listener) const { |
| 1757 if (p == NULL) |
| 1758 return false; |
| 1759 |
| 1760 *listener << "which points to an object "; |
| 1761 // Since *p has a property method, it must be a class/struct/union |
| 1762 // type and thus cannot be a pointer. Therefore we pass |
| 1763 // false_type() as the first argument. |
| 1764 return MatchAndExplainImpl(false_type(), *p, listener); |
| 1765 } |
| 1766 |
1692 PropertyType (Class::*property_)() const; | 1767 PropertyType (Class::*property_)() const; |
1693 const Matcher<RefToConstProperty> matcher_; | 1768 const Matcher<RefToConstProperty> matcher_; |
1694 | 1769 |
1695 GTEST_DISALLOW_ASSIGN_(PropertyMatcher); | 1770 GTEST_DISALLOW_ASSIGN_(PropertyMatcher); |
1696 }; | 1771 }; |
1697 | 1772 |
1698 // Explains the result of matching an object or pointer against a | |
1699 // property matcher. | |
1700 template <typename Class, typename PropertyType, typename T> | |
1701 void ExplainMatchResultTo(const PropertyMatcher<Class, PropertyType>& matcher, | |
1702 const T& value, ::std::ostream* os) { | |
1703 matcher.ExplainMatchResultTo( | |
1704 typename ::testing::internal::is_pointer<T>::type(), value, os); | |
1705 } | |
1706 | |
1707 // Type traits specifying various features of different functors for ResultOf. | 1773 // Type traits specifying various features of different functors for ResultOf. |
1708 // The default template specifies features for functor objects. | 1774 // The default template specifies features for functor objects. |
1709 // Functor classes have to typedef argument_type and result_type | 1775 // Functor classes have to typedef argument_type and result_type |
1710 // to be compatible with ResultOf. | 1776 // to be compatible with ResultOf. |
1711 template <typename Functor> | 1777 template <typename Functor> |
1712 struct CallableTraits { | 1778 struct CallableTraits { |
1713 typedef typename Functor::result_type ResultType; | 1779 typedef typename Functor::result_type ResultType; |
1714 typedef Functor StorageType; | 1780 typedef Functor StorageType; |
1715 | 1781 |
1716 static void CheckIsValid(Functor /* functor */) {} | 1782 static void CheckIsValid(Functor /* functor */) {} |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 } | 1818 } |
1753 | 1819 |
1754 private: | 1820 private: |
1755 typedef typename CallableTraits<Callable>::StorageType CallableStorageType; | 1821 typedef typename CallableTraits<Callable>::StorageType CallableStorageType; |
1756 | 1822 |
1757 template <typename T> | 1823 template <typename T> |
1758 class Impl : public MatcherInterface<T> { | 1824 class Impl : public MatcherInterface<T> { |
1759 public: | 1825 public: |
1760 Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) | 1826 Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) |
1761 : callable_(callable), matcher_(matcher) {} | 1827 : callable_(callable), matcher_(matcher) {} |
1762 // Returns true iff callable_(obj) matches the inner matcher. | |
1763 // The calling syntax is different for different types of callables | |
1764 // so we abstract it in CallableTraits<Callable>::Invoke(). | |
1765 virtual bool Matches(T obj) const { | |
1766 return matcher_.Matches( | |
1767 CallableTraits<Callable>::template Invoke<T>(callable_, obj)); | |
1768 } | |
1769 | 1828 |
1770 virtual void DescribeTo(::std::ostream* os) const { | 1829 virtual void DescribeTo(::std::ostream* os) const { |
1771 *os << "result of the given callable "; | 1830 *os << "is mapped by the given callable to a value that "; |
1772 matcher_.DescribeTo(os); | 1831 matcher_.DescribeTo(os); |
1773 } | 1832 } |
1774 | 1833 |
1775 virtual void DescribeNegationTo(::std::ostream* os) const { | 1834 virtual void DescribeNegationTo(::std::ostream* os) const { |
1776 *os << "result of the given callable "; | 1835 *os << "is mapped by the given callable to a value that "; |
1777 matcher_.DescribeNegationTo(os); | 1836 matcher_.DescribeNegationTo(os); |
1778 } | 1837 } |
1779 | 1838 |
1780 virtual void ExplainMatchResultTo(T obj, ::std::ostream* os) const { | 1839 virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { |
1781 ::std::stringstream ss; | 1840 *listener << "which is mapped by the given callable to "; |
1782 matcher_.ExplainMatchResultTo( | 1841 // Cannot pass the return value (for example, int) to |
1783 CallableTraits<Callable>::template Invoke<T>(callable_, obj), | 1842 // MatchPrintAndExplain, which takes a non-const reference as argument. |
1784 &ss); | 1843 ResultType result = |
1785 const internal::string s = ss.str(); | 1844 CallableTraits<Callable>::template Invoke<T>(callable_, obj); |
1786 if (s != "") | 1845 return MatchPrintAndExplain(result, matcher_, listener); |
1787 *os << "result of the given callable " << s; | |
1788 } | 1846 } |
1789 | 1847 |
1790 private: | 1848 private: |
1791 // Functors often define operator() as non-const method even though | 1849 // Functors often define operator() as non-const method even though |
1792 // they are actualy stateless. But we need to use them even when | 1850 // they are actualy stateless. But we need to use them even when |
1793 // 'this' is a const pointer. It's the user's responsibility not to | 1851 // 'this' is a const pointer. It's the user's responsibility not to |
1794 // use stateful callables with ResultOf(), which does't guarantee | 1852 // use stateful callables with ResultOf(), which does't guarantee |
1795 // how many times the callable will be invoked. | 1853 // how many times the callable will be invoked. |
1796 mutable CallableStorageType callable_; | 1854 mutable CallableStorageType callable_; |
1797 const Matcher<ResultType> matcher_; | 1855 const Matcher<ResultType> matcher_; |
1798 | 1856 |
1799 GTEST_DISALLOW_ASSIGN_(Impl); | 1857 GTEST_DISALLOW_ASSIGN_(Impl); |
1800 }; // class Impl | 1858 }; // class Impl |
1801 | 1859 |
1802 const CallableStorageType callable_; | 1860 const CallableStorageType callable_; |
1803 const Matcher<ResultType> matcher_; | 1861 const Matcher<ResultType> matcher_; |
1804 | 1862 |
1805 GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); | 1863 GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); |
1806 }; | 1864 }; |
1807 | 1865 |
1808 // Explains the result of matching a value against a functor matcher. | |
1809 template <typename T, typename Callable> | |
1810 void ExplainMatchResultTo(const ResultOfMatcher<Callable>& matcher, | |
1811 T obj, ::std::ostream* os) { | |
1812 matcher.ExplainMatchResultTo(obj, os); | |
1813 } | |
1814 | |
1815 // Implements an equality matcher for any STL-style container whose elements | 1866 // Implements an equality matcher for any STL-style container whose elements |
1816 // support ==. This matcher is like Eq(), but its failure explanations provide | 1867 // support ==. This matcher is like Eq(), but its failure explanations provide |
1817 // more detailed information that is useful when the container is used as a set. | 1868 // more detailed information that is useful when the container is used as a set. |
1818 // The failure message reports elements that are in one of the operands but not | 1869 // The failure message reports elements that are in one of the operands but not |
1819 // the other. The failure messages do not report duplicate or out-of-order | 1870 // the other. The failure messages do not report duplicate or out-of-order |
1820 // elements in the containers (which don't properly matter to sets, but can | 1871 // elements in the containers (which don't properly matter to sets, but can |
1821 // occur if the containers are vectors or lists, for example). | 1872 // occur if the containers are vectors or lists, for example). |
1822 // | 1873 // |
1823 // Uses the container's const_iterator, value_type, operator ==, | 1874 // Uses the container's const_iterator, value_type, operator ==, |
1824 // begin(), and end(). | 1875 // begin(), and end(). |
1825 template <typename Container> | 1876 template <typename Container> |
1826 class ContainerEqMatcher { | 1877 class ContainerEqMatcher { |
1827 public: | 1878 public: |
1828 typedef internal::StlContainerView<Container> View; | 1879 typedef internal::StlContainerView<Container> View; |
1829 typedef typename View::type StlContainer; | 1880 typedef typename View::type StlContainer; |
1830 typedef typename View::const_reference StlContainerReference; | 1881 typedef typename View::const_reference StlContainerReference; |
1831 | 1882 |
1832 // We make a copy of rhs in case the elements in it are modified | 1883 // We make a copy of rhs in case the elements in it are modified |
1833 // after this matcher is created. | 1884 // after this matcher is created. |
1834 explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { | 1885 explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { |
1835 // Makes sure the user doesn't instantiate this class template | 1886 // Makes sure the user doesn't instantiate this class template |
1836 // with a const or reference type. | 1887 // with a const or reference type. |
1837 testing::StaticAssertTypeEq<Container, | 1888 testing::StaticAssertTypeEq<Container, |
1838 GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container))>(); | 1889 GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container))>(); |
1839 } | 1890 } |
1840 | 1891 |
1841 template <typename LhsContainer> | |
1842 bool Matches(const LhsContainer& lhs) const { | |
1843 // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug | |
1844 // that causes LhsContainer to be a const type sometimes. | |
1845 typedef internal::StlContainerView<GMOCK_REMOVE_CONST_(LhsContainer)> | |
1846 LhsView; | |
1847 StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); | |
1848 return lhs_stl_container == rhs_; | |
1849 } | |
1850 void DescribeTo(::std::ostream* os) const { | 1892 void DescribeTo(::std::ostream* os) const { |
1851 *os << "equals "; | 1893 *os << "equals "; |
1852 UniversalPrinter<StlContainer>::Print(rhs_, os); | 1894 UniversalPrinter<StlContainer>::Print(rhs_, os); |
1853 } | 1895 } |
1854 void DescribeNegationTo(::std::ostream* os) const { | 1896 void DescribeNegationTo(::std::ostream* os) const { |
1855 *os << "does not equal "; | 1897 *os << "does not equal "; |
1856 UniversalPrinter<StlContainer>::Print(rhs_, os); | 1898 UniversalPrinter<StlContainer>::Print(rhs_, os); |
1857 } | 1899 } |
1858 | 1900 |
1859 template <typename LhsContainer> | 1901 template <typename LhsContainer> |
1860 void ExplainMatchResultTo(const LhsContainer& lhs, | 1902 bool MatchAndExplain(const LhsContainer& lhs, |
1861 ::std::ostream* os) const { | 1903 MatchResultListener* listener) const { |
1862 // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug | 1904 // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug |
1863 // that causes LhsContainer to be a const type sometimes. | 1905 // that causes LhsContainer to be a const type sometimes. |
1864 typedef internal::StlContainerView<GMOCK_REMOVE_CONST_(LhsContainer)> | 1906 typedef internal::StlContainerView<GMOCK_REMOVE_CONST_(LhsContainer)> |
1865 LhsView; | 1907 LhsView; |
1866 typedef typename LhsView::type LhsStlContainer; | 1908 typedef typename LhsView::type LhsStlContainer; |
1867 StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); | 1909 StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); |
| 1910 if (lhs_stl_container == rhs_) |
| 1911 return true; |
1868 | 1912 |
1869 // Something is different. Check for missing values first. | 1913 ::std::ostream* const os = listener->stream(); |
1870 bool printed_header = false; | 1914 if (os != NULL) { |
1871 for (typename LhsStlContainer::const_iterator it = | 1915 // Something is different. Check for missing values first. |
1872 lhs_stl_container.begin(); | 1916 bool printed_header = false; |
1873 it != lhs_stl_container.end(); ++it) { | 1917 for (typename LhsStlContainer::const_iterator it = |
1874 if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == | 1918 lhs_stl_container.begin(); |
1875 rhs_.end()) { | 1919 it != lhs_stl_container.end(); ++it) { |
1876 if (printed_header) { | 1920 if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == |
1877 *os << ", "; | 1921 rhs_.end()) { |
1878 } else { | 1922 if (printed_header) { |
1879 *os << "Only in actual: "; | 1923 *os << ", "; |
1880 printed_header = true; | 1924 } else { |
| 1925 *os << "Only in actual: "; |
| 1926 printed_header = true; |
| 1927 } |
| 1928 UniversalPrinter<typename LhsStlContainer::value_type>:: |
| 1929 Print(*it, os); |
1881 } | 1930 } |
1882 UniversalPrinter<typename LhsStlContainer::value_type>::Print(*it, os); | 1931 } |
| 1932 |
| 1933 // Now check for extra values. |
| 1934 bool printed_header2 = false; |
| 1935 for (typename StlContainer::const_iterator it = rhs_.begin(); |
| 1936 it != rhs_.end(); ++it) { |
| 1937 if (internal::ArrayAwareFind( |
| 1938 lhs_stl_container.begin(), lhs_stl_container.end(), *it) == |
| 1939 lhs_stl_container.end()) { |
| 1940 if (printed_header2) { |
| 1941 *os << ", "; |
| 1942 } else { |
| 1943 *os << (printed_header ? "; not" : "Not") << " in actual: "; |
| 1944 printed_header2 = true; |
| 1945 } |
| 1946 UniversalPrinter<typename StlContainer::value_type>::Print(*it, os); |
| 1947 } |
1883 } | 1948 } |
1884 } | 1949 } |
1885 | 1950 |
1886 // Now check for extra values. | 1951 return false; |
1887 bool printed_header2 = false; | |
1888 for (typename StlContainer::const_iterator it = rhs_.begin(); | |
1889 it != rhs_.end(); ++it) { | |
1890 if (internal::ArrayAwareFind( | |
1891 lhs_stl_container.begin(), lhs_stl_container.end(), *it) == | |
1892 lhs_stl_container.end()) { | |
1893 if (printed_header2) { | |
1894 *os << ", "; | |
1895 } else { | |
1896 *os << (printed_header ? "; not" : "Not") << " in actual: "; | |
1897 printed_header2 = true; | |
1898 } | |
1899 UniversalPrinter<typename StlContainer::value_type>::Print(*it, os); | |
1900 } | |
1901 } | |
1902 } | 1952 } |
1903 | 1953 |
1904 private: | 1954 private: |
1905 const StlContainer rhs_; | 1955 const StlContainer rhs_; |
1906 | 1956 |
1907 GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); | 1957 GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); |
1908 }; | 1958 }; |
1909 | 1959 |
1910 template <typename LhsContainer, typename Container> | |
1911 void ExplainMatchResultTo(const ContainerEqMatcher<Container>& matcher, | |
1912 const LhsContainer& lhs, | |
1913 ::std::ostream* os) { | |
1914 matcher.ExplainMatchResultTo(lhs, os); | |
1915 } | |
1916 | |
1917 // Implements Contains(element_matcher) for the given argument type Container. | 1960 // Implements Contains(element_matcher) for the given argument type Container. |
1918 template <typename Container> | 1961 template <typename Container> |
1919 class ContainsMatcherImpl : public MatcherInterface<Container> { | 1962 class ContainsMatcherImpl : public MatcherInterface<Container> { |
1920 public: | 1963 public: |
1921 typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; | 1964 typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container)) RawContainer; |
1922 typedef StlContainerView<RawContainer> View; | 1965 typedef StlContainerView<RawContainer> View; |
1923 typedef typename View::type StlContainer; | 1966 typedef typename View::type StlContainer; |
1924 typedef typename View::const_reference StlContainerReference; | 1967 typedef typename View::const_reference StlContainerReference; |
1925 typedef typename StlContainer::value_type Element; | 1968 typedef typename StlContainer::value_type Element; |
1926 | 1969 |
1927 template <typename InnerMatcher> | 1970 template <typename InnerMatcher> |
1928 explicit ContainsMatcherImpl(InnerMatcher inner_matcher) | 1971 explicit ContainsMatcherImpl(InnerMatcher inner_matcher) |
1929 : inner_matcher_( | 1972 : inner_matcher_( |
1930 testing::SafeMatcherCast<const Element&>(inner_matcher)) {} | 1973 testing::SafeMatcherCast<const Element&>(inner_matcher)) {} |
1931 | 1974 |
1932 // Returns true iff 'container' matches. | |
1933 virtual bool Matches(Container container) const { | |
1934 StlContainerReference stl_container = View::ConstReference(container); | |
1935 for (typename StlContainer::const_iterator it = stl_container.begin(); | |
1936 it != stl_container.end(); ++it) { | |
1937 if (inner_matcher_.Matches(*it)) | |
1938 return true; | |
1939 } | |
1940 return false; | |
1941 } | |
1942 | |
1943 // Describes what this matcher does. | 1975 // Describes what this matcher does. |
1944 virtual void DescribeTo(::std::ostream* os) const { | 1976 virtual void DescribeTo(::std::ostream* os) const { |
1945 *os << "contains at least one element that "; | 1977 *os << "contains at least one element that "; |
1946 inner_matcher_.DescribeTo(os); | 1978 inner_matcher_.DescribeTo(os); |
1947 } | 1979 } |
1948 | 1980 |
1949 // Describes what the negation of this matcher does. | 1981 // Describes what the negation of this matcher does. |
1950 virtual void DescribeNegationTo(::std::ostream* os) const { | 1982 virtual void DescribeNegationTo(::std::ostream* os) const { |
1951 *os << "doesn't contain any element that "; | 1983 *os << "doesn't contain any element that "; |
1952 inner_matcher_.DescribeTo(os); | 1984 inner_matcher_.DescribeTo(os); |
1953 } | 1985 } |
1954 | 1986 |
1955 // Explains why 'container' matches, or doesn't match, this matcher. | 1987 virtual bool MatchAndExplain(Container container, |
1956 virtual void ExplainMatchResultTo(Container container, | 1988 MatchResultListener* listener) const { |
1957 ::std::ostream* os) const { | |
1958 StlContainerReference stl_container = View::ConstReference(container); | 1989 StlContainerReference stl_container = View::ConstReference(container); |
1959 | 1990 size_t i = 0; |
1960 // We need to explain which (if any) element matches inner_matcher_. | 1991 for (typename StlContainer::const_iterator it = stl_container.begin(); |
1961 typename StlContainer::const_iterator it = stl_container.begin(); | 1992 it != stl_container.end(); ++it, ++i) { |
1962 for (size_t i = 0; it != stl_container.end(); ++it, ++i) { | |
1963 if (inner_matcher_.Matches(*it)) { | 1993 if (inner_matcher_.Matches(*it)) { |
1964 *os << "element " << i << " matches"; | 1994 *listener << "element " << i << " matches"; |
1965 return; | 1995 return true; |
1966 } | 1996 } |
1967 } | 1997 } |
| 1998 return false; |
1968 } | 1999 } |
1969 | 2000 |
1970 private: | 2001 private: |
1971 const Matcher<const Element&> inner_matcher_; | 2002 const Matcher<const Element&> inner_matcher_; |
1972 | 2003 |
1973 GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); | 2004 GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); |
1974 }; | 2005 }; |
1975 | 2006 |
1976 // Implements polymorphic Contains(element_matcher). | 2007 // Implements polymorphic Contains(element_matcher). |
1977 template <typename M> | 2008 template <typename M> |
(...skipping 22 matching lines...) Expand all Loading... |
2000 typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(PairType)) RawPairType; | 2031 typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(PairType)) RawPairType; |
2001 typedef typename RawPairType::first_type KeyType; | 2032 typedef typename RawPairType::first_type KeyType; |
2002 | 2033 |
2003 template <typename InnerMatcher> | 2034 template <typename InnerMatcher> |
2004 explicit KeyMatcherImpl(InnerMatcher inner_matcher) | 2035 explicit KeyMatcherImpl(InnerMatcher inner_matcher) |
2005 : inner_matcher_( | 2036 : inner_matcher_( |
2006 testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { | 2037 testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { |
2007 } | 2038 } |
2008 | 2039 |
2009 // Returns true iff 'key_value.first' (the key) matches the inner matcher. | 2040 // Returns true iff 'key_value.first' (the key) matches the inner matcher. |
2010 virtual bool Matches(PairType key_value) const { | 2041 virtual bool MatchAndExplain(PairType key_value, |
2011 return inner_matcher_.Matches(key_value.first); | 2042 MatchResultListener* listener) const { |
| 2043 return inner_matcher_.MatchAndExplain(key_value.first, listener); |
2012 } | 2044 } |
2013 | 2045 |
2014 // Describes what this matcher does. | 2046 // Describes what this matcher does. |
2015 virtual void DescribeTo(::std::ostream* os) const { | 2047 virtual void DescribeTo(::std::ostream* os) const { |
2016 *os << "has a key that "; | 2048 *os << "has a key that "; |
2017 inner_matcher_.DescribeTo(os); | 2049 inner_matcher_.DescribeTo(os); |
2018 } | 2050 } |
2019 | 2051 |
2020 // Describes what the negation of this matcher does. | 2052 // Describes what the negation of this matcher does. |
2021 virtual void DescribeNegationTo(::std::ostream* os) const { | 2053 virtual void DescribeNegationTo(::std::ostream* os) const { |
2022 *os << "doesn't have a key that "; | 2054 *os << "doesn't have a key that "; |
2023 inner_matcher_.DescribeTo(os); | 2055 inner_matcher_.DescribeTo(os); |
2024 } | 2056 } |
2025 | 2057 |
2026 // Explains why 'key_value' matches, or doesn't match, this matcher. | |
2027 virtual void ExplainMatchResultTo(PairType key_value, | |
2028 ::std::ostream* os) const { | |
2029 inner_matcher_.ExplainMatchResultTo(key_value.first, os); | |
2030 } | |
2031 | |
2032 private: | 2058 private: |
2033 const Matcher<const KeyType&> inner_matcher_; | 2059 const Matcher<const KeyType&> inner_matcher_; |
2034 | 2060 |
2035 GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); | 2061 GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); |
2036 }; | 2062 }; |
2037 | 2063 |
2038 // Implements polymorphic Key(matcher_for_key). | 2064 // Implements polymorphic Key(matcher_for_key). |
2039 template <typename M> | 2065 template <typename M> |
2040 class KeyMatcher { | 2066 class KeyMatcher { |
2041 public: | 2067 public: |
(...skipping 20 matching lines...) Expand all Loading... |
2062 typedef typename RawPairType::second_type SecondType; | 2088 typedef typename RawPairType::second_type SecondType; |
2063 | 2089 |
2064 template <typename FirstMatcher, typename SecondMatcher> | 2090 template <typename FirstMatcher, typename SecondMatcher> |
2065 PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) | 2091 PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) |
2066 : first_matcher_( | 2092 : first_matcher_( |
2067 testing::SafeMatcherCast<const FirstType&>(first_matcher)), | 2093 testing::SafeMatcherCast<const FirstType&>(first_matcher)), |
2068 second_matcher_( | 2094 second_matcher_( |
2069 testing::SafeMatcherCast<const SecondType&>(second_matcher)) { | 2095 testing::SafeMatcherCast<const SecondType&>(second_matcher)) { |
2070 } | 2096 } |
2071 | 2097 |
2072 // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' | |
2073 // matches second_matcher. | |
2074 virtual bool Matches(PairType a_pair) const { | |
2075 return first_matcher_.Matches(a_pair.first) && | |
2076 second_matcher_.Matches(a_pair.second); | |
2077 } | |
2078 | |
2079 // Describes what this matcher does. | 2098 // Describes what this matcher does. |
2080 virtual void DescribeTo(::std::ostream* os) const { | 2099 virtual void DescribeTo(::std::ostream* os) const { |
2081 *os << "has a first field that "; | 2100 *os << "has a first field that "; |
2082 first_matcher_.DescribeTo(os); | 2101 first_matcher_.DescribeTo(os); |
2083 *os << ", and has a second field that "; | 2102 *os << ", and has a second field that "; |
2084 second_matcher_.DescribeTo(os); | 2103 second_matcher_.DescribeTo(os); |
2085 } | 2104 } |
2086 | 2105 |
2087 // Describes what the negation of this matcher does. | 2106 // Describes what the negation of this matcher does. |
2088 virtual void DescribeNegationTo(::std::ostream* os) const { | 2107 virtual void DescribeNegationTo(::std::ostream* os) const { |
2089 *os << "has a first field that "; | 2108 *os << "has a first field that "; |
2090 first_matcher_.DescribeNegationTo(os); | 2109 first_matcher_.DescribeNegationTo(os); |
2091 *os << ", or has a second field that "; | 2110 *os << ", or has a second field that "; |
2092 second_matcher_.DescribeNegationTo(os); | 2111 second_matcher_.DescribeNegationTo(os); |
2093 } | 2112 } |
2094 | 2113 |
2095 // Explains why 'a_pair' matches, or doesn't match, this matcher. | 2114 // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' |
2096 virtual void ExplainMatchResultTo(PairType a_pair, | 2115 // matches second_matcher. |
2097 ::std::ostream* os) const { | 2116 virtual bool MatchAndExplain(PairType a_pair, |
2098 ::std::stringstream ss1; | 2117 MatchResultListener* listener) const { |
2099 first_matcher_.ExplainMatchResultTo(a_pair.first, &ss1); | 2118 if (!listener->IsInterested()) { |
2100 internal::string s1 = ss1.str(); | 2119 // If the listener is not interested, we don't need to construct the |
2101 if (s1 != "") { | 2120 // explanation. |
2102 s1 = "the first field " + s1; | 2121 return first_matcher_.Matches(a_pair.first) && |
| 2122 second_matcher_.Matches(a_pair.second); |
2103 } | 2123 } |
2104 | 2124 StringMatchResultListener first_inner_listener; |
2105 ::std::stringstream ss2; | 2125 if (!first_matcher_.MatchAndExplain(a_pair.first, |
2106 second_matcher_.ExplainMatchResultTo(a_pair.second, &ss2); | 2126 &first_inner_listener)) { |
2107 internal::string s2 = ss2.str(); | 2127 *listener << "whose first field does not match"; |
2108 if (s2 != "") { | 2128 PrintIfNotEmpty(first_inner_listener.str(), listener); |
2109 s2 = "the second field " + s2; | 2129 return false; |
2110 } | 2130 } |
2111 | 2131 StringMatchResultListener second_inner_listener; |
2112 *os << s1; | 2132 if (!second_matcher_.MatchAndExplain(a_pair.second, |
2113 if (s1 != "" && s2 != "") { | 2133 &second_inner_listener)) { |
2114 *os << ", and "; | 2134 *listener << "whose second field does not match"; |
| 2135 PrintIfNotEmpty(second_inner_listener.str(), listener); |
| 2136 return false; |
2115 } | 2137 } |
2116 *os << s2; | 2138 ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), |
| 2139 listener); |
| 2140 return true; |
2117 } | 2141 } |
2118 | 2142 |
2119 private: | 2143 private: |
| 2144 void ExplainSuccess(const internal::string& first_explanation, |
| 2145 const internal::string& second_explanation, |
| 2146 MatchResultListener* listener) const { |
| 2147 *listener << "whose both fields match"; |
| 2148 if (first_explanation != "") { |
| 2149 *listener << ", where the first field is a value " << first_explanation; |
| 2150 } |
| 2151 if (second_explanation != "") { |
| 2152 *listener << ", "; |
| 2153 if (first_explanation != "") { |
| 2154 *listener << "and "; |
| 2155 } else { |
| 2156 *listener << "where "; |
| 2157 } |
| 2158 *listener << "the second field is a value " << second_explanation; |
| 2159 } |
| 2160 } |
| 2161 |
2120 const Matcher<const FirstType&> first_matcher_; | 2162 const Matcher<const FirstType&> first_matcher_; |
2121 const Matcher<const SecondType&> second_matcher_; | 2163 const Matcher<const SecondType&> second_matcher_; |
2122 | 2164 |
2123 GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); | 2165 GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); |
2124 }; | 2166 }; |
2125 | 2167 |
2126 // Implements polymorphic Pair(first_matcher, second_matcher). | 2168 // Implements polymorphic Pair(first_matcher, second_matcher). |
2127 template <typename FirstMatcher, typename SecondMatcher> | 2169 template <typename FirstMatcher, typename SecondMatcher> |
2128 class PairMatcher { | 2170 class PairMatcher { |
2129 public: | 2171 public: |
(...skipping 28 matching lines...) Expand all Loading... |
2158 // element matchers. | 2200 // element matchers. |
2159 template <typename InputIter> | 2201 template <typename InputIter> |
2160 ElementsAreMatcherImpl(InputIter first, size_t a_count) { | 2202 ElementsAreMatcherImpl(InputIter first, size_t a_count) { |
2161 matchers_.reserve(a_count); | 2203 matchers_.reserve(a_count); |
2162 InputIter it = first; | 2204 InputIter it = first; |
2163 for (size_t i = 0; i != a_count; ++i, ++it) { | 2205 for (size_t i = 0; i != a_count; ++i, ++it) { |
2164 matchers_.push_back(MatcherCast<const Element&>(*it)); | 2206 matchers_.push_back(MatcherCast<const Element&>(*it)); |
2165 } | 2207 } |
2166 } | 2208 } |
2167 | 2209 |
2168 // Returns true iff 'container' matches. | |
2169 virtual bool Matches(Container container) const { | |
2170 StlContainerReference stl_container = View::ConstReference(container); | |
2171 if (stl_container.size() != count()) | |
2172 return false; | |
2173 | |
2174 typename StlContainer::const_iterator it = stl_container.begin(); | |
2175 for (size_t i = 0; i != count(); ++it, ++i) { | |
2176 if (!matchers_[i].Matches(*it)) | |
2177 return false; | |
2178 } | |
2179 | |
2180 return true; | |
2181 } | |
2182 | |
2183 // Describes what this matcher does. | 2210 // Describes what this matcher does. |
2184 virtual void DescribeTo(::std::ostream* os) const { | 2211 virtual void DescribeTo(::std::ostream* os) const { |
2185 if (count() == 0) { | 2212 if (count() == 0) { |
2186 *os << "is empty"; | 2213 *os << "is empty"; |
2187 } else if (count() == 1) { | 2214 } else if (count() == 1) { |
2188 *os << "has 1 element that "; | 2215 *os << "has 1 element that "; |
2189 matchers_[0].DescribeTo(os); | 2216 matchers_[0].DescribeTo(os); |
2190 } else { | 2217 } else { |
2191 *os << "has " << Elements(count()) << " where\n"; | 2218 *os << "has " << Elements(count()) << " where\n"; |
2192 for (size_t i = 0; i != count(); ++i) { | 2219 for (size_t i = 0; i != count(); ++i) { |
(...skipping 16 matching lines...) Expand all Loading... |
2209 *os << "does not have " << Elements(count()) << ", or\n"; | 2236 *os << "does not have " << Elements(count()) << ", or\n"; |
2210 for (size_t i = 0; i != count(); ++i) { | 2237 for (size_t i = 0; i != count(); ++i) { |
2211 *os << "element " << i << " "; | 2238 *os << "element " << i << " "; |
2212 matchers_[i].DescribeNegationTo(os); | 2239 matchers_[i].DescribeNegationTo(os); |
2213 if (i + 1 < count()) { | 2240 if (i + 1 < count()) { |
2214 *os << ", or\n"; | 2241 *os << ", or\n"; |
2215 } | 2242 } |
2216 } | 2243 } |
2217 } | 2244 } |
2218 | 2245 |
2219 // Explains why 'container' matches, or doesn't match, this matcher. | 2246 virtual bool MatchAndExplain(Container container, |
2220 virtual void ExplainMatchResultTo(Container container, | 2247 MatchResultListener* listener) const { |
2221 ::std::ostream* os) const { | |
2222 StlContainerReference stl_container = View::ConstReference(container); | 2248 StlContainerReference stl_container = View::ConstReference(container); |
2223 if (Matches(container)) { | 2249 const size_t actual_count = stl_container.size(); |
2224 // We need to explain why *each* element matches (the obvious | 2250 if (actual_count != count()) { |
2225 // ones can be skipped). | 2251 // The element count doesn't match. If the container is empty, |
| 2252 // there's no need to explain anything as Google Mock already |
| 2253 // prints the empty container. Otherwise we just need to show |
| 2254 // how many elements there actually are. |
| 2255 if (actual_count != 0) { |
| 2256 *listener << "has " << Elements(actual_count); |
| 2257 } |
| 2258 return false; |
| 2259 } |
2226 | 2260 |
2227 bool reason_printed = false; | 2261 typename StlContainer::const_iterator it = stl_container.begin(); |
2228 typename StlContainer::const_iterator it = stl_container.begin(); | 2262 // explanations[i] is the explanation of the element at index i. |
2229 for (size_t i = 0; i != count(); ++it, ++i) { | 2263 std::vector<internal::string> explanations(count()); |
2230 ::std::stringstream ss; | 2264 for (size_t i = 0; i != count(); ++it, ++i) { |
2231 matchers_[i].ExplainMatchResultTo(*it, &ss); | 2265 StringMatchResultListener s; |
| 2266 if (matchers_[i].MatchAndExplain(*it, &s)) { |
| 2267 explanations[i] = s.str(); |
| 2268 } else { |
| 2269 // The container has the right size but the i-th element |
| 2270 // doesn't match its expectation. |
| 2271 *listener << "element " << i << " doesn't match"; |
2232 | 2272 |
2233 const string s = ss.str(); | 2273 StreamInParensAsNeeded(s.str(), listener->stream()); |
2234 if (!s.empty()) { | 2274 return false; |
2235 if (reason_printed) { | |
2236 *os << ",\n"; | |
2237 } | |
2238 *os << "element " << i << " " << s; | |
2239 reason_printed = true; | |
2240 } | |
2241 } | |
2242 } else { | |
2243 // We need to explain why the container doesn't match. | |
2244 const size_t actual_count = stl_container.size(); | |
2245 if (actual_count != count()) { | |
2246 // The element count doesn't match. If the container is | |
2247 // empty, there's no need to explain anything as Google Mock | |
2248 // already prints the empty container. Otherwise we just need | |
2249 // to show how many elements there actually are. | |
2250 if (actual_count != 0) { | |
2251 *os << "has " << Elements(actual_count); | |
2252 } | |
2253 return; | |
2254 } | |
2255 | |
2256 // The container has the right size but at least one element | |
2257 // doesn't match expectation. We need to find this element and | |
2258 // explain why it doesn't match. | |
2259 typename StlContainer::const_iterator it = stl_container.begin(); | |
2260 for (size_t i = 0; i != count(); ++it, ++i) { | |
2261 if (matchers_[i].Matches(*it)) { | |
2262 continue; | |
2263 } | |
2264 | |
2265 *os << "element " << i << " doesn't match"; | |
2266 | |
2267 ::std::stringstream ss; | |
2268 matchers_[i].ExplainMatchResultTo(*it, &ss); | |
2269 const string s = ss.str(); | |
2270 if (!s.empty()) { | |
2271 *os << " (" << s << ")"; | |
2272 } | |
2273 return; | |
2274 } | 2275 } |
2275 } | 2276 } |
| 2277 |
| 2278 // Every element matches its expectation. We need to explain why |
| 2279 // (the obvious ones can be skipped). |
| 2280 |
| 2281 bool reason_printed = false; |
| 2282 for (size_t i = 0; i != count(); ++i) { |
| 2283 const internal::string& s = explanations[i]; |
| 2284 if (!s.empty()) { |
| 2285 if (reason_printed) { |
| 2286 *listener << ",\n"; |
| 2287 } |
| 2288 *listener << "element " << i << " " << s; |
| 2289 reason_printed = true; |
| 2290 } |
| 2291 } |
| 2292 |
| 2293 return true; |
2276 } | 2294 } |
2277 | 2295 |
2278 private: | 2296 private: |
2279 static Message Elements(size_t count) { | 2297 static Message Elements(size_t count) { |
2280 return Message() << count << (count == 1 ? " element" : " elements"); | 2298 return Message() << count << (count == 1 ? " element" : " elements"); |
2281 } | 2299 } |
2282 | 2300 |
2283 size_t count() const { return matchers_.size(); } | 2301 size_t count() const { return matchers_.size(); } |
2284 std::vector<Matcher<const Element&> > matchers_; | 2302 std::vector<Matcher<const Element&> > matchers_; |
2285 | 2303 |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2602 prefix)); | 2620 prefix)); |
2603 } | 2621 } |
2604 | 2622 |
2605 // Matches a string that ends with 'suffix' (case-sensitive). | 2623 // Matches a string that ends with 'suffix' (case-sensitive). |
2606 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > | 2624 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > |
2607 EndsWith(const internal::string& suffix) { | 2625 EndsWith(const internal::string& suffix) { |
2608 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( | 2626 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( |
2609 suffix)); | 2627 suffix)); |
2610 } | 2628 } |
2611 | 2629 |
2612 #ifdef GMOCK_HAS_REGEX | |
2613 | |
2614 // Matches a string that fully matches regular expression 'regex'. | 2630 // Matches a string that fully matches regular expression 'regex'. |
2615 // The matcher takes ownership of 'regex'. | 2631 // The matcher takes ownership of 'regex'. |
2616 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( | 2632 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( |
2617 const internal::RE* regex) { | 2633 const internal::RE* regex) { |
2618 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); | 2634 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); |
2619 } | 2635 } |
2620 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( | 2636 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( |
2621 const internal::string& regex) { | 2637 const internal::string& regex) { |
2622 return MatchesRegex(new internal::RE(regex)); | 2638 return MatchesRegex(new internal::RE(regex)); |
2623 } | 2639 } |
2624 | 2640 |
2625 // Matches a string that contains regular expression 'regex'. | 2641 // Matches a string that contains regular expression 'regex'. |
2626 // The matcher takes ownership of 'regex'. | 2642 // The matcher takes ownership of 'regex'. |
2627 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( | 2643 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( |
2628 const internal::RE* regex) { | 2644 const internal::RE* regex) { |
2629 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); | 2645 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); |
2630 } | 2646 } |
2631 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( | 2647 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( |
2632 const internal::string& regex) { | 2648 const internal::string& regex) { |
2633 return ContainsRegex(new internal::RE(regex)); | 2649 return ContainsRegex(new internal::RE(regex)); |
2634 } | 2650 } |
2635 | 2651 |
2636 #endif // GMOCK_HAS_REGEX | |
2637 | |
2638 #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING | 2652 #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING |
2639 // Wide string matchers. | 2653 // Wide string matchers. |
2640 | 2654 |
2641 // Matches a string equal to str. | 2655 // Matches a string equal to str. |
2642 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > | 2656 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > |
2643 StrEq(const internal::wstring& str) { | 2657 StrEq(const internal::wstring& str) { |
2644 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( | 2658 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( |
2645 str, true, true)); | 2659 str, true, true)); |
2646 } | 2660 } |
2647 | 2661 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2804 inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > | 2818 inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > |
2805 Truly(Predicate pred) { | 2819 Truly(Predicate pred) { |
2806 return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); | 2820 return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); |
2807 } | 2821 } |
2808 | 2822 |
2809 // Returns a matcher that matches an equal container. | 2823 // Returns a matcher that matches an equal container. |
2810 // This matcher behaves like Eq(), but in the event of mismatch lists the | 2824 // This matcher behaves like Eq(), but in the event of mismatch lists the |
2811 // values that are included in one container but not the other. (Duplicate | 2825 // values that are included in one container but not the other. (Duplicate |
2812 // values and order differences are not explained.) | 2826 // values and order differences are not explained.) |
2813 template <typename Container> | 2827 template <typename Container> |
2814 inline PolymorphicMatcher<internal::ContainerEqMatcher< | 2828 inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT |
2815 GMOCK_REMOVE_CONST_(Container)> > | 2829 GMOCK_REMOVE_CONST_(Container)> > |
2816 ContainerEq(const Container& rhs) { | 2830 ContainerEq(const Container& rhs) { |
2817 // This following line is for working around a bug in MSVC 8.0, | 2831 // This following line is for working around a bug in MSVC 8.0, |
2818 // which causes Container to be a const type sometimes. | 2832 // which causes Container to be a const type sometimes. |
2819 typedef GMOCK_REMOVE_CONST_(Container) RawContainer; | 2833 typedef GMOCK_REMOVE_CONST_(Container) RawContainer; |
2820 return MakePolymorphicMatcher(internal::ContainerEqMatcher<RawContainer>(rhs))
; | 2834 return MakePolymorphicMatcher( |
| 2835 internal::ContainerEqMatcher<RawContainer>(rhs)); |
2821 } | 2836 } |
2822 | 2837 |
2823 // Matches an STL-style container or a native array that contains at | 2838 // Matches an STL-style container or a native array that contains at |
2824 // least one element matching the given value or matcher. | 2839 // least one element matching the given value or matcher. |
2825 // | 2840 // |
2826 // Examples: | 2841 // Examples: |
2827 // ::std::set<int> page_ids; | 2842 // ::std::set<int> page_ids; |
2828 // page_ids.insert(3); | 2843 // page_ids.insert(3); |
2829 // page_ids.insert(1); | 2844 // page_ids.insert(1); |
2830 // EXPECT_THAT(page_ids, Contains(1)); | 2845 // EXPECT_THAT(page_ids, Contains(1)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2869 inline internal::MatcherAsPredicate<M> Matches(M matcher) { | 2884 inline internal::MatcherAsPredicate<M> Matches(M matcher) { |
2870 return internal::MatcherAsPredicate<M>(matcher); | 2885 return internal::MatcherAsPredicate<M>(matcher); |
2871 } | 2886 } |
2872 | 2887 |
2873 // Returns true iff the value matches the matcher. | 2888 // Returns true iff the value matches the matcher. |
2874 template <typename T, typename M> | 2889 template <typename T, typename M> |
2875 inline bool Value(const T& value, M matcher) { | 2890 inline bool Value(const T& value, M matcher) { |
2876 return testing::Matches(matcher)(value); | 2891 return testing::Matches(matcher)(value); |
2877 } | 2892 } |
2878 | 2893 |
| 2894 // Matches the value against the given matcher and explains the match |
| 2895 // result to listener. |
| 2896 template <typename T, typename M> |
| 2897 inline bool ExplainMatchResult( |
| 2898 M matcher, const T& value, MatchResultListener* listener) { |
| 2899 return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener); |
| 2900 } |
| 2901 |
2879 // AllArgs(m) is a synonym of m. This is useful in | 2902 // AllArgs(m) is a synonym of m. This is useful in |
2880 // | 2903 // |
2881 // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); | 2904 // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); |
2882 // | 2905 // |
2883 // which is easier to read than | 2906 // which is easier to read than |
2884 // | 2907 // |
2885 // EXPECT_CALL(foo, Bar(_, _)).With(Eq()); | 2908 // EXPECT_CALL(foo, Bar(_, _)).With(Eq()); |
2886 template <typename InnerMatcher> | 2909 template <typename InnerMatcher> |
2887 inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } | 2910 inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } |
2888 | 2911 |
2889 // These macros allow using matchers to check values in Google Test | 2912 // These macros allow using matchers to check values in Google Test |
2890 // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) | 2913 // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) |
2891 // succeed iff the value matches the matcher. If the assertion fails, | 2914 // succeed iff the value matches the matcher. If the assertion fails, |
2892 // the value and the description of the matcher will be printed. | 2915 // the value and the description of the matcher will be printed. |
2893 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ | 2916 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ |
2894 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) | 2917 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) |
2895 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ | 2918 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ |
2896 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) | 2919 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) |
2897 | 2920 |
2898 } // namespace testing | 2921 } // namespace testing |
2899 | 2922 |
2900 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ | 2923 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ |
OLD | NEW |