Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
fdb57f85
Unverified
Commit
fdb57f85
authored
Apr 11, 2018
by
Gennadiy Civil
Committed by
GitHub
Apr 11, 2018
Browse files
Merge pull request #1561 from gennadiycivil/master
Merging gmock-actions
parents
62736472
373481c5
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
74 additions
and
18 deletions
+74
-18
googlemock/include/gmock/gmock-actions.h
googlemock/include/gmock/gmock-actions.h
+73
-17
googlemock/src/gmock-internal-utils.cc
googlemock/src/gmock-internal-utils.cc
+1
-1
No files found.
googlemock/include/gmock/gmock-actions.h
View file @
fdb57f85
...
@@ -360,14 +360,20 @@ class Action {
...
@@ -360,14 +360,20 @@ class Action {
// Constructs a null Action. Needed for storing Action objects in
// Constructs a null Action. Needed for storing Action objects in
// STL containers.
// STL containers.
Action
()
:
impl_
(
NULL
)
{}
Action
()
{}
// Constructs an Action from its implementation. A NULL impl is
#if GTEST_LANG_CXX11
// used to represent the "do-default" action.
// Construct an Action from a specified callable.
explicit
Action
(
ActionInterface
<
F
>*
impl
)
:
impl_
(
impl
)
{}
// This cannot take std::function directly, because then Action would not be
// directly constructible from lambda (it would require two conversions).
template
<
typename
G
,
typename
=
typename
::
std
::
enable_if
<
::
std
::
is_constructible
<::
std
::
function
<
F
>,
G
>::
value
>::
type
>
Action
(
G
&&
fun
)
:
fun_
(
::
std
::
forward
<
G
>
(
fun
))
{}
// NOLINT
#endif
// Co
py co
nstruct
or
.
// Construct
s an Action from its implementation
.
Action
(
const
Action
&
action
)
:
impl_
(
action
.
impl
_
)
{}
explicit
Action
(
ActionInterface
<
F
>*
impl
)
:
impl_
(
impl
)
{}
// This constructor allows us to turn an Action<Func> object into an
// This constructor allows us to turn an Action<Func> object into an
// Action<F>, as long as F's arguments can be implicitly converted
// Action<F>, as long as F's arguments can be implicitly converted
...
@@ -377,7 +383,13 @@ class Action {
...
@@ -377,7 +383,13 @@ class Action {
explicit
Action
(
const
Action
<
Func
>&
action
);
explicit
Action
(
const
Action
<
Func
>&
action
);
// Returns true iff this is the DoDefault() action.
// Returns true iff this is the DoDefault() action.
bool
IsDoDefault
()
const
{
return
impl_
.
get
()
==
NULL
;
}
bool
IsDoDefault
()
const
{
#if GTEST_LANG_CXX11
return
impl_
==
nullptr
&&
fun_
==
nullptr
;
#else
return
impl_
==
NULL
;
#endif
}
// Performs the action. Note that this method is const even though
// Performs the action. Note that this method is const even though
// the corresponding method in ActionInterface is not. The reason
// the corresponding method in ActionInterface is not. The reason
...
@@ -385,14 +397,15 @@ class Action {
...
@@ -385,14 +397,15 @@ class Action {
// another concrete action, not that the concrete action it binds to
// another concrete action, not that the concrete action it binds to
// cannot change state. (Think of the difference between a const
// cannot change state. (Think of the difference between a const
// pointer and a pointer to const.)
// pointer and a pointer to const.)
Result
Perform
(
const
ArgumentTuple
&
args
)
const
{
Result
Perform
(
ArgumentTuple
args
)
const
{
internal
::
Assert
(
if
(
IsDoDefault
())
{
!
IsDoDefault
(),
__FILE__
,
__LINE__
,
internal
::
IllegalDoDefault
(
__FILE__
,
__LINE__
);
"You are using DoDefault() inside a composite action like "
}
"DoAll() or WithArgs(). This is not supported for technical "
#if GTEST_LANG_CXX11
"reasons. Please instead spell out the default action, or "
if
(
fun_
!=
nullptr
)
{
"assign the default action to an Action variable and use "
return
internal
::
Apply
(
fun_
,
::
std
::
move
(
args
));
"the variable in various places."
);
}
#endif
return
impl_
->
Perform
(
args
);
return
impl_
->
Perform
(
args
);
}
}
...
@@ -400,6 +413,18 @@ class Action {
...
@@ -400,6 +413,18 @@ class Action {
template
<
typename
F1
,
typename
F2
>
template
<
typename
F1
,
typename
F2
>
friend
class
internal
::
ActionAdaptor
;
friend
class
internal
::
ActionAdaptor
;
template
<
typename
G
>
friend
class
Action
;
// In C++11, Action can be implemented either as a generic functor (through
// std::function), or legacy ActionInterface. In C++98, only ActionInterface
// is available. The invariants are as follows:
// * in C++98, impl_ is null iff this is the default action
// * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff
// this is the default action
#if GTEST_LANG_CXX11
::
std
::
function
<
F
>
fun_
;
#endif
internal
::
linked_ptr
<
ActionInterface
<
F
>
>
impl_
;
internal
::
linked_ptr
<
ActionInterface
<
F
>
>
impl_
;
};
};
...
@@ -531,6 +556,9 @@ struct ByMoveWrapper {
...
@@ -531,6 +556,9 @@ struct ByMoveWrapper {
// statement, and conversion of the result of Return to Action<T(U)> is a
// statement, and conversion of the result of Return to Action<T(U)> is a
// good place for that.
// good place for that.
//
//
// The real life example of the above scenario happens when an invocation
// of gtl::Container() is passed into Return.
//
template
<
typename
R
>
template
<
typename
R
>
class
ReturnAction
{
class
ReturnAction
{
public:
public:
...
@@ -750,7 +778,7 @@ class DoDefaultAction {
...
@@ -750,7 +778,7 @@ class DoDefaultAction {
// This template type conversion operator allows DoDefault() to be
// This template type conversion operator allows DoDefault() to be
// used in any function.
// used in any function.
template
<
typename
F
>
template
<
typename
F
>
operator
Action
<
F
>
()
const
{
return
Action
<
F
>
(
NULL
);
}
operator
Action
<
F
>
()
const
{
return
Action
<
F
>
();
}
// NOLINT
};
};
// Implements the Assign action to set a given pointer referent to a
// Implements the Assign action to set a given pointer referent to a
...
@@ -886,6 +914,28 @@ class InvokeMethodWithoutArgsAction {
...
@@ -886,6 +914,28 @@ class InvokeMethodWithoutArgsAction {
GTEST_DISALLOW_ASSIGN_
(
InvokeMethodWithoutArgsAction
);
GTEST_DISALLOW_ASSIGN_
(
InvokeMethodWithoutArgsAction
);
};
};
// Implements the InvokeWithoutArgs(callback) action.
template
<
typename
CallbackType
>
class
InvokeCallbackWithoutArgsAction
{
public:
// The c'tor takes ownership of the callback.
explicit
InvokeCallbackWithoutArgsAction
(
CallbackType
*
callback
)
:
callback_
(
callback
)
{
callback
->
CheckIsRepeatable
();
// Makes sure the callback is permanent.
}
// This type conversion operator template allows Invoke(callback) to
// be used wherever the callback's return type can be implicitly
// converted to that of the mock function.
template
<
typename
Result
,
typename
ArgumentTuple
>
Result
Perform
(
const
ArgumentTuple
&
)
const
{
return
callback_
->
Run
();
}
private:
const
internal
::
linked_ptr
<
CallbackType
>
callback_
;
GTEST_DISALLOW_ASSIGN_
(
InvokeCallbackWithoutArgsAction
);
};
// Implements the IgnoreResult(action) action.
// Implements the IgnoreResult(action) action.
template
<
typename
A
>
template
<
typename
A
>
class
IgnoreResultAction
{
class
IgnoreResultAction
{
...
@@ -1053,7 +1103,13 @@ typedef internal::IgnoredValue Unused;
...
@@ -1053,7 +1103,13 @@ typedef internal::IgnoredValue Unused;
template
<
typename
To
>
template
<
typename
To
>
template
<
typename
From
>
template
<
typename
From
>
Action
<
To
>::
Action
(
const
Action
<
From
>&
from
)
Action
<
To
>::
Action
(
const
Action
<
From
>&
from
)
:
impl_
(
new
internal
::
ActionAdaptor
<
To
,
From
>
(
from
))
{}
:
#if GTEST_LANG_CXX11
fun_
(
from
.
fun_
),
#endif
impl_
(
from
.
impl_
==
NULL
?
NULL
:
new
internal
::
ActionAdaptor
<
To
,
From
>
(
from
))
{
}
// Creates an action that returns 'value'. 'value' is passed by value
// Creates an action that returns 'value'. 'value' is passed by value
// instead of const reference - otherwise Return("string literal")
// instead of const reference - otherwise Return("string literal")
...
...
googlemock/src/gmock-internal-utils.cc
View file @
fdb57f85
...
@@ -188,7 +188,7 @@ GTEST_API_ void Log(LogSeverity severity, const std::string& message,
...
@@ -188,7 +188,7 @@ GTEST_API_ void Log(LogSeverity severity, const std::string& message,
std
::
cout
<<
::
std
::
flush
;
std
::
cout
<<
::
std
::
flush
;
}
}
void
IllegalDoDefault
(
const
char
*
file
,
int
line
)
{
GTEST_API_
void
IllegalDoDefault
(
const
char
*
file
,
int
line
)
{
internal
::
Assert
(
internal
::
Assert
(
false
,
file
,
line
,
false
,
file
,
line
,
"You are using DoDefault() inside a composite action like "
"You are using DoDefault() inside a composite action like "
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment