Googletest export
Introduce a new `Address` matcher to gmock. PiperOrigin-RevId: 346344591
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user