Matchers Reference
A matcher matches a single argument. You can use it inside ON_CALL() or
EXPECT_CALL(), or use it to validate a value directly using two macros:
| Macro | Description | 
|---|---|
| EXPECT_THAT(actual_value, matcher) | Asserts that actual_valuematchesmatcher. | 
| ASSERT_THAT(actual_value, matcher) | The same as EXPECT_THAT(actual_value, matcher), except that it generates a fatal failure. | 
WARNING: Equality matching via EXPECT_THAT(actual_value, expected_value)
is supported, however note that implicit conversions can cause surprising
results. For example, EXPECT_THAT(some_bool, "some string") will compile and
may pass unintentionally.
BEST PRACTICE: Prefer to make the comparison explicit via
EXPECT_THAT(actual_value, Eq(expected_value)) or EXPECT_EQ(actual_value,
expected_value).
Built-in matchers (where argument is the function argument, e.g.
actual_value in the example above, or when used in the context of
EXPECT_CALL(mock_object, method(matchers)), the arguments of method) are
divided into several categories. All matchers are defined in the ::testing
namespace unless otherwise noted.
Wildcard
| Matcher | Description | 
|---|---|
| _ | argumentcan be any value of the correct type. | 
| A<type>()orAn<type>() | argumentcan be any value of typetype. | 
Generic Comparison
| Matcher | Description | 
|---|---|
| Eq(value)orvalue | argument == value | 
| Ge(value) | argument >= value | 
| Gt(value) | argument > value | 
| Le(value) | argument <= value | 
| Lt(value) | argument < value | 
| Ne(value) | argument != value | 
| IsFalse() | argumentevaluates tofalsein a Boolean context. | 
| DistanceFrom(target, m) | The distance between argumentandtarget(computed byabs(argument - target)) matchesm. | 
| DistanceFrom(target, get_distance, m) | The distance between argumentandtarget(computed byget_distance(argument, target)) matchesm. | 
| IsTrue() | argumentevaluates totruein a Boolean context. | 
| IsNull() | argumentis aNULLpointer (raw or smart). | 
| NotNull() | argumentis a non-null pointer (raw or smart). | 
| Optional(m) | argumentisoptional<>that contains a value matchingm. (For testing whether anoptional<>is set, check for equality withnullopt. You may need to useEq(nullopt)if the inner type doesn’t have==.) | 
| VariantWith<T>(m) | argumentisvariant<>that holds the alternative of type T with a value matchingm. | 
| AnyWith<T>(m) | argumentisany<>that holds a value of type T with a value matchingm. | 
| Ref(variable) | argumentis a reference tovariable. | 
| TypedEq<type>(value) | argumenthas typetypeand is equal tovalue. You may need to use this instead ofEq(value)when the mock function is overloaded. | 
Except Ref(), these matchers make a copy of value in case it’s modified or
destructed later. If the compiler complains that value doesn’t have a public
copy constructor, try wrap it in std::ref(), e.g.
Eq(std::ref(non_copyable_value)). If you do that, make sure
non_copyable_value is not changed afterwards, or the meaning of your matcher
will be changed.
IsTrue and IsFalse are useful when you need to use a matcher, or for types
that can be explicitly converted to Boolean, but are not implicitly converted to
Boolean. In other cases, you can use the basic
EXPECT_TRUE and EXPECT_FALSE assertions.
Floating-Point Matchers
| Matcher | Description | 
|---|---|
| DoubleEq(a_double) | argumentis adoublevalue approximately equal toa_double, treating two NaNs as unequal. | 
| FloatEq(a_float) | argumentis afloatvalue approximately equal toa_float, treating two NaNs as unequal. | 
| NanSensitiveDoubleEq(a_double) | argumentis adoublevalue approximately equal toa_double, treating two NaNs as equal. | 
| NanSensitiveFloatEq(a_float) | argumentis afloatvalue approximately equal toa_float, treating two NaNs as equal. | 
| IsNan() | argumentis any floating-point type with a NaN value. | 
The above matchers use ULP-based comparison (the same as used in googletest).
They automatically pick a reasonable error bound based on the absolute value of
the expected value. DoubleEq() and FloatEq() conform to the IEEE standard,
which requires comparing two NaNs for equality to return false. The
NanSensitive* version instead treats two NaNs as equal, which is often what a
user wants.
| Matcher | Description | 
|---|---|
| DoubleNear(a_double, max_abs_error) | argumentis adoublevalue close toa_double(absolute error <=max_abs_error), treating two NaNs as unequal. | 
| FloatNear(a_float, max_abs_error) | argumentis afloatvalue close toa_float(absolute error <=max_abs_error), treating two NaNs as unequal. | 
| NanSensitiveDoubleNear(a_double, max_abs_error) | argumentis adoublevalue close toa_double(absolute error <=max_abs_error), treating two NaNs as equal. | 
| NanSensitiveFloatNear(a_float, max_abs_error) | argumentis afloatvalue close toa_float(absolute error <=max_abs_error), treating two NaNs as equal. | 
String Matchers
The argument can be either a C string or a C++ string object:
| Matcher | Description | 
|---|---|
| ContainsRegex(string) | argumentmatches the given regular expression. | 
| EndsWith(suffix) | argumentends with stringsuffix. | 
| HasSubstr(string) | argumentcontainsstringas a sub-string. | 
| IsEmpty() | argumentis an empty string. | 
| MatchesRegex(string) | argumentmatches the given regular expression with the match starting at the first character and ending at the last character. | 
| StartsWith(prefix) | argumentstarts with stringprefix. | 
| StrCaseEq(string) | argumentis equal tostring, ignoring case. | 
| StrCaseNe(string) | argumentis not equal tostring, ignoring case. | 
| StrEq(string) | argumentis equal tostring. | 
| StrNe(string) | argumentis not equal tostring. | 
| WhenBase64Unescaped(m) | argumentis a base-64 escaped string whose unescaped string matchesm.  The web-safe format from RFC 4648 is supported. | 
ContainsRegex() and MatchesRegex() take ownership of the RE object. They
use the regular expression syntax defined
here. All of these matchers, except
ContainsRegex() and MatchesRegex() work for wide strings as well.
Exception Matchers
| Matcher | Description | 
|---|---|
| Throws<E>() | The argumentis a callable object that, when called, throws an exception of the expected typeE. | 
| Throws<E>(m) | The argumentis a callable object that, when called, throws an exception of typeEthat satisfies the matcherm. | 
| ThrowsMessage<E>(m) | The argumentis a callable object that, when called, throws an exception of typeEwith a message that satisfies the matcherm. | 
Examples:
auto argument = [] { throw std::runtime_error("error msg"); };
// Checks if the lambda throws a `std::runtime_error`.
EXPECT_THAT(argument, Throws<std::runtime_error>());
// Checks if the lambda throws a `std::runtime_error` with a specific message
// that matches "error msg".
EXPECT_THAT(argument,
            Throws<std::runtime_error>(Property(&std::runtime_error::what,
                                                Eq("error msg"))));
// Checks if the lambda throws a `std::runtime_error` with a message that
// contains "msg".
EXPECT_THAT(argument, ThrowsMessage<std::runtime_error>(HasSubstr("msg")));
Container Matchers
Most STL-style containers support ==, so you can use Eq(expected_container)
or simply expected_container to match a container exactly. If you want to
write the elements in-line, match them more flexibly, or get more informative
messages, you can use:
| Matcher | Description | 
|---|---|
| BeginEndDistanceIs(m) | argumentis a container whosebegin()andend()iterators are separated by a number of increments matchingm. E.g.BeginEndDistanceIs(2)orBeginEndDistanceIs(Lt(2)). For containers that define asize()method,SizeIs(m)may be more efficient. | 
| ContainerEq(container) | The same as Eq(container)except that the failure message also includes which elements are in one container but not the other. | 
| Contains(e) | argumentcontains an element that matchese, which can be either a value or a matcher. | 
| Contains(e).Times(n) | argumentcontains elements that matche, which can be either a value or a matcher, and the number of matches isn, which can be either a value or a matcher. Unlike the plainContainsandEachthis allows to check for arbitrary occurrences including testing for absence withContains(e).Times(0). | 
| Each(e) | argumentis a container where every element matchese, which can be either a value or a matcher. | 
| ElementsAre(e0, e1, ..., en) | argumenthasn + 1elements, where the i-th element matchesei, which can be a value or a matcher. | 
| ElementsAreArray({e0, e1, ..., en}),ElementsAreArray(a_container),ElementsAreArray(begin, end),ElementsAreArray(array), orElementsAreArray(array, count) | The same as ElementsAre()except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | 
| IsEmpty() | argumentis an empty container (container.empty()). | 
| IsSubsetOf({e0, e1, ..., en}),IsSubsetOf(a_container),IsSubsetOf(begin, end),IsSubsetOf(array), orIsSubsetOf(array, count) | argumentmatchesUnorderedElementsAre(x0, x1, ..., xk)for some subset{x0, x1, ..., xk}of the expected matchers. | 
| IsSupersetOf({e0, e1, ..., en}),IsSupersetOf(a_container),IsSupersetOf(begin, end),IsSupersetOf(array), orIsSupersetOf(array, count) | Some subset of argumentmatchesUnorderedElementsAre(expected matchers). | 
| Pointwise(m, container),Pointwise(m, {e0, e1, ..., en}) | argumentcontains the same number of elements as incontainer, and for all i, (the i-th element inargument, the i-th element incontainer) matchm, which is a matcher on 2-tuples. E.g.Pointwise(Le(), upper_bounds)verifies that each element inargumentdoesn’t exceed the corresponding element inupper_bounds. See more detail below. | 
| SizeIs(m) | argumentis a container whose size matchesm. E.g.SizeIs(2)orSizeIs(Lt(2)). | 
| UnorderedElementsAre(e0, e1, ..., en) | argumenthasn + 1elements, and under some permutation of the elements, each element matches anei(for a differenti), which can be a value or a matcher. | 
| UnorderedElementsAreArray({e0, e1, ..., en}),UnorderedElementsAreArray(a_container),UnorderedElementsAreArray(begin, end),UnorderedElementsAreArray(array), orUnorderedElementsAreArray(array, count) | The same as UnorderedElementsAre()except that the expected element values/matchers come from an initializer list, STL-style container, iterator range, or C-style array. | 
| UnorderedPointwise(m, container),UnorderedPointwise(m, {e0, e1, ..., en}) | Like Pointwise(m, container), but ignores the order of elements. | 
| WhenSorted(m) | When argumentis sorted using the<operator, it matches container matcherm. E.g.WhenSorted(ElementsAre(1, 2, 3))verifies thatargumentcontains elements 1, 2, and 3, ignoring order. | 
| WhenSortedBy(comparator, m) | The same as WhenSorted(m), except that the given comparator instead of<is used to sortargument. E.g.WhenSortedBy(std::greater(), ElementsAre(3, 2, 1)). | 
Notes:
- These matchers can also match:
    - a native array passed by reference (e.g. in Foo(const int (&a)[5])), and
- an array passed as a pointer and a count (e.g. in Bar(const T* buffer, int len)– see Multi-argument Matchers).
 
- a native array passed by reference (e.g. in 
- The array being matched may be multi-dimensional (i.e. its elements can be arrays).
- 
    minPointwise(m, ...)andUnorderedPointwise(m, ...)should be a matcher for::std::tuple<T, U>whereTandUare the element type of the actual container and the expected container, respectively. For example, to compare twoFoocontainers whereFoodoesn’t supportoperator==, one might write:MATCHER(FooEq, "") { return std::get<0>(arg).Equals(std::get<1>(arg)); } ... EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos));
Member Matchers
| Matcher | Description | 
|---|---|
| Field(&class::field, m) | argument.field(orargument->fieldwhenargumentis a plain pointer) matches matcherm, whereargumentis an object of type class. | 
| Field(field_name, &class::field, m) | The same as the two-parameter version, but provides a better error message. | 
| Key(e) | argument.firstmatchese, which can be either a value or a matcher. E.g.Contains(Key(Le(5)))can verify that amapcontains a key<= 5. | 
| Pair(m1, m2) | argumentis anstd::pairwhosefirstfield matchesm1andsecondfield matchesm2. | 
| FieldsAre(m...) | argumentis a compatible object where each field matches piecewise with the matchersm.... A compatible object is any that supports thestd::tuple_size<Obj>+get<I>(obj)protocol. In C++17 and up this also supports types compatible with structured bindings, like aggregates. | 
| Property(&class::property, m) | argument.property()(orargument->property()whenargumentis a plain pointer) matches matcherm, whereargumentis an object of type class. The methodproperty()must take no argument and be declared asconst. | 
| Property(property_name, &class::property, m) | The same as the two-parameter version, but provides a better error message. | 
Warning: Don’t use Property() against member functions that you do not own,
because taking addresses of functions is fragile and generally not part of the
contract of the function.
Notes:
- 
    You can use FieldsAre()to match any type that supports structured bindings, such asstd::tuple,std::pair,std::array, and aggregate types. For example:std::tuple<int, std::string> my_tuple{7, "hello world"}; EXPECT_THAT(my_tuple, FieldsAre(Ge(0), HasSubstr("hello"))); struct MyStruct { int value = 42; std::string greeting = "aloha"; }; MyStruct s; EXPECT_THAT(s, FieldsAre(42, "aloha"));
Matching the Result of a Function, Functor, or Callback
| Matcher | Description | 
|---|---|
| ResultOf(f, m) | f(argument)matches matcherm, wherefis a function or functor. | 
| ResultOf(result_description, f, m) | The same as the two-parameter version, but provides a better error message. | 
Pointer Matchers
| Matcher | Description | 
|---|---|
| Address(m) | the result of std::addressof(argument)matchesm. | 
| Pointee(m) | argument(either a smart pointer or a raw pointer) points to a value that matches matcherm. | 
| Pointer(m) | argument(either a smart pointer or a raw pointer) contains a pointer that matchesm.mwill match against the raw pointer regardless of the type ofargument. | 
| WhenDynamicCastTo<T>(m) | when argumentis passed throughdynamic_cast<T>(), it matches matcherm. | 
Multi-argument Matchers
Technically, all matchers match a single value. A “multi-argument” matcher is
just one that matches a tuple. The following matchers can be used to match a
tuple (x, y):
| Matcher | Description | 
|---|---|
| Eq() | x == y | 
| Ge() | x >= y | 
| Gt() | x > y | 
| Le() | x <= y | 
| Lt() | x < y | 
| Ne() | x != y | 
You can use the following selectors to pick a subset of the arguments (or reorder them) to participate in the matching:
| Matcher | Description | 
|---|---|
| AllArgs(m) | Equivalent to m. Useful as syntactic sugar in.With(AllArgs(m)). | 
| Args<N1, N2, ..., Nk>(m) | The tuple of the kselected (using 0-based indices) arguments matchesm, e.g.Args<1, 2>(Eq()). | 
Composite Matchers
You can make a matcher from one or more other matchers:
| Matcher | Description | 
|---|---|
| AllOf(m1, m2, ..., mn) | argumentmatches all of the matchersm1tomn. | 
| AllOfArray({m0, m1, ..., mn}),AllOfArray(a_container),AllOfArray(begin, end),AllOfArray(array), orAllOfArray(array, count) | The same as AllOf()except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | 
| AnyOf(m1, m2, ..., mn) | argumentmatches at least one of the matchersm1tomn. | 
| AnyOfArray({m0, m1, ..., mn}),AnyOfArray(a_container),AnyOfArray(begin, end),AnyOfArray(array), orAnyOfArray(array, count) | The same as AnyOf()except that the matchers come from an initializer list, STL-style container, iterator range, or C-style array. | 
| Not(m) | argumentdoesn’t match matcherm. | 
| Conditional(cond, m1, m2) | Matches matcher m1ifcondevaluates to true, else matchesm2. | 
Adapters for Matchers
| Matcher | Description | 
|---|---|
| MatcherCast<T>(m) | casts matcher mto typeMatcher<T>. | 
| SafeMatcherCast<T>(m) | safely casts matcher mto typeMatcher<T>. | 
| Truly(predicate) | predicate(argument)returns something considered by C++ to be true, wherepredicateis a function or functor. | 
AddressSatisfies(callback) and Truly(callback) take ownership of callback,
which must be a permanent callback.
Using Matchers as Predicates
| Matcher | Description | 
|---|---|
| Matches(m)(value) | evaluates to trueifvaluematchesm. You can useMatches(m)alone as a unary functor. | 
| ExplainMatchResult(m, value, result_listener) | evaluates to trueifvaluematchesm, explaining the result toresult_listener. | 
| Value(value, m) | evaluates to trueifvaluematchesm. | 
Defining Matchers
| Macro | Description | 
|---|---|
| MATCHER(IsEven, "") { return (arg % 2) == 0; } | Defines a matcher IsEven()to match an even number. | 
| MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; } | Defines a matcher IsDivisibleBy(n)to match a number divisible byn. | 
| MATCHER_P2(IsBetween, a, b, absl::StrCat(negation ? "isn't" : "is", " between ", PrintToString(a), " and ", PrintToString(b))) { return a <= arg && arg <= b; } | Defines a matcher IsBetween(a, b)to match a value in the range [a,b]. | 
Notes:
- The MATCHER*macros cannot be used inside a function or class.
- The matcher body must be purely functional (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters).
- You can use PrintToString(x)to convert a valuexof any type to a string.
- 
    You can use ExplainMatchResult()in a custom matcher to wrap another matcher, for example:MATCHER_P(NestedPropertyMatches, matcher, "") { return ExplainMatchResult(matcher, arg.nested().property(), result_listener); }
- 
    You can use DescribeMatcher<>to describe another matcher. For example:MATCHER_P(XAndYThat, matcher, "X that " + DescribeMatcher<int>(matcher, negation) + (negation ? " or" : " and") + " Y that " + DescribeMatcher<double>(matcher, negation)) { return ExplainMatchResult(matcher, arg.x(), result_listener) && ExplainMatchResult(matcher, arg.y(), result_listener); }