Update documentation to syntax highlight code
This commit is contained in:
parent
c7a8998556
commit
de9675986f
|
@ -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 {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
(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 {
|
||||||
|
|
||||||
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.
|
||||||
## 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 {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
(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
|
||||||
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,8 +81,8 @@ 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) {
|
||||||
MockFoo foo; // #2
|
MockFoo foo; // #2
|
||||||
|
@ -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();
|
||||||
```
|
```
|
||||||
|
|
||||||
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))
|
||||||
|
|
||||||
`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
|
||||||
`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:
|
||||||
|`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,11 +194,12 @@ 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 |
|
||||||
|:-------------------|:----------------------------------------------------------------------------------------------|
|
|:-------------------|:---------------------------------------------------------------------------------------------------------|
|
||||||
|`FloatEq(a_float)` |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. |
|
|`DoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal. |
|
||||||
|`NanSensitiveDoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. |
|
|`FloatEq(a_float)` |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. |
|
||||||
|`NanSensitiveFloatEq(a_float)`|`argument` is a `float` value approximately equal to `a_float`, 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. |
|
||||||
|
|
||||||
The above matchers use ULP-based comparison (the same as used in
|
The above matchers use ULP-based comparison (the same as used in
|
||||||
[Google Test](../../googletest/)). They
|
[Google Test](../../googletest/)). They
|
||||||
|
@ -206,26 +209,28 @@ 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 |
|
||||||
|:----------------------|:-----------------------------------------------|
|
|:----------------------|:--------------------------------------------------|
|
||||||
|`EndsWith(suffix)` |`argument` ends with string `suffix`. |
|
|`ContainsRegex(string)`|`argument` matches the given regular expression. |
|
||||||
|`HasSubstr(string)` |`argument` contains `string` as a sub-string. |
|
|`EndsWith(suffix)` |`argument` ends with string `suffix`. |
|
||||||
|
|`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.|
|
||||||
|`StartsWith(prefix)` |`argument` starts with string `prefix`. |
|
|`StartsWith(prefix)` |`argument` starts with string `prefix`. |
|
||||||
|`StrCaseEq(string)` |`argument` is equal to `string`, ignoring case. |
|
|`StrCaseEq(string)` |`argument` is equal to `string`, ignoring case. |
|
||||||
|`StrCaseNe(string)` |`argument` is not equal to `string`, ignoring case.|
|
|`StrCaseNe(string)` |`argument` is not equal to `string`, ignoring case.|
|
||||||
|`StrEq(string)` |`argument` is equal to `string`. |
|
|`StrEq(string)` |`argument` is equal to `string`. |
|
||||||
|`StrNe(string)` |`argument` is not equal to `string`. |
|
|`StrNe(string)` |`argument` is not equal to `string`. |
|
||||||
|
|
||||||
`ContainsRegex()` and `MatchesRegex()` use the regular expression
|
`ContainsRegex()` and `MatchesRegex()` use the regular expression
|
||||||
syntax defined
|
syntax defined
|
||||||
|
@ -240,18 +245,19 @@ 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. |
|
||||||
| `ElementsAreArray({ e0, e1, ..., en })`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |
|
| `ElementsAreArray({ e0, e1, ..., en })`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |
|
||||||
| `IsEmpty()` | `argument` is an empty container (`container.empty()`). |
|
| `IsEmpty()` | `argument` is an empty container (`container.empty()`). |
|
||||||
| `Pointwise(m, container)` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. |
|
| `Pointwise(m, container)` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. |
|
||||||
| `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. |
|
| `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. |
|
||||||
| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under some permutation each element matches an `ei` (for a different `i`), which can be a value or a matcher. 0 to 10 arguments are allowed. |
|
| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under some permutation each element matches an `ei` (for a different `i`), which can be a value or a matcher. 0 to 10 arguments are allowed. |
|
||||||
| `UnorderedElementsAreArray({ e0, e1, ..., en })`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |
|
| `UnorderedElementsAreArray({ e0, e1, ..., en })`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. |
|
||||||
| `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements `1`, `2`, and `3`, ignoring order. |
|
| `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements `1`, `2`, and `3`, ignoring order. |
|
||||||
| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater<int>(), ElementsAre(3, 2, 1))`. |
|
| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater<int>(), ElementsAre(3, 2, 1))`. |
|
||||||
|
|
||||||
Notes:
|
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));
|
||||||
|
|
||||||
## 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"
|
||||||
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)`:
|
||||||
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:
|
||||||
|
|
||||||
## 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,77 +375,83 @@ 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 |
|
||||||
|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------|
|
|:-----------------------------|:-----------------------------------------------------------------------------------------------------------------------------|
|
||||||
|`IgnoreResult(a)` |Perform action `a` and ignore its result. `a` must not return void. |
|
|`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. |
|
||||||
|`WithArg<N>(a)` |Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. |
|
|`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. |
|
||||||
|`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. |
|
||||||
|`WithoutArgs(a)` |Perform action `a` without any arguments. |
|
|`WithoutArgs(a)` |Perform action `a` without any arguments. |
|
||||||
|
|
||||||
## Defining Actions ##
|
## Defining Actions ##
|
||||||
|
|
||||||
| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. |
|
| Matcher | Description |
|
||||||
|:--------------------------------------|:---------------------------------------------------------------------------------------|
|
|:----------------------------------------------|:------------------------------------------------------------------------------------------|
|
||||||
| `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(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. |
|
||||||
| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. |
|
| `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`. |
|
||||||
|
|
||||||
The `ACTION*` macros cannot be used inside a function or class.
|
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.
|
||||||
|
|
||||||
## 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
|
||||||
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>
|
||||||
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_
|
||||||
`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.)
|
||||||
# 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);
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
# 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. |
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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:
|
||||||
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.
|
||||||
## 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
|
||||||
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
|
||||||
`++(*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
|
||||||
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`:
|
||||||
|
|
||||||
| `argK_type` | The type of the K-th (0-based) argument of the mock function |
|
| Argument | Description |
|
||||||
|:------------|:-------------------------------------------------------------|
|
|:----------------|:-------------------------------------------------------------|
|
||||||
| `args` | All arguments of the mock function as a tuple |
|
| `argK_type` | The type of the K-th (0-based) argument of the mock function |
|
||||||
| `args_type` | The type of all arguments of the mock function as a tuple |
|
| `args` | All arguments of the mock function as a tuple |
|
||||||
| `return_type` | The return type of the mock function |
|
| `args_type` | The type of all arguments of the mock function as a tuple |
|
||||||
|
| `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:
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
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) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
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.
|
||||||
### 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.
|
||||||
|
|
||||||
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;
|
||||||
|
@ -196,12 +198,12 @@ Google Test (the name is chosen to match `static_assert` in C++0x).
|
||||||
If you are writing a function that returns an `ACTION` object, you'll
|
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>` |
|
||||||
| ... | ... | ... |
|
| ... | ... | ... |
|
||||||
|
|
||||||
Note that we have to pick different suffixes (`Action`, `ActionP`,
|
Note that we have to pick different suffixes (`Action`, `ActionP`,
|
||||||
`ActionP2`, and etc) for actions with different numbers of parameters,
|
`ActionP2`, and etc) for actions with different numbers of parameters,
|
||||||
|
@ -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; }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -277,4 +279,4 @@ you can use `IsPositive()` as a matcher that matches a value iff it is
|
||||||
greater than 0.
|
greater than 0.
|
||||||
|
|
||||||
We will also add `MATCHER_P`, `MATCHER_P2`, and etc for parameterized
|
We will also add `MATCHER_P`, `MATCHER_P2`, and etc for parameterized
|
||||||
matchers.
|
matchers.
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
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
|
||||||
## 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
|
||||||
## 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
|
||||||
|
|
||||||
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
|
||||||
## 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(_));
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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())
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
**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
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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**,
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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--) {
|
||||||
|
|
||||||
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
|
||||||
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> {
|
||||||
```
|
```
|
||||||
|
|
||||||
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*`.)
|
||||||
|
|
||||||
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> {
|
||||||
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> {
|
||||||
```
|
```
|
||||||
|
|
||||||
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 {
|
||||||
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 {
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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.
|
||||||
## 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
|
||||||
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.
|
||||||
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.
|
||||||
|
|
||||||
## 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
|
||||||
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.
|
||||||
|
|
||||||
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.
|
||||||
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:
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
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,60 +115,64 @@ 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"
|
||||||
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
|
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
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)
|
||||||
RESULT_VARIABLE result
|
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
|
||||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
|
RESULT_VARIABLE result
|
||||||
if(result)
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
|
||||||
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
|
if(result)
|
||||||
endif()
|
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} --build .
|
endif()
|
||||||
RESULT_VARIABLE result
|
execute_process(COMMAND ${CMAKE_COMMAND} --build .
|
||||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
|
RESULT_VARIABLE result
|
||||||
if(result)
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
|
||||||
message(FATAL_ERROR "Build step for googletest failed: ${result}")
|
if(result)
|
||||||
endif()
|
message(FATAL_ERROR "Build step for googletest failed: ${result}")
|
||||||
|
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
|
||||||
|
|
||||||
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)
|
||||||
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 [[
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
## 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 ]]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user