diff options
| author | Abseil Team <absl-team@google.com> | 2020-12-08 12:37:32 -0500 |
|---|---|---|
| committer | Andy Getz <durandal@google.com> | 2020-12-08 19:15:35 -0500 |
| commit | e5644f5f12ff3d5b2232dabc1c5ea272a52e8155 (patch) | |
| tree | 170e3f0de02818b0c15709da473cfb6efdd7f0b6 /googlemock/include | |
| parent | 8779937dd05016e3a96e477d2bb1f94947486605 (diff) | |
| download | googletest-e5644f5f12ff3d5b2232dabc1c5ea272a52e8155.tar.gz googletest-e5644f5f12ff3d5b2232dabc1c5ea272a52e8155.zip | |
Googletest export
Introduce a new `Address` matcher to gmock.
PiperOrigin-RevId: 346344591
Diffstat (limited to 'googlemock/include')
| -rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index ae064b5d..9641ed42 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -2833,6 +2833,49 @@ class KeyMatcher { const M matcher_for_key_; }; +// Implements polymorphic Address(matcher_for_address). +template <typename InnerMatcher> +class AddressMatcher { + public: + explicit AddressMatcher(InnerMatcher m) : matcher_(m) {} + + template <typename Type> + operator Matcher<Type>() const { // NOLINT + return Matcher<Type>(new Impl<const Type&>(matcher_)); + } + + private: + // The monomorphic implementation that works for a particular object type. + template <typename Type> + class Impl : public MatcherInterface<Type> { + public: + using Address = const GTEST_REMOVE_REFERENCE_AND_CONST_(Type) *; + explicit Impl(const InnerMatcher& matcher) + : matcher_(MatcherCast<Address>(matcher)) {} + + void DescribeTo(::std::ostream* os) const override { + *os << "has address that "; + matcher_.DescribeTo(os); + } + + void DescribeNegationTo(::std::ostream* os) const override { + *os << "does not have address that "; + matcher_.DescribeTo(os); + } + + bool MatchAndExplain(Type object, + MatchResultListener* listener) const override { + *listener << "which has address "; + Address address = std::addressof(object); + return MatchPrintAndExplain(address, matcher_, listener); + } + + private: + const Matcher<Address> matcher_; + }; + const InnerMatcher matcher_; +}; + // Implements Pair(first_matcher, second_matcher) for the given argument pair // type with its two matchers. See Pair() function below. template <typename PairType> @@ -4787,6 +4830,14 @@ inline internal::PointerMatcher<InnerMatcher> Pointer( const InnerMatcher& inner_matcher) { return internal::PointerMatcher<InnerMatcher>(inner_matcher); } + +// Creates a matcher that matches an object that has an address that matches +// inner_matcher. +template <typename InnerMatcher> +inline internal::AddressMatcher<InnerMatcher> Address( + const InnerMatcher& inner_matcher) { + return internal::AddressMatcher<InnerMatcher>(inner_matcher); +} } // namespace no_adl // Returns a predicate that is satisfied by anything that matches the |

