Unverified Commit 990bf4ff by Gennadiy Civil Committed by GitHub

Merge branch 'master' into fix-gmock-pkgconfig

parents 79875d32 3787a483
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
## Mocking a Normal Class ## ## Mocking a Normal Class ##
Given Given
``` ```cpp
class Foo { class Foo {
... ...
virtual ~Foo(); virtual ~Foo();
...@@ -16,7 +16,7 @@ class Foo { ...@@ -16,7 +16,7 @@ class Foo {
}; };
``` ```
(note that `~Foo()` **must** be virtual) we can define its mock as (note that `~Foo()` **must** be virtual) we can define its mock as
``` ```cpp
#include "gmock/gmock.h" #include "gmock/gmock.h"
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -29,7 +29,7 @@ class MockFoo : public Foo { ...@@ -29,7 +29,7 @@ class MockFoo : public Foo {
To create a "nice" mock object which ignores all uninteresting calls, To create a "nice" mock object which ignores all uninteresting calls,
or a "strict" mock object, which treats them as failures: or a "strict" mock object, which treats them as failures:
``` ```cpp
NiceMock<MockFoo> nice_foo; // The type is a subclass of MockFoo. NiceMock<MockFoo> nice_foo; // The type is a subclass of MockFoo.
StrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo. StrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo.
``` ```
...@@ -37,7 +37,7 @@ StrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo. ...@@ -37,7 +37,7 @@ StrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo.
## Mocking a Class Template ## ## Mocking a Class Template ##
To mock To mock
``` ```cpp
template <typename Elem> template <typename Elem>
class StackInterface { class StackInterface {
public: public:
...@@ -48,7 +48,7 @@ class StackInterface { ...@@ -48,7 +48,7 @@ class StackInterface {
}; };
``` ```
(note that `~StackInterface()` **must** be virtual) just append `_T` to the `MOCK_*` macros: (note that `~StackInterface()` **must** be virtual) just append `_T` to the `MOCK_*` macros:
``` ```cpp
template <typename Elem> template <typename Elem>
class MockStack : public StackInterface<Elem> { class MockStack : public StackInterface<Elem> {
public: public:
...@@ -64,7 +64,7 @@ If your mock function doesn't use the default calling convention, you ...@@ -64,7 +64,7 @@ If your mock function doesn't use the default calling convention, you
can specify it by appending `_WITH_CALLTYPE` to any of the macros can specify it by appending `_WITH_CALLTYPE` to any of the macros
described in the previous two sections and supplying the calling described in the previous two sections and supplying the calling
convention as the first argument to the macro. For example, convention as the first argument to the macro. For example,
``` ```cpp
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int n)); MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int n));
MOCK_CONST_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, Bar, int(double x, double y)); MOCK_CONST_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, Bar, int(double x, double y));
``` ```
...@@ -81,7 +81,7 @@ The typical flow is: ...@@ -81,7 +81,7 @@ The typical flow is:
1. When a mock objects is destructed, Google Mock automatically verifies that all expectations on it have been satisfied. 1. When a mock objects is destructed, Google Mock automatically verifies that all expectations on it have been satisfied.
Here is an example: Here is an example:
``` ```cpp
using ::testing::Return; // #1 using ::testing::Return; // #1
TEST(BarTest, DoesThis) { TEST(BarTest, DoesThis) {
...@@ -106,7 +106,7 @@ Google Mock has a **built-in default action** for any function that ...@@ -106,7 +106,7 @@ Google Mock has a **built-in default action** for any function that
returns `void`, `bool`, a numeric value, or a pointer. returns `void`, `bool`, a numeric value, or a pointer.
To customize the default action for functions with return type `T` globally: To customize the default action for functions with return type `T` globally:
``` ```cpp
using ::testing::DefaultValue; using ::testing::DefaultValue;
// Sets the default value to be returned. T must be CopyConstructible. // Sets the default value to be returned. T must be CopyConstructible.
...@@ -120,7 +120,7 @@ DefaultValue<T>::Clear(); ...@@ -120,7 +120,7 @@ DefaultValue<T>::Clear();
``` ```
To customize the default action for a particular method, use `ON_CALL()`: To customize the default action for a particular method, use `ON_CALL()`:
``` ```cpp
ON_CALL(mock_object, method(matchers)) ON_CALL(mock_object, method(matchers))
.With(multi_argument_matcher) ? .With(multi_argument_matcher) ?
.WillByDefault(action); .WillByDefault(action);
...@@ -130,7 +130,7 @@ ON_CALL(mock_object, method(matchers)) ...@@ -130,7 +130,7 @@ ON_CALL(mock_object, method(matchers))
`EXPECT_CALL()` sets **expectations** on a mock method (How will it be `EXPECT_CALL()` sets **expectations** on a mock method (How will it be
called? What will it do?): called? What will it do?):
``` ```cpp
EXPECT_CALL(mock_object, method(matchers)) EXPECT_CALL(mock_object, method(matchers))
.With(multi_argument_matcher) ? .With(multi_argument_matcher) ?
.Times(cardinality) ? .Times(cardinality) ?
...@@ -155,22 +155,25 @@ A **matcher** matches a _single_ argument. You can use it inside ...@@ -155,22 +155,25 @@ A **matcher** matches a _single_ argument. You can use it inside
`ON_CALL()` or `EXPECT_CALL()`, or use it to validate a value `ON_CALL()` or `EXPECT_CALL()`, or use it to validate a value
directly: directly:
| Matcher | Description |
|:--------|:------------|
| `EXPECT_THAT(value, matcher)` | Asserts that `value` matches `matcher`. | | `EXPECT_THAT(value, matcher)` | Asserts that `value` matches `matcher`. |
|:------------------------------|:----------------------------------------|
| `ASSERT_THAT(value, matcher)` | The same as `EXPECT_THAT(value, matcher)`, except that it generates a **fatal** failure. | | `ASSERT_THAT(value, matcher)` | The same as `EXPECT_THAT(value, matcher)`, except that it generates a **fatal** failure. |
Built-in matchers (where `argument` is the function argument) are Built-in matchers (where `argument` is the function argument) are
divided into several categories: divided into several categories:
## Wildcard ## ## Wildcard ##
| Matcher | Description |
|:--------|:------------|
|`_`|`argument` can be any value of the correct type.| |`_`|`argument` can be any value of the correct type.|
|:--|:-----------------------------------------------|
|`A<type>()` or `An<type>()`|`argument` can be any value of type `type`. | |`A<type>()` or `An<type>()`|`argument` can be any value of type `type`. |
## Generic Comparison ## ## Generic Comparison ##
|`Eq(value)` or `value`|`argument == value`| | Matcher | Description |
|:---------------------|:------------------| |:---------------------|:------------------|
|`Eq(value)` or `value`|`argument == value`|
|`Ge(value)` |`argument >= value`| |`Ge(value)` |`argument >= value`|
|`Gt(value)` |`argument > value` | |`Gt(value)` |`argument > value` |
|`Le(value)` |`argument <= value`| |`Le(value)` |`argument <= value`|
...@@ -178,8 +181,7 @@ divided into several categories: ...@@ -178,8 +181,7 @@ divided into several categories:
|`Ne(value)` |`argument != value`| |`Ne(value)` |`argument != value`|
|`IsNull()` |`argument` is a `NULL` pointer (raw or smart).| |`IsNull()` |`argument` is a `NULL` pointer (raw or smart).|
|`NotNull()` |`argument` is a non-null pointer (raw or smart).| |`NotNull()` |`argument` is a non-null pointer (raw or smart).|
|`VariantWith<T>(m)` |`argument` is `variant<>` that holds the alternative of |`VariantWith<T>(m)` |`argument` is `variant<>` that holds the alternative of type T with a value matching `m`.|
type T with a value matching `m`.|
|`Ref(variable)` |`argument` is a reference to `variable`.| |`Ref(variable)` |`argument` is a reference to `variable`.|
|`TypedEq<type>(value)`|`argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded.| |`TypedEq<type>(value)`|`argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded.|
...@@ -192,8 +194,9 @@ matcher will be changed. ...@@ -192,8 +194,9 @@ matcher will be changed.
## Floating-Point Matchers ## ## Floating-Point Matchers ##
|`DoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal.| | Matcher | Description |
|:-------------------|:----------------------------------------------------------------------------------------------| |:-------------------|:---------------------------------------------------------------------------------------------------------|
|`DoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal. |
|`FloatEq(a_float)` |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. | |`FloatEq(a_float)` |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. |
|`NanSensitiveDoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. | |`NanSensitiveDoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. |
|`NanSensitiveFloatEq(a_float)`|`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. | |`NanSensitiveFloatEq(a_float)`|`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. |
...@@ -206,18 +209,20 @@ the IEEE standard, which requires comparing two NaNs for equality to ...@@ -206,18 +209,20 @@ the IEEE standard, which requires comparing two NaNs for equality to
return false. The `NanSensitive*` version instead treats two NaNs as return false. The `NanSensitive*` version instead treats two NaNs as
equal, which is often what a user wants. equal, which is often what a user wants.
| Matcher | Description |
|:--------|:------------|
|`DoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal.| |`DoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal.|
|:------------------------------------|:--------------------------------------------------------------------------------------------------------------------| |`FloatNear(a_float, max_abs_error)`|`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal.|
|`FloatNear(a_float, max_abs_error)` |`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | |`NanSensitiveDoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal.|
|`NanSensitiveDoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal. | |`NanSensitiveFloatNear(a_float, max_abs_error)`|`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal.|
|`NanSensitiveFloatNear(a_float, max_abs_error)`|`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal. |
## String Matchers ## ## String Matchers ##
The `argument` can be either a C string or a C++ string object: The `argument` can be either a C string or a C++ string object:
|`ContainsRegex(string)`|`argument` matches the given regular expression.| | Matcher | Description |
|:----------------------|:-----------------------------------------------| |:----------------------|:--------------------------------------------------|
|`ContainsRegex(string)`|`argument` matches the given regular expression. |
|`EndsWith(suffix)` |`argument` ends with string `suffix`. | |`EndsWith(suffix)` |`argument` ends with string `suffix`. |
|`HasSubstr(string)` |`argument` contains `string` as a sub-string. | |`HasSubstr(string)` |`argument` contains `string` as a sub-string. |
|`MatchesRegex(string)` |`argument` matches the given regular expression with the match starting at the first character and ending at the last character.| |`MatchesRegex(string)` |`argument` matches the given regular expression with the match starting at the first character and ending at the last character.|
...@@ -240,8 +245,9 @@ Most STL-style containers support `==`, so you can use ...@@ -240,8 +245,9 @@ Most STL-style containers support `==`, so you can use
container exactly. If you want to write the elements in-line, container exactly. If you want to write the elements in-line,
match them more flexibly, or get more informative messages, you can use: match them more flexibly, or get more informative messages, you can use:
| Matcher | Description |
|:--------|:------------|
| `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. | | `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)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. | | `Contains(e)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. |
| `Each(e)` | `argument` is a container where _every_ element matches `e`, which can be either a value or a matcher. | | `Each(e)` | `argument` is a container where _every_ element matches `e`, which can be either a value or a matcher. |
| `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the i-th element matches `ei`, which can be a value or a matcher. 0 to 10 arguments are allowed. | | `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the i-th element matches `ei`, which can be a value or a matcher. 0 to 10 arguments are allowed. |
...@@ -262,7 +268,7 @@ Notes: ...@@ -262,7 +268,7 @@ Notes:
* The array being matched may be multi-dimensional (i.e. its elements can be arrays). * The array being matched may be multi-dimensional (i.e. its elements can be arrays).
* `m` in `Pointwise(m, ...)` should be a matcher for `::testing::tuple<T, U>` where `T` and `U` are the element type of the actual container and the expected container, respectively. For example, to compare two `Foo` containers where `Foo` doesn't support `operator==` but has an `Equals()` method, one might write: * `m` in `Pointwise(m, ...)` should be a matcher for `::testing::tuple<T, U>` where `T` and `U` are the element type of the actual container and the expected container, respectively. For example, to compare two `Foo` containers where `Foo` doesn't support `operator==` but has an `Equals()` method, one might write:
``` ```cpp
using ::testing::get; using ::testing::get;
MATCHER(FooEq, "") { MATCHER(FooEq, "") {
return get<0>(arg).Equals(get<1>(arg)); return get<0>(arg).Equals(get<1>(arg));
...@@ -273,21 +279,24 @@ EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos)); ...@@ -273,21 +279,24 @@ EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos));
## Member Matchers ## ## Member Matchers ##
| Matcher | Description |
|:--------|:------------|
|`Field(&class::field, m)`|`argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.| |`Field(&class::field, m)`|`argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.|
|:------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------| |`Key(e)`|`argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`.|
|`Key(e)` |`argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`.| |`Pair(m1, m2)`|`argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`.|
|`Pair(m1, m2)` |`argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`. |
|`Property(&class::property, m)`|`argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.| |`Property(&class::property, m)`|`argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.|
## Matching the Result of a Function or Functor ## ## Matching the Result of a Function or Functor ##
|`ResultOf(f, m)`|`f(argument)` matches matcher `m`, where `f` is a function or functor.| | Matcher | Description |
|:---------------|:---------------------------------------------------------------------| |:---------------|:---------------------------------------------------------------------|
|`ResultOf(f, m)`|`f(argument)` matches matcher `m`, where `f` is a function or functor.|
## Pointer Matchers ## ## Pointer Matchers ##
|`Pointee(m)`|`argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`.| | Matcher | Description |
|:-----------|:-----------------------------------------------------------------------------------------------| |:------------------------|:-----------------------------------------------------------------------------------------------|
|`Pointee(m)` |`argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`.|
|`WhenDynamicCastTo<T>(m)`| when `argument` is passed through `dynamic_cast<T>()`, it matches matcher `m`. | |`WhenDynamicCastTo<T>(m)`| when `argument` is passed through `dynamic_cast<T>()`, it matches matcher `m`. |
## Multiargument Matchers ## ## Multiargument Matchers ##
...@@ -296,8 +305,9 @@ Technically, all matchers match a _single_ value. A "multi-argument" ...@@ -296,8 +305,9 @@ Technically, all matchers match a _single_ value. A "multi-argument"
matcher is just one that matches a _tuple_. The following matchers can matcher is just one that matches a _tuple_. The following matchers can
be used to match a tuple `(x, y)`: be used to match a tuple `(x, y)`:
| Matcher | Description |
|:--------|:------------|
|`Eq()`|`x == y`| |`Eq()`|`x == y`|
|:-----|:-------|
|`Ge()`|`x >= y`| |`Ge()`|`x >= y`|
|`Gt()`|`x > y` | |`Gt()`|`x > y` |
|`Le()`|`x <= y`| |`Le()`|`x <= y`|
...@@ -307,37 +317,42 @@ be used to match a tuple `(x, y)`: ...@@ -307,37 +317,42 @@ be used to match a tuple `(x, y)`:
You can use the following selectors to pick a subset of the arguments You can use the following selectors to pick a subset of the arguments
(or reorder them) to participate in the matching: (or reorder them) to participate in the matching:
| Matcher | Description |
|:--------|:------------|
|`AllArgs(m)`|Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`.| |`AllArgs(m)`|Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`.|
|:-----------|:-------------------------------------------------------------------|
|`Args<N1, N2, ..., Nk>(m)`|The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`.| |`Args<N1, N2, ..., Nk>(m)`|The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`.|
## Composite Matchers ## ## Composite Matchers ##
You can make a matcher from one or more other matchers: You can make a matcher from one or more other matchers:
|`AllOf(m1, m2, ..., mn)`|`argument` matches all of the matchers `m1` to `mn`.| | Matcher | Description |
|:-----------------------|:---------------------------------------------------| |:-----------------------|:------------------------------------------------------------|
|`AllOf(m1, m2, ..., mn)`|`argument` matches all of the matchers `m1` to `mn`. |
|`AnyOf(m1, m2, ..., mn)`|`argument` matches at least one of the matchers `m1` to `mn`.| |`AnyOf(m1, m2, ..., mn)`|`argument` matches at least one of the matchers `m1` to `mn`.|
|`Not(m)` |`argument` doesn't match matcher `m`. | |`Not(m)` |`argument` doesn't match matcher `m`. |
## Adapters for Matchers ## ## Adapters for Matchers ##
| Matcher | Description |
|:--------|:------------|
|`MatcherCast<T>(m)`|casts matcher `m` to type `Matcher<T>`.| |`MatcherCast<T>(m)`|casts matcher `m` to type `Matcher<T>`.|
|:------------------|:--------------------------------------| |`SafeMatcherCast<T>(m)`| [safely casts](CookBook.md#casting-matchers) matcher `m` to type `Matcher<T>`.|
|`SafeMatcherCast<T>(m)`| [safely casts](CookBook.md#casting-matchers) matcher `m` to type `Matcher<T>`. | |`Truly(predicate)`|`predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor.|
|`Truly(predicate)` |`predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor.|
## Matchers as Predicates ## ## Matchers as Predicates ##
| Matcher | Description |
|:--------|:------------|
|`Matches(m)(value)`|evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor.| |`Matches(m)(value)`|evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor.|
|:------------------|:---------------------------------------------------------------------------------------------| |`ExplainMatchResult(m, value, result_listener)`|evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`.|
|`ExplainMatchResult(m, value, result_listener)`|evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`. | |`Value(value, m)`|evaluates to `true` if `value` matches `m`.|
|`Value(value, m)` |evaluates to `true` if `value` matches `m`. |
## Defining Matchers ## ## Defining Matchers ##
| Matcher | Description |
|:--------|:------------|
| `MATCHER(IsEven, "") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. | | `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 macher `IsDivisibleBy(n)` to match a number divisible by `n`. | | `MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; }` | Defines a macher `IsDivisibleBy(n)` to match a number divisible by `n`. |
| `MATCHER_P2(IsBetween, a, b, std::string(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`]. | | `MATCHER_P2(IsBetween, a, b, std::string(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`]. |
...@@ -349,9 +364,10 @@ You can make a matcher from one or more other matchers: ...@@ -349,9 +364,10 @@ You can make a matcher from one or more other matchers:
## Matchers as Test Assertions ## ## Matchers as Test Assertions ##
| Matcher | Description |
|:--------|:------------|
|`ASSERT_THAT(expression, m)`|Generates a [fatal failure](../../googletest/docs/primer.md#assertions) if the value of `expression` doesn't match matcher `m`.| |`ASSERT_THAT(expression, m)`|Generates a [fatal failure](../../googletest/docs/primer.md#assertions) if the value of `expression` doesn't match matcher `m`.|
|:---------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------| |`EXPECT_THAT(expression, m)`|Generates a non-fatal failure if the value of `expression` doesn't match matcher `m`.|
|`EXPECT_THAT(expression, m)`|Generates a non-fatal failure if the value of `expression` doesn't match matcher `m`. |
# Actions # # Actions #
...@@ -359,66 +375,71 @@ You can make a matcher from one or more other matchers: ...@@ -359,66 +375,71 @@ You can make a matcher from one or more other matchers:
## Returning a Value ## ## Returning a Value ##
| Matcher | Description |
|:--------|:------------|
|`Return()`|Return from a `void` mock function.| |`Return()`|Return from a `void` mock function.|
|:---------|:----------------------------------|
|`Return(value)`|Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type <i>at the time the expectation is set</i>, not when the action is executed.| |`Return(value)`|Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type <i>at the time the expectation is set</i>, not when the action is executed.|
|`ReturnArg<N>()`|Return the `N`-th (0-based) argument.| |`ReturnArg<N>()`|Return the `N`-th (0-based) argument.|
|`ReturnNew<T>(a1, ..., ak)`|Return `new T(a1, ..., ak)`; a different object is created each time.| |`ReturnNew<T>(a1, ..., ak)`|Return `new T(a1, ..., ak)`; a different object is created each time.|
|`ReturnNull()`|Return a null pointer. | |`ReturnNull()`|Return a null pointer.|
|`ReturnPointee(ptr)`|Return the value pointed to by `ptr`.| |`ReturnPointee(ptr)`|Return the value pointed to by `ptr`.|
|`ReturnRef(variable)`|Return a reference to `variable`. | |`ReturnRef(variable)`|Return a reference to `variable`.|
|`ReturnRefOfCopy(value)`|Return a reference to a copy of `value`; the copy lives as long as the action.| |`ReturnRefOfCopy(value)`|Return a reference to a copy of `value`; the copy lives as long as the action.|
## Side Effects ## ## Side Effects ##
| Matcher | Description |
|:--------|:------------|
|`Assign(&variable, value)`|Assign `value` to variable.| |`Assign(&variable, value)`|Assign `value` to variable.|
|:-------------------------|:--------------------------| |`DeleteArg<N>()`| Delete the `N`-th (0-based) argument, which must be a pointer.|
| `DeleteArg<N>()` | Delete the `N`-th (0-based) argument, which must be a pointer. | |`SaveArg<N>(pointer)`| Save the `N`-th (0-based) argument to `*pointer`.|
| `SaveArg<N>(pointer)` | Save the `N`-th (0-based) argument to `*pointer`. | |`SaveArgPointee<N>(pointer)`| Save the value pointed to by the `N`-th (0-based) argument to `*pointer`.|
| `SaveArgPointee<N>(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. | |`SetArgReferee<N>(value)` | Assign value to the variable referenced by the `N`-th (0-based) argument. |
| `SetArgReferee<N>(value)` | Assign value to the variable referenced by the `N`-th (0-based) argument. |
|`SetArgPointee<N>(value)` |Assign `value` to the variable pointed by the `N`-th (0-based) argument.| |`SetArgPointee<N>(value)` |Assign `value` to the variable pointed by the `N`-th (0-based) argument.|
|`SetArgumentPointee<N>(value)`|Same as `SetArgPointee<N>(value)`. Deprecated. Will be removed in v1.7.0.| |`SetArgumentPointee<N>(value)`|Same as `SetArgPointee<N>(value)`. Deprecated. Will be removed in v1.7.0.|
|`SetArrayArgument<N>(first, last)`|Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range.| |`SetArrayArgument<N>(first, last)`|Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range.|
|`SetErrnoAndReturn(error, value)`|Set `errno` to `error` and return `value`.| |`SetErrnoAndReturn(error, value)`|Set `errno` to `error` and return `value`.|
|`Throw(exception)` |Throws the given exception, which can be any copyable value. Available since v1.1.0.| |`Throw(exception)`|Throws the given exception, which can be any copyable value. Available since v1.1.0.|
## Using a Function or a Functor as an Action ## ## Using a Function or a Functor as an Action ##
| Matcher | Description |
|:--------|:------------|
|`Invoke(f)`|Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor.| |`Invoke(f)`|Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor.|
|:----------|:-----------------------------------------------------------------------------------------------------------------| |`Invoke(object_pointer, &class::method)`|Invoke the {method on the object with the arguments passed to the mock function.|
|`Invoke(object_pointer, &class::method)`|Invoke the {method on the object with the arguments passed to the mock function. | |`InvokeWithoutArgs(f)`|Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments.|
|`InvokeWithoutArgs(f)`|Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments. | |`InvokeWithoutArgs(object_pointer, &class::method)`|Invoke the method on the object, which takes no arguments.|
|`InvokeWithoutArgs(object_pointer, &class::method)`|Invoke the method on the object, which takes no arguments. |
|`InvokeArgument<N>(arg1, arg2, ..., argk)`|Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments.| |`InvokeArgument<N>(arg1, arg2, ..., argk)`|Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments.|
The return value of the invoked function is used as the return value The return value of the invoked function is used as the return value
of the action. of the action.
When defining a function or functor to be used with `Invoke*()`, you can declare any unused parameters as `Unused`: When defining a function or functor to be used with `Invoke*()`, you can declare any unused parameters as `Unused`:
``` ```cpp
double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); } double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); }
... ...
EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance)); EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance));
``` ```
In `InvokeArgument<N>(...)`, if an argument needs to be passed by reference, wrap it inside `ByRef()`. For example, In `InvokeArgument<N>(...)`, if an argument needs to be passed by reference, wrap it inside `ByRef()`. For example,
``` ```cpp
InvokeArgument<2>(5, string("Hi"), ByRef(foo)) InvokeArgument<2>(5, string("Hi"), ByRef(foo))
``` ```
calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by value, and `foo` by reference. calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by value, and `foo` by reference.
## Default Action ## ## Default Action ##
| Matcher | Description |
|:--------|:------------|
|`DoDefault()`|Do the default action (specified by `ON_CALL()` or the built-in one).| |`DoDefault()`|Do the default action (specified by `ON_CALL()` or the built-in one).|
|:------------|:--------------------------------------------------------------------|
**Note:** due to technical reasons, `DoDefault()` cannot be used inside a composite action - trying to do so will result in a run-time error. **Note:** due to technical reasons, `DoDefault()` cannot be used inside a composite action - trying to do so will result in a run-time error.
## Composite Actions ## ## Composite Actions ##
|`DoAll(a1, a2, ..., an)`|Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. | | Matcher | Description |
|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------| |:-----------------------------|:-----------------------------------------------------------------------------------------------------------------------------|
|`DoAll(a1, a2, ..., an)` |Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. |
|`IgnoreResult(a)` |Perform action `a` and ignore its result. `a` must not return void. | |`IgnoreResult(a)` |Perform action `a` and ignore its result. `a` must not return void. |
|`WithArg<N>(a)` |Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. | |`WithArg<N>(a)` |Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. |
|`WithArgs<N1, N2, ..., Nk>(a)`|Pass the selected (0-based) arguments of the mock function to action `a` and perform it. | |`WithArgs<N1, N2, ..., Nk>(a)`|Pass the selected (0-based) arguments of the mock function to action `a` and perform it. |
...@@ -426,8 +447,9 @@ calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by v ...@@ -426,8 +447,9 @@ calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by v
## Defining Actions ## ## Defining Actions ##
| Matcher | Description |
|:----------------------------------------------|:------------------------------------------------------------------------------------------|
| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. | | `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. |
|:--------------------------------------|:---------------------------------------------------------------------------------------|
| `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. | | `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. |
| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. | | `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. |
...@@ -437,10 +459,11 @@ The `ACTION*` macros cannot be used inside a function or class. ...@@ -437,10 +459,11 @@ The `ACTION*` macros cannot be used inside a function or class.
These are used in `Times()` to specify how many times a mock function will be called: These are used in `Times()` to specify how many times a mock function will be called:
| Matcher | Description |
|:--------|:------------|
|`AnyNumber()`|The function can be called any number of times.| |`AnyNumber()`|The function can be called any number of times.|
|:------------|:----------------------------------------------| |`AtLeast(n)`|The call is expected at least `n` times.|
|`AtLeast(n)` |The call is expected at least `n` times. | |`AtMost(n)`|The call is expected at most `n` times.|
|`AtMost(n)` |The call is expected at most `n` times. |
|`Between(m, n)`|The call is expected between `m` and `n` (inclusive) times.| |`Between(m, n)`|The call is expected between `m` and `n` (inclusive) times.|
|`Exactly(n) or n`|The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0.| |`Exactly(n) or n`|The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0.|
...@@ -453,7 +476,7 @@ together. ...@@ -453,7 +476,7 @@ together.
## The After Clause ## ## The After Clause ##
``` ```cpp
using ::testing::Expectation; using ::testing::Expectation;
... ...
Expectation init_x = EXPECT_CALL(foo, InitX()); Expectation init_x = EXPECT_CALL(foo, InitX());
...@@ -467,7 +490,7 @@ says that `Bar()` can be called only after both `InitX()` and ...@@ -467,7 +490,7 @@ says that `Bar()` can be called only after both `InitX()` and
If you don't know how many pre-requisites an expectation has when you If you don't know how many pre-requisites an expectation has when you
write it, you can use an `ExpectationSet` to collect them: write it, you can use an `ExpectationSet` to collect them:
``` ```cpp
using ::testing::ExpectationSet; using ::testing::ExpectationSet;
... ...
ExpectationSet all_inits; ExpectationSet all_inits;
...@@ -492,7 +515,7 @@ each expectation in the chain a different name. <i>All expected<br> ...@@ -492,7 +515,7 @@ each expectation in the chain a different name. <i>All expected<br>
calls</i> in the same sequence must occur in the order they are calls</i> in the same sequence must occur in the order they are
specified. specified.
``` ```cpp
using ::testing::Sequence; using ::testing::Sequence;
Sequence s1, s2; Sequence s1, s2;
... ...
...@@ -510,7 +533,7 @@ says that `Reset()` must be called before _both_ `GetSize()` _and_ ...@@ -510,7 +533,7 @@ says that `Reset()` must be called before _both_ `GetSize()` _and_
`Describe()`, and the latter two can occur in any order. `Describe()`, and the latter two can occur in any order.
To put many expectations in a sequence conveniently: To put many expectations in a sequence conveniently:
``` ```cpp
using ::testing::InSequence; using ::testing::InSequence;
{ {
InSequence dummy; InSequence dummy;
...@@ -527,7 +550,7 @@ strict order. The name `dummy` is irrelevant.) ...@@ -527,7 +550,7 @@ strict order. The name `dummy` is irrelevant.)
# Verifying and Resetting a Mock # # Verifying and Resetting a Mock #
Google Mock will verify the expectations on a mock object when it is destructed, or you can do it earlier: Google Mock will verify the expectations on a mock object when it is destructed, or you can do it earlier:
``` ```cpp
using ::testing::Mock; using ::testing::Mock;
... ...
// Verifies and removes the expectations on mock_obj; // Verifies and removes the expectations on mock_obj;
...@@ -542,14 +565,14 @@ Mock::VerifyAndClear(&mock_obj); ...@@ -542,14 +565,14 @@ Mock::VerifyAndClear(&mock_obj);
You can also tell Google Mock that a mock object can be leaked and doesn't You can also tell Google Mock that a mock object can be leaked and doesn't
need to be verified: need to be verified:
``` ```cpp
Mock::AllowLeak(&mock_obj); Mock::AllowLeak(&mock_obj);
``` ```
# Mock Classes # # Mock Classes #
Google Mock defines a convenient mock class template Google Mock defines a convenient mock class template
``` ```cpp
class MockFunction<R(A1, ..., An)> { class MockFunction<R(A1, ..., An)> {
public: public:
MOCK_METHODn(Call, R(A1, ..., An)); MOCK_METHODn(Call, R(A1, ..., An));
...@@ -559,6 +582,7 @@ See this [recipe](CookBook.md#using-check-points) for one application of it. ...@@ -559,6 +582,7 @@ See this [recipe](CookBook.md#using-check-points) for one application of it.
# Flags # # Flags #
| Flag | Description |
|:--------|:------------|
| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | | `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. |
|:-------------------------------|:----------------------------------------------|
| `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | | `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. |
...@@ -22,7 +22,7 @@ from outside of the mock class. (Yes, C++ allows a subclass to specify ...@@ -22,7 +22,7 @@ from outside of the mock class. (Yes, C++ allows a subclass to specify
a different access level than the base class on a virtual function.) a different access level than the base class on a virtual function.)
Example: Example:
``` ```cpp
class Foo { class Foo {
public: public:
... ...
...@@ -51,7 +51,7 @@ class MockFoo : public Foo { ...@@ -51,7 +51,7 @@ class MockFoo : public Foo {
You can mock overloaded functions as usual. No special attention is required: You can mock overloaded functions as usual. No special attention is required:
``` ```cpp
class Foo { class Foo {
... ...
...@@ -81,7 +81,7 @@ class MockFoo : public Foo { ...@@ -81,7 +81,7 @@ class MockFoo : public Foo {
compiler will give you a warning about some methods in the base class compiler will give you a warning about some methods in the base class
being hidden. To fix that, use `using` to bring them in scope: being hidden. To fix that, use `using` to bring them in scope:
``` ```cpp
class MockFoo : public Foo { class MockFoo : public Foo {
... ...
using Foo::Add; using Foo::Add;
...@@ -95,7 +95,7 @@ class MockFoo : public Foo { ...@@ -95,7 +95,7 @@ class MockFoo : public Foo {
To mock a class template, append `_T` to the `MOCK_*` macros: To mock a class template, append `_T` to the `MOCK_*` macros:
``` ```cpp
template <typename Elem> template <typename Elem>
class StackInterface { class StackInterface {
... ...
...@@ -124,7 +124,7 @@ class, your mock class will be _unrelated_ to the real class, but ...@@ -124,7 +124,7 @@ class, your mock class will be _unrelated_ to the real class, but
contain methods with the same signatures. The syntax for mocking contain methods with the same signatures. The syntax for mocking
non-virtual methods is the _same_ as mocking virtual methods: non-virtual methods is the _same_ as mocking virtual methods:
``` ```cpp
// A simple packet stream class. None of its members is virtual. // A simple packet stream class. None of its members is virtual.
class ConcretePacketStream { class ConcretePacketStream {
public: public:
...@@ -160,7 +160,7 @@ instantiate your template with `ConcretePacketStream` as the type ...@@ -160,7 +160,7 @@ instantiate your template with `ConcretePacketStream` as the type
argument. In tests, you will instantiate the same template with argument. In tests, you will instantiate the same template with
`MockPacketStream`. For example, you may write: `MockPacketStream`. For example, you may write:
``` ```cpp
template <class PacketStream> template <class PacketStream>
void CreateConnection(PacketStream* stream) { ... } void CreateConnection(PacketStream* stream) { ... }
...@@ -176,7 +176,7 @@ Then you can use `CreateConnection<ConcretePacketStream>()` and ...@@ -176,7 +176,7 @@ Then you can use `CreateConnection<ConcretePacketStream>()` and
`CreateConnection<MockPacketStream>()` and `CreateConnection<MockPacketStream>()` and
`PacketReader<MockPacketStream>` in tests. `PacketReader<MockPacketStream>` in tests.
``` ```cpp
MockPacketStream mock_stream; MockPacketStream mock_stream;
EXPECT_CALL(mock_stream, ...)...; EXPECT_CALL(mock_stream, ...)...;
.. set more expectations on mock_stream ... .. set more expectations on mock_stream ...
...@@ -194,7 +194,7 @@ Instead of calling a free function (say, `OpenFile`) directly, ...@@ -194,7 +194,7 @@ Instead of calling a free function (say, `OpenFile`) directly,
introduce an interface for it and have a concrete subclass that calls introduce an interface for it and have a concrete subclass that calls
the free function: the free function:
``` ```cpp
class FileInterface { class FileInterface {
public: public:
... ...
...@@ -236,7 +236,7 @@ per-mock-object basis. ...@@ -236,7 +236,7 @@ per-mock-object basis.
Suppose your test uses a mock class `MockFoo`: Suppose your test uses a mock class `MockFoo`:
``` ```cpp
TEST(...) { TEST(...) {
MockFoo mock_foo; MockFoo mock_foo;
EXPECT_CALL(mock_foo, DoThis()); EXPECT_CALL(mock_foo, DoThis());
...@@ -249,7 +249,7 @@ reported by Google Mock as a warning. However, if you rewrite your ...@@ -249,7 +249,7 @@ reported by Google Mock as a warning. However, if you rewrite your
test to use `NiceMock<MockFoo>` instead, the warning will be gone, test to use `NiceMock<MockFoo>` instead, the warning will be gone,
resulting in a cleaner test output: resulting in a cleaner test output:
``` ```cpp
using ::testing::NiceMock; using ::testing::NiceMock;
TEST(...) { TEST(...) {
...@@ -265,7 +265,7 @@ wherever `MockFoo` is accepted. ...@@ -265,7 +265,7 @@ wherever `MockFoo` is accepted.
It also works if `MockFoo`'s constructor takes some arguments, as It also works if `MockFoo`'s constructor takes some arguments, as
`NiceMock<MockFoo>` "inherits" `MockFoo`'s constructors: `NiceMock<MockFoo>` "inherits" `MockFoo`'s constructors:
``` ```cpp
using ::testing::NiceMock; using ::testing::NiceMock;
TEST(...) { TEST(...) {
...@@ -278,7 +278,7 @@ TEST(...) { ...@@ -278,7 +278,7 @@ TEST(...) {
The usage of `StrictMock` is similar, except that it makes all The usage of `StrictMock` is similar, except that it makes all
uninteresting calls failures: uninteresting calls failures:
``` ```cpp
using ::testing::StrictMock; using ::testing::StrictMock;
TEST(...) { TEST(...) {
...@@ -305,7 +305,7 @@ Finally, you should be **very cautious** about when to use naggy or strict mocks ...@@ -305,7 +305,7 @@ Finally, you should be **very cautious** about when to use naggy or strict mocks
Sometimes a method has a long list of arguments that is mostly Sometimes a method has a long list of arguments that is mostly
uninteresting. For example, uninteresting. For example,
``` ```cpp
class LogSink { class LogSink {
public: public:
... ...
...@@ -324,7 +324,7 @@ it, which is often infeasible. ...@@ -324,7 +324,7 @@ it, which is often infeasible.
The trick is to re-dispatch the method in the mock class: The trick is to re-dispatch the method in the mock class:
``` ```cpp
class ScopedMockLog : public LogSink { class ScopedMockLog : public LogSink {
public: public:
... ...
...@@ -403,7 +403,7 @@ applicable in a wide variety of situations. :-) ...@@ -403,7 +403,7 @@ applicable in a wide variety of situations. :-)
Some times you have a non-trivial fake implementation of an Some times you have a non-trivial fake implementation of an
interface. For example: interface. For example:
``` ```cpp
class Foo { class Foo {
public: public:
virtual ~Foo() {} virtual ~Foo() {}
...@@ -433,7 +433,7 @@ When you define the mock class using Google Mock, you can have it ...@@ -433,7 +433,7 @@ When you define the mock class using Google Mock, you can have it
delegate its default action to a fake class you already have, using delegate its default action to a fake class you already have, using
this pattern: this pattern:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
...@@ -460,7 +460,7 @@ With that, you can use `MockFoo` in your tests as usual. Just remember ...@@ -460,7 +460,7 @@ With that, you can use `MockFoo` in your tests as usual. Just remember
that if you don't explicitly set an action in an `ON_CALL()` or that if you don't explicitly set an action in an `ON_CALL()` or
`EXPECT_CALL()`, the fake will be called upon to do it: `EXPECT_CALL()`, the fake will be called upon to do it:
``` ```cpp
using ::testing::_; using ::testing::_;
TEST(AbcTest, Xyz) { TEST(AbcTest, Xyz) {
...@@ -515,7 +515,7 @@ ability to validate calls. This technique is very similar to the ...@@ -515,7 +515,7 @@ ability to validate calls. This technique is very similar to the
delegating-to-fake technique, the difference being that we use a real delegating-to-fake technique, the difference being that we use a real
object instead of a fake. Here's an example: object instead of a fake. Here's an example:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::AtLeast; using ::testing::AtLeast;
using ::testing::Invoke; using ::testing::Invoke;
...@@ -559,7 +559,7 @@ Ideally, you should code to interfaces, whose methods are all pure ...@@ -559,7 +559,7 @@ Ideally, you should code to interfaces, whose methods are all pure
virtual. In reality, sometimes you do need to mock a virtual method virtual. In reality, sometimes you do need to mock a virtual method
that is not pure (i.e, it already has an implementation). For example: that is not pure (i.e, it already has an implementation). For example:
``` ```cpp
class Foo { class Foo {
public: public:
virtual ~Foo(); virtual ~Foo();
...@@ -586,7 +586,7 @@ whenever you don't need to mock one of its methods). ...@@ -586,7 +586,7 @@ whenever you don't need to mock one of its methods).
The trick is to leave a back door in your mock class for accessing the The trick is to leave a back door in your mock class for accessing the
real methods in the base class: real methods in the base class:
``` ```cpp
class MockFoo : public Foo { class MockFoo : public Foo {
public: public:
// Mocking a pure method. // Mocking a pure method.
...@@ -601,7 +601,7 @@ class MockFoo : public Foo { ...@@ -601,7 +601,7 @@ class MockFoo : public Foo {
Now, you can call `Foo::Concrete()` inside an action by: Now, you can call `Foo::Concrete()` inside an action by:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
... ...
...@@ -611,7 +611,7 @@ using ::testing::Invoke; ...@@ -611,7 +611,7 @@ using ::testing::Invoke;
or tell the mock object that you don't want to mock `Concrete()`: or tell the mock object that you don't want to mock `Concrete()`:
``` ```cpp
using ::testing::Invoke; using ::testing::Invoke;
... ...
ON_CALL(foo, Concrete(_)) ON_CALL(foo, Concrete(_))
...@@ -629,7 +629,7 @@ works.) ...@@ -629,7 +629,7 @@ works.)
You can specify exactly which arguments a mock method is expecting: You can specify exactly which arguments a mock method is expecting:
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
EXPECT_CALL(foo, DoThis(5)) EXPECT_CALL(foo, DoThis(5))
...@@ -641,7 +641,7 @@ using ::testing::Return; ...@@ -641,7 +641,7 @@ using ::testing::Return;
You can use matchers to match arguments that have a certain property: You can use matchers to match arguments that have a certain property:
``` ```cpp
using ::testing::Ge; using ::testing::Ge;
using ::testing::NotNull; using ::testing::NotNull;
using ::testing::Return; using ::testing::Return;
...@@ -654,7 +654,7 @@ using ::testing::Return; ...@@ -654,7 +654,7 @@ using ::testing::Return;
A frequently used matcher is `_`, which matches anything: A frequently used matcher is `_`, which matches anything:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::NotNull; using ::testing::NotNull;
... ...
...@@ -666,7 +666,7 @@ using ::testing::NotNull; ...@@ -666,7 +666,7 @@ using ::testing::NotNull;
You can build complex matchers from existing ones using `AllOf()`, You can build complex matchers from existing ones using `AllOf()`,
`AnyOf()`, and `Not()`: `AnyOf()`, and `Not()`:
``` ```cpp
using ::testing::AllOf; using ::testing::AllOf;
using ::testing::Gt; using ::testing::Gt;
using ::testing::HasSubstr; using ::testing::HasSubstr;
...@@ -710,7 +710,7 @@ The code won't compile if any of these conditions aren't met. ...@@ -710,7 +710,7 @@ The code won't compile if any of these conditions aren't met.
Here's one example: Here's one example:
``` ```cpp
using ::testing::SafeMatcherCast; using ::testing::SafeMatcherCast;
// A base class and a child class. // A base class and a child class.
...@@ -744,7 +744,7 @@ need some help on which overloaded version it is. ...@@ -744,7 +744,7 @@ need some help on which overloaded version it is.
To disambiguate functions overloaded on the const-ness of this object, To disambiguate functions overloaded on the const-ness of this object,
use the `Const()` argument wrapper. use the `Const()` argument wrapper.
``` ```cpp
using ::testing::ReturnRef; using ::testing::ReturnRef;
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -771,7 +771,7 @@ of a matcher, either by wrapping your matcher in `Matcher<type>()`, or ...@@ -771,7 +771,7 @@ of a matcher, either by wrapping your matcher in `Matcher<type>()`, or
using a matcher whose type is fixed (`TypedEq<type>`, `An<type>()`, using a matcher whose type is fixed (`TypedEq<type>`, `An<type>()`,
etc): etc):
``` ```cpp
using ::testing::An; using ::testing::An;
using ::testing::Lt; using ::testing::Lt;
using ::testing::Matcher; using ::testing::Matcher;
...@@ -803,7 +803,7 @@ still active will be selected (think "newer overrides older"). So, you ...@@ -803,7 +803,7 @@ still active will be selected (think "newer overrides older"). So, you
can make a method do different things depending on its argument values can make a method do different things depending on its argument values
like this: like this:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Lt; using ::testing::Lt;
using ::testing::Return; using ::testing::Return;
...@@ -827,7 +827,7 @@ example, we may want to say that the first argument must be less than ...@@ -827,7 +827,7 @@ example, we may want to say that the first argument must be less than
the second argument. The `With()` clause allows us to match the second argument. The `With()` clause allows us to match
all arguments of a mock function as a whole. For example, all arguments of a mock function as a whole. For example,
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Lt; using ::testing::Lt;
using ::testing::Ne; using ::testing::Ne;
...@@ -850,7 +850,7 @@ than `.With(Lt())`. ...@@ -850,7 +850,7 @@ than `.With(Lt())`.
You can use `Args<k1, ..., kn>(m)` to match the `n` selected arguments You can use `Args<k1, ..., kn>(m)` to match the `n` selected arguments
(as a tuple) against `m`. For example, (as a tuple) against `m`. For example,
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::AllOf; using ::testing::AllOf;
using ::testing::Args; using ::testing::Args;
...@@ -882,7 +882,7 @@ participate. ...@@ -882,7 +882,7 @@ participate.
Luckily, you can use a matcher where a unary predicate functor is Luckily, you can use a matcher where a unary predicate functor is
expected by wrapping it inside the `Matches()` function. For example, expected by wrapping it inside the `Matches()` function. For example,
``` ```cpp
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
...@@ -898,7 +898,7 @@ predicates (doing the same using STL's `<functional>` header is just ...@@ -898,7 +898,7 @@ predicates (doing the same using STL's `<functional>` header is just
painful). For example, here's a predicate that's satisfied by any painful). For example, here's a predicate that's satisfied by any
number that is >= 0, <= 100, and != 50: number that is >= 0, <= 100, and != 50:
``` ```cpp
Matches(AllOf(Ge(0), Le(100), Ne(50))) Matches(AllOf(Ge(0), Le(100), Ne(50)))
``` ```
...@@ -909,14 +909,14 @@ themselves, there is a way to take advantage of them in ...@@ -909,14 +909,14 @@ themselves, there is a way to take advantage of them in
[Google Test](../../googletest/) assertions. It's [Google Test](../../googletest/) assertions. It's
called `ASSERT_THAT` and `EXPECT_THAT`: called `ASSERT_THAT` and `EXPECT_THAT`:
``` ```cpp
ASSERT_THAT(value, matcher); // Asserts that value matches matcher. ASSERT_THAT(value, matcher); // Asserts that value matches matcher.
EXPECT_THAT(value, matcher); // The non-fatal version. EXPECT_THAT(value, matcher); // The non-fatal version.
``` ```
For example, in a Google Test test you can write: For example, in a Google Test test you can write:
``` ```cpp
#include "gmock/gmock.h" #include "gmock/gmock.h"
using ::testing::AllOf; using ::testing::AllOf;
...@@ -960,7 +960,7 @@ as a matcher - as long as the predicate accepts a value of the type ...@@ -960,7 +960,7 @@ as a matcher - as long as the predicate accepts a value of the type
you want. You do this by wrapping the predicate inside the `Truly()` you want. You do this by wrapping the predicate inside the `Truly()`
function, for example: function, for example:
``` ```cpp
using ::testing::Truly; using ::testing::Truly;
int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; }
...@@ -990,7 +990,7 @@ away from it if you can guarantee that `bar` won't be changed after ...@@ -990,7 +990,7 @@ away from it if you can guarantee that `bar` won't be changed after
the `EXPECT_CALL()` is executed. Just tell Google Mock that it should the `EXPECT_CALL()` is executed. Just tell Google Mock that it should
save a reference to `bar`, instead of a copy of it. Here's how: save a reference to `bar`, instead of a copy of it. Here's how:
``` ```cpp
using ::testing::Eq; using ::testing::Eq;
using ::testing::ByRef; using ::testing::ByRef;
using ::testing::Lt; using ::testing::Lt;
...@@ -1014,14 +1014,14 @@ you may need to validate a certain member variable or the result of a ...@@ -1014,14 +1014,14 @@ you may need to validate a certain member variable or the result of a
certain getter method of the object. You can do this with `Field()` certain getter method of the object. You can do this with `Field()`
and `Property()`. More specifically, and `Property()`. More specifically,
``` ```cpp
Field(&Foo::bar, m) Field(&Foo::bar, m)
``` ```
is a matcher that matches a `Foo` object whose `bar` member variable is a matcher that matches a `Foo` object whose `bar` member variable
satisfies matcher `m`. satisfies matcher `m`.
``` ```cpp
Property(&Foo::baz, m) Property(&Foo::baz, m)
``` ```
...@@ -1041,7 +1041,7 @@ argument and be declared as `const`. ...@@ -1041,7 +1041,7 @@ argument and be declared as `const`.
BTW, `Field()` and `Property()` can also match plain pointers to BTW, `Field()` and `Property()` can also match plain pointers to
objects. For instance, objects. For instance,
``` ```cpp
Field(&Foo::number, Ge(3)) Field(&Foo::number, Ge(3))
``` ```
...@@ -1062,7 +1062,7 @@ Well, you can use the `Pointee(m)` matcher. ...@@ -1062,7 +1062,7 @@ Well, you can use the `Pointee(m)` matcher.
`Pointee(m)` matches a pointer iff `m` matches the value the pointer `Pointee(m)` matches a pointer iff `m` matches the value the pointer
points to. For example: points to. For example:
``` ```cpp
using ::testing::Ge; using ::testing::Ge;
using ::testing::Pointee; using ::testing::Pointee;
... ...
...@@ -1075,7 +1075,7 @@ greater than or equal to 3. ...@@ -1075,7 +1075,7 @@ greater than or equal to 3.
One nice thing about `Pointee()` is that it treats a `NULL` pointer as One nice thing about `Pointee()` is that it treats a `NULL` pointer as
a match failure, so you can write `Pointee(m)` instead of a match failure, so you can write `Pointee(m)` instead of
``` ```cpp
AllOf(NotNull(), Pointee(m)) AllOf(NotNull(), Pointee(m))
``` ```
...@@ -1102,7 +1102,7 @@ which has an `int bar()` method and an `int baz()` method, and you ...@@ -1102,7 +1102,7 @@ which has an `int bar()` method and an `int baz()` method, and you
want to constrain that the argument's `bar()` value plus its `baz()` want to constrain that the argument's `bar()` value plus its `baz()`
value is a given number. Here's how you can define a matcher to do it: value is a given number. Here's how you can define a matcher to do it:
``` ```cpp
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
...@@ -1153,7 +1153,7 @@ container out-of-line is a bit of a hassle. ...@@ -1153,7 +1153,7 @@ container out-of-line is a bit of a hassle.
You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in
such cases: such cases:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::ElementsAre; using ::testing::ElementsAre;
using ::testing::Gt; using ::testing::Gt;
...@@ -1170,7 +1170,7 @@ must be 1, greater than 0, anything, and 5 respectively. ...@@ -1170,7 +1170,7 @@ must be 1, greater than 0, anything, and 5 respectively.
If you instead write: If you instead write:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Gt; using ::testing::Gt;
using ::testing::UnorderedElementsAre; using ::testing::UnorderedElementsAre;
...@@ -1190,7 +1190,7 @@ to 10 arguments. If more are needed, you can place them in a C-style ...@@ -1190,7 +1190,7 @@ to 10 arguments. If more are needed, you can place them in a C-style
array and use `ElementsAreArray()` or `UnorderedElementsAreArray()` array and use `ElementsAreArray()` or `UnorderedElementsAreArray()`
instead: instead:
``` ```cpp
using ::testing::ElementsAreArray; using ::testing::ElementsAreArray;
... ...
...@@ -1207,7 +1207,7 @@ In case the array needs to be dynamically created (and therefore the ...@@ -1207,7 +1207,7 @@ In case the array needs to be dynamically created (and therefore the
array size cannot be inferred by the compiler), you can give array size cannot be inferred by the compiler), you can give
`ElementsAreArray()` an additional argument to specify the array size: `ElementsAreArray()` an additional argument to specify the array size:
``` ```cpp
using ::testing::ElementsAreArray; using ::testing::ElementsAreArray;
... ...
int* const expected_vector3 = new int[count]; int* const expected_vector3 = new int[count];
...@@ -1234,7 +1234,7 @@ Therefore, if you have some complex matcher that you want to use again ...@@ -1234,7 +1234,7 @@ Therefore, if you have some complex matcher that you want to use again
and again, there is no need to build it every time. Just assign it to a and again, there is no need to build it every time. Just assign it to a
matcher variable and use that variable repeatedly! For example, matcher variable and use that variable repeatedly! For example,
``` ```cpp
Matcher<int> in_range = AllOf(Gt(5), Le(10)); Matcher<int> in_range = AllOf(Gt(5), Le(10));
... use in_range as a matcher in multiple EXPECT_CALLs ... ... use in_range as a matcher in multiple EXPECT_CALLs ...
``` ```
...@@ -1277,7 +1277,7 @@ any `EXPECT_CALL()` statement, it will be an error. ...@@ -1277,7 +1277,7 @@ any `EXPECT_CALL()` statement, it will be an error.
If a mock method shouldn't be called at all, explicitly say so: If a mock method shouldn't be called at all, explicitly say so:
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
EXPECT_CALL(foo, Bar(_)) EXPECT_CALL(foo, Bar(_))
...@@ -1287,7 +1287,7 @@ using ::testing::_; ...@@ -1287,7 +1287,7 @@ using ::testing::_;
If some calls to the method are allowed, but the rest are not, just If some calls to the method are allowed, but the rest are not, just
list all the expected calls: list all the expected calls:
``` ```cpp
using ::testing::AnyNumber; using ::testing::AnyNumber;
using ::testing::Gt; using ::testing::Gt;
... ...
...@@ -1319,7 +1319,7 @@ A **strict mock** turns uninteresting call warnings into errors. So making a moc ...@@ -1319,7 +1319,7 @@ A **strict mock** turns uninteresting call warnings into errors. So making a moc
Let's look at an example: Let's look at an example:
``` ```cpp
TEST(...) { TEST(...) {
NiceMock<MockDomainRegistry> mock_registry; NiceMock<MockDomainRegistry> mock_registry;
EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) EXPECT_CALL(mock_registry, GetDomainOwner("google.com"))
...@@ -1334,7 +1334,7 @@ The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have ...@@ -1334,7 +1334,7 @@ The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have
So how do we tell Google Mock that `GetDomainOwner()` can be called with some other arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: So how do we tell Google Mock that `GetDomainOwner()` can be called with some other arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`:
``` ```cpp
EXPECT_CALL(mock_registry, GetDomainOwner(_)) EXPECT_CALL(mock_registry, GetDomainOwner(_))
.Times(AnyNumber()); // catches all other calls to this method. .Times(AnyNumber()); // catches all other calls to this method.
EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) EXPECT_CALL(mock_registry, GetDomainOwner("google.com"))
...@@ -1360,7 +1360,7 @@ If you would rather have all calls occur in the order of the ...@@ -1360,7 +1360,7 @@ If you would rather have all calls occur in the order of the
expectations, put the `EXPECT_CALL()` statements in a block where you expectations, put the `EXPECT_CALL()` statements in a block where you
define a variable of type `InSequence`: define a variable of type `InSequence`:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::InSequence; using ::testing::InSequence;
...@@ -1411,7 +1411,7 @@ things: first to define some `Sequence` objects, and then for each ...@@ -1411,7 +1411,7 @@ things: first to define some `Sequence` objects, and then for each
of. Expectations in the same sequence must occur in the order they are of. Expectations in the same sequence must occur in the order they are
written. For example, written. For example,
``` ```cpp
using ::testing::Sequence; using ::testing::Sequence;
Sequence s1, s2; Sequence s1, s2;
...@@ -1447,7 +1447,7 @@ that are still active. An expectation is active when created, and ...@@ -1447,7 +1447,7 @@ that are still active. An expectation is active when created, and
becomes inactive (aka _retires_) when a call that has to occur later becomes inactive (aka _retires_) when a call that has to occur later
has occurred. For example, in has occurred. For example, in
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Sequence; using ::testing::Sequence;
...@@ -1468,7 +1468,7 @@ as soon as either #2 or #3 is matched, #1 will retire. If a warning ...@@ -1468,7 +1468,7 @@ as soon as either #2 or #3 is matched, #1 will retire. If a warning
Note that an expectation doesn't retire automatically when it's Note that an expectation doesn't retire automatically when it's
saturated. For example, saturated. For example,
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
EXPECT_CALL(log, Log(WARNING, _, _)); // #1 EXPECT_CALL(log, Log(WARNING, _, _)); // #1
...@@ -1482,7 +1482,7 @@ match again and result in an upper-bound-violated error. ...@@ -1482,7 +1482,7 @@ match again and result in an upper-bound-violated error.
If this is not what you want, you can ask an expectation to retire as If this is not what you want, you can ask an expectation to retire as
soon as it becomes saturated: soon as it becomes saturated:
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
EXPECT_CALL(log, Log(WARNING, _, _)); // #1 EXPECT_CALL(log, Log(WARNING, _, _)); // #1
...@@ -1501,7 +1501,7 @@ will match #1 - there will be no error. ...@@ -1501,7 +1501,7 @@ will match #1 - there will be no error.
If a mock function's return type is a reference, you need to use If a mock function's return type is a reference, you need to use
`ReturnRef()` instead of `Return()` to return a result: `ReturnRef()` instead of `Return()` to return a result:
``` ```cpp
using ::testing::ReturnRef; using ::testing::ReturnRef;
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -1531,7 +1531,7 @@ as doing that usually indicates a user error. So, what shall you do? ...@@ -1531,7 +1531,7 @@ as doing that usually indicates a user error. So, what shall you do?
You may be tempted to try `ByRef()`: You may be tempted to try `ByRef()`:
``` ```cpp
using testing::ByRef; using testing::ByRef;
using testing::Return; using testing::Return;
...@@ -1568,7 +1568,7 @@ and `Return(ByRef(x))` will always return 0. ...@@ -1568,7 +1568,7 @@ and `Return(ByRef(x))` will always return 0.
specifically. It returns the value pointed to by `pointer` at the time specifically. It returns the value pointed to by `pointer` at the time
the action is _executed_: the action is _executed_:
``` ```cpp
using testing::ReturnPointee; using testing::ReturnPointee;
... ...
int x = 0; int x = 0;
...@@ -1585,7 +1585,7 @@ Want to do more than one thing when a function is called? That's ...@@ -1585,7 +1585,7 @@ Want to do more than one thing when a function is called? That's
fine. `DoAll()` allow you to do sequence of actions every time. Only fine. `DoAll()` allow you to do sequence of actions every time. Only
the return value of the last action in the sequence will be used. the return value of the last action in the sequence will be used.
``` ```cpp
using ::testing::DoAll; using ::testing::DoAll;
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -1611,7 +1611,7 @@ define your own action by implementing `::testing::ActionInterface`. ...@@ -1611,7 +1611,7 @@ define your own action by implementing `::testing::ActionInterface`.
If all you need to do is to change an output argument, the built-in If all you need to do is to change an output argument, the built-in
`SetArgPointee()` action is convenient: `SetArgPointee()` action is convenient:
``` ```cpp
using ::testing::SetArgPointee; using ::testing::SetArgPointee;
class MockMutator : public Mutator { class MockMutator : public Mutator {
...@@ -1638,7 +1638,7 @@ constructor and assignment operator. ...@@ -1638,7 +1638,7 @@ constructor and assignment operator.
If the mock method also needs to return a value as well, you can chain If the mock method also needs to return a value as well, you can chain
`SetArgPointee()` with `Return()` using `DoAll()`: `SetArgPointee()` with `Return()` using `DoAll()`:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Return; using ::testing::Return;
using ::testing::SetArgPointee; using ::testing::SetArgPointee;
...@@ -1661,7 +1661,7 @@ If the output argument is an array, use the ...@@ -1661,7 +1661,7 @@ If the output argument is an array, use the
elements in source range `[first, last)` to the array pointed to by elements in source range `[first, last)` to the array pointed to by
the `N`-th (0-based) argument: the `N`-th (0-based) argument:
``` ```cpp
using ::testing::NotNull; using ::testing::NotNull;
using ::testing::SetArrayArgument; using ::testing::SetArrayArgument;
...@@ -1680,7 +1680,7 @@ class MockArrayMutator : public ArrayMutator { ...@@ -1680,7 +1680,7 @@ class MockArrayMutator : public ArrayMutator {
This also works when the argument is an output iterator: This also works when the argument is an output iterator:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::SetArrayArgument; using ::testing::SetArrayArgument;
...@@ -1704,7 +1704,7 @@ class MockRolodex : public Rolodex { ...@@ -1704,7 +1704,7 @@ class MockRolodex : public Rolodex {
If you expect a call to change the behavior of a mock object, you can use `::testing::InSequence` to specify different behaviors before and after the call: If you expect a call to change the behavior of a mock object, you can use `::testing::InSequence` to specify different behaviors before and after the call:
``` ```cpp
using ::testing::InSequence; using ::testing::InSequence;
using ::testing::Return; using ::testing::Return;
...@@ -1724,7 +1724,7 @@ This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called ...@@ -1724,7 +1724,7 @@ This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called
If the behavior change is more complex, you can store the effects in a variable and make a mock method get its return value from that variable: If the behavior change is more complex, you can store the effects in a variable and make a mock method get its return value from that variable:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::SaveArg; using ::testing::SaveArg;
using ::testing::Return; using ::testing::Return;
...@@ -1754,7 +1754,7 @@ to specify a default value for types Google Mock doesn't know ...@@ -1754,7 +1754,7 @@ to specify a default value for types Google Mock doesn't know
about. You can do this using the `::testing::DefaultValue` class about. You can do this using the `::testing::DefaultValue` class
template: template:
``` ```cpp
class MockFoo : public Foo { class MockFoo : public Foo {
public: public:
MOCK_METHOD0(CalculateBar, Bar()); MOCK_METHOD0(CalculateBar, Bar());
...@@ -1790,7 +1790,7 @@ have two mock methods with the same return type and you want them to ...@@ -1790,7 +1790,7 @@ have two mock methods with the same return type and you want them to
have different behaviors. The `ON_CALL()` macro allows you to have different behaviors. The `ON_CALL()` macro allows you to
customize your mock's behavior at the method level: customize your mock's behavior at the method level:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::AnyNumber; using ::testing::AnyNumber;
using ::testing::Gt; using ::testing::Gt;
...@@ -1823,7 +1823,7 @@ specialize the mock's behavior later. ...@@ -1823,7 +1823,7 @@ specialize the mock's behavior later.
If the built-in actions don't suit you, you can easily use an existing If the built-in actions don't suit you, you can easily use an existing
function, method, or functor as an action: function, method, or functor as an action:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
...@@ -1878,7 +1878,7 @@ tedious and obscures the intent of the test. ...@@ -1878,7 +1878,7 @@ tedious and obscures the intent of the test.
that it doesn't pass the mock function's arguments to the that it doesn't pass the mock function's arguments to the
callee. Here's an example: callee. Here's an example:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::InvokeWithoutArgs; using ::testing::InvokeWithoutArgs;
...@@ -1902,7 +1902,7 @@ bool Job1() { ... } ...@@ -1902,7 +1902,7 @@ bool Job1() { ... }
Sometimes a mock function will receive a function pointer or a functor Sometimes a mock function will receive a function pointer or a functor
(in other words, a "callable") as an argument, e.g. (in other words, a "callable") as an argument, e.g.
``` ```cpp
class MockFoo : public Foo { class MockFoo : public Foo {
public: public:
MOCK_METHOD2(DoThis, bool(int n, bool (*fp)(int))); MOCK_METHOD2(DoThis, bool(int n, bool (*fp)(int)));
...@@ -1911,7 +1911,7 @@ class MockFoo : public Foo { ...@@ -1911,7 +1911,7 @@ class MockFoo : public Foo {
and you may want to invoke this callable argument: and you may want to invoke this callable argument:
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
MockFoo foo; MockFoo foo;
...@@ -1927,7 +1927,7 @@ Or do you really? ...@@ -1927,7 +1927,7 @@ Or do you really?
Well, Google Mock has an action to solve _exactly_ this problem: Well, Google Mock has an action to solve _exactly_ this problem:
``` ```cpp
InvokeArgument<N>(arg_1, arg_2, ..., arg_m) InvokeArgument<N>(arg_1, arg_2, ..., arg_m)
``` ```
...@@ -1937,7 +1937,7 @@ a function pointer or a functor, Google Mock handles them both. ...@@ -1937,7 +1937,7 @@ a function pointer or a functor, Google Mock handles them both.
With that, you could write: With that, you could write:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::InvokeArgument; using ::testing::InvokeArgument;
... ...
...@@ -1950,7 +1950,7 @@ using ::testing::InvokeArgument; ...@@ -1950,7 +1950,7 @@ using ::testing::InvokeArgument;
What if the callable takes an argument by reference? No problem - just What if the callable takes an argument by reference? No problem - just
wrap it inside `ByRef()`: wrap it inside `ByRef()`:
``` ```cpp
... ...
MOCK_METHOD1(Bar, bool(bool (*fp)(int, const Helper&))); MOCK_METHOD1(Bar, bool(bool (*fp)(int, const Helper&)));
... ...
...@@ -1974,7 +1974,7 @@ copy_ of the argument, and pass a _reference to the copy_, instead of ...@@ -1974,7 +1974,7 @@ copy_ of the argument, and pass a _reference to the copy_, instead of
a reference to the original value, to the callable. This is especially a reference to the original value, to the callable. This is especially
handy when the argument is a temporary value: handy when the argument is a temporary value:
``` ```cpp
... ...
MOCK_METHOD1(DoThat, bool(bool (*f)(const double& x, const string& s))); MOCK_METHOD1(DoThat, bool(bool (*f)(const double& x, const string& s)));
... ...
...@@ -2001,7 +2001,7 @@ function that returns `void`, or perhaps it needs to be used in ...@@ -2001,7 +2001,7 @@ function that returns `void`, or perhaps it needs to be used in
`DoAll()` and it's not the last in the list). `IgnoreResult()` lets `DoAll()` and it's not the last in the list). `IgnoreResult()` lets
you do that. For example: you do that. For example:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::Return; using ::testing::Return;
...@@ -2038,7 +2038,7 @@ Say you have a mock function `Foo()` that takes seven arguments, and ...@@ -2038,7 +2038,7 @@ Say you have a mock function `Foo()` that takes seven arguments, and
you have a custom action that you want to invoke when `Foo()` is you have a custom action that you want to invoke when `Foo()` is
called. Trouble is, the custom action only wants three arguments: called. Trouble is, the custom action only wants three arguments:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
... ...
...@@ -2060,7 +2060,7 @@ To please the compiler God, you can to define an "adaptor" that has ...@@ -2060,7 +2060,7 @@ To please the compiler God, you can to define an "adaptor" that has
the same signature as `Foo()` and calls the custom action with the the same signature as `Foo()` and calls the custom action with the
right arguments: right arguments:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
...@@ -2081,7 +2081,7 @@ Google Mock provides a generic _action adaptor_, so you can spend your ...@@ -2081,7 +2081,7 @@ Google Mock provides a generic _action adaptor_, so you can spend your
time minding more important business than writing your own time minding more important business than writing your own
adaptors. Here's the syntax: adaptors. Here's the syntax:
``` ```cpp
WithArgs<N1, N2, ..., Nk>(action) WithArgs<N1, N2, ..., Nk>(action)
``` ```
...@@ -2089,7 +2089,7 @@ creates an action that passes the arguments of the mock function at ...@@ -2089,7 +2089,7 @@ creates an action that passes the arguments of the mock function at
the given indices (0-based) to the inner `action` and performs the given indices (0-based) to the inner `action` and performs
it. Using `WithArgs`, our original example can be written as: it. Using `WithArgs`, our original example can be written as:
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::WithArgs; using ::testing::WithArgs;
...@@ -2129,14 +2129,14 @@ case the types of the uninteresting arguments change. It could also ...@@ -2129,14 +2129,14 @@ case the types of the uninteresting arguments change. It could also
increase the chance the action function can be reused. For example, increase the chance the action function can be reused. For example,
given given
``` ```cpp
MOCK_METHOD3(Foo, double(const string& label, double x, double y)); MOCK_METHOD3(Foo, double(const string& label, double x, double y));
MOCK_METHOD3(Bar, double(int index, double x, double y)); MOCK_METHOD3(Bar, double(int index, double x, double y));
``` ```
instead of instead of
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
...@@ -2157,7 +2157,7 @@ double DistanceToOriginWithIndex(int index, double x, double y) { ...@@ -2157,7 +2157,7 @@ double DistanceToOriginWithIndex(int index, double x, double y) {
you could write you could write
``` ```cpp
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::Unused; using ::testing::Unused;
...@@ -2187,7 +2187,7 @@ doesn't have an internal state (i.e. if it always does the same thing ...@@ -2187,7 +2187,7 @@ doesn't have an internal state (i.e. if it always does the same thing
no matter how many times it has been called), you can assign it to an no matter how many times it has been called), you can assign it to an
action variable and use that variable repeatedly. For example: action variable and use that variable repeatedly. For example:
``` ```cpp
Action<bool(int*)> set_flag = DoAll(SetArgPointee<0>(5), Action<bool(int*)> set_flag = DoAll(SetArgPointee<0>(5),
Return(true)); Return(true));
... use set_flag in .WillOnce() and .WillRepeatedly() ... ... use set_flag in .WillOnce() and .WillRepeatedly() ...
...@@ -2200,7 +2200,7 @@ returns a counter whose initial value is `init`, using two actions ...@@ -2200,7 +2200,7 @@ returns a counter whose initial value is `init`, using two actions
created from the same expression and using a shared action will created from the same expression and using a shared action will
exihibit different behaviors. Example: exihibit different behaviors. Example:
``` ```cpp
EXPECT_CALL(foo, DoThis()) EXPECT_CALL(foo, DoThis())
.WillRepeatedly(IncrementCounter(0)); .WillRepeatedly(IncrementCounter(0));
EXPECT_CALL(foo, DoThat()) EXPECT_CALL(foo, DoThat())
...@@ -2213,7 +2213,7 @@ exihibit different behaviors. Example: ...@@ -2213,7 +2213,7 @@ exihibit different behaviors. Example:
versus versus
``` ```cpp
Action<int()> increment = IncrementCounter(0); Action<int()> increment = IncrementCounter(0);
EXPECT_CALL(foo, DoThis()) EXPECT_CALL(foo, DoThis())
...@@ -2420,7 +2420,7 @@ and destructor once, resulting in a much faster compilation. ...@@ -2420,7 +2420,7 @@ and destructor once, resulting in a much faster compilation.
Let's illustrate the idea using an example. Here's the definition of a Let's illustrate the idea using an example. Here's the definition of a
mock class before applying this recipe: mock class before applying this recipe:
``` ```cpp
// File mock_foo.h. // File mock_foo.h.
... ...
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -2437,7 +2437,7 @@ class MockFoo : public Foo { ...@@ -2437,7 +2437,7 @@ class MockFoo : public Foo {
After the change, it would look like: After the change, it would look like:
``` ```cpp
// File mock_foo.h. // File mock_foo.h.
... ...
class MockFoo : public Foo { class MockFoo : public Foo {
...@@ -2452,7 +2452,7 @@ class MockFoo : public Foo { ...@@ -2452,7 +2452,7 @@ class MockFoo : public Foo {
}; };
``` ```
and and
``` ```cpp
// File mock_foo.cpp. // File mock_foo.cpp.
#include "path/to/mock_foo.h" #include "path/to/mock_foo.h"
...@@ -2484,7 +2484,7 @@ to _force_ Google Mock to verify a mock object before it is ...@@ -2484,7 +2484,7 @@ to _force_ Google Mock to verify a mock object before it is
(hopefully) destructed. You can do this with (hopefully) destructed. You can do this with
`Mock::VerifyAndClearExpectations(&mock_object)`: `Mock::VerifyAndClearExpectations(&mock_object)`:
``` ```cpp
TEST(MyServerTest, ProcessesRequest) { TEST(MyServerTest, ProcessesRequest) {
using ::testing::Mock; using ::testing::Mock;
...@@ -2537,7 +2537,7 @@ function at specific places. Then you can verify that the mock ...@@ -2537,7 +2537,7 @@ function at specific places. Then you can verify that the mock
function calls do happen at the right time. For example, if you are function calls do happen at the right time. For example, if you are
exercising code: exercising code:
``` ```cpp
Foo(1); Foo(1);
Foo(2); Foo(2);
Foo(3); Foo(3);
...@@ -2546,7 +2546,7 @@ Foo(3); ...@@ -2546,7 +2546,7 @@ Foo(3);
and want to verify that `Foo(1)` and `Foo(3)` both invoke and want to verify that `Foo(1)` and `Foo(3)` both invoke
`mock.Bar("a")`, but `Foo(2)` doesn't invoke anything. You can write: `mock.Bar("a")`, but `Foo(2)` doesn't invoke anything. You can write:
``` ```cpp
using ::testing::MockFunction; using ::testing::MockFunction;
TEST(FooTest, InvokesBarCorrectly) { TEST(FooTest, InvokesBarCorrectly) {
...@@ -2588,7 +2588,7 @@ This sounds simple, except for one problem: a destructor is a special ...@@ -2588,7 +2588,7 @@ This sounds simple, except for one problem: a destructor is a special
function with special syntax and special semantics, and the function with special syntax and special semantics, and the
`MOCK_METHOD0` macro doesn't work for it: `MOCK_METHOD0` macro doesn't work for it:
``` ```cpp
MOCK_METHOD0(~MockFoo, void()); // Won't compile! MOCK_METHOD0(~MockFoo, void()); // Won't compile!
``` ```
...@@ -2596,7 +2596,7 @@ The good news is that you can use a simple pattern to achieve the same ...@@ -2596,7 +2596,7 @@ The good news is that you can use a simple pattern to achieve the same
effect. First, add a mock function `Die()` to your mock class and call effect. First, add a mock function `Die()` to your mock class and call
it in the destructor, like this: it in the destructor, like this:
``` ```cpp
class MockFoo : public Foo { class MockFoo : public Foo {
... ...
// Add the following two lines to the mock class. // Add the following two lines to the mock class.
...@@ -2609,7 +2609,7 @@ class MockFoo : public Foo { ...@@ -2609,7 +2609,7 @@ class MockFoo : public Foo {
name.) Now, we have translated the problem of testing when a `MockFoo` name.) Now, we have translated the problem of testing when a `MockFoo`
object dies to testing when its `Die()` method is called: object dies to testing when its `Die()` method is called:
``` ```cpp
MockFoo* foo = new MockFoo; MockFoo* foo = new MockFoo;
MockBar* bar = new MockBar; MockBar* bar = new MockBar;
... ...
...@@ -2664,7 +2664,7 @@ behavior. That's not fun, so don't do it. ...@@ -2664,7 +2664,7 @@ behavior. That's not fun, so don't do it.
Google Mock guarantees that the action for a mock function is done in Google Mock guarantees that the action for a mock function is done in
the same thread that called the mock function. For example, in the same thread that called the mock function. For example, in
``` ```cpp
EXPECT_CALL(mock, Foo(1)) EXPECT_CALL(mock, Foo(1))
.WillOnce(action1); .WillOnce(action1);
EXPECT_CALL(mock, Foo(2)) EXPECT_CALL(mock, Foo(2))
...@@ -2715,7 +2715,7 @@ with three possible values: ...@@ -2715,7 +2715,7 @@ with three possible values:
Alternatively, you can adjust the value of that flag from within your Alternatively, you can adjust the value of that flag from within your
tests like so: tests like so:
``` ```cpp
::testing::FLAGS_gmock_verbose = "error"; ::testing::FLAGS_gmock_verbose = "error";
``` ```
...@@ -2737,7 +2737,7 @@ which `EXPECT_CALL` Google Mock thinks it matches? ...@@ -2737,7 +2737,7 @@ which `EXPECT_CALL` Google Mock thinks it matches?
You can unlock this power by running your test with the You can unlock this power by running your test with the
`--gmock_verbose=info` flag. For example, given the test program: `--gmock_verbose=info` flag. For example, given the test program:
``` ```cpp
using testing::_; using testing::_;
using testing::HasSubstr; using testing::HasSubstr;
using testing::Return; using testing::Return;
...@@ -2831,7 +2831,7 @@ against them. ...@@ -2831,7 +2831,7 @@ against them.
The `MATCHER*` family of macros can be used to define custom matchers The `MATCHER*` family of macros can be used to define custom matchers
easily. The syntax: easily. The syntax:
``` ```cpp
MATCHER(name, description_string_expression) { statements; } MATCHER(name, description_string_expression) { statements; }
``` ```
...@@ -2852,16 +2852,16 @@ in which case Google Mock will use the sequence of words in the ...@@ -2852,16 +2852,16 @@ in which case Google Mock will use the sequence of words in the
matcher name as the description. matcher name as the description.
For example: For example:
``` ```cpp
MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; }
``` ```
allows you to write allows you to write
``` ```cpp
// Expects mock_foo.Bar(n) to be called where n is divisible by 7. // Expects mock_foo.Bar(n) to be called where n is divisible by 7.
EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7()));
``` ```
or, or,
``` ```cpp
using ::testing::Not; using ::testing::Not;
... ...
EXPECT_THAT(some_expression, IsDivisibleBy7()); EXPECT_THAT(some_expression, IsDivisibleBy7());
...@@ -2884,7 +2884,7 @@ by 7)"` are automatically calculated from the matcher name ...@@ -2884,7 +2884,7 @@ by 7)"` are automatically calculated from the matcher name
As you may have noticed, the auto-generated descriptions (especially As you may have noticed, the auto-generated descriptions (especially
those for the negation) may not be so great. You can always override those for the negation) may not be so great. You can always override
them with a string expression of your own: them with a string expression of your own:
``` ```cpp
MATCHER(IsDivisibleBy7, std::string(negation ? "isn't" : "is") + MATCHER(IsDivisibleBy7, std::string(negation ? "isn't" : "is") +
" divisible by 7") { " divisible by 7") {
return (arg % 7) == 0; return (arg % 7) == 0;
...@@ -2894,7 +2894,7 @@ MATCHER(IsDivisibleBy7, std::string(negation ? "isn't" : "is") + ...@@ -2894,7 +2894,7 @@ MATCHER(IsDivisibleBy7, std::string(negation ? "isn't" : "is") +
Optionally, you can stream additional information to a hidden argument Optionally, you can stream additional information to a hidden argument
named `result_listener` to explain the match result. For example, a named `result_listener` to explain the match result. For example, a
better definition of `IsDivisibleBy7` is: better definition of `IsDivisibleBy7` is:
``` ```cpp
MATCHER(IsDivisibleBy7, "") { MATCHER(IsDivisibleBy7, "") {
if ((arg % 7) == 0) if ((arg % 7) == 0)
return true; return true;
...@@ -2927,18 +2927,18 @@ Google Mock already prints it for you. ...@@ -2927,18 +2927,18 @@ Google Mock already prints it for you.
Sometimes you'll want to define a matcher that has parameters. For that you Sometimes you'll want to define a matcher that has parameters. For that you
can use the macro: can use the macro:
``` ```cpp
MATCHER_P(name, param_name, description_string) { statements; } MATCHER_P(name, param_name, description_string) { statements; }
``` ```
where the description string can be either `""` or a string expression where the description string can be either `""` or a string expression
that references `negation` and `param_name`. that references `negation` and `param_name`.
For example: For example:
``` ```cpp
MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
``` ```
will allow you to write: will allow you to write:
``` ```cpp
EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
``` ```
which may lead to this message (assuming `n` is 10): which may lead to this message (assuming `n` is 10):
...@@ -2958,7 +2958,7 @@ body of `MATCHER_P(HasAbsoluteValue, value)` above, you can write ...@@ -2958,7 +2958,7 @@ body of `MATCHER_P(HasAbsoluteValue, value)` above, you can write
Google Mock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to Google Mock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to
`MATCHER_P10` to support multi-parameter matchers: `MATCHER_P10` to support multi-parameter matchers:
``` ```cpp
MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; }
``` ```
...@@ -2970,7 +2970,7 @@ referencing the matcher parameters in the description string ...@@ -2970,7 +2970,7 @@ referencing the matcher parameters in the description string
expression. expression.
For example, For example,
``` ```cpp
using ::testing::PrintToString; using ::testing::PrintToString;
MATCHER_P2(InClosedRange, low, hi, MATCHER_P2(InClosedRange, low, hi,
std::string(negation ? "isn't" : "is") + " in range [" + std::string(negation ? "isn't" : "is") + " in range [" +
...@@ -2988,7 +2988,7 @@ would generate a failure that contains the message: ...@@ -2988,7 +2988,7 @@ would generate a failure that contains the message:
If you specify `""` as the description, the failure message will If you specify `""` as the description, the failure message will
contain the sequence of words in the matcher name followed by the contain the sequence of words in the matcher name followed by the
parameter values printed as a tuple. For example, parameter values printed as a tuple. For example,
``` ```cpp
MATCHER_P2(InClosedRange, low, hi, "") { ... } MATCHER_P2(InClosedRange, low, hi, "") { ... }
... ...
EXPECT_THAT(3, InClosedRange(4, 6)); EXPECT_THAT(3, InClosedRange(4, 6));
...@@ -2999,11 +2999,11 @@ would generate a failure that contains the text: ...@@ -2999,11 +2999,11 @@ would generate a failure that contains the text:
``` ```
For the purpose of typing, you can view For the purpose of typing, you can view
``` ```cpp
MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
``` ```
as shorthand for as shorthand for
``` ```cpp
template <typename p1_type, ..., typename pk_type> template <typename p1_type, ..., typename pk_type>
FooMatcherPk<p1_type, ..., pk_type> FooMatcherPk<p1_type, ..., pk_type>
Foo(p1_type p1, ..., pk_type pk) { ... } Foo(p1_type p1, ..., pk_type pk) { ... }
...@@ -3032,7 +3032,7 @@ matcher you will see the value of the referenced object but not its ...@@ -3032,7 +3032,7 @@ matcher you will see the value of the referenced object but not its
address. address.
You can overload matchers with different numbers of parameters: You can overload matchers with different numbers of parameters:
``` ```cpp
MATCHER_P(Blah, a, description_string_1) { ... } MATCHER_P(Blah, a, description_string_1) { ... }
MATCHER_P2(Blah, a, b, description_string_2) { ... } MATCHER_P2(Blah, a, b, description_string_2) { ... }
``` ```
...@@ -3058,7 +3058,7 @@ error messages when expectations are violated. ...@@ -3058,7 +3058,7 @@ error messages when expectations are violated.
The interface looks like this: The interface looks like this:
``` ```cpp
class MatchResultListener { class MatchResultListener {
public: public:
... ...
...@@ -3098,7 +3098,7 @@ strictly needed but it makes the syntax of using the matcher nicer. ...@@ -3098,7 +3098,7 @@ strictly needed but it makes the syntax of using the matcher nicer.
For example, you can define a matcher to test whether an `int` is For example, you can define a matcher to test whether an `int` is
divisible by 7 and then use it like this: divisible by 7 and then use it like this:
``` ```cpp
using ::testing::MakeMatcher; using ::testing::MakeMatcher;
using ::testing::Matcher; using ::testing::Matcher;
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
...@@ -3130,7 +3130,7 @@ inline Matcher<int> DivisibleBy7() { ...@@ -3130,7 +3130,7 @@ inline Matcher<int> DivisibleBy7() {
You may improve the matcher message by streaming additional You may improve the matcher message by streaming additional
information to the `listener` argument in `MatchAndExplain()`: information to the `listener` argument in `MatchAndExplain()`:
``` ```cpp
class DivisibleBy7Matcher : public MatcherInterface<int> { class DivisibleBy7Matcher : public MatcherInterface<int> {
public: public:
virtual bool MatchAndExplain(int n, virtual bool MatchAndExplain(int n,
...@@ -3167,7 +3167,7 @@ Fortunately, most of the time you can define a polymorphic matcher ...@@ -3167,7 +3167,7 @@ Fortunately, most of the time you can define a polymorphic matcher
easily with the help of `MakePolymorphicMatcher()`. Here's how you can easily with the help of `MakePolymorphicMatcher()`. Here's how you can
define `NotNull()` as an example: define `NotNull()` as an example:
``` ```cpp
using ::testing::MakePolymorphicMatcher; using ::testing::MakePolymorphicMatcher;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
using ::testing::NotNull; using ::testing::NotNull;
...@@ -3224,7 +3224,7 @@ If the built-in set of cardinalities doesn't suit you, you are free to ...@@ -3224,7 +3224,7 @@ If the built-in set of cardinalities doesn't suit you, you are free to
define your own by implementing the following interface (in namespace define your own by implementing the following interface (in namespace
`testing`): `testing`):
``` ```cpp
class CardinalityInterface { class CardinalityInterface {
public: public:
virtual ~CardinalityInterface(); virtual ~CardinalityInterface();
...@@ -3243,7 +3243,7 @@ class CardinalityInterface { ...@@ -3243,7 +3243,7 @@ class CardinalityInterface {
For example, to specify that a call must occur even number of times, For example, to specify that a call must occur even number of times,
you can write you can write
``` ```cpp
using ::testing::Cardinality; using ::testing::Cardinality;
using ::testing::CardinalityInterface; using ::testing::CardinalityInterface;
using ::testing::MakeCardinality; using ::testing::MakeCardinality;
...@@ -3280,7 +3280,7 @@ family to quickly define a new action that can be used in your code as ...@@ -3280,7 +3280,7 @@ family to quickly define a new action that can be used in your code as
if it's a built-in action. if it's a built-in action.
By writing By writing
``` ```cpp
ACTION(name) { statements; } ACTION(name) { statements; }
``` ```
in a namespace scope (i.e. not inside a class or function), you will in a namespace scope (i.e. not inside a class or function), you will
...@@ -3288,11 +3288,11 @@ define an action with the given name that executes the statements. ...@@ -3288,11 +3288,11 @@ define an action with the given name that executes the statements.
The value returned by `statements` will be used as the return value of The value returned by `statements` will be used as the return value of
the action. Inside the statements, you can refer to the K-th the action. Inside the statements, you can refer to the K-th
(0-based) argument of the mock function as `argK`. For example: (0-based) argument of the mock function as `argK`. For example:
``` ```cpp
ACTION(IncrementArg1) { return ++(*arg1); } ACTION(IncrementArg1) { return ++(*arg1); }
``` ```
allows you to write allows you to write
``` ```cpp
... WillOnce(IncrementArg1()); ... WillOnce(IncrementArg1());
``` ```
...@@ -3303,7 +3303,7 @@ operator, or if the type of `++(*arg1)` isn't compatible with the mock ...@@ -3303,7 +3303,7 @@ operator, or if the type of `++(*arg1)` isn't compatible with the mock
function's return type. function's return type.
Another example: Another example:
``` ```cpp
ACTION(Foo) { ACTION(Foo) {
(*arg2)(5); (*arg2)(5);
Blah(); Blah();
...@@ -3319,14 +3319,14 @@ For more convenience and flexibility, you can also use the following ...@@ -3319,14 +3319,14 @@ For more convenience and flexibility, you can also use the following
pre-defined symbols in the body of `ACTION`: pre-defined symbols in the body of `ACTION`:
| `argK_type` | The type of the K-th (0-based) argument of the mock function | | `argK_type` | The type of the K-th (0-based) argument of the mock function |
|:------------|:-------------------------------------------------------------| |:----------------|:-------------------------------------------------------------|
| `args` | All arguments of the mock function as a tuple | | `args` | All arguments of the mock function as a tuple |
| `args_type` | The type of all arguments of the mock function as a tuple | | `args_type` | The type of all arguments of the mock function as a tuple |
| `return_type` | The return type of the mock function | | `return_type` | The return type of the mock function |
| `function_type` | The type of the mock function | | `function_type` | The type of the mock function |
For example, when using an `ACTION` as a stub action for mock function: For example, when using an `ACTION` as a stub action for mock function:
``` ```cpp
int DoSomething(bool flag, int* ptr); int DoSomething(bool flag, int* ptr);
``` ```
we have: we have:
...@@ -3346,16 +3346,16 @@ we have: ...@@ -3346,16 +3346,16 @@ we have:
Sometimes you'll want to parameterize an action you define. For that Sometimes you'll want to parameterize an action you define. For that
we have another macro we have another macro
``` ```cpp
ACTION_P(name, param) { statements; } ACTION_P(name, param) { statements; }
``` ```
For example, For example,
``` ```cpp
ACTION_P(Add, n) { return arg0 + n; } ACTION_P(Add, n) { return arg0 + n; }
``` ```
will allow you to write will allow you to write
``` ```cpp
// Returns argument #0 + 5. // Returns argument #0 + 5.
... WillOnce(Add(5)); ... WillOnce(Add(5));
``` ```
...@@ -3372,7 +3372,7 @@ parameter as inferred by the compiler. For example, in the body of ...@@ -3372,7 +3372,7 @@ parameter as inferred by the compiler. For example, in the body of
Google Mock also provides `ACTION_P2`, `ACTION_P3`, and etc to support Google Mock also provides `ACTION_P2`, `ACTION_P3`, and etc to support
multi-parameter actions. For example, multi-parameter actions. For example,
``` ```cpp
ACTION_P2(ReturnDistanceTo, x, y) { ACTION_P2(ReturnDistanceTo, x, y) {
double dx = arg0 - x; double dx = arg0 - x;
double dy = arg1 - y; double dy = arg1 - y;
...@@ -3380,7 +3380,7 @@ ACTION_P2(ReturnDistanceTo, x, y) { ...@@ -3380,7 +3380,7 @@ ACTION_P2(ReturnDistanceTo, x, y) {
} }
``` ```
lets you write lets you write
``` ```cpp
... WillOnce(ReturnDistanceTo(5.0, 26.5)); ... WillOnce(ReturnDistanceTo(5.0, 26.5));
``` ```
...@@ -3388,7 +3388,7 @@ You can view `ACTION` as a degenerated parameterized action where the ...@@ -3388,7 +3388,7 @@ You can view `ACTION` as a degenerated parameterized action where the
number of parameters is 0. number of parameters is 0.
You can also easily define actions overloaded on the number of parameters: You can also easily define actions overloaded on the number of parameters:
``` ```cpp
ACTION_P(Plus, a) { ... } ACTION_P(Plus, a) { ... }
ACTION_P2(Plus, a, b) { ... } ACTION_P2(Plus, a, b) { ... }
``` ```
...@@ -3401,7 +3401,7 @@ parameters. Instead, we let the compiler infer the types for us. ...@@ -3401,7 +3401,7 @@ parameters. Instead, we let the compiler infer the types for us.
Sometimes, however, we may want to be more explicit about the types. Sometimes, however, we may want to be more explicit about the types.
There are several tricks to do that. For example: There are several tricks to do that. For example:
``` ```cpp
ACTION(Foo) { ACTION(Foo) {
// Makes sure arg0 can be converted to int. // Makes sure arg0 can be converted to int.
int n = arg0; int n = arg0;
...@@ -3427,7 +3427,7 @@ supports that and can be viewed as an extension to `ACTION()` and ...@@ -3427,7 +3427,7 @@ supports that and can be viewed as an extension to `ACTION()` and
`ACTION_P*()`. `ACTION_P*()`.
The syntax: The syntax:
``` ```cpp
ACTION_TEMPLATE(ActionName, ACTION_TEMPLATE(ActionName,
HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
...@@ -3441,7 +3441,7 @@ integral constant, or a template. `p_i` is the name of the i-th value ...@@ -3441,7 +3441,7 @@ integral constant, or a template. `p_i` is the name of the i-th value
parameter. parameter.
Example: Example:
``` ```cpp
// DuplicateArg<k, T>(output) converts the k-th argument of the mock // DuplicateArg<k, T>(output) converts the k-th argument of the mock
// function to type T and copies it to *output. // function to type T and copies it to *output.
ACTION_TEMPLATE(DuplicateArg, ACTION_TEMPLATE(DuplicateArg,
...@@ -3453,13 +3453,13 @@ ACTION_TEMPLATE(DuplicateArg, ...@@ -3453,13 +3453,13 @@ ACTION_TEMPLATE(DuplicateArg,
``` ```
To create an instance of an action template, write: To create an instance of an action template, write:
``` ```cpp
ActionName<t1, ..., t_m>(v1, ..., v_n) ActionName<t1, ..., t_m>(v1, ..., v_n)
``` ```
where the `t`s are the template arguments and the where the `t`s are the template arguments and the
`v`s are the value arguments. The value argument `v`s are the value arguments. The value argument
types are inferred by the compiler. For example: types are inferred by the compiler. For example:
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
int n; int n;
...@@ -3469,7 +3469,7 @@ using ::testing::_; ...@@ -3469,7 +3469,7 @@ using ::testing::_;
If you want to explicitly specify the value argument types, you can If you want to explicitly specify the value argument types, you can
provide additional template arguments: provide additional template arguments:
``` ```cpp
ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
``` ```
where `u_i` is the desired type of `v_i`. where `u_i` is the desired type of `v_i`.
...@@ -3479,7 +3479,7 @@ number of value parameters, but not on the number of template ...@@ -3479,7 +3479,7 @@ number of value parameters, but not on the number of template
parameters. Without the restriction, the meaning of the following is parameters. Without the restriction, the meaning of the following is
unclear: unclear:
``` ```cpp
OverloadedAction<int, bool>(x); OverloadedAction<int, bool>(x);
``` ```
...@@ -3522,7 +3522,7 @@ An alternative to the `ACTION*` macros is to implement ...@@ -3522,7 +3522,7 @@ An alternative to the `ACTION*` macros is to implement
`::testing::ActionInterface<F>`, where `F` is the type of the mock `::testing::ActionInterface<F>`, where `F` is the type of the mock
function in which the action will be used. For example: function in which the action will be used. For example:
``` ```cpp
template <typename F>class ActionInterface { template <typename F>class ActionInterface {
public: public:
virtual ~ActionInterface(); virtual ~ActionInterface();
...@@ -3574,7 +3574,7 @@ If an action can be used in several types of mock functions, we say ...@@ -3574,7 +3574,7 @@ If an action can be used in several types of mock functions, we say
it's _polymorphic_. The `MakePolymorphicAction()` function template it's _polymorphic_. The `MakePolymorphicAction()` function template
makes it easy to define such an action: makes it easy to define such an action:
``` ```cpp
namespace testing { namespace testing {
template <typename Impl> template <typename Impl>
...@@ -3587,7 +3587,7 @@ As an example, let's define an action that returns the second argument ...@@ -3587,7 +3587,7 @@ As an example, let's define an action that returns the second argument
in the mock function's argument list. The first step is to define an in the mock function's argument list. The first step is to define an
implementation class: implementation class:
``` ```cpp
class ReturnSecondArgumentAction { class ReturnSecondArgumentAction {
public: public:
template <typename Result, typename ArgumentTuple> template <typename Result, typename ArgumentTuple>
...@@ -3611,7 +3611,7 @@ Next, we use `MakePolymorphicAction()` to turn an instance of the ...@@ -3611,7 +3611,7 @@ Next, we use `MakePolymorphicAction()` to turn an instance of the
implementation class into the polymorphic action we need. It will be implementation class into the polymorphic action we need. It will be
convenient to have a wrapper for this: convenient to have a wrapper for this:
``` ```cpp
using ::testing::MakePolymorphicAction; using ::testing::MakePolymorphicAction;
using ::testing::PolymorphicAction; using ::testing::PolymorphicAction;
...@@ -3623,7 +3623,7 @@ PolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() { ...@@ -3623,7 +3623,7 @@ PolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() {
Now, you can use this polymorphic action the same way you use the Now, you can use this polymorphic action the same way you use the
built-in ones: built-in ones:
``` ```cpp
using ::testing::_; using ::testing::_;
class MockFoo : public Foo { class MockFoo : public Foo {
......
...@@ -11,7 +11,7 @@ non-trivial effort to define a custom action in Google Mock. For ...@@ -11,7 +11,7 @@ non-trivial effort to define a custom action in Google Mock. For
example, suppose you want to "increment the value pointed to by the example, suppose you want to "increment the value pointed to by the
second argument of the mock function and return it", you could write: second argument of the mock function and return it", you could write:
``` ```cpp
int IncrementArg1(Unused, int* p, Unused) { int IncrementArg1(Unused, int* p, Unused) {
return ++(*p); return ++(*p);
} }
...@@ -28,7 +28,7 @@ There are several things unsatisfactory about this approach: ...@@ -28,7 +28,7 @@ There are several things unsatisfactory about this approach:
The latter two problems can be overcome using `MakePolymorphicAction()`, The latter two problems can be overcome using `MakePolymorphicAction()`,
but it requires much more boilerplate code: but it requires much more boilerplate code:
``` ```cpp
class IncrementArg1Action { class IncrementArg1Action {
public: public:
template <typename Result, typename ArgumentTuple> template <typename Result, typename ArgumentTuple>
...@@ -50,7 +50,7 @@ boiler-plate C++ requires. ...@@ -50,7 +50,7 @@ boiler-plate C++ requires.
## Solution ## ## Solution ##
We propose to introduce a new macro: We propose to introduce a new macro:
``` ```cpp
ACTION(name) { statements; } ACTION(name) { statements; }
``` ```
...@@ -58,11 +58,11 @@ Using this in a namespace scope will define an action with the given ...@@ -58,11 +58,11 @@ Using this in a namespace scope will define an action with the given
name that executes the statements. Inside the statements, you can name that executes the statements. Inside the statements, you can
refer to the K-th (0-based) argument of the mock function as `argK`. refer to the K-th (0-based) argument of the mock function as `argK`.
For example: For example:
``` ```cpp
ACTION(IncrementArg1) { return ++(*arg1); } ACTION(IncrementArg1) { return ++(*arg1); }
``` ```
allows you to write allows you to write
``` ```cpp
... WillOnce(IncrementArg1()); ... WillOnce(IncrementArg1());
``` ```
...@@ -73,7 +73,7 @@ your code is still type-safe though: you'll get a compiler error if ...@@ -73,7 +73,7 @@ your code is still type-safe though: you'll get a compiler error if
`++(*arg1)` isn't compatible with the mock function's return type. `++(*arg1)` isn't compatible with the mock function's return type.
Another example: Another example:
``` ```cpp
ACTION(Foo) { ACTION(Foo) {
(*arg2)(5); (*arg2)(5);
Blah(); Blah();
...@@ -88,18 +88,20 @@ with 5, calls function `Blah()`, sets the value pointed to by argument ...@@ -88,18 +88,20 @@ with 5, calls function `Blah()`, sets the value pointed to by argument
For more convenience and flexibility, you can also use the following For more convenience and flexibility, you can also use the following
pre-defined symbols in the body of `ACTION`: pre-defined symbols in the body of `ACTION`:
| Argument | Description |
|:----------------|:-------------------------------------------------------------|
| `argK_type` | The type of the K-th (0-based) argument of the mock function | | `argK_type` | The type of the K-th (0-based) argument of the mock function |
|:------------|:-------------------------------------------------------------|
| `args` | All arguments of the mock function as a tuple | | `args` | All arguments of the mock function as a tuple |
| `args_type` | The type of all arguments of the mock function as a tuple | | `args_type` | The type of all arguments of the mock function as a tuple |
| `return_type` | The return type of the mock function | | `return_type` | The return type of the mock function |
| `function_type` | The type of the mock function | | `function_type` | The type of the mock function |
For example, when using an `ACTION` as a stub action for mock function: For example, when using an `ACTION` as a stub action for mock function:
``` ```cpp
int DoSomething(bool flag, int* ptr); int DoSomething(bool flag, int* ptr);
``` ```
we have: we have:
| **Pre-defined Symbol** | **Is Bound To** | | **Pre-defined Symbol** | **Is Bound To** |
|:-----------------------|:----------------| |:-----------------------|:----------------|
| `arg0` | the value of `flag` | | `arg0` | the value of `flag` |
...@@ -115,16 +117,16 @@ we have: ...@@ -115,16 +117,16 @@ we have:
Sometimes you'll want to parameterize the action. For that we propose Sometimes you'll want to parameterize the action. For that we propose
another macro another macro
``` ```cpp
ACTION_P(name, param) { statements; } ACTION_P(name, param) { statements; }
``` ```
For example, For example,
``` ```cpp
ACTION_P(Add, n) { return arg0 + n; } ACTION_P(Add, n) { return arg0 + n; }
``` ```
will allow you to write will allow you to write
``` ```cpp
// Returns argument #0 + 5. // Returns argument #0 + 5.
... WillOnce(Add(5)); ... WillOnce(Add(5));
``` ```
...@@ -140,7 +142,7 @@ parameter as inferred by the compiler. ...@@ -140,7 +142,7 @@ parameter as inferred by the compiler.
We will also provide `ACTION_P2`, `ACTION_P3`, and etc to support We will also provide `ACTION_P2`, `ACTION_P3`, and etc to support
multi-parameter actions. For example, multi-parameter actions. For example,
``` ```cpp
ACTION_P2(ReturnDistanceTo, x, y) { ACTION_P2(ReturnDistanceTo, x, y) {
double dx = arg0 - x; double dx = arg0 - x;
double dy = arg1 - y; double dy = arg1 - y;
...@@ -148,7 +150,7 @@ ACTION_P2(ReturnDistanceTo, x, y) { ...@@ -148,7 +150,7 @@ ACTION_P2(ReturnDistanceTo, x, y) {
} }
``` ```
lets you write lets you write
``` ```cpp
... WillOnce(ReturnDistanceTo(5.0, 26.5)); ... WillOnce(ReturnDistanceTo(5.0, 26.5));
``` ```
...@@ -160,7 +162,7 @@ number of parameters is 0. ...@@ -160,7 +162,7 @@ number of parameters is 0.
### Overloading Actions ### ### Overloading Actions ###
You can easily define actions overloaded on the number of parameters: You can easily define actions overloaded on the number of parameters:
``` ```cpp
ACTION_P(Plus, a) { ... } ACTION_P(Plus, a) { ... }
ACTION_P2(Plus, a, b) { ... } ACTION_P2(Plus, a, b) { ... }
``` ```
...@@ -173,7 +175,7 @@ parameters. Instead, we let the compiler infer the types for us. ...@@ -173,7 +175,7 @@ parameters. Instead, we let the compiler infer the types for us.
Sometimes, however, we may want to be more explicit about the types. Sometimes, however, we may want to be more explicit about the types.
There are several tricks to do that. For example: There are several tricks to do that. For example:
``` ```cpp
ACTION(Foo) { ACTION(Foo) {
// Makes sure arg0 can be converted to int. // Makes sure arg0 can be converted to int.
int n = arg0; int n = arg0;
...@@ -197,7 +199,7 @@ If you are writing a function that returns an `ACTION` object, you'll ...@@ -197,7 +199,7 @@ If you are writing a function that returns an `ACTION` object, you'll
need to know its type. The type depends on the macro used to define need to know its type. The type depends on the macro used to define
the action and the parameter types. The rule is relatively simple: the action and the parameter types. The rule is relatively simple:
| **Given Definition** | **Expression** | **Has Type** | | **Given Definition** | **Expression** | **Has Type** |
|:---------------------|:---------------|:-------------| |:-------------------------|:-----------------------------|:-------------------------|
| `ACTION(Foo)` | `Foo()` | `FooAction` | | `ACTION(Foo)` | `Foo()` | `FooAction` |
| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP<int>` | | `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP<int>` |
| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2<bool, int>` | | `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2<bool, int>` |
...@@ -262,14 +264,14 @@ available, we may want to support using lambdas as actions. ...@@ -262,14 +264,14 @@ available, we may want to support using lambdas as actions.
Once the macros for defining actions are implemented, we plan to do Once the macros for defining actions are implemented, we plan to do
the same for matchers: the same for matchers:
``` ```cpp
MATCHER(name) { statements; } MATCHER(name) { statements; }
``` ```
where you can refer to the value being matched as `arg`. For example, where you can refer to the value being matched as `arg`. For example,
given: given:
``` ```cpp
MATCHER(IsPositive) { return arg > 0; } MATCHER(IsPositive) { return arg > 0; }
``` ```
......
...@@ -49,7 +49,7 @@ Using Google Mock is easy! Inside your C++ source file, just `#include` `"gtest/ ...@@ -49,7 +49,7 @@ Using Google Mock is easy! Inside your C++ source file, just `#include` `"gtest/
# A Case for Mock Turtles # # A Case for Mock Turtles #
Let's look at an example. Suppose you are developing a graphics program that relies on a LOGO-like API for drawing. How would you test that it does the right thing? Well, you can run it and compare the screen with a golden screen snapshot, but let's admit it: tests like this are expensive to run and fragile (What if you just upgraded to a shiny new graphics card that has better anti-aliasing? Suddenly you have to update all your golden images.). It would be too painful if all your tests are like this. Fortunately, you learned about Dependency Injection and know the right thing to do: instead of having your application talk to the drawing API directly, wrap the API in an interface (say, `Turtle`) and code to that interface: Let's look at an example. Suppose you are developing a graphics program that relies on a LOGO-like API for drawing. How would you test that it does the right thing? Well, you can run it and compare the screen with a golden screen snapshot, but let's admit it: tests like this are expensive to run and fragile (What if you just upgraded to a shiny new graphics card that has better anti-aliasing? Suddenly you have to update all your golden images.). It would be too painful if all your tests are like this. Fortunately, you learned about Dependency Injection and know the right thing to do: instead of having your application talk to the drawing API directly, wrap the API in an interface (say, `Turtle`) and code to that interface:
``` ```cpp
class Turtle { class Turtle {
... ...
virtual ~Turtle() {} virtual ~Turtle() {}
...@@ -83,7 +83,7 @@ Using the `Turtle` interface as example, here are the simple steps you need to f ...@@ -83,7 +83,7 @@ Using the `Turtle` interface as example, here are the simple steps you need to f
After the process, you should have something like: After the process, you should have something like:
``` ```cpp
#include "gmock/gmock.h" // Brings in Google Mock. #include "gmock/gmock.h" // Brings in Google Mock.
class MockTurtle : public Turtle { class MockTurtle : public Turtle {
public: public:
...@@ -125,7 +125,7 @@ Once you have a mock class, using it is easy. The typical work flow is: ...@@ -125,7 +125,7 @@ Once you have a mock class, using it is easy. The typical work flow is:
Here's an example: Here's an example:
``` ```cpp
#include "path/to/mock-turtle.h" #include "path/to/mock-turtle.h"
#include "gmock/gmock.h" #include "gmock/gmock.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
...@@ -171,7 +171,7 @@ Admittedly, this test is contrived and doesn't do much. You can easily achieve t ...@@ -171,7 +171,7 @@ Admittedly, this test is contrived and doesn't do much. You can easily achieve t
## Using Google Mock with Any Testing Framework ## ## Using Google Mock with Any Testing Framework ##
If you want to use something other than Google Test (e.g. [CppUnit](http://sourceforge.net/projects/cppunit/) or If you want to use something other than Google Test (e.g. [CppUnit](http://sourceforge.net/projects/cppunit/) or
[CxxTest](https://cxxtest.com/)) as your testing framework, just change the `main()` function in the previous section to: [CxxTest](https://cxxtest.com/)) as your testing framework, just change the `main()` function in the previous section to:
``` ```cpp
int main(int argc, char** argv) { int main(int argc, char** argv) {
// The following line causes Google Mock to throw an exception on failure, // The following line causes Google Mock to throw an exception on failure,
// which will be interpreted by your testing framework as a test failure. // which will be interpreted by your testing framework as a test failure.
...@@ -203,7 +203,7 @@ The key to using a mock object successfully is to set the _right expectations_ o ...@@ -203,7 +203,7 @@ The key to using a mock object successfully is to set the _right expectations_ o
## General Syntax ## ## General Syntax ##
In Google Mock we use the `EXPECT_CALL()` macro to set an expectation on a mock method. The general syntax is: In Google Mock we use the `EXPECT_CALL()` macro to set an expectation on a mock method. The general syntax is:
``` ```cpp
EXPECT_CALL(mock_object, method(matchers)) EXPECT_CALL(mock_object, method(matchers))
.Times(cardinality) .Times(cardinality)
.WillOnce(action) .WillOnce(action)
...@@ -216,7 +216,7 @@ The macro can be followed by some optional _clauses_ that provide more informati ...@@ -216,7 +216,7 @@ The macro can be followed by some optional _clauses_ that provide more informati
This syntax is designed to make an expectation read like English. For example, you can probably guess that This syntax is designed to make an expectation read like English. For example, you can probably guess that
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
EXPECT_CALL(turtle, GetX()) EXPECT_CALL(turtle, GetX())
...@@ -233,14 +233,14 @@ says that the `turtle` object's `GetX()` method will be called five times, it wi ...@@ -233,14 +233,14 @@ says that the `turtle` object's `GetX()` method will be called five times, it wi
## Matchers: What Arguments Do We Expect? ## ## Matchers: What Arguments Do We Expect? ##
When a mock function takes arguments, we must specify what arguments we are expecting; for example: When a mock function takes arguments, we must specify what arguments we are expecting; for example:
``` ```cpp
// Expects the turtle to move forward by 100 units. // Expects the turtle to move forward by 100 units.
EXPECT_CALL(turtle, Forward(100)); EXPECT_CALL(turtle, Forward(100));
``` ```
Sometimes you may not want to be too specific (Remember that talk about tests being too rigid? Over specification leads to brittle tests and obscures the intent of tests. Therefore we encourage you to specify only what's necessary - no more, no less.). If you care to check that `Forward()` will be called but aren't interested in its actual argument, write `_` as the argument, which means "anything goes": Sometimes you may not want to be too specific (Remember that talk about tests being too rigid? Over specification leads to brittle tests and obscures the intent of tests. Therefore we encourage you to specify only what's necessary - no more, no less.). If you care to check that `Forward()` will be called but aren't interested in its actual argument, write `_` as the argument, which means "anything goes":
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
// Expects the turtle to move forward. // Expects the turtle to move forward.
...@@ -251,7 +251,7 @@ EXPECT_CALL(turtle, Forward(_)); ...@@ -251,7 +251,7 @@ EXPECT_CALL(turtle, Forward(_));
A list of built-in matchers can be found in the [CheatSheet](CheatSheet.md). For example, here's the `Ge` (greater than or equal) matcher: A list of built-in matchers can be found in the [CheatSheet](CheatSheet.md). For example, here's the `Ge` (greater than or equal) matcher:
``` ```cpp
using ::testing::Ge; using ::testing::Ge;
... ...
EXPECT_CALL(turtle, Forward(Ge(100))); EXPECT_CALL(turtle, Forward(Ge(100)));
...@@ -281,7 +281,7 @@ First, if the return type of a mock function is a built-in type or a pointer, th ...@@ -281,7 +281,7 @@ First, if the return type of a mock function is a built-in type or a pointer, th
Second, if a mock function doesn't have a default action, or the default action doesn't suit you, you can specify the action to be taken each time the expectation matches using a series of `WillOnce()` clauses followed by an optional `WillRepeatedly()`. For example, Second, if a mock function doesn't have a default action, or the default action doesn't suit you, you can specify the action to be taken each time the expectation matches using a series of `WillOnce()` clauses followed by an optional `WillRepeatedly()`. For example,
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
EXPECT_CALL(turtle, GetX()) EXPECT_CALL(turtle, GetX())
...@@ -292,7 +292,7 @@ EXPECT_CALL(turtle, GetX()) ...@@ -292,7 +292,7 @@ EXPECT_CALL(turtle, GetX())
This says that `turtle.GetX()` will be called _exactly three times_ (Google Mock inferred this from how many `WillOnce()` clauses we've written, since we didn't explicitly write `Times()`), and will return 100, 200, and 300 respectively. This says that `turtle.GetX()` will be called _exactly three times_ (Google Mock inferred this from how many `WillOnce()` clauses we've written, since we didn't explicitly write `Times()`), and will return 100, 200, and 300 respectively.
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
EXPECT_CALL(turtle, GetY()) EXPECT_CALL(turtle, GetY())
...@@ -309,7 +309,7 @@ What can we do inside `WillOnce()` besides `Return()`? You can return a referenc ...@@ -309,7 +309,7 @@ What can we do inside `WillOnce()` besides `Return()`? You can return a referenc
**Important note:** The `EXPECT_CALL()` statement evaluates the action clause only once, even though the action may be performed many times. Therefore you must be careful about side effects. The following may not do what you want: **Important note:** The `EXPECT_CALL()` statement evaluates the action clause only once, even though the action may be performed many times. Therefore you must be careful about side effects. The following may not do what you want:
``` ```cpp
int n = 100; int n = 100;
EXPECT_CALL(turtle, GetX()) EXPECT_CALL(turtle, GetX())
.Times(4) .Times(4)
...@@ -320,7 +320,7 @@ Instead of returning 100, 101, 102, ..., consecutively, this mock function will ...@@ -320,7 +320,7 @@ Instead of returning 100, 101, 102, ..., consecutively, this mock function will
Time for another quiz! What do you think the following means? Time for another quiz! What do you think the following means?
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
EXPECT_CALL(turtle, GetY()) EXPECT_CALL(turtle, GetY())
...@@ -335,7 +335,7 @@ So far we've only shown examples where you have a single expectation. More reali ...@@ -335,7 +335,7 @@ So far we've only shown examples where you have a single expectation. More reali
By default, when a mock method is invoked, Google Mock will search the expectations in the **reverse order** they are defined, and stop when an active expectation that matches the arguments is found (you can think of it as "newer rules override older ones."). If the matching expectation cannot take any more calls, you will get an upper-bound-violated failure. Here's an example: By default, when a mock method is invoked, Google Mock will search the expectations in the **reverse order** they are defined, and stop when an active expectation that matches the arguments is found (you can think of it as "newer rules override older ones."). If the matching expectation cannot take any more calls, you will get an upper-bound-violated failure. Here's an example:
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
EXPECT_CALL(turtle, Forward(_)); // #1 EXPECT_CALL(turtle, Forward(_)); // #1
...@@ -352,7 +352,7 @@ By default, an expectation can match a call even though an earlier expectation h ...@@ -352,7 +352,7 @@ By default, an expectation can match a call even though an earlier expectation h
Sometimes, you may want all the expected calls to occur in a strict order. To say this in Google Mock is easy: Sometimes, you may want all the expected calls to occur in a strict order. To say this in Google Mock is easy:
``` ```cpp
using ::testing::InSequence; using ::testing::InSequence;
... ...
TEST(FooTest, DrawsLineSegment) { TEST(FooTest, DrawsLineSegment) {
...@@ -379,7 +379,7 @@ Now let's do a quick quiz to see how well you can use this mock stuff already. H ...@@ -379,7 +379,7 @@ Now let's do a quick quiz to see how well you can use this mock stuff already. H
After you've come up with your answer, take a look at ours and compare notes (solve it yourself first - don't cheat!): After you've come up with your answer, take a look at ours and compare notes (solve it yourself first - don't cheat!):
``` ```cpp
using ::testing::_; using ::testing::_;
... ...
EXPECT_CALL(turtle, GoTo(_, _)) // #1 EXPECT_CALL(turtle, GoTo(_, _)) // #1
...@@ -394,7 +394,7 @@ This example shows that **expectations in Google Mock are "sticky" by default**, ...@@ -394,7 +394,7 @@ This example shows that **expectations in Google Mock are "sticky" by default**,
Simple? Let's see if you've really understood it: what does the following code say? Simple? Let's see if you've really understood it: what does the following code say?
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
for (int i = n; i > 0; i--) { for (int i = n; i > 0; i--) {
...@@ -407,7 +407,7 @@ If you think it says that `turtle.GetX()` will be called `n` times and will retu ...@@ -407,7 +407,7 @@ If you think it says that `turtle.GetX()` will be called `n` times and will retu
One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is to explicitly say that the expectations are _not_ sticky. In other words, they should _retire_ as soon as they are saturated: One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is to explicitly say that the expectations are _not_ sticky. In other words, they should _retire_ as soon as they are saturated:
``` ```cpp
using ::testing::Return; using ::testing::Return;
... ...
for (int i = n; i > 0; i--) { for (int i = n; i > 0; i--) {
...@@ -419,7 +419,7 @@ for (int i = n; i > 0; i--) { ...@@ -419,7 +419,7 @@ for (int i = n; i > 0; i--) {
And, there's a better way to do it: in this case, we expect the calls to occur in a specific order, and we line up the actions to match the order. Since the order is important here, we should make it explicit using a sequence: And, there's a better way to do it: in this case, we expect the calls to occur in a specific order, and we line up the actions to match the order. Since the order is important here, we should make it explicit using a sequence:
``` ```cpp
using ::testing::InSequence; using ::testing::InSequence;
using ::testing::Return; using ::testing::Return;
... ...
......
...@@ -27,7 +27,7 @@ later. Fortunately, it's usually not hard to migrate an existing ...@@ -27,7 +27,7 @@ later. Fortunately, it's usually not hard to migrate an existing
matcher to the new API. Here's what you need to do: matcher to the new API. Here's what you need to do:
If you wrote your matcher like this: If you wrote your matcher like this:
``` ```cpp
// Old matcher definition that doesn't work with the latest // Old matcher definition that doesn't work with the latest
// Google Mock. // Google Mock.
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
...@@ -44,7 +44,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> { ...@@ -44,7 +44,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> {
``` ```
you'll need to change it to: you'll need to change it to:
``` ```cpp
// New matcher definition that works with the latest Google Mock. // New matcher definition that works with the latest Google Mock.
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
...@@ -65,7 +65,7 @@ argument of type `MatchResultListener*`.) ...@@ -65,7 +65,7 @@ argument of type `MatchResultListener*`.)
If you were also using `ExplainMatchResultTo()` to improve the matcher If you were also using `ExplainMatchResultTo()` to improve the matcher
message: message:
``` ```cpp
// Old matcher definition that doesn't work with the lastest // Old matcher definition that doesn't work with the lastest
// Google Mock. // Google Mock.
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
...@@ -91,7 +91,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> { ...@@ -91,7 +91,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> {
you should move the logic of `ExplainMatchResultTo()` into you should move the logic of `ExplainMatchResultTo()` into
`MatchAndExplain()`, using the `MatchResultListener` argument where `MatchAndExplain()`, using the `MatchResultListener` argument where
the `::std::ostream` was used: the `::std::ostream` was used:
``` ```cpp
// New matcher definition that works with the latest Google Mock. // New matcher definition that works with the latest Google Mock.
using ::testing::MatcherInterface; using ::testing::MatcherInterface;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
...@@ -110,7 +110,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> { ...@@ -110,7 +110,7 @@ class MyWonderfulMatcher : public MatcherInterface<MyType> {
``` ```
If your matcher is defined using `MakePolymorphicMatcher()`: If your matcher is defined using `MakePolymorphicMatcher()`:
``` ```cpp
// Old matcher definition that doesn't work with the latest // Old matcher definition that doesn't work with the latest
// Google Mock. // Google Mock.
using ::testing::MakePolymorphicMatcher; using ::testing::MakePolymorphicMatcher;
...@@ -130,7 +130,7 @@ class MyGreatMatcher { ...@@ -130,7 +130,7 @@ class MyGreatMatcher {
you should rename the `Matches()` method to `MatchAndExplain()` and you should rename the `Matches()` method to `MatchAndExplain()` and
add a `MatchResultListener*` argument (the same as what you need to do add a `MatchResultListener*` argument (the same as what you need to do
for matchers defined by implementing `MatcherInterface`): for matchers defined by implementing `MatcherInterface`):
``` ```cpp
// New matcher definition that works with the latest Google Mock. // New matcher definition that works with the latest Google Mock.
using ::testing::MakePolymorphicMatcher; using ::testing::MakePolymorphicMatcher;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
...@@ -150,7 +150,7 @@ class MyGreatMatcher { ...@@ -150,7 +150,7 @@ class MyGreatMatcher {
If your polymorphic matcher uses `ExplainMatchResultTo()` for better If your polymorphic matcher uses `ExplainMatchResultTo()` for better
failure messages: failure messages:
``` ```cpp
// Old matcher definition that doesn't work with the latest // Old matcher definition that doesn't work with the latest
// Google Mock. // Google Mock.
using ::testing::MakePolymorphicMatcher; using ::testing::MakePolymorphicMatcher;
...@@ -176,7 +176,7 @@ void ExplainMatchResultTo(const MyGreatMatcher& matcher, ...@@ -176,7 +176,7 @@ void ExplainMatchResultTo(const MyGreatMatcher& matcher,
you'll need to move the logic inside `ExplainMatchResultTo()` to you'll need to move the logic inside `ExplainMatchResultTo()` to
`MatchAndExplain()`: `MatchAndExplain()`:
``` ```cpp
// New matcher definition that works with the latest Google Mock. // New matcher definition that works with the latest Google Mock.
using ::testing::MakePolymorphicMatcher; using ::testing::MakePolymorphicMatcher;
using ::testing::MatchResultListener; using ::testing::MatchResultListener;
...@@ -254,7 +254,7 @@ C++ as much as possible. ...@@ -254,7 +254,7 @@ C++ as much as possible.
## MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? ## ## MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? ##
If you compile this using Microsoft Visual C++ 2005 SP1: If you compile this using Microsoft Visual C++ 2005 SP1:
``` ```cpp
class Foo { class Foo {
... ...
virtual void Bar(const int i) = 0; virtual void Bar(const int i) = 0;
...@@ -279,7 +279,7 @@ warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous v ...@@ -279,7 +279,7 @@ warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous v
In C++, if you _declare_ a function with a `const` parameter, the In C++, if you _declare_ a function with a `const` parameter, the
`const` modifier is _ignored_. Therefore, the `Foo` base class above `const` modifier is _ignored_. Therefore, the `Foo` base class above
is equivalent to: is equivalent to:
``` ```cpp
class Foo { class Foo {
... ...
virtual void Bar(int i) = 0; // int or const int? Makes no difference. virtual void Bar(int i) = 0; // int or const int? Makes no difference.
...@@ -298,7 +298,7 @@ Note that we are talking about the _top-level_ `const` modifier here. ...@@ -298,7 +298,7 @@ Note that we are talking about the _top-level_ `const` modifier here.
If the function parameter is passed by pointer or reference, declaring If the function parameter is passed by pointer or reference, declaring
the _pointee_ or _referee_ as `const` is still meaningful. For the _pointee_ or _referee_ as `const` is still meaningful. For
example, the following two declarations are _not_ equivalent: example, the following two declarations are _not_ equivalent:
``` ```cpp
void Bar(int* p); // Neither p nor *p is const. void Bar(int* p); // Neither p nor *p is const.
void Bar(const int* p); // p is not const, but *p is. void Bar(const int* p); // p is not const, but *p is.
``` ```
...@@ -318,7 +318,7 @@ you'll gain insights on why the expectations you set are not met. ...@@ -318,7 +318,7 @@ you'll gain insights on why the expectations you set are not met.
## How can I assert that a function is NEVER called? ## ## How can I assert that a function is NEVER called? ##
``` ```cpp
EXPECT_CALL(foo, Bar(_)) EXPECT_CALL(foo, Bar(_))
.Times(0); .Times(0);
``` ```
...@@ -345,7 +345,7 @@ Whenever you derive from a base class, make sure its destructor is ...@@ -345,7 +345,7 @@ Whenever you derive from a base class, make sure its destructor is
virtual. Otherwise Bad Things will happen. Consider the following virtual. Otherwise Bad Things will happen. Consider the following
code: code:
``` ```cpp
class Base { class Base {
public: public:
// Not virtual, but should be. // Not virtual, but should be.
...@@ -375,7 +375,7 @@ will be happy. ...@@ -375,7 +375,7 @@ will be happy.
When people complain about this, often they are referring to code like: When people complain about this, often they are referring to code like:
``` ```cpp
// foo.Bar() should be called twice, return 1 the first time, and return // foo.Bar() should be called twice, return 1 the first time, and return
// 2 the second time. However, I have to write the expectations in the // 2 the second time. However, I have to write the expectations in the
// reverse order. This sucks big time!!! // reverse order. This sucks big time!!!
...@@ -399,7 +399,7 @@ harder to do so. ...@@ -399,7 +399,7 @@ harder to do so.
There are two better ways to write the test spec. You could either There are two better ways to write the test spec. You could either
put the expectations in sequence: put the expectations in sequence:
``` ```cpp
// foo.Bar() should be called twice, return 1 the first time, and return // foo.Bar() should be called twice, return 1 the first time, and return
// 2 the second time. Using a sequence, we can write the expectations // 2 the second time. Using a sequence, we can write the expectations
// in their natural order. // in their natural order.
...@@ -416,7 +416,7 @@ put the expectations in sequence: ...@@ -416,7 +416,7 @@ put the expectations in sequence:
or you can put the sequence of actions in the same expectation: or you can put the sequence of actions in the same expectation:
``` ```cpp
// foo.Bar() should be called twice, return 1 the first time, and return // foo.Bar() should be called twice, return 1 the first time, and return
// 2 the second time. // 2 the second time.
EXPECT_CALL(foo, Bar()) EXPECT_CALL(foo, Bar())
...@@ -450,14 +450,14 @@ may creep in unnoticed. ...@@ -450,14 +450,14 @@ may creep in unnoticed.
If, however, you are sure that the calls are OK, you can write If, however, you are sure that the calls are OK, you can write
``` ```cpp
EXPECT_CALL(foo, Bar(_)) EXPECT_CALL(foo, Bar(_))
.WillRepeatedly(...); .WillRepeatedly(...);
``` ```
instead of instead of
``` ```cpp
ON_CALL(foo, Bar(_)) ON_CALL(foo, Bar(_))
.WillByDefault(...); .WillByDefault(...);
``` ```
...@@ -488,12 +488,12 @@ extent, Google Mock's syntax was chosen for several practical advantages it ...@@ -488,12 +488,12 @@ extent, Google Mock's syntax was chosen for several practical advantages it
has. has.
Try to mock a function that takes a map as an argument: Try to mock a function that takes a map as an argument:
``` ```cpp
virtual int GetSize(const map<int, std::string>& m); virtual int GetSize(const map<int, std::string>& m);
``` ```
Using the proposed syntax, it would be: Using the proposed syntax, it would be:
``` ```cpp
MOCK_METHOD1(GetSize, int, const map<int, std::string>& m); MOCK_METHOD1(GetSize, int, const map<int, std::string>& m);
``` ```
...@@ -503,7 +503,7 @@ around this you can use `typedef` to give the map type a name, but ...@@ -503,7 +503,7 @@ around this you can use `typedef` to give the map type a name, but
that gets in the way of your work. Google Mock's syntax avoids this that gets in the way of your work. Google Mock's syntax avoids this
problem as the function's argument types are protected inside a pair problem as the function's argument types are protected inside a pair
of parentheses: of parentheses:
``` ```cpp
// This compiles fine. // This compiles fine.
MOCK_METHOD1(GetSize, int(const map<int, std::string>& m)); MOCK_METHOD1(GetSize, int(const map<int, std::string>& m));
``` ```
......
...@@ -115,12 +115,13 @@ pulled into the main build with `add_subdirectory()`. For example: ...@@ -115,12 +115,13 @@ pulled into the main build with `add_subdirectory()`. For example:
New file `CMakeLists.txt.in`: New file `CMakeLists.txt.in`:
cmake_minimum_required(VERSION 2.8.2) ``` cmake
cmake_minimum_required(VERSION 2.8.2)
project(googletest-download NONE) project(googletest-download NONE)
include(ExternalProject) include(ExternalProject)
ExternalProject_Add(googletest ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest.git GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master GIT_TAG master
SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src"
...@@ -129,46 +130,49 @@ New file `CMakeLists.txt.in`: ...@@ -129,46 +130,49 @@ New file `CMakeLists.txt.in`:
BUILD_COMMAND "" BUILD_COMMAND ""
INSTALL_COMMAND "" INSTALL_COMMAND ""
TEST_COMMAND "" TEST_COMMAND ""
) )
```
Existing build's `CMakeLists.txt`: Existing build's `CMakeLists.txt`:
# Download and unpack googletest at configure time ``` cmake
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) # Download and unpack googletest at configure time
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download ) WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
if(result) if(result)
message(FATAL_ERROR "CMake step for googletest failed: ${result}") message(FATAL_ERROR "CMake step for googletest failed: ${result}")
endif() endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build . execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download ) WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
if(result) if(result)
message(FATAL_ERROR "Build step for googletest failed: ${result}") message(FATAL_ERROR "Build step for googletest failed: ${result}")
endif() endif()
# Prevent overriding the parent project's compiler/linker # Prevent overriding the parent project's compiler/linker
# settings on Windows # settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Add googletest directly to our build. This defines # Add googletest directly to our build. This defines
# the gtest and gtest_main targets. # the gtest and gtest_main targets.
add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
${CMAKE_BINARY_DIR}/googletest-build ${CMAKE_BINARY_DIR}/googletest-build
EXCLUDE_FROM_ALL) EXCLUDE_FROM_ALL)
# The gtest/gtest_main targets carry header search path # The gtest/gtest_main targets carry header search path
# dependencies automatically when using CMake 2.8.11 or # dependencies automatically when using CMake 2.8.11 or
# later. Otherwise we have to add them here ourselves. # later. Otherwise we have to add them here ourselves.
if (CMAKE_VERSION VERSION_LESS 2.8.11) if (CMAKE_VERSION VERSION_LESS 2.8.11)
include_directories("${gtest_SOURCE_DIR}/include") include_directories("${gtest_SOURCE_DIR}/include")
endif() endif()
# Now simply link against gtest or gtest_main as needed. Eg # Now simply link against gtest or gtest_main as needed. Eg
add_executable(example example.cpp) add_executable(example example.cpp)
target_link_libraries(example gtest_main) target_link_libraries(example gtest_main)
add_test(NAME example_test COMMAND example) add_test(NAME example_test COMMAND example)
```
Note that this approach requires CMake 2.8.2 or later due to its use of the Note that this approach requires CMake 2.8.2 or later due to its use of the
`ExternalProject_Add()` command. The above technique is discussed in more detail `ExternalProject_Add()` command. The above technique is discussed in more detail
......
...@@ -19,7 +19,7 @@ all examples here we assume you want to compile the sample ...@@ -19,7 +19,7 @@ all examples here we assume you want to compile the sample
Using `pkg-config` in CMake is fairly easy: Using `pkg-config` in CMake is fairly easy:
``` ``` cmake
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0048 NEW)
...@@ -102,7 +102,7 @@ test('first_and_only_test', testapp) ...@@ -102,7 +102,7 @@ test('first_and_only_test', testapp)
Since `pkg-config` is a small Unix command-line utility, it can be used Since `pkg-config` is a small Unix command-line utility, it can be used
in handwritten `Makefile`s too: in handwritten `Makefile`s too:
``` ``` Makefile
GTEST_CFLAGS = `pkg-config --cflags gtest_main` GTEST_CFLAGS = `pkg-config --cflags gtest_main`
GTEST_LIBS = `pkg-config --libs gtest_main` GTEST_LIBS = `pkg-config --libs gtest_main`
......
...@@ -71,7 +71,7 @@ $if i == 0 [[ ...@@ -71,7 +71,7 @@ $if i == 0 [[
will be translated by the Pump compiler to: will be translated by the Pump compiler to:
``` ``` cpp
// Foo0 does blah for 0-ary predicates. // Foo0 does blah for 0-ary predicates.
template <size_t N> template <size_t N>
class Foo0 { class Foo0 {
...@@ -107,7 +107,7 @@ $$ The text between i and [[ is the separator between iterations. ...@@ -107,7 +107,7 @@ $$ The text between i and [[ is the separator between iterations.
will generate one of the following lines (without the comments), depending on the value of `n`: will generate one of the following lines (without the comments), depending on the value of `n`:
``` ``` cpp
Func(); // If n is 0. Func(); // If n is 0.
Func(a1); // If n is 1. Func(a1); // If n is 1.
Func(a1 + a2); // If n is 2. Func(a1 + a2); // If n is 2.
...@@ -140,7 +140,7 @@ up in your output. ...@@ -140,7 +140,7 @@ up in your output.
## Grammar ## ## Grammar ##
``` ``` ebnf
code ::= atomic_code* code ::= atomic_code*
atomic_code ::= $var id = exp atomic_code ::= $var id = exp
| $var id = [[ code ]] | $var id = [[ code ]]
......
...@@ -471,7 +471,7 @@ If a fatal failure happens the subsequent steps will be skipped. ...@@ -471,7 +471,7 @@ If a fatal failure happens the subsequent steps will be skipped.
> >
> Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than > Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than
> once conflicts with some advanced googletest features (e.g. thread-safe [death > once conflicts with some advanced googletest features (e.g. thread-safe [death
> tests](advanced#death-tests)) and thus is not supported. > tests](advanced.md#death-tests)) and thus is not supported.
**Availability**: Linux, Windows, Mac. **Availability**: Linux, Windows, Mac.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment