Unverified Commit 990bf4ff by Gennadiy Civil Committed by GitHub

Merge branch 'master' into fix-gmock-pkgconfig

parents 79875d32 3787a483
...@@ -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`:
| `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: ...@@ -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;
...@@ -196,12 +198,12 @@ Google Test (the name is chosen to match `static_assert` in C++0x). ...@@ -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. ...@@ -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 ...@@ -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.
\ No newline at end of file
...@@ -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,60 +115,64 @@ pulled into the main build with `add_subdirectory()`. For example: ...@@ -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)
ExternalProject_Add(googletest include(ExternalProject)
GIT_REPOSITORY https://github.com/google/googletest.git ExternalProject_Add(googletest
GIT_TAG master GIT_REPOSITORY https://github.com/google/googletest.git
SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" GIT_TAG master
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src"
CONFIGURE_COMMAND "" BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
BUILD_COMMAND "" CONFIGURE_COMMAND ""
INSTALL_COMMAND "" BUILD_COMMAND ""
TEST_COMMAND "" INSTALL_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
# settings on Windows # Prevent overriding the parent project's compiler/linker
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) # settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Add googletest directly to our build. This defines
# the gtest and gtest_main targets. # Add googletest directly to our build. This defines
add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src # the gtest and gtest_main targets.
${CMAKE_BINARY_DIR}/googletest-build add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
EXCLUDE_FROM_ALL) ${CMAKE_BINARY_DIR}/googletest-build
EXCLUDE_FROM_ALL)
# The gtest/gtest_main targets carry header search path
# dependencies automatically when using CMake 2.8.11 or # The gtest/gtest_main targets carry header search path
# later. Otherwise we have to add them here ourselves. # dependencies automatically when using CMake 2.8.11 or
if (CMAKE_VERSION VERSION_LESS 2.8.11) # later. Otherwise we have to add them here ourselves.
include_directories("${gtest_SOURCE_DIR}/include") if (CMAKE_VERSION VERSION_LESS 2.8.11)
endif() include_directories("${gtest_SOURCE_DIR}/include")
endif()
# Now simply link against gtest or gtest_main as needed. Eg
add_executable(example example.cpp) # Now simply link against gtest or gtest_main as needed. Eg
target_link_libraries(example gtest_main) add_executable(example example.cpp)
add_test(NAME example_test COMMAND example) target_link_libraries(example gtest_main)
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