1 // Copyright 2007, Google Inc.
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
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
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.
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.
30 // The Google C++ Testing and Mocking Framework (Google Test)
32 // This file implements just enough of the matcher interface to allow
33 // EXPECT_DEATH and friends to accept a matcher argument.
35 // IWYU pragma: private, include "gtest/gtest.h"
36 // IWYU pragma: friend gtest/.*
37 // IWYU pragma: friend gmock/.*
39 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
40 #define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
47 #include <type_traits>
49 #include "gtest/gtest-printers.h"
50 #include "gtest/internal/gtest-internal.h"
51 #include "gtest/internal/gtest-port.h"
53 // MSVC warning C5046 is new as of VS2017 version 15.8.
54 #if defined(_MSC_VER) && _MSC_VER >= 1915
55 #define GTEST_MAYBE_5046_ 5046
57 #define GTEST_MAYBE_5046_
60 GTEST_DISABLE_MSC_WARNINGS_PUSH_(
61 4251 GTEST_MAYBE_5046_
/* class A needs to have dll-interface to be used by
63 /* Symbol involving type with internal linkage not defined */)
67 // To implement a matcher Foo for type T, define:
68 // 1. a class FooMatcherMatcher that implements the matcher interface:
69 // using is_gtest_matcher = void;
70 // bool MatchAndExplain(const T&, std::ostream*);
71 // (MatchResultListener* can also be used instead of std::ostream*)
72 // void DescribeTo(std::ostream*);
73 // void DescribeNegationTo(std::ostream*);
75 // 2. a factory function that creates a Matcher<T> object from a
78 class MatchResultListener
{
80 // Creates a listener object with the given underlying ostream. The
81 // listener does not own the ostream, and does not dereference it
82 // in the constructor or destructor.
83 explicit MatchResultListener(::std::ostream
* os
) : stream_(os
) {}
84 virtual ~MatchResultListener() = 0; // Makes this class abstract.
86 // Streams x to the underlying ostream; does nothing if the ostream
89 MatchResultListener
& operator<<(const T
& x
) {
90 if (stream_
!= nullptr) *stream_
<< x
;
94 // Returns the underlying ostream.
95 ::std::ostream
* stream() { return stream_
; }
97 // Returns true if and only if the listener is interested in an explanation
98 // of the match result. A matcher's MatchAndExplain() method can use
99 // this information to avoid generating the explanation when no one
100 // intends to hear it.
101 bool IsInterested() const { return stream_
!= nullptr; }
104 ::std::ostream
* const stream_
;
106 MatchResultListener(const MatchResultListener
&) = delete;
107 MatchResultListener
& operator=(const MatchResultListener
&) = delete;
110 inline MatchResultListener::~MatchResultListener() = default;
112 // An instance of a subclass of this knows how to describe itself as a
114 class GTEST_API_ MatcherDescriberInterface
{
116 virtual ~MatcherDescriberInterface() = default;
118 // Describes this matcher to an ostream. The function should print
119 // a verb phrase that describes the property a value matching this
120 // matcher should have. The subject of the verb phrase is the value
121 // being matched. For example, the DescribeTo() method of the Gt(7)
122 // matcher prints "is greater than 7".
123 virtual void DescribeTo(::std::ostream
* os
) const = 0;
125 // Describes the negation of this matcher to an ostream. For
126 // example, if the description of this matcher is "is greater than
127 // 7", the negated description could be "is not greater than 7".
128 // You are not required to override this when implementing
129 // MatcherInterface, but it is highly advised so that your matcher
130 // can produce good error messages.
131 virtual void DescribeNegationTo(::std::ostream
* os
) const {
138 // The implementation of a matcher.
139 template <typename T
>
140 class MatcherInterface
: public MatcherDescriberInterface
{
142 // Returns true if and only if the matcher matches x; also explains the
143 // match result to 'listener' if necessary (see the next paragraph), in
144 // the form of a non-restrictive relative clause ("which ...",
145 // "whose ...", etc) that describes x. For example, the
146 // MatchAndExplain() method of the Pointee(...) matcher should
147 // generate an explanation like "which points to ...".
149 // Implementations of MatchAndExplain() should add an explanation of
150 // the match result *if and only if* they can provide additional
151 // information that's not already present (or not obvious) in the
152 // print-out of x and the matcher's description. Whether the match
153 // succeeds is not a factor in deciding whether an explanation is
154 // needed, as sometimes the caller needs to print a failure message
155 // when the match succeeds (e.g. when the matcher is used inside
158 // For example, a "has at least 10 elements" matcher should explain
159 // what the actual element count is, regardless of the match result,
160 // as it is useful information to the reader; on the other hand, an
161 // "is empty" matcher probably only needs to explain what the actual
162 // size is when the match fails, as it's redundant to say that the
163 // size is 0 when the value is already known to be empty.
165 // You should override this method when defining a new matcher.
167 // It's the responsibility of the caller (Google Test) to guarantee
168 // that 'listener' is not NULL. This helps to simplify a matcher's
169 // implementation when it doesn't care about the performance, as it
170 // can talk to 'listener' without checking its validity first.
171 // However, in order to implement dummy listeners efficiently,
172 // listener->stream() may be NULL.
173 virtual bool MatchAndExplain(T x
, MatchResultListener
* listener
) const = 0;
175 // Inherits these methods from MatcherDescriberInterface:
176 // virtual void DescribeTo(::std::ostream* os) const = 0;
177 // virtual void DescribeNegationTo(::std::ostream* os) const;
182 // A match result listener that ignores the explanation.
183 class DummyMatchResultListener
: public MatchResultListener
{
185 DummyMatchResultListener() : MatchResultListener(nullptr) {}
188 DummyMatchResultListener(const DummyMatchResultListener
&) = delete;
189 DummyMatchResultListener
& operator=(const DummyMatchResultListener
&) = delete;
192 // A match result listener that forwards the explanation to a given
193 // ostream. The difference between this and MatchResultListener is
194 // that the former is concrete.
195 class StreamMatchResultListener
: public MatchResultListener
{
197 explicit StreamMatchResultListener(::std::ostream
* os
)
198 : MatchResultListener(os
) {}
201 StreamMatchResultListener(const StreamMatchResultListener
&) = delete;
202 StreamMatchResultListener
& operator=(const StreamMatchResultListener
&) =
206 struct SharedPayloadBase
{
207 std::atomic
<int> ref
{1};
208 void Ref() { ref
.fetch_add(1, std::memory_order_relaxed
); }
209 bool Unref() { return ref
.fetch_sub(1, std::memory_order_acq_rel
) == 1; }
212 template <typename T
>
213 struct SharedPayload
: SharedPayloadBase
{
214 explicit SharedPayload(const T
& v
) : value(v
) {}
215 explicit SharedPayload(T
&& v
) : value(std::move(v
)) {}
217 static void Destroy(SharedPayloadBase
* shared
) {
218 delete static_cast<SharedPayload
*>(shared
);
224 // An internal class for implementing Matcher<T>, which will derive
225 // from it. We put functionalities common to all Matcher<T>
226 // specializations here to avoid code duplication.
227 template <typename T
>
228 class MatcherBase
: private MatcherDescriberInterface
{
230 // Returns true if and only if the matcher matches x; also explains the
231 // match result to 'listener'.
232 bool MatchAndExplain(const T
& x
, MatchResultListener
* listener
) const {
233 GTEST_CHECK_(vtable_
!= nullptr);
234 return vtable_
->match_and_explain(*this, x
, listener
);
237 // Returns true if and only if this matcher matches x.
238 bool Matches(const T
& x
) const {
239 DummyMatchResultListener dummy
;
240 return MatchAndExplain(x
, &dummy
);
243 // Describes this matcher to an ostream.
244 void DescribeTo(::std::ostream
* os
) const final
{
245 GTEST_CHECK_(vtable_
!= nullptr);
246 vtable_
->describe(*this, os
, false);
249 // Describes the negation of this matcher to an ostream.
250 void DescribeNegationTo(::std::ostream
* os
) const final
{
251 GTEST_CHECK_(vtable_
!= nullptr);
252 vtable_
->describe(*this, os
, true);
255 // Explains why x matches, or doesn't match, the matcher.
256 void ExplainMatchResultTo(const T
& x
, ::std::ostream
* os
) const {
257 StreamMatchResultListener
listener(os
);
258 MatchAndExplain(x
, &listener
);
261 // Returns the describer for this matcher object; retains ownership
262 // of the describer, which is only guaranteed to be alive when
263 // this matcher object is alive.
264 const MatcherDescriberInterface
* GetDescriber() const {
265 if (vtable_
== nullptr) return nullptr;
266 return vtable_
->get_describer(*this);
270 MatcherBase() : vtable_(nullptr), buffer_() {}
272 // Constructs a matcher from its implementation.
273 template <typename U
>
274 explicit MatcherBase(const MatcherInterface
<U
>* impl
)
275 : vtable_(nullptr), buffer_() {
279 template <typename M
, typename
= typename
std::remove_reference
<
280 M
>::type::is_gtest_matcher
>
281 MatcherBase(M
&& m
) : vtable_(nullptr), buffer_() { // NOLINT
282 Init(std::forward
<M
>(m
));
285 MatcherBase(const MatcherBase
& other
)
286 : vtable_(other
.vtable_
), buffer_(other
.buffer_
) {
287 if (IsShared()) buffer_
.shared
->Ref();
290 MatcherBase
& operator=(const MatcherBase
& other
) {
291 if (this == &other
) return *this;
293 vtable_
= other
.vtable_
;
294 buffer_
= other
.buffer_
;
295 if (IsShared()) buffer_
.shared
->Ref();
299 MatcherBase(MatcherBase
&& other
)
300 : vtable_(other
.vtable_
), buffer_(other
.buffer_
) {
301 other
.vtable_
= nullptr;
304 MatcherBase
& operator=(MatcherBase
&& other
) {
305 if (this == &other
) return *this;
307 vtable_
= other
.vtable_
;
308 buffer_
= other
.buffer_
;
309 other
.vtable_
= nullptr;
313 ~MatcherBase() override
{ Destroy(); }
317 bool (*match_and_explain
)(const MatcherBase
&, const T
&,
318 MatchResultListener
*);
319 void (*describe
)(const MatcherBase
&, std::ostream
*, bool negation
);
320 // Returns the captured object if it implements the interface, otherwise
321 // returns the MatcherBase itself.
322 const MatcherDescriberInterface
* (*get_describer
)(const MatcherBase
&);
323 // Called on shared instances when the reference count reaches 0.
324 void (*shared_destroy
)(SharedPayloadBase
*);
327 bool IsShared() const {
328 return vtable_
!= nullptr && vtable_
->shared_destroy
!= nullptr;
331 // If the implementation uses a listener, call that.
332 template <typename P
>
333 static auto MatchAndExplainImpl(const MatcherBase
& m
, const T
& value
,
334 MatchResultListener
* listener
)
335 -> decltype(P::Get(m
).MatchAndExplain(value
, listener
->stream())) {
336 return P::Get(m
).MatchAndExplain(value
, listener
->stream());
339 template <typename P
>
340 static auto MatchAndExplainImpl(const MatcherBase
& m
, const T
& value
,
341 MatchResultListener
* listener
)
342 -> decltype(P::Get(m
).MatchAndExplain(value
, listener
)) {
343 return P::Get(m
).MatchAndExplain(value
, listener
);
346 template <typename P
>
347 static void DescribeImpl(const MatcherBase
& m
, std::ostream
* os
,
350 P::Get(m
).DescribeNegationTo(os
);
352 P::Get(m
).DescribeTo(os
);
356 template <typename P
>
357 static const MatcherDescriberInterface
* GetDescriberImpl(
358 const MatcherBase
& m
) {
359 // If the impl is a MatcherDescriberInterface, then return it.
360 // Otherwise use MatcherBase itself.
361 // This allows us to implement the GetDescriber() function without support
362 // from the impl, but some users really want to get their impl back when
363 // they call GetDescriber().
364 // We use std::get on a tuple as a workaround of not having `if constexpr`.
366 std::is_convertible
<decltype(&P::Get(m
)),
367 const MatcherDescriberInterface
*>::value
369 : 0)>(std::make_tuple(&m
, &P::Get(m
)));
372 template <typename P
>
373 const VTable
* GetVTable() {
374 static constexpr VTable kVTable
= {&MatchAndExplainImpl
<P
>,
375 &DescribeImpl
<P
>, &GetDescriberImpl
<P
>,
381 // Add some types to give Buffer some common alignment/size use cases.
385 // And add one for the out-of-line cases.
386 SharedPayloadBase
* shared
;
390 if (IsShared() && buffer_
.shared
->Unref()) {
391 vtable_
->shared_destroy(buffer_
.shared
);
395 template <typename M
>
396 static constexpr bool IsInlined() {
397 return sizeof(M
) <= sizeof(Buffer
) && alignof(M
) <= alignof(Buffer
) &&
398 std::is_trivially_copy_constructible
<M
>::value
&&
399 std::is_trivially_destructible
<M
>::value
;
402 template <typename M
, bool = MatcherBase::IsInlined
<M
>()>
404 static const M
& Get(const MatcherBase
& m
) {
405 // When inlined along with Init, need to be explicit to avoid violating
406 // strict aliasing rules.
408 static_cast<const M
*>(static_cast<const void*>(&m
.buffer_
));
411 static void Init(MatcherBase
& m
, M impl
) {
412 ::new (static_cast<void*>(&m
.buffer_
)) M(impl
);
414 static constexpr auto shared_destroy
= nullptr;
417 template <typename M
>
418 struct ValuePolicy
<M
, false> {
419 using Shared
= SharedPayload
<M
>;
420 static const M
& Get(const MatcherBase
& m
) {
421 return static_cast<Shared
*>(m
.buffer_
.shared
)->value
;
423 template <typename Arg
>
424 static void Init(MatcherBase
& m
, Arg
&& arg
) {
425 m
.buffer_
.shared
= new Shared(std::forward
<Arg
>(arg
));
427 static constexpr auto shared_destroy
= &Shared::Destroy
;
430 template <typename U
, bool B
>
431 struct ValuePolicy
<const MatcherInterface
<U
>*, B
> {
432 using M
= const MatcherInterface
<U
>;
433 using Shared
= SharedPayload
<std::unique_ptr
<M
>>;
434 static const M
& Get(const MatcherBase
& m
) {
435 return *static_cast<Shared
*>(m
.buffer_
.shared
)->value
;
437 static void Init(MatcherBase
& m
, M
* impl
) {
438 m
.buffer_
.shared
= new Shared(std::unique_ptr
<M
>(impl
));
441 static constexpr auto shared_destroy
= &Shared::Destroy
;
444 template <typename M
>
446 using MM
= typename
std::decay
<M
>::type
;
447 using Policy
= ValuePolicy
<MM
>;
448 vtable_
= GetVTable
<Policy
>();
449 Policy::Init(*this, std::forward
<M
>(m
));
452 const VTable
* vtable_
;
456 } // namespace internal
458 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
459 // object that can check whether a value of type T matches. The
460 // implementation of Matcher<T> is just a std::shared_ptr to const
461 // MatcherInterface<T>. Don't inherit from Matcher!
462 template <typename T
>
463 class Matcher
: public internal::MatcherBase
<T
> {
465 // Constructs a null matcher. Needed for storing Matcher objects in STL
466 // containers. A default-constructed matcher is not yet initialized. You
467 // cannot use it until a valid value has been assigned to it.
468 explicit Matcher() {} // NOLINT
470 // Constructs a matcher from its implementation.
471 explicit Matcher(const MatcherInterface
<const T
&>* impl
)
472 : internal::MatcherBase
<T
>(impl
) {}
474 template <typename U
>
476 const MatcherInterface
<U
>* impl
,
477 typename
std::enable_if
<!std::is_same
<U
, const U
&>::value
>::type
* =
479 : internal::MatcherBase
<T
>(impl
) {}
481 template <typename M
, typename
= typename
std::remove_reference
<
482 M
>::type::is_gtest_matcher
>
483 Matcher(M
&& m
) : internal::MatcherBase
<T
>(std::forward
<M
>(m
)) {} // NOLINT
485 // Implicit constructor here allows people to write
486 // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
487 Matcher(T value
); // NOLINT
490 // The following two specializations allow the user to write str
491 // instead of Eq(str) and "foo" instead of Eq("foo") when a std::string
492 // matcher is expected.
494 class GTEST_API_ Matcher
<const std::string
&>
495 : public internal::MatcherBase
<const std::string
&> {
499 explicit Matcher(const MatcherInterface
<const std::string
&>* impl
)
500 : internal::MatcherBase
<const std::string
&>(impl
) {}
502 template <typename M
, typename
= typename
std::remove_reference
<
503 M
>::type::is_gtest_matcher
>
504 Matcher(M
&& m
) // NOLINT
505 : internal::MatcherBase
<const std::string
&>(std::forward
<M
>(m
)) {}
507 // Allows the user to write str instead of Eq(str) sometimes, where
508 // str is a std::string object.
509 Matcher(const std::string
& s
); // NOLINT
511 // Allows the user to write "foo" instead of Eq("foo") sometimes.
512 Matcher(const char* s
); // NOLINT
516 class GTEST_API_ Matcher
<std::string
>
517 : public internal::MatcherBase
<std::string
> {
521 explicit Matcher(const MatcherInterface
<const std::string
&>* impl
)
522 : internal::MatcherBase
<std::string
>(impl
) {}
523 explicit Matcher(const MatcherInterface
<std::string
>* impl
)
524 : internal::MatcherBase
<std::string
>(impl
) {}
526 template <typename M
, typename
= typename
std::remove_reference
<
527 M
>::type::is_gtest_matcher
>
528 Matcher(M
&& m
) // NOLINT
529 : internal::MatcherBase
<std::string
>(std::forward
<M
>(m
)) {}
531 // Allows the user to write str instead of Eq(str) sometimes, where
532 // str is a string object.
533 Matcher(const std::string
& s
); // NOLINT
535 // Allows the user to write "foo" instead of Eq("foo") sometimes.
536 Matcher(const char* s
); // NOLINT
539 #if GTEST_INTERNAL_HAS_STRING_VIEW
540 // The following two specializations allow the user to write str
541 // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view
542 // matcher is expected.
544 class GTEST_API_ Matcher
<const internal::StringView
&>
545 : public internal::MatcherBase
<const internal::StringView
&> {
549 explicit Matcher(const MatcherInterface
<const internal::StringView
&>* impl
)
550 : internal::MatcherBase
<const internal::StringView
&>(impl
) {}
552 template <typename M
, typename
= typename
std::remove_reference
<
553 M
>::type::is_gtest_matcher
>
554 Matcher(M
&& m
) // NOLINT
555 : internal::MatcherBase
<const internal::StringView
&>(std::forward
<M
>(m
)) {
558 // Allows the user to write str instead of Eq(str) sometimes, where
559 // str is a std::string object.
560 Matcher(const std::string
& s
); // NOLINT
562 // Allows the user to write "foo" instead of Eq("foo") sometimes.
563 Matcher(const char* s
); // NOLINT
565 // Allows the user to pass absl::string_views or std::string_views directly.
566 Matcher(internal::StringView s
); // NOLINT
570 class GTEST_API_ Matcher
<internal::StringView
>
571 : public internal::MatcherBase
<internal::StringView
> {
575 explicit Matcher(const MatcherInterface
<const internal::StringView
&>* impl
)
576 : internal::MatcherBase
<internal::StringView
>(impl
) {}
577 explicit Matcher(const MatcherInterface
<internal::StringView
>* impl
)
578 : internal::MatcherBase
<internal::StringView
>(impl
) {}
580 template <typename M
, typename
= typename
std::remove_reference
<
581 M
>::type::is_gtest_matcher
>
582 Matcher(M
&& m
) // NOLINT
583 : internal::MatcherBase
<internal::StringView
>(std::forward
<M
>(m
)) {}
585 // Allows the user to write str instead of Eq(str) sometimes, where
586 // str is a std::string object.
587 Matcher(const std::string
& s
); // NOLINT
589 // Allows the user to write "foo" instead of Eq("foo") sometimes.
590 Matcher(const char* s
); // NOLINT
592 // Allows the user to pass absl::string_views or std::string_views directly.
593 Matcher(internal::StringView s
); // NOLINT
595 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
597 // Prints a matcher in a human-readable format.
598 template <typename T
>
599 std::ostream
& operator<<(std::ostream
& os
, const Matcher
<T
>& matcher
) {
600 matcher
.DescribeTo(&os
);
604 // The PolymorphicMatcher class template makes it easy to implement a
605 // polymorphic matcher (i.e. a matcher that can match values of more
606 // than one type, e.g. Eq(n) and NotNull()).
608 // To define a polymorphic matcher, a user should provide an Impl
609 // class that has a DescribeTo() method and a DescribeNegationTo()
610 // method, and define a member function (or member function template)
612 // bool MatchAndExplain(const Value& value,
613 // MatchResultListener* listener) const;
615 // See the definition of NotNull() for a complete example.
616 template <class Impl
>
617 class PolymorphicMatcher
{
619 explicit PolymorphicMatcher(const Impl
& an_impl
) : impl_(an_impl
) {}
621 // Returns a mutable reference to the underlying matcher
622 // implementation object.
623 Impl
& mutable_impl() { return impl_
; }
625 // Returns an immutable reference to the underlying matcher
626 // implementation object.
627 const Impl
& impl() const { return impl_
; }
629 template <typename T
>
630 operator Matcher
<T
>() const {
631 return Matcher
<T
>(new MonomorphicImpl
<const T
&>(impl_
));
635 template <typename T
>
636 class MonomorphicImpl
: public MatcherInterface
<T
> {
638 explicit MonomorphicImpl(const Impl
& impl
) : impl_(impl
) {}
640 void DescribeTo(::std::ostream
* os
) const override
{ impl_
.DescribeTo(os
); }
642 void DescribeNegationTo(::std::ostream
* os
) const override
{
643 impl_
.DescribeNegationTo(os
);
646 bool MatchAndExplain(T x
, MatchResultListener
* listener
) const override
{
647 return impl_
.MatchAndExplain(x
, listener
);
657 // Creates a matcher from its implementation.
658 // DEPRECATED: Especially in the generic code, prefer:
659 // Matcher<T>(new MyMatcherImpl<const T&>(...));
661 // MakeMatcher may create a Matcher that accepts its argument by value, which
662 // leads to unnecessary copies & lack of support for non-copyable types.
663 template <typename T
>
664 inline Matcher
<T
> MakeMatcher(const MatcherInterface
<T
>* impl
) {
665 return Matcher
<T
>(impl
);
668 // Creates a polymorphic matcher from its implementation. This is
669 // easier to use than the PolymorphicMatcher<Impl> constructor as it
670 // doesn't require you to explicitly write the template argument, e.g.
672 // MakePolymorphicMatcher(foo);
674 // PolymorphicMatcher<TypeOfFoo>(foo);
675 template <class Impl
>
676 inline PolymorphicMatcher
<Impl
> MakePolymorphicMatcher(const Impl
& impl
) {
677 return PolymorphicMatcher
<Impl
>(impl
);
681 // Implements a matcher that compares a given value with a
682 // pre-supplied value using one of the ==, <=, <, etc, operators. The
683 // two values being compared don't have to have the same type.
685 // The matcher defined here is polymorphic (for example, Eq(5) can be
686 // used to match an int, a short, a double, etc). Therefore we use
687 // a template type conversion operator in the implementation.
689 // The following template definition assumes that the Rhs parameter is
690 // a "bare" type (i.e. neither 'const T' nor 'T&').
691 template <typename D
, typename Rhs
, typename Op
>
692 class ComparisonBase
{
694 explicit ComparisonBase(const Rhs
& rhs
) : rhs_(rhs
) {}
696 using is_gtest_matcher
= void;
698 template <typename Lhs
>
699 bool MatchAndExplain(const Lhs
& lhs
, std::ostream
*) const {
700 return Op()(lhs
, Unwrap(rhs_
));
702 void DescribeTo(std::ostream
* os
) const {
703 *os
<< D::Desc() << " ";
704 UniversalPrint(Unwrap(rhs_
), os
);
706 void DescribeNegationTo(std::ostream
* os
) const {
707 *os
<< D::NegatedDesc() << " ";
708 UniversalPrint(Unwrap(rhs_
), os
);
712 template <typename T
>
713 static const T
& Unwrap(const T
& v
) {
716 template <typename T
>
717 static const T
& Unwrap(std::reference_wrapper
<T
> v
) {
724 template <typename Rhs
>
725 class EqMatcher
: public ComparisonBase
<EqMatcher
<Rhs
>, Rhs
, std::equal_to
<>> {
727 explicit EqMatcher(const Rhs
& rhs
)
728 : ComparisonBase
<EqMatcher
<Rhs
>, Rhs
, std::equal_to
<>>(rhs
) {}
729 static const char* Desc() { return "is equal to"; }
730 static const char* NegatedDesc() { return "isn't equal to"; }
732 template <typename Rhs
>
734 : public ComparisonBase
<NeMatcher
<Rhs
>, Rhs
, std::not_equal_to
<>> {
736 explicit NeMatcher(const Rhs
& rhs
)
737 : ComparisonBase
<NeMatcher
<Rhs
>, Rhs
, std::not_equal_to
<>>(rhs
) {}
738 static const char* Desc() { return "isn't equal to"; }
739 static const char* NegatedDesc() { return "is equal to"; }
741 template <typename Rhs
>
742 class LtMatcher
: public ComparisonBase
<LtMatcher
<Rhs
>, Rhs
, std::less
<>> {
744 explicit LtMatcher(const Rhs
& rhs
)
745 : ComparisonBase
<LtMatcher
<Rhs
>, Rhs
, std::less
<>>(rhs
) {}
746 static const char* Desc() { return "is <"; }
747 static const char* NegatedDesc() { return "isn't <"; }
749 template <typename Rhs
>
750 class GtMatcher
: public ComparisonBase
<GtMatcher
<Rhs
>, Rhs
, std::greater
<>> {
752 explicit GtMatcher(const Rhs
& rhs
)
753 : ComparisonBase
<GtMatcher
<Rhs
>, Rhs
, std::greater
<>>(rhs
) {}
754 static const char* Desc() { return "is >"; }
755 static const char* NegatedDesc() { return "isn't >"; }
757 template <typename Rhs
>
759 : public ComparisonBase
<LeMatcher
<Rhs
>, Rhs
, std::less_equal
<>> {
761 explicit LeMatcher(const Rhs
& rhs
)
762 : ComparisonBase
<LeMatcher
<Rhs
>, Rhs
, std::less_equal
<>>(rhs
) {}
763 static const char* Desc() { return "is <="; }
764 static const char* NegatedDesc() { return "isn't <="; }
766 template <typename Rhs
>
768 : public ComparisonBase
<GeMatcher
<Rhs
>, Rhs
, std::greater_equal
<>> {
770 explicit GeMatcher(const Rhs
& rhs
)
771 : ComparisonBase
<GeMatcher
<Rhs
>, Rhs
, std::greater_equal
<>>(rhs
) {}
772 static const char* Desc() { return "is >="; }
773 static const char* NegatedDesc() { return "isn't >="; }
776 template <typename T
, typename
= typename
std::enable_if
<
777 std::is_constructible
<std::string
, T
>::value
>::type
>
778 using StringLike
= T
;
780 // Implements polymorphic matchers MatchesRegex(regex) and
781 // ContainsRegex(regex), which can be used as a Matcher<T> as long as
782 // T can be converted to a string.
783 class MatchesRegexMatcher
{
785 MatchesRegexMatcher(const RE
* regex
, bool full_match
)
786 : regex_(regex
), full_match_(full_match
) {}
788 #if GTEST_INTERNAL_HAS_STRING_VIEW
789 bool MatchAndExplain(const internal::StringView
& s
,
790 MatchResultListener
* listener
) const {
791 return MatchAndExplain(std::string(s
), listener
);
793 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
795 // Accepts pointer types, particularly:
800 template <typename CharType
>
801 bool MatchAndExplain(CharType
* s
, MatchResultListener
* listener
) const {
802 return s
!= nullptr && MatchAndExplain(std::string(s
), listener
);
805 // Matches anything that can convert to std::string.
807 // This is a template, not just a plain function with const std::string&,
808 // because absl::string_view has some interfering non-explicit constructors.
809 template <class MatcheeStringType
>
810 bool MatchAndExplain(const MatcheeStringType
& s
,
811 MatchResultListener
* /* listener */) const {
812 const std::string
s2(s
);
813 return full_match_
? RE::FullMatch(s2
, *regex_
)
814 : RE::PartialMatch(s2
, *regex_
);
817 void DescribeTo(::std::ostream
* os
) const {
818 *os
<< (full_match_
? "matches" : "contains") << " regular expression ";
819 UniversalPrinter
<std::string
>::Print(regex_
->pattern(), os
);
822 void DescribeNegationTo(::std::ostream
* os
) const {
823 *os
<< "doesn't " << (full_match_
? "match" : "contain")
824 << " regular expression ";
825 UniversalPrinter
<std::string
>::Print(regex_
->pattern(), os
);
829 const std::shared_ptr
<const RE
> regex_
;
830 const bool full_match_
;
832 } // namespace internal
834 // Matches a string that fully matches regular expression 'regex'.
835 // The matcher takes ownership of 'regex'.
836 inline PolymorphicMatcher
<internal::MatchesRegexMatcher
> MatchesRegex(
837 const internal::RE
* regex
) {
838 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex
, true));
840 template <typename T
= std::string
>
841 PolymorphicMatcher
<internal::MatchesRegexMatcher
> MatchesRegex(
842 const internal::StringLike
<T
>& regex
) {
843 return MatchesRegex(new internal::RE(std::string(regex
)));
846 // Matches a string that contains regular expression 'regex'.
847 // The matcher takes ownership of 'regex'.
848 inline PolymorphicMatcher
<internal::MatchesRegexMatcher
> ContainsRegex(
849 const internal::RE
* regex
) {
850 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex
, false));
852 template <typename T
= std::string
>
853 PolymorphicMatcher
<internal::MatchesRegexMatcher
> ContainsRegex(
854 const internal::StringLike
<T
>& regex
) {
855 return ContainsRegex(new internal::RE(std::string(regex
)));
858 // Creates a polymorphic matcher that matches anything equal to x.
859 // Note: if the parameter of Eq() were declared as const T&, Eq("foo")
861 template <typename T
>
862 inline internal::EqMatcher
<T
> Eq(T x
) {
863 return internal::EqMatcher
<T
>(x
);
866 // Constructs a Matcher<T> from a 'value' of type T. The constructed
867 // matcher matches any value that's equal to 'value'.
868 template <typename T
>
869 Matcher
<T
>::Matcher(T value
) {
873 // Creates a monomorphic matcher that matches anything with type Lhs
874 // and equal to rhs. A user may need to use this instead of Eq(...)
875 // in order to resolve an overloading ambiguity.
877 // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
878 // or Matcher<T>(x), but more readable than the latter.
880 // We could define similar monomorphic matchers for other comparison
881 // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
882 // it yet as those are used much less than Eq() in practice. A user
883 // can always write Matcher<T>(Lt(5)) to be explicit about the type,
885 template <typename Lhs
, typename Rhs
>
886 inline Matcher
<Lhs
> TypedEq(const Rhs
& rhs
) {
890 // Creates a polymorphic matcher that matches anything >= x.
891 template <typename Rhs
>
892 inline internal::GeMatcher
<Rhs
> Ge(Rhs x
) {
893 return internal::GeMatcher
<Rhs
>(x
);
896 // Creates a polymorphic matcher that matches anything > x.
897 template <typename Rhs
>
898 inline internal::GtMatcher
<Rhs
> Gt(Rhs x
) {
899 return internal::GtMatcher
<Rhs
>(x
);
902 // Creates a polymorphic matcher that matches anything <= x.
903 template <typename Rhs
>
904 inline internal::LeMatcher
<Rhs
> Le(Rhs x
) {
905 return internal::LeMatcher
<Rhs
>(x
);
908 // Creates a polymorphic matcher that matches anything < x.
909 template <typename Rhs
>
910 inline internal::LtMatcher
<Rhs
> Lt(Rhs x
) {
911 return internal::LtMatcher
<Rhs
>(x
);
914 // Creates a polymorphic matcher that matches anything != x.
915 template <typename Rhs
>
916 inline internal::NeMatcher
<Rhs
> Ne(Rhs x
) {
917 return internal::NeMatcher
<Rhs
>(x
);
919 } // namespace testing
921 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046
923 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_