gtest-matchers.h (27039B)
1 // Copyright 2007, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 // The Google C++ Testing and Mocking Framework (Google Test) 31 // 32 // This file implements just enough of the matcher interface to allow 33 // EXPECT_DEATH and friends to accept a matcher argument. 34 35 // IWYU pragma: private, include "testing/base/public/gunit.h" 36 // IWYU pragma: friend third_party/googletest/googlemock/.* 37 // IWYU pragma: friend third_party/googletest/googletest/.* 38 39 #ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ 40 #define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ 41 42 #include <memory> 43 #include <ostream> 44 #include <string> 45 #include <type_traits> 46 47 #include "gtest/gtest-printers.h" 48 #include "gtest/internal/gtest-internal.h" 49 #include "gtest/internal/gtest-port.h" 50 51 // MSVC warning C5046 is new as of VS2017 version 15.8. 52 #if defined(_MSC_VER) && _MSC_VER >= 1915 53 #define GTEST_MAYBE_5046_ 5046 54 #else 55 #define GTEST_MAYBE_5046_ 56 #endif 57 58 GTEST_DISABLE_MSC_WARNINGS_PUSH_( 59 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by 60 clients of class B */ 61 /* Symbol involving type with internal linkage not defined */) 62 63 namespace testing { 64 65 // To implement a matcher Foo for type T, define: 66 // 1. a class FooMatcherImpl that implements the 67 // MatcherInterface<T> interface, and 68 // 2. a factory function that creates a Matcher<T> object from a 69 // FooMatcherImpl*. 70 // 71 // The two-level delegation design makes it possible to allow a user 72 // to write "v" instead of "Eq(v)" where a Matcher is expected, which 73 // is impossible if we pass matchers by pointers. It also eases 74 // ownership management as Matcher objects can now be copied like 75 // plain values. 76 77 // MatchResultListener is an abstract class. Its << operator can be 78 // used by a matcher to explain why a value matches or doesn't match. 79 // 80 class MatchResultListener { 81 public: 82 // Creates a listener object with the given underlying ostream. The 83 // listener does not own the ostream, and does not dereference it 84 // in the constructor or destructor. 85 explicit MatchResultListener(::std::ostream* os) : stream_(os) {} 86 virtual ~MatchResultListener() = 0; // Makes this class abstract. 87 88 // Streams x to the underlying ostream; does nothing if the ostream 89 // is NULL. 90 template <typename T> 91 MatchResultListener& operator<<(const T& x) { 92 if (stream_ != nullptr) *stream_ << x; 93 return *this; 94 } 95 96 // Returns the underlying ostream. 97 ::std::ostream* stream() { return stream_; } 98 99 // Returns true if and only if the listener is interested in an explanation 100 // of the match result. A matcher's MatchAndExplain() method can use 101 // this information to avoid generating the explanation when no one 102 // intends to hear it. 103 bool IsInterested() const { return stream_ != nullptr; } 104 105 private: 106 ::std::ostream* const stream_; 107 108 GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); 109 }; 110 111 inline MatchResultListener::~MatchResultListener() { 112 } 113 114 // An instance of a subclass of this knows how to describe itself as a 115 // matcher. 116 class MatcherDescriberInterface { 117 public: 118 virtual ~MatcherDescriberInterface() {} 119 120 // Describes this matcher to an ostream. The function should print 121 // a verb phrase that describes the property a value matching this 122 // matcher should have. The subject of the verb phrase is the value 123 // being matched. For example, the DescribeTo() method of the Gt(7) 124 // matcher prints "is greater than 7". 125 virtual void DescribeTo(::std::ostream* os) const = 0; 126 127 // Describes the negation of this matcher to an ostream. For 128 // example, if the description of this matcher is "is greater than 129 // 7", the negated description could be "is not greater than 7". 130 // You are not required to override this when implementing 131 // MatcherInterface, but it is highly advised so that your matcher 132 // can produce good error messages. 133 virtual void DescribeNegationTo(::std::ostream* os) const { 134 *os << "not ("; 135 DescribeTo(os); 136 *os << ")"; 137 } 138 }; 139 140 // The implementation of a matcher. 141 template <typename T> 142 class MatcherInterface : public MatcherDescriberInterface { 143 public: 144 // Returns true if and only if the matcher matches x; also explains the 145 // match result to 'listener' if necessary (see the next paragraph), in 146 // the form of a non-restrictive relative clause ("which ...", 147 // "whose ...", etc) that describes x. For example, the 148 // MatchAndExplain() method of the Pointee(...) matcher should 149 // generate an explanation like "which points to ...". 150 // 151 // Implementations of MatchAndExplain() should add an explanation of 152 // the match result *if and only if* they can provide additional 153 // information that's not already present (or not obvious) in the 154 // print-out of x and the matcher's description. Whether the match 155 // succeeds is not a factor in deciding whether an explanation is 156 // needed, as sometimes the caller needs to print a failure message 157 // when the match succeeds (e.g. when the matcher is used inside 158 // Not()). 159 // 160 // For example, a "has at least 10 elements" matcher should explain 161 // what the actual element count is, regardless of the match result, 162 // as it is useful information to the reader; on the other hand, an 163 // "is empty" matcher probably only needs to explain what the actual 164 // size is when the match fails, as it's redundant to say that the 165 // size is 0 when the value is already known to be empty. 166 // 167 // You should override this method when defining a new matcher. 168 // 169 // It's the responsibility of the caller (Google Test) to guarantee 170 // that 'listener' is not NULL. This helps to simplify a matcher's 171 // implementation when it doesn't care about the performance, as it 172 // can talk to 'listener' without checking its validity first. 173 // However, in order to implement dummy listeners efficiently, 174 // listener->stream() may be NULL. 175 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 176 177 // Inherits these methods from MatcherDescriberInterface: 178 // virtual void DescribeTo(::std::ostream* os) const = 0; 179 // virtual void DescribeNegationTo(::std::ostream* os) const; 180 }; 181 182 namespace internal { 183 184 // Converts a MatcherInterface<T> to a MatcherInterface<const T&>. 185 template <typename T> 186 class MatcherInterfaceAdapter : public MatcherInterface<const T&> { 187 public: 188 explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl) 189 : impl_(impl) {} 190 ~MatcherInterfaceAdapter() override { delete impl_; } 191 192 void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); } 193 194 void DescribeNegationTo(::std::ostream* os) const override { 195 impl_->DescribeNegationTo(os); 196 } 197 198 bool MatchAndExplain(const T& x, 199 MatchResultListener* listener) const override { 200 return impl_->MatchAndExplain(x, listener); 201 } 202 203 private: 204 const MatcherInterface<T>* const impl_; 205 206 GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); 207 }; 208 209 struct AnyEq { 210 template <typename A, typename B> 211 bool operator()(const A& a, const B& b) const { return a == b; } 212 }; 213 struct AnyNe { 214 template <typename A, typename B> 215 bool operator()(const A& a, const B& b) const { return a != b; } 216 }; 217 struct AnyLt { 218 template <typename A, typename B> 219 bool operator()(const A& a, const B& b) const { return a < b; } 220 }; 221 struct AnyGt { 222 template <typename A, typename B> 223 bool operator()(const A& a, const B& b) const { return a > b; } 224 }; 225 struct AnyLe { 226 template <typename A, typename B> 227 bool operator()(const A& a, const B& b) const { return a <= b; } 228 }; 229 struct AnyGe { 230 template <typename A, typename B> 231 bool operator()(const A& a, const B& b) const { return a >= b; } 232 }; 233 234 // A match result listener that ignores the explanation. 235 class DummyMatchResultListener : public MatchResultListener { 236 public: 237 DummyMatchResultListener() : MatchResultListener(nullptr) {} 238 239 private: 240 GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); 241 }; 242 243 // A match result listener that forwards the explanation to a given 244 // ostream. The difference between this and MatchResultListener is 245 // that the former is concrete. 246 class StreamMatchResultListener : public MatchResultListener { 247 public: 248 explicit StreamMatchResultListener(::std::ostream* os) 249 : MatchResultListener(os) {} 250 251 private: 252 GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); 253 }; 254 255 // An internal class for implementing Matcher<T>, which will derive 256 // from it. We put functionalities common to all Matcher<T> 257 // specializations here to avoid code duplication. 258 template <typename T> 259 class MatcherBase { 260 public: 261 // Returns true if and only if the matcher matches x; also explains the 262 // match result to 'listener'. 263 bool MatchAndExplain(const T& x, MatchResultListener* listener) const { 264 return impl_->MatchAndExplain(x, listener); 265 } 266 267 // Returns true if and only if this matcher matches x. 268 bool Matches(const T& x) const { 269 DummyMatchResultListener dummy; 270 return MatchAndExplain(x, &dummy); 271 } 272 273 // Describes this matcher to an ostream. 274 void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 275 276 // Describes the negation of this matcher to an ostream. 277 void DescribeNegationTo(::std::ostream* os) const { 278 impl_->DescribeNegationTo(os); 279 } 280 281 // Explains why x matches, or doesn't match, the matcher. 282 void ExplainMatchResultTo(const T& x, ::std::ostream* os) const { 283 StreamMatchResultListener listener(os); 284 MatchAndExplain(x, &listener); 285 } 286 287 // Returns the describer for this matcher object; retains ownership 288 // of the describer, which is only guaranteed to be alive when 289 // this matcher object is alive. 290 const MatcherDescriberInterface* GetDescriber() const { 291 return impl_.get(); 292 } 293 294 protected: 295 MatcherBase() {} 296 297 // Constructs a matcher from its implementation. 298 explicit MatcherBase(const MatcherInterface<const T&>* impl) : impl_(impl) {} 299 300 template <typename U> 301 explicit MatcherBase( 302 const MatcherInterface<U>* impl, 303 typename std::enable_if<!std::is_same<U, const U&>::value>::type* = 304 nullptr) 305 : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {} 306 307 MatcherBase(const MatcherBase&) = default; 308 MatcherBase& operator=(const MatcherBase&) = default; 309 MatcherBase(MatcherBase&&) = default; 310 MatcherBase& operator=(MatcherBase&&) = default; 311 312 virtual ~MatcherBase() {} 313 314 private: 315 std::shared_ptr<const MatcherInterface<const T&>> impl_; 316 }; 317 318 } // namespace internal 319 320 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment) 321 // object that can check whether a value of type T matches. The 322 // implementation of Matcher<T> is just a std::shared_ptr to const 323 // MatcherInterface<T>. Don't inherit from Matcher! 324 template <typename T> 325 class Matcher : public internal::MatcherBase<T> { 326 public: 327 // Constructs a null matcher. Needed for storing Matcher objects in STL 328 // containers. A default-constructed matcher is not yet initialized. You 329 // cannot use it until a valid value has been assigned to it. 330 explicit Matcher() {} // NOLINT 331 332 // Constructs a matcher from its implementation. 333 explicit Matcher(const MatcherInterface<const T&>* impl) 334 : internal::MatcherBase<T>(impl) {} 335 336 template <typename U> 337 explicit Matcher( 338 const MatcherInterface<U>* impl, 339 typename std::enable_if<!std::is_same<U, const U&>::value>::type* = 340 nullptr) 341 : internal::MatcherBase<T>(impl) {} 342 343 // Implicit constructor here allows people to write 344 // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes 345 Matcher(T value); // NOLINT 346 }; 347 348 // The following two specializations allow the user to write str 349 // instead of Eq(str) and "foo" instead of Eq("foo") when a std::string 350 // matcher is expected. 351 template <> 352 class GTEST_API_ Matcher<const std::string&> 353 : public internal::MatcherBase<const std::string&> { 354 public: 355 Matcher() {} 356 357 explicit Matcher(const MatcherInterface<const std::string&>* impl) 358 : internal::MatcherBase<const std::string&>(impl) {} 359 360 // Allows the user to write str instead of Eq(str) sometimes, where 361 // str is a std::string object. 362 Matcher(const std::string& s); // NOLINT 363 364 // Allows the user to write "foo" instead of Eq("foo") sometimes. 365 Matcher(const char* s); // NOLINT 366 }; 367 368 template <> 369 class GTEST_API_ Matcher<std::string> 370 : public internal::MatcherBase<std::string> { 371 public: 372 Matcher() {} 373 374 explicit Matcher(const MatcherInterface<const std::string&>* impl) 375 : internal::MatcherBase<std::string>(impl) {} 376 explicit Matcher(const MatcherInterface<std::string>* impl) 377 : internal::MatcherBase<std::string>(impl) {} 378 379 // Allows the user to write str instead of Eq(str) sometimes, where 380 // str is a string object. 381 Matcher(const std::string& s); // NOLINT 382 383 // Allows the user to write "foo" instead of Eq("foo") sometimes. 384 Matcher(const char* s); // NOLINT 385 }; 386 387 #if GTEST_HAS_ABSL 388 // The following two specializations allow the user to write str 389 // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view 390 // matcher is expected. 391 template <> 392 class GTEST_API_ Matcher<const absl::string_view&> 393 : public internal::MatcherBase<const absl::string_view&> { 394 public: 395 Matcher() {} 396 397 explicit Matcher(const MatcherInterface<const absl::string_view&>* impl) 398 : internal::MatcherBase<const absl::string_view&>(impl) {} 399 400 // Allows the user to write str instead of Eq(str) sometimes, where 401 // str is a std::string object. 402 Matcher(const std::string& s); // NOLINT 403 404 // Allows the user to write "foo" instead of Eq("foo") sometimes. 405 Matcher(const char* s); // NOLINT 406 407 // Allows the user to pass absl::string_views directly. 408 Matcher(absl::string_view s); // NOLINT 409 }; 410 411 template <> 412 class GTEST_API_ Matcher<absl::string_view> 413 : public internal::MatcherBase<absl::string_view> { 414 public: 415 Matcher() {} 416 417 explicit Matcher(const MatcherInterface<const absl::string_view&>* impl) 418 : internal::MatcherBase<absl::string_view>(impl) {} 419 explicit Matcher(const MatcherInterface<absl::string_view>* impl) 420 : internal::MatcherBase<absl::string_view>(impl) {} 421 422 // Allows the user to write str instead of Eq(str) sometimes, where 423 // str is a std::string object. 424 Matcher(const std::string& s); // NOLINT 425 426 // Allows the user to write "foo" instead of Eq("foo") sometimes. 427 Matcher(const char* s); // NOLINT 428 429 // Allows the user to pass absl::string_views directly. 430 Matcher(absl::string_view s); // NOLINT 431 }; 432 #endif // GTEST_HAS_ABSL 433 434 // Prints a matcher in a human-readable format. 435 template <typename T> 436 std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) { 437 matcher.DescribeTo(&os); 438 return os; 439 } 440 441 // The PolymorphicMatcher class template makes it easy to implement a 442 // polymorphic matcher (i.e. a matcher that can match values of more 443 // than one type, e.g. Eq(n) and NotNull()). 444 // 445 // To define a polymorphic matcher, a user should provide an Impl 446 // class that has a DescribeTo() method and a DescribeNegationTo() 447 // method, and define a member function (or member function template) 448 // 449 // bool MatchAndExplain(const Value& value, 450 // MatchResultListener* listener) const; 451 // 452 // See the definition of NotNull() for a complete example. 453 template <class Impl> 454 class PolymorphicMatcher { 455 public: 456 explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} 457 458 // Returns a mutable reference to the underlying matcher 459 // implementation object. 460 Impl& mutable_impl() { return impl_; } 461 462 // Returns an immutable reference to the underlying matcher 463 // implementation object. 464 const Impl& impl() const { return impl_; } 465 466 template <typename T> 467 operator Matcher<T>() const { 468 return Matcher<T>(new MonomorphicImpl<const T&>(impl_)); 469 } 470 471 private: 472 template <typename T> 473 class MonomorphicImpl : public MatcherInterface<T> { 474 public: 475 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 476 477 virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); } 478 479 virtual void DescribeNegationTo(::std::ostream* os) const { 480 impl_.DescribeNegationTo(os); 481 } 482 483 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 484 return impl_.MatchAndExplain(x, listener); 485 } 486 487 private: 488 const Impl impl_; 489 }; 490 491 Impl impl_; 492 }; 493 494 // Creates a matcher from its implementation. 495 // DEPRECATED: Especially in the generic code, prefer: 496 // Matcher<T>(new MyMatcherImpl<const T&>(...)); 497 // 498 // MakeMatcher may create a Matcher that accepts its argument by value, which 499 // leads to unnecessary copies & lack of support for non-copyable types. 500 template <typename T> 501 inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) { 502 return Matcher<T>(impl); 503 } 504 505 // Creates a polymorphic matcher from its implementation. This is 506 // easier to use than the PolymorphicMatcher<Impl> constructor as it 507 // doesn't require you to explicitly write the template argument, e.g. 508 // 509 // MakePolymorphicMatcher(foo); 510 // vs 511 // PolymorphicMatcher<TypeOfFoo>(foo); 512 template <class Impl> 513 inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) { 514 return PolymorphicMatcher<Impl>(impl); 515 } 516 517 namespace internal { 518 // Implements a matcher that compares a given value with a 519 // pre-supplied value using one of the ==, <=, <, etc, operators. The 520 // two values being compared don't have to have the same type. 521 // 522 // The matcher defined here is polymorphic (for example, Eq(5) can be 523 // used to match an int, a short, a double, etc). Therefore we use 524 // a template type conversion operator in the implementation. 525 // 526 // The following template definition assumes that the Rhs parameter is 527 // a "bare" type (i.e. neither 'const T' nor 'T&'). 528 template <typename D, typename Rhs, typename Op> 529 class ComparisonBase { 530 public: 531 explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} 532 template <typename Lhs> 533 operator Matcher<Lhs>() const { 534 return Matcher<Lhs>(new Impl<const Lhs&>(rhs_)); 535 } 536 537 private: 538 template <typename T> 539 static const T& Unwrap(const T& v) { return v; } 540 template <typename T> 541 static const T& Unwrap(std::reference_wrapper<T> v) { return v; } 542 543 template <typename Lhs, typename = Rhs> 544 class Impl : public MatcherInterface<Lhs> { 545 public: 546 explicit Impl(const Rhs& rhs) : rhs_(rhs) {} 547 bool MatchAndExplain(Lhs lhs, 548 MatchResultListener* /* listener */) const override { 549 return Op()(lhs, Unwrap(rhs_)); 550 } 551 void DescribeTo(::std::ostream* os) const override { 552 *os << D::Desc() << " "; 553 UniversalPrint(Unwrap(rhs_), os); 554 } 555 void DescribeNegationTo(::std::ostream* os) const override { 556 *os << D::NegatedDesc() << " "; 557 UniversalPrint(Unwrap(rhs_), os); 558 } 559 560 private: 561 Rhs rhs_; 562 }; 563 Rhs rhs_; 564 }; 565 566 template <typename Rhs> 567 class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> { 568 public: 569 explicit EqMatcher(const Rhs& rhs) 570 : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { } 571 static const char* Desc() { return "is equal to"; } 572 static const char* NegatedDesc() { return "isn't equal to"; } 573 }; 574 template <typename Rhs> 575 class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> { 576 public: 577 explicit NeMatcher(const Rhs& rhs) 578 : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { } 579 static const char* Desc() { return "isn't equal to"; } 580 static const char* NegatedDesc() { return "is equal to"; } 581 }; 582 template <typename Rhs> 583 class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> { 584 public: 585 explicit LtMatcher(const Rhs& rhs) 586 : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { } 587 static const char* Desc() { return "is <"; } 588 static const char* NegatedDesc() { return "isn't <"; } 589 }; 590 template <typename Rhs> 591 class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> { 592 public: 593 explicit GtMatcher(const Rhs& rhs) 594 : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { } 595 static const char* Desc() { return "is >"; } 596 static const char* NegatedDesc() { return "isn't >"; } 597 }; 598 template <typename Rhs> 599 class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> { 600 public: 601 explicit LeMatcher(const Rhs& rhs) 602 : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { } 603 static const char* Desc() { return "is <="; } 604 static const char* NegatedDesc() { return "isn't <="; } 605 }; 606 template <typename Rhs> 607 class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> { 608 public: 609 explicit GeMatcher(const Rhs& rhs) 610 : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { } 611 static const char* Desc() { return "is >="; } 612 static const char* NegatedDesc() { return "isn't >="; } 613 }; 614 615 // Implements polymorphic matchers MatchesRegex(regex) and 616 // ContainsRegex(regex), which can be used as a Matcher<T> as long as 617 // T can be converted to a string. 618 class MatchesRegexMatcher { 619 public: 620 MatchesRegexMatcher(const RE* regex, bool full_match) 621 : regex_(regex), full_match_(full_match) {} 622 623 #if GTEST_HAS_ABSL 624 bool MatchAndExplain(const absl::string_view& s, 625 MatchResultListener* listener) const { 626 return MatchAndExplain(std::string(s), listener); 627 } 628 #endif // GTEST_HAS_ABSL 629 630 // Accepts pointer types, particularly: 631 // const char* 632 // char* 633 // const wchar_t* 634 // wchar_t* 635 template <typename CharType> 636 bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 637 return s != nullptr && MatchAndExplain(std::string(s), listener); 638 } 639 640 // Matches anything that can convert to std::string. 641 // 642 // This is a template, not just a plain function with const std::string&, 643 // because absl::string_view has some interfering non-explicit constructors. 644 template <class MatcheeStringType> 645 bool MatchAndExplain(const MatcheeStringType& s, 646 MatchResultListener* /* listener */) const { 647 const std::string& s2(s); 648 return full_match_ ? RE::FullMatch(s2, *regex_) 649 : RE::PartialMatch(s2, *regex_); 650 } 651 652 void DescribeTo(::std::ostream* os) const { 653 *os << (full_match_ ? "matches" : "contains") << " regular expression "; 654 UniversalPrinter<std::string>::Print(regex_->pattern(), os); 655 } 656 657 void DescribeNegationTo(::std::ostream* os) const { 658 *os << "doesn't " << (full_match_ ? "match" : "contain") 659 << " regular expression "; 660 UniversalPrinter<std::string>::Print(regex_->pattern(), os); 661 } 662 663 private: 664 const std::shared_ptr<const RE> regex_; 665 const bool full_match_; 666 }; 667 } // namespace internal 668 669 // Matches a string that fully matches regular expression 'regex'. 670 // The matcher takes ownership of 'regex'. 671 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 672 const internal::RE* regex) { 673 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); 674 } 675 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 676 const std::string& regex) { 677 return MatchesRegex(new internal::RE(regex)); 678 } 679 680 // Matches a string that contains regular expression 'regex'. 681 // The matcher takes ownership of 'regex'. 682 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 683 const internal::RE* regex) { 684 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); 685 } 686 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 687 const std::string& regex) { 688 return ContainsRegex(new internal::RE(regex)); 689 } 690 691 // Creates a polymorphic matcher that matches anything equal to x. 692 // Note: if the parameter of Eq() were declared as const T&, Eq("foo") 693 // wouldn't compile. 694 template <typename T> 695 inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); } 696 697 // Constructs a Matcher<T> from a 'value' of type T. The constructed 698 // matcher matches any value that's equal to 'value'. 699 template <typename T> 700 Matcher<T>::Matcher(T value) { *this = Eq(value); } 701 702 // Creates a monomorphic matcher that matches anything with type Lhs 703 // and equal to rhs. A user may need to use this instead of Eq(...) 704 // in order to resolve an overloading ambiguity. 705 // 706 // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x)) 707 // or Matcher<T>(x), but more readable than the latter. 708 // 709 // We could define similar monomorphic matchers for other comparison 710 // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do 711 // it yet as those are used much less than Eq() in practice. A user 712 // can always write Matcher<T>(Lt(5)) to be explicit about the type, 713 // for example. 714 template <typename Lhs, typename Rhs> 715 inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); } 716 717 // Creates a polymorphic matcher that matches anything >= x. 718 template <typename Rhs> 719 inline internal::GeMatcher<Rhs> Ge(Rhs x) { 720 return internal::GeMatcher<Rhs>(x); 721 } 722 723 // Creates a polymorphic matcher that matches anything > x. 724 template <typename Rhs> 725 inline internal::GtMatcher<Rhs> Gt(Rhs x) { 726 return internal::GtMatcher<Rhs>(x); 727 } 728 729 // Creates a polymorphic matcher that matches anything <= x. 730 template <typename Rhs> 731 inline internal::LeMatcher<Rhs> Le(Rhs x) { 732 return internal::LeMatcher<Rhs>(x); 733 } 734 735 // Creates a polymorphic matcher that matches anything < x. 736 template <typename Rhs> 737 inline internal::LtMatcher<Rhs> Lt(Rhs x) { 738 return internal::LtMatcher<Rhs>(x); 739 } 740 741 // Creates a polymorphic matcher that matches anything != x. 742 template <typename Rhs> 743 inline internal::NeMatcher<Rhs> Ne(Rhs x) { 744 return internal::NeMatcher<Rhs>(x); 745 } 746 } // namespace testing 747 748 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046 749 750 #endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_