mirror of
https://github.com/google/googletest.git
synced 2025-03-19 10:23:48 +00:00
merging,
This commit is contained in:
parent
1114a0202a
commit
b539167cf0
@ -332,6 +332,58 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Removes the given pointer; this is a helper for the expectation setter method
|
||||||
|
// for parameterless matchers.
|
||||||
|
//
|
||||||
|
// We want to make sure that the user cannot set a parameterless expectation on
|
||||||
|
// overloaded methods, including methods which are overloaded on const. Example:
|
||||||
|
//
|
||||||
|
// class MockClass {
|
||||||
|
// MOCK_METHOD0(GetName, string&());
|
||||||
|
// MOCK_CONST_METHOD0(GetName, const string&());
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// TEST() {
|
||||||
|
// // This should be an error, as it's not clear which overload is expected.
|
||||||
|
// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Here are the generated expectation-setter methods:
|
||||||
|
//
|
||||||
|
// class MockClass {
|
||||||
|
// // Overload 1
|
||||||
|
// MockSpec<string&()> gmock_GetName() { … }
|
||||||
|
// // Overload 2. Declared const so that the compiler will generate an
|
||||||
|
// // error when trying to resolve between this and overload 4 in
|
||||||
|
// // 'gmock_GetName(WithoutMatchers(), nullptr)'.
|
||||||
|
// MockSpec<string&()> gmock_GetName(
|
||||||
|
// const WithoutMatchers&, const Function<string&()>*) const {
|
||||||
|
// // Removes const from this, calls overload 1
|
||||||
|
// return AdjustConstness_(this)->gmock_GetName();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Overload 3
|
||||||
|
// const string& gmock_GetName() const { … }
|
||||||
|
// // Overload 4
|
||||||
|
// MockSpec<const string&()> gmock_GetName(
|
||||||
|
// const WithoutMatchers&, const Function<const string&()>*) const {
|
||||||
|
// // Does not remove const, calls overload 3
|
||||||
|
// return AdjustConstness_const(this)->gmock_GetName();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
template <typename MockType>
|
||||||
|
const MockType* AdjustConstness_const(const MockType* mock) {
|
||||||
|
return mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes const from and returns the given pointer; this is a helper for the
|
||||||
|
// expectation setter method for parameterless matchers.
|
||||||
|
template <typename MockType>
|
||||||
|
MockType* AdjustConstness_(const MockType* mock) {
|
||||||
|
return const_cast<MockType*>(mock);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// The style guide prohibits "using" statements in a namespace scope
|
// The style guide prohibits "using" statements in a namespace scope
|
||||||
@ -365,367 +417,534 @@ using internal::FunctionMocker;
|
|||||||
GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
|
GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method() constness { \
|
||||||
) constness { \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
__VA_ARGS__>::ArgumentTuple>::value == 0), \
|
||||||
== 0), \
|
this_method_does_not_take_0_arguments); \
|
||||||
this_method_does_not_take_0_arguments); \
|
GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \
|
return GMOCK_MOCKER_(0, constness, Method).Invoke(); \
|
||||||
return GMOCK_MOCKER_(0, constness, Method).Invoke(); \
|
} \
|
||||||
} \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method() constness { \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \
|
||||||
gmock_##Method() constness { \
|
return GMOCK_MOCKER_(0, constness, Method).With(); \
|
||||||
GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \
|
} \
|
||||||
return GMOCK_MOCKER_(0, constness, Method).With(); \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
} \
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(); \
|
||||||
|
} \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \
|
||||||
Method)
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
== 1), \
|
__VA_ARGS__>::ArgumentTuple>::value == 1), \
|
||||||
this_method_does_not_take_1_argument); \
|
this_method_does_not_take_1_argument); \
|
||||||
GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \
|
GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
return GMOCK_MOCKER_(1, constness, \
|
return GMOCK_MOCKER_(1, constness, Method) \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
__VA_ARGS__)>(gmock_a1)); \
|
gmock_a1)); \
|
||||||
} \
|
} \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
|
||||||
GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \
|
GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \
|
||||||
return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \
|
return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \
|
||||||
} \
|
} \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
Method)
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2) constness { \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness { \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
== 2), \
|
__VA_ARGS__>::ArgumentTuple>::value == 2), \
|
||||||
this_method_does_not_take_2_arguments); \
|
this_method_does_not_take_2_arguments); \
|
||||||
GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \
|
GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
return GMOCK_MOCKER_(2, constness, \
|
return GMOCK_MOCKER_(2, constness, Method) \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2)); \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
} \
|
gmock_a2)); \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
} \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \
|
||||||
return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \
|
GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \
|
||||||
} \
|
return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \
|
} \
|
||||||
Method)
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
__VA_ARGS__) gmock_a3) constness { \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness { \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
== 3), \
|
__VA_ARGS__>::ArgumentTuple>::value == 3), \
|
||||||
this_method_does_not_take_3_arguments); \
|
this_method_does_not_take_3_arguments); \
|
||||||
GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \
|
GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
return GMOCK_MOCKER_(3, constness, \
|
return GMOCK_MOCKER_(3, constness, Method) \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3)); \
|
gmock_a2), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a3)); \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
} \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \
|
||||||
gmock_a3); \
|
GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \
|
||||||
} \
|
return GMOCK_MOCKER_(3, constness, Method) \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \
|
.With(gmock_a1, gmock_a2, gmock_a3); \
|
||||||
Method)
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
== 4), \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
this_method_does_not_take_4_arguments); \
|
__VA_ARGS__>::ArgumentTuple>::value == 4), \
|
||||||
GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \
|
this_method_does_not_take_4_arguments); \
|
||||||
return GMOCK_MOCKER_(4, constness, \
|
GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
return GMOCK_MOCKER_(4, constness, Method) \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4)); \
|
gmock_a2), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a3), \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
gmock_a4)); \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
} \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
gmock_a3, gmock_a4); \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \
|
GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \
|
||||||
Method)
|
return GMOCK_MOCKER_(4, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5) constness { \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness { \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
== 5), \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
this_method_does_not_take_5_arguments); \
|
__VA_ARGS__>::ArgumentTuple>::value == 5), \
|
||||||
GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \
|
this_method_does_not_take_5_arguments); \
|
||||||
return GMOCK_MOCKER_(5, constness, \
|
GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
return GMOCK_MOCKER_(5, constness, Method) \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5)); \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
} \
|
gmock_a3), \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
gmock_a4), \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
gmock_a5)); \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
} \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
gmock_a3, gmock_a4, gmock_a5); \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \
|
||||||
Method)
|
GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(5, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
__VA_ARGS__) gmock_a6) constness { \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness { \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
== 6), \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
this_method_does_not_take_6_arguments); \
|
__VA_ARGS__>::ArgumentTuple>::value == 6), \
|
||||||
GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \
|
this_method_does_not_take_6_arguments); \
|
||||||
return GMOCK_MOCKER_(6, constness, \
|
GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
return GMOCK_MOCKER_(6, constness, Method) \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6)); \
|
gmock_a3), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a4), \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
gmock_a5), \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
gmock_a6)); \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
} \
|
||||||
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
gmock_a3, gmock_a4, gmock_a5, gmock_a6); \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
Method)
|
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \
|
||||||
|
GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(6, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
|
||||||
== 7), \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
this_method_does_not_take_7_arguments); \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \
|
__VA_ARGS__>::ArgumentTuple>::value == 7), \
|
||||||
return GMOCK_MOCKER_(7, constness, \
|
this_method_does_not_take_7_arguments); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
return GMOCK_MOCKER_(7, constness, Method) \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7)); \
|
gmock_a3), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a4), \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
gmock_a5), \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
gmock_a6), \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
gmock_a7)); \
|
||||||
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
|
} \
|
||||||
GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
Method)
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
|
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
|
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
|
||||||
|
GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(7, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \
|
||||||
|
gmock_a7); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
__VA_ARGS__) gmock_a8) constness { \
|
GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness { \
|
||||||
== 8), \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
this_method_does_not_take_8_arguments); \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \
|
__VA_ARGS__>::ArgumentTuple>::value == 8), \
|
||||||
return GMOCK_MOCKER_(8, constness, \
|
this_method_does_not_take_8_arguments); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
return GMOCK_MOCKER_(8, constness, Method) \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \
|
gmock_a3), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8)); \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
} \
|
gmock_a4), \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
gmock_a5), \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
gmock_a6), \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
gmock_a7), \
|
||||||
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
gmock_a8)); \
|
||||||
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \
|
} \
|
||||||
GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
Method)
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
|
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
|
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
|
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \
|
||||||
|
GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(8, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \
|
||||||
|
gmock_a7, gmock_a8); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
__VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, \
|
GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
__VA_ARGS__) gmock_a9) constness { \
|
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness { \
|
||||||
== 9), \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
this_method_does_not_take_9_arguments); \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \
|
__VA_ARGS__>::ArgumentTuple>::value == 9), \
|
||||||
return GMOCK_MOCKER_(9, constness, \
|
this_method_does_not_take_9_arguments); \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
return GMOCK_MOCKER_(9, constness, Method) \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \
|
gmock_a3), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9)); \
|
gmock_a4), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a5), \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
gmock_a6), \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
gmock_a7), \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
gmock_a8), \
|
||||||
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
|
gmock_a9)); \
|
||||||
GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \
|
} \
|
||||||
GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
gmock_a9); \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
Method)
|
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
|
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
|
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
|
||||||
|
GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \
|
||||||
|
GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(9, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \
|
||||||
|
gmock_a7, gmock_a8, gmock_a9); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) \
|
||||||
GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \
|
ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
__VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \
|
GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
__VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \
|
GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
__VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \
|
GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \
|
GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
|
GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \
|
||||||
tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
|
GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \
|
||||||
== 10), \
|
GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \
|
||||||
this_method_does_not_take_10_arguments); \
|
GTEST_COMPILE_ASSERT_( \
|
||||||
GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \
|
(::testing::tuple_size<tn ::testing::internal::Function< \
|
||||||
return GMOCK_MOCKER_(10, constness, \
|
__VA_ARGS__>::ArgumentTuple>::value == 10), \
|
||||||
Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \
|
this_method_does_not_take_10_arguments); \
|
||||||
__VA_ARGS__)>(gmock_a1), \
|
GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \
|
return GMOCK_MOCKER_(10, constness, Method) \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \
|
.Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \
|
gmock_a1), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \
|
gmock_a2), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \
|
gmock_a3), \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9), \
|
::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
|
||||||
::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>(gmock_a10)); \
|
gmock_a4), \
|
||||||
} \
|
::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
|
||||||
::testing::MockSpec<__VA_ARGS__> \
|
gmock_a5), \
|
||||||
gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
gmock_a6), \
|
||||||
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
gmock_a7), \
|
||||||
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
gmock_a8), \
|
||||||
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
|
gmock_a9), \
|
||||||
GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \
|
::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>( \
|
||||||
GMOCK_MATCHER_(tn, 10, \
|
gmock_a10)); \
|
||||||
__VA_ARGS__) gmock_a10) constness { \
|
} \
|
||||||
GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \
|
GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
|
||||||
gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \
|
GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
|
||||||
gmock_a10); \
|
GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
|
||||||
} \
|
GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \
|
GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
|
||||||
Method)
|
GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
|
||||||
|
GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
|
||||||
|
GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
|
||||||
|
GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \
|
||||||
|
GMOCK_MATCHER_(tn, 10, __VA_ARGS__) gmock_a10) constness { \
|
||||||
|
GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \
|
||||||
|
return GMOCK_MOCKER_(10, constness, Method) \
|
||||||
|
.With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \
|
||||||
|
gmock_a7, gmock_a8, gmock_a9, gmock_a10); \
|
||||||
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>*) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this) \
|
||||||
|
->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(), \
|
||||||
|
::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>()); \
|
||||||
|
} \
|
||||||
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \
|
||||||
|
Method)
|
||||||
|
|
||||||
#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)
|
#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)
|
||||||
#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)
|
#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)
|
||||||
|
@ -94,6 +94,58 @@ class FunctionMocker<R($As)> : public
|
|||||||
|
|
||||||
|
|
||||||
]]
|
]]
|
||||||
|
// Removes the given pointer; this is a helper for the expectation setter method
|
||||||
|
// for parameterless matchers.
|
||||||
|
//
|
||||||
|
// We want to make sure that the user cannot set a parameterless expectation on
|
||||||
|
// overloaded methods, including methods which are overloaded on const. Example:
|
||||||
|
//
|
||||||
|
// class MockClass {
|
||||||
|
// MOCK_METHOD0(GetName, string&());
|
||||||
|
// MOCK_CONST_METHOD0(GetName, const string&());
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// TEST() {
|
||||||
|
// // This should be an error, as it's not clear which overload is expected.
|
||||||
|
// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Here are the generated expectation-setter methods:
|
||||||
|
//
|
||||||
|
// class MockClass {
|
||||||
|
// // Overload 1
|
||||||
|
// MockSpec<string&()> gmock_GetName() { … }
|
||||||
|
// // Overload 2. Declared const so that the compiler will generate an
|
||||||
|
// // error when trying to resolve between this and overload 4 in
|
||||||
|
// // 'gmock_GetName(WithoutMatchers(), nullptr)'.
|
||||||
|
// MockSpec<string&()> gmock_GetName(
|
||||||
|
// const WithoutMatchers&, const Function<string&()>*) const {
|
||||||
|
// // Removes const from this, calls overload 1
|
||||||
|
// return AdjustConstness_(this)->gmock_GetName();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Overload 3
|
||||||
|
// const string& gmock_GetName() const { … }
|
||||||
|
// // Overload 4
|
||||||
|
// MockSpec<const string&()> gmock_GetName(
|
||||||
|
// const WithoutMatchers&, const Function<const string&()>*) const {
|
||||||
|
// // Does not remove const, calls overload 3
|
||||||
|
// return AdjustConstness_const(this)->gmock_GetName();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
template <typename MockType>
|
||||||
|
const MockType* AdjustConstness_const(const MockType* mock) {
|
||||||
|
return mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes const from and returns the given pointer; this is a helper for the
|
||||||
|
// expectation setter method for parameterless matchers.
|
||||||
|
template <typename MockType>
|
||||||
|
MockType* AdjustConstness_(const MockType* mock) {
|
||||||
|
return const_cast<MockType*>(mock);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// The style guide prohibits "using" statements in a namespace scope
|
// The style guide prohibits "using" statements in a namespace scope
|
||||||
@ -135,6 +187,8 @@ $var as = [[$for j, \
|
|||||||
$var matcher_arg_as = [[$for j, \
|
$var matcher_arg_as = [[$for j, \
|
||||||
[[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
|
[[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
|
||||||
$var matcher_as = [[$for j, [[gmock_a$j]]]]
|
$var matcher_as = [[$for j, [[gmock_a$j]]]]
|
||||||
|
$var anything_matchers = [[$for j, \
|
||||||
|
[[::testing::A<GMOCK_ARG_(tn, $j, __VA_ARGS__)>()]]]]
|
||||||
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
|
||||||
#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \
|
#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \
|
||||||
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
|
||||||
@ -150,6 +204,12 @@ $var matcher_as = [[$for j, [[gmock_a$j]]]]
|
|||||||
GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \
|
GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \
|
||||||
return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \
|
return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \
|
||||||
} \
|
} \
|
||||||
|
::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
|
||||||
|
const ::testing::internal::WithoutMatchers&, \
|
||||||
|
constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
|
||||||
|
return ::testing::internal::AdjustConstness_##constness(this)-> \
|
||||||
|
gmock_##Method($anything_matchers); \
|
||||||
|
} \
|
||||||
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)
|
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1718,25 +1718,27 @@ class NotMatcher {
|
|||||||
// that will prevent different instantiations of BothOfMatcher from
|
// that will prevent different instantiations of BothOfMatcher from
|
||||||
// sharing the same BothOfMatcherImpl<T> class.
|
// sharing the same BothOfMatcherImpl<T> class.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class BothOfMatcherImpl
|
class AllOfMatcherImpl
|
||||||
: public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {
|
: public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {
|
||||||
public:
|
public:
|
||||||
BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
|
explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)
|
||||||
: matcher1_(matcher1), matcher2_(matcher2) {}
|
: matchers_(internal::move(matchers)) {}
|
||||||
|
|
||||||
virtual void DescribeTo(::std::ostream* os) const {
|
virtual void DescribeTo(::std::ostream* os) const {
|
||||||
*os << "(";
|
*os << "(";
|
||||||
matcher1_.DescribeTo(os);
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
*os << ") and (";
|
if (i != 0) *os << ") and (";
|
||||||
matcher2_.DescribeTo(os);
|
matchers_[i].DescribeTo(os);
|
||||||
|
}
|
||||||
*os << ")";
|
*os << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void DescribeNegationTo(::std::ostream* os) const {
|
virtual void DescribeNegationTo(::std::ostream* os) const {
|
||||||
*os << "(";
|
*os << "(";
|
||||||
matcher1_.DescribeNegationTo(os);
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
*os << ") or (";
|
if (i != 0) *os << ") or (";
|
||||||
matcher2_.DescribeNegationTo(os);
|
matchers_[i].DescribeNegationTo(os);
|
||||||
|
}
|
||||||
*os << ")";
|
*os << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1744,93 +1746,38 @@ class BothOfMatcherImpl
|
|||||||
MatchResultListener* listener) const {
|
MatchResultListener* listener) const {
|
||||||
// If either matcher1_ or matcher2_ doesn't match x, we only need
|
// If either matcher1_ or matcher2_ doesn't match x, we only need
|
||||||
// to explain why one of them fails.
|
// to explain why one of them fails.
|
||||||
StringMatchResultListener listener1;
|
std::string all_match_result;
|
||||||
if (!matcher1_.MatchAndExplain(x, &listener1)) {
|
|
||||||
*listener << listener1.str();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringMatchResultListener listener2;
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
if (!matcher2_.MatchAndExplain(x, &listener2)) {
|
StringMatchResultListener slistener;
|
||||||
*listener << listener2.str();
|
if (matchers_[i].MatchAndExplain(x, &slistener)) {
|
||||||
return false;
|
if (all_match_result.empty()) {
|
||||||
|
all_match_result = slistener.str();
|
||||||
|
} else {
|
||||||
|
std::string result = slistener.str();
|
||||||
|
if (!result.empty()) {
|
||||||
|
all_match_result += ", and ";
|
||||||
|
all_match_result += result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*listener << slistener.str();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise we need to explain why *both* of them match.
|
// Otherwise we need to explain why *both* of them match.
|
||||||
const std::string s1 = listener1.str();
|
*listener << all_match_result;
|
||||||
const std::string s2 = listener2.str();
|
|
||||||
|
|
||||||
if (s1 == "") {
|
|
||||||
*listener << s2;
|
|
||||||
} else {
|
|
||||||
*listener << s1;
|
|
||||||
if (s2 != "") {
|
|
||||||
*listener << ", and " << s2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Matcher<T> matcher1_;
|
const std::vector<Matcher<T> > matchers_;
|
||||||
const Matcher<T> matcher2_;
|
|
||||||
|
|
||||||
GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl);
|
GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if GTEST_LANG_CXX11
|
#if GTEST_LANG_CXX11
|
||||||
// MatcherList provides mechanisms for storing a variable number of matchers in
|
|
||||||
// a list structure (ListType) and creating a combining matcher from such a
|
|
||||||
// list.
|
|
||||||
// The template is defined recursively using the following template parameters:
|
|
||||||
// * kSize is the length of the MatcherList.
|
|
||||||
// * Head is the type of the first matcher of the list.
|
|
||||||
// * Tail denotes the types of the remaining matchers of the list.
|
|
||||||
template <int kSize, typename Head, typename... Tail>
|
|
||||||
struct MatcherList {
|
|
||||||
typedef MatcherList<kSize - 1, Tail...> MatcherListTail;
|
|
||||||
typedef ::std::pair<Head, typename MatcherListTail::ListType> ListType;
|
|
||||||
|
|
||||||
// BuildList stores variadic type values in a nested pair structure.
|
|
||||||
// Example:
|
|
||||||
// MatcherList<3, int, string, float>::BuildList(5, "foo", 2.0) will return
|
|
||||||
// the corresponding result of type pair<int, pair<string, float>>.
|
|
||||||
static ListType BuildList(const Head& matcher, const Tail&... tail) {
|
|
||||||
return ListType(matcher, MatcherListTail::BuildList(tail...));
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMatcher<T> creates a Matcher<T> from a given list of matchers (built
|
|
||||||
// by BuildList()). CombiningMatcher<T> is used to combine the matchers of the
|
|
||||||
// list. CombiningMatcher<T> must implement MatcherInterface<T> and have a
|
|
||||||
// constructor taking two Matcher<T>s as input.
|
|
||||||
template <typename T, template <typename /* T */> class CombiningMatcher>
|
|
||||||
static Matcher<T> CreateMatcher(const ListType& matchers) {
|
|
||||||
return Matcher<T>(new CombiningMatcher<T>(
|
|
||||||
SafeMatcherCast<T>(matchers.first),
|
|
||||||
MatcherListTail::template CreateMatcher<T, CombiningMatcher>(
|
|
||||||
matchers.second)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// The following defines the base case for the recursive definition of
|
|
||||||
// MatcherList.
|
|
||||||
template <typename Matcher1, typename Matcher2>
|
|
||||||
struct MatcherList<2, Matcher1, Matcher2> {
|
|
||||||
typedef ::std::pair<Matcher1, Matcher2> ListType;
|
|
||||||
|
|
||||||
static ListType BuildList(const Matcher1& matcher1,
|
|
||||||
const Matcher2& matcher2) {
|
|
||||||
return ::std::pair<Matcher1, Matcher2>(matcher1, matcher2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, template <typename /* T */> class CombiningMatcher>
|
|
||||||
static Matcher<T> CreateMatcher(const ListType& matchers) {
|
|
||||||
return Matcher<T>(new CombiningMatcher<T>(
|
|
||||||
SafeMatcherCast<T>(matchers.first),
|
|
||||||
SafeMatcherCast<T>(matchers.second)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// VariadicMatcher is used for the variadic implementation of
|
// VariadicMatcher is used for the variadic implementation of
|
||||||
// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
|
// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
|
||||||
// CombiningMatcher<T> is used to recursively combine the provided matchers
|
// CombiningMatcher<T> is used to recursively combine the provided matchers
|
||||||
@ -1839,27 +1786,40 @@ template <template <typename T> class CombiningMatcher, typename... Args>
|
|||||||
class VariadicMatcher {
|
class VariadicMatcher {
|
||||||
public:
|
public:
|
||||||
VariadicMatcher(const Args&... matchers) // NOLINT
|
VariadicMatcher(const Args&... matchers) // NOLINT
|
||||||
: matchers_(MatcherListType::BuildList(matchers...)) {}
|
: matchers_(matchers...) {
|
||||||
|
static_assert(sizeof...(Args) > 0, "Must have at least one matcher.");
|
||||||
|
}
|
||||||
|
|
||||||
// This template type conversion operator allows an
|
// This template type conversion operator allows an
|
||||||
// VariadicMatcher<Matcher1, Matcher2...> object to match any type that
|
// VariadicMatcher<Matcher1, Matcher2...> object to match any type that
|
||||||
// all of the provided matchers (Matcher1, Matcher2, ...) can match.
|
// all of the provided matchers (Matcher1, Matcher2, ...) can match.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator Matcher<T>() const {
|
operator Matcher<T>() const {
|
||||||
return MatcherListType::template CreateMatcher<T, CombiningMatcher>(
|
std::vector<Matcher<T> > values;
|
||||||
matchers_);
|
CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());
|
||||||
|
return Matcher<T>(new CombiningMatcher<T>(internal::move(values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef MatcherList<sizeof...(Args), Args...> MatcherListType;
|
template <typename T, size_t I>
|
||||||
|
void CreateVariadicMatcher(std::vector<Matcher<T> >* values,
|
||||||
|
std::integral_constant<size_t, I>) const {
|
||||||
|
values->push_back(SafeMatcherCast<T>(std::get<I>(matchers_)));
|
||||||
|
CreateVariadicMatcher<T>(values, std::integral_constant<size_t, I + 1>());
|
||||||
|
}
|
||||||
|
|
||||||
const typename MatcherListType::ListType matchers_;
|
template <typename T>
|
||||||
|
void CreateVariadicMatcher(
|
||||||
|
std::vector<Matcher<T> >*,
|
||||||
|
std::integral_constant<size_t, sizeof...(Args)>) const {}
|
||||||
|
|
||||||
|
tuple<Args...> matchers_;
|
||||||
|
|
||||||
GTEST_DISALLOW_ASSIGN_(VariadicMatcher);
|
GTEST_DISALLOW_ASSIGN_(VariadicMatcher);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
using AllOfMatcher = VariadicMatcher<BothOfMatcherImpl, Args...>;
|
using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;
|
||||||
|
|
||||||
#endif // GTEST_LANG_CXX11
|
#endif // GTEST_LANG_CXX11
|
||||||
|
|
||||||
@ -1876,8 +1836,10 @@ class BothOfMatcher {
|
|||||||
// both Matcher1 and Matcher2 can match.
|
// both Matcher1 and Matcher2 can match.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator Matcher<T>() const {
|
operator Matcher<T>() const {
|
||||||
return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_),
|
std::vector<Matcher<T> > values;
|
||||||
SafeMatcherCast<T>(matcher2_)));
|
values.push_back(SafeMatcherCast<T>(matcher1_));
|
||||||
|
values.push_back(SafeMatcherCast<T>(matcher2_));
|
||||||
|
return Matcher<T>(new AllOfMatcherImpl<T>(internal::move(values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1892,70 +1854,69 @@ class BothOfMatcher {
|
|||||||
// that will prevent different instantiations of AnyOfMatcher from
|
// that will prevent different instantiations of AnyOfMatcher from
|
||||||
// sharing the same EitherOfMatcherImpl<T> class.
|
// sharing the same EitherOfMatcherImpl<T> class.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class EitherOfMatcherImpl
|
class AnyOfMatcherImpl
|
||||||
: public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {
|
: public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {
|
||||||
public:
|
public:
|
||||||
EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
|
explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)
|
||||||
: matcher1_(matcher1), matcher2_(matcher2) {}
|
: matchers_(internal::move(matchers)) {}
|
||||||
|
|
||||||
virtual void DescribeTo(::std::ostream* os) const {
|
virtual void DescribeTo(::std::ostream* os) const {
|
||||||
*os << "(";
|
*os << "(";
|
||||||
matcher1_.DescribeTo(os);
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
*os << ") or (";
|
if (i != 0) *os << ") or (";
|
||||||
matcher2_.DescribeTo(os);
|
matchers_[i].DescribeTo(os);
|
||||||
|
}
|
||||||
*os << ")";
|
*os << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void DescribeNegationTo(::std::ostream* os) const {
|
virtual void DescribeNegationTo(::std::ostream* os) const {
|
||||||
*os << "(";
|
*os << "(";
|
||||||
matcher1_.DescribeNegationTo(os);
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
*os << ") and (";
|
if (i != 0) *os << ") and (";
|
||||||
matcher2_.DescribeNegationTo(os);
|
matchers_[i].DescribeNegationTo(os);
|
||||||
|
}
|
||||||
*os << ")";
|
*os << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,
|
virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,
|
||||||
MatchResultListener* listener) const {
|
MatchResultListener* listener) const {
|
||||||
|
std::string no_match_result;
|
||||||
|
|
||||||
// If either matcher1_ or matcher2_ matches x, we just need to
|
// If either matcher1_ or matcher2_ matches x, we just need to
|
||||||
// explain why *one* of them matches.
|
// explain why *one* of them matches.
|
||||||
StringMatchResultListener listener1;
|
for (size_t i = 0; i < matchers_.size(); ++i) {
|
||||||
if (matcher1_.MatchAndExplain(x, &listener1)) {
|
StringMatchResultListener slistener;
|
||||||
*listener << listener1.str();
|
if (matchers_[i].MatchAndExplain(x, &slistener)) {
|
||||||
return true;
|
*listener << slistener.str();
|
||||||
}
|
return true;
|
||||||
|
} else {
|
||||||
StringMatchResultListener listener2;
|
if (no_match_result.empty()) {
|
||||||
if (matcher2_.MatchAndExplain(x, &listener2)) {
|
no_match_result = slistener.str();
|
||||||
*listener << listener2.str();
|
} else {
|
||||||
return true;
|
std::string result = slistener.str();
|
||||||
|
if (!result.empty()) {
|
||||||
|
no_match_result += ", and ";
|
||||||
|
no_match_result += result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise we need to explain why *both* of them fail.
|
// Otherwise we need to explain why *both* of them fail.
|
||||||
const std::string s1 = listener1.str();
|
*listener << no_match_result;
|
||||||
const std::string s2 = listener2.str();
|
|
||||||
|
|
||||||
if (s1 == "") {
|
|
||||||
*listener << s2;
|
|
||||||
} else {
|
|
||||||
*listener << s1;
|
|
||||||
if (s2 != "") {
|
|
||||||
*listener << ", and " << s2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Matcher<T> matcher1_;
|
const std::vector<Matcher<T> > matchers_;
|
||||||
const Matcher<T> matcher2_;
|
|
||||||
|
|
||||||
GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl);
|
GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if GTEST_LANG_CXX11
|
#if GTEST_LANG_CXX11
|
||||||
// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
|
// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
using AnyOfMatcher = VariadicMatcher<EitherOfMatcherImpl, Args...>;
|
using AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;
|
||||||
|
|
||||||
#endif // GTEST_LANG_CXX11
|
#endif // GTEST_LANG_CXX11
|
||||||
|
|
||||||
@ -1973,8 +1934,10 @@ class EitherOfMatcher {
|
|||||||
// both Matcher1 and Matcher2 can match.
|
// both Matcher1 and Matcher2 can match.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator Matcher<T>() const {
|
operator Matcher<T>() const {
|
||||||
return Matcher<T>(new EitherOfMatcherImpl<T>(
|
std::vector<Matcher<T> > values;
|
||||||
SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_)));
|
values.push_back(SafeMatcherCast<T>(matcher1_));
|
||||||
|
values.push_back(SafeMatcherCast<T>(matcher2_));
|
||||||
|
return Matcher<T>(new AnyOfMatcherImpl<T>(internal::move(values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1282,6 +1282,13 @@ class MockSpec {
|
|||||||
file, line, source_text, matchers_);
|
file, line, source_text, matchers_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This operator overload is used to swallow the superfluous parameter list
|
||||||
|
// introduced by the ON/EXPECT_CALL macros. See the macro comments for more
|
||||||
|
// explanation.
|
||||||
|
MockSpec<F>& operator()(const internal::WithoutMatchers&, void* const) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename Function>
|
template <typename Function>
|
||||||
friend class internal::FunctionMocker;
|
friend class internal::FunctionMocker;
|
||||||
@ -1836,17 +1843,76 @@ inline Expectation::Expectation(internal::ExpectationBase& exp) // NOLINT
|
|||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
// A separate macro is required to avoid compile errors when the name
|
// Implementation for ON_CALL and EXPECT_CALL macros. A separate macro is
|
||||||
// of the method used in call is a result of macro expansion.
|
// required to avoid compile errors when the name of the method used in call is
|
||||||
// See CompilesWithMethodNameExpandedFromMacro tests in
|
// a result of macro expansion. See CompilesWithMethodNameExpandedFromMacro
|
||||||
// internal/gmock-spec-builders_test.cc for more details.
|
// tests in internal/gmock-spec-builders_test.cc for more details.
|
||||||
#define GMOCK_ON_CALL_IMPL_(obj, call) \
|
//
|
||||||
((obj).gmock_##call).InternalDefaultActionSetAt(__FILE__, __LINE__, \
|
// This macro supports statements both with and without parameter matchers. If
|
||||||
#obj, #call)
|
// the parameter list is omitted, gMock will accept any parameters, which allows
|
||||||
#define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call)
|
// tests to be written that don't need to encode the number of method
|
||||||
|
// parameter. This technique may only be used for non-overloaded methods.
|
||||||
|
//
|
||||||
|
// // These are the same:
|
||||||
|
// ON_CALL(mock, NoArgsMethod()).WillByDefault(…);
|
||||||
|
// ON_CALL(mock, NoArgsMethod).WillByDefault(…);
|
||||||
|
//
|
||||||
|
// // As are these:
|
||||||
|
// ON_CALL(mock, TwoArgsMethod(_, _)).WillByDefault(…);
|
||||||
|
// ON_CALL(mock, TwoArgsMethod).WillByDefault(…);
|
||||||
|
//
|
||||||
|
// // Can also specify args if you want, of course:
|
||||||
|
// ON_CALL(mock, TwoArgsMethod(_, 45)).WillByDefault(…);
|
||||||
|
//
|
||||||
|
// // Overloads work as long as you specify parameters:
|
||||||
|
// ON_CALL(mock, OverloadedMethod(_)).WillByDefault(…);
|
||||||
|
// ON_CALL(mock, OverloadedMethod(_, _)).WillByDefault(…);
|
||||||
|
//
|
||||||
|
// // Oops! Which overload did you want?
|
||||||
|
// ON_CALL(mock, OverloadedMethod).WillByDefault(…);
|
||||||
|
// => ERROR: call to member function 'gmock_OverloadedMethod' is ambiguous
|
||||||
|
//
|
||||||
|
// How this works: The mock class uses two overloads of the gmock_Method
|
||||||
|
// expectation setter method plus an operator() overload on the MockSpec object.
|
||||||
|
// In the matcher list form, the macro expands to:
|
||||||
|
//
|
||||||
|
// // This statement:
|
||||||
|
// ON_CALL(mock, TwoArgsMethod(_, 45))…
|
||||||
|
//
|
||||||
|
// // …expands to:
|
||||||
|
// mock.gmock_TwoArgsMethod(_, 45)(WithoutMatchers(), nullptr)…
|
||||||
|
// |-------------v---------------||------------v-------------|
|
||||||
|
// invokes first overload swallowed by operator()
|
||||||
|
//
|
||||||
|
// // …which is essentially:
|
||||||
|
// mock.gmock_TwoArgsMethod(_, 45)…
|
||||||
|
//
|
||||||
|
// Whereas the form without a matcher list:
|
||||||
|
//
|
||||||
|
// // This statement:
|
||||||
|
// ON_CALL(mock, TwoArgsMethod)…
|
||||||
|
//
|
||||||
|
// // …expands to:
|
||||||
|
// mock.gmock_TwoArgsMethod(WithoutMatchers(), nullptr)…
|
||||||
|
// |-----------------------v--------------------------|
|
||||||
|
// invokes second overload
|
||||||
|
//
|
||||||
|
// // …which is essentially:
|
||||||
|
// mock.gmock_TwoArgsMethod(_, _)…
|
||||||
|
//
|
||||||
|
// The WithoutMatchers() argument is used to disambiguate overloads and to
|
||||||
|
// block the caller from accidentally invoking the second overload directly. The
|
||||||
|
// second argument is an internal type derived from the method signature. The
|
||||||
|
// failure to disambiguate two overloads of this method in the ON_CALL statement
|
||||||
|
// is how we block callers from setting expectations on overloaded methods.
|
||||||
|
#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call) \
|
||||||
|
((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), NULL) \
|
||||||
|
.Setter(__FILE__, __LINE__, #mock_expr, #call)
|
||||||
|
|
||||||
#define GMOCK_EXPECT_CALL_IMPL_(obj, call) \
|
#define ON_CALL(obj, call) \
|
||||||
((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call)
|
GMOCK_ON_CALL_IMPL_(obj, InternalDefaultActionSetAt, call)
|
||||||
#define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call)
|
|
||||||
|
#define EXPECT_CALL(obj, call) \
|
||||||
|
GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)
|
||||||
|
|
||||||
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
|
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
|
||||||
|
@ -344,6 +344,21 @@ GTEST_API_ bool LogIsVisible(LogSeverity severity);
|
|||||||
GTEST_API_ void Log(LogSeverity severity, const std::string& message,
|
GTEST_API_ void Log(LogSeverity severity, const std::string& message,
|
||||||
int stack_frames_to_skip);
|
int stack_frames_to_skip);
|
||||||
|
|
||||||
|
// A marker class that is used to resolve parameterless expectations to the
|
||||||
|
// correct overload. This must not be instantiable, to prevent client code from
|
||||||
|
// accidentally resolving to the overload; for example:
|
||||||
|
//
|
||||||
|
// ON_CALL(mock, Method({}, nullptr))…
|
||||||
|
//
|
||||||
|
class WithoutMatchers {
|
||||||
|
private:
|
||||||
|
WithoutMatchers() {}
|
||||||
|
friend GTEST_API_ WithoutMatchers GetWithoutMatchers();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Internal use only: access the singleton instance of WithoutMatchers.
|
||||||
|
GTEST_API_ WithoutMatchers GetWithoutMatchers();
|
||||||
|
|
||||||
// TODO(wan@google.com): group all type utilities together.
|
// TODO(wan@google.com): group all type utilities together.
|
||||||
|
|
||||||
// Type traits.
|
// Type traits.
|
||||||
|
@ -188,6 +188,8 @@ GTEST_API_ void Log(LogSeverity severity, const std::string& message,
|
|||||||
std::cout << ::std::flush;
|
std::cout << ::std::flush;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatchers(); }
|
||||||
|
|
||||||
GTEST_API_ 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,
|
||||||
|
@ -59,13 +59,6 @@
|
|||||||
# include <forward_list> // NOLINT
|
# include <forward_list> // NOLINT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Disable MSVC2015 warning for std::pair:
|
|
||||||
// "decorated name length exceeded, name was truncated".
|
|
||||||
#if defined _MSC_VER
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable:4503)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GTEST_LANG_CXX11
|
#if GTEST_LANG_CXX11
|
||||||
# include <type_traits>
|
# include <type_traits>
|
||||||
#endif
|
#endif
|
||||||
@ -749,6 +742,13 @@ TEST(MatcherCastTest, NonImplicitlyConstructibleTypeWithOperatorEq) {
|
|||||||
EXPECT_FALSE(m3.Matches(239));
|
EXPECT_FALSE(m3.Matches(239));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConvertibleFromAny does not work with MSVC. resulting in
|
||||||
|
// error C2440: 'initializing': cannot convert from 'Eq' to 'M'
|
||||||
|
// No constructor could take the source type, or constructor overload
|
||||||
|
// resolution was ambiguous
|
||||||
|
|
||||||
|
#if !defined _MSC_VER
|
||||||
|
|
||||||
// The below ConvertibleFromAny struct is implicitly constructible from anything
|
// The below ConvertibleFromAny struct is implicitly constructible from anything
|
||||||
// and when in the same namespace can interact with other tests. In particular,
|
// and when in the same namespace can interact with other tests. In particular,
|
||||||
// if it is in the same namespace as other tests and one removes
|
// if it is in the same namespace as other tests and one removes
|
||||||
@ -761,7 +761,7 @@ namespace convertible_from_any {
|
|||||||
struct ConvertibleFromAny {
|
struct ConvertibleFromAny {
|
||||||
ConvertibleFromAny(int a_value) : value(a_value) {}
|
ConvertibleFromAny(int a_value) : value(a_value) {}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
explicit ConvertibleFromAny(const T& /*a_value*/) : value(-1) {
|
ConvertibleFromAny(const T& /*a_value*/) : value(-1) {
|
||||||
ADD_FAILURE() << "Conversion constructor called";
|
ADD_FAILURE() << "Conversion constructor called";
|
||||||
}
|
}
|
||||||
int value;
|
int value;
|
||||||
@ -789,6 +789,8 @@ TEST(MatcherCastTest, FromConvertibleFromAny) {
|
|||||||
}
|
}
|
||||||
} // namespace convertible_from_any
|
} // namespace convertible_from_any
|
||||||
|
|
||||||
|
#endif // !defined _MSC_VER
|
||||||
|
|
||||||
struct IntReferenceWrapper {
|
struct IntReferenceWrapper {
|
||||||
IntReferenceWrapper(const int& a_value) : value(&a_value) {}
|
IntReferenceWrapper(const int& a_value) : value(&a_value) {}
|
||||||
const int* value;
|
const int* value;
|
||||||
@ -893,6 +895,8 @@ TEST(SafeMatcherCastTest, FromSameType) {
|
|||||||
EXPECT_FALSE(m2.Matches(1));
|
EXPECT_FALSE(m2.Matches(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined _MSC_VER
|
||||||
|
|
||||||
namespace convertible_from_any {
|
namespace convertible_from_any {
|
||||||
TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
|
TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
|
||||||
Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
|
Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
|
||||||
@ -908,6 +912,8 @@ TEST(SafeMatcherCastTest, FromConvertibleFromAny) {
|
|||||||
}
|
}
|
||||||
} // namespace convertible_from_any
|
} // namespace convertible_from_any
|
||||||
|
|
||||||
|
#endif // !defined _MSC_VER
|
||||||
|
|
||||||
TEST(SafeMatcherCastTest, ValueIsNotCopied) {
|
TEST(SafeMatcherCastTest, ValueIsNotCopied) {
|
||||||
int n = 42;
|
int n = 42;
|
||||||
Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n);
|
Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n);
|
||||||
@ -2539,7 +2545,7 @@ TEST(AllOfTest, VariadicMatchesWhenAllMatch) {
|
|||||||
::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
|
::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
|
||||||
Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
|
Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
|
||||||
Ne(9), Ne(10), Ne(11));
|
Ne(9), Ne(10), Ne(11));
|
||||||
EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))"));
|
EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11)"));
|
||||||
AllOfMatches(11, m);
|
AllOfMatches(11, m);
|
||||||
AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
|
AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
|
||||||
Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
|
Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
|
||||||
@ -2733,7 +2739,7 @@ TEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
|
|||||||
// on ADL.
|
// on ADL.
|
||||||
Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
|
Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
|
||||||
|
|
||||||
EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))"));
|
EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11)"));
|
||||||
AnyOfMatches(11, m);
|
AnyOfMatches(11, m);
|
||||||
AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||||
@ -3093,6 +3099,44 @@ TEST(AllArgsTest, WorksInWithClause) {
|
|||||||
EXPECT_EQ(2, helper.Helper('a', 1));
|
EXPECT_EQ(2, helper.Helper('a', 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class OptionalMatchersHelper {
|
||||||
|
public:
|
||||||
|
OptionalMatchersHelper() {}
|
||||||
|
|
||||||
|
MOCK_METHOD0(NoArgs, int());
|
||||||
|
|
||||||
|
MOCK_METHOD1(OneArg, int(int y));
|
||||||
|
|
||||||
|
MOCK_METHOD2(TwoArgs, int(char x, int y));
|
||||||
|
|
||||||
|
MOCK_METHOD1(Overloaded, int(char x));
|
||||||
|
MOCK_METHOD2(Overloaded, int(char x, int y));
|
||||||
|
|
||||||
|
private:
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(OptionalMatchersHelper);
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(AllArgsTest, WorksWithoutMatchers) {
|
||||||
|
OptionalMatchersHelper helper;
|
||||||
|
|
||||||
|
ON_CALL(helper, NoArgs).WillByDefault(Return(10));
|
||||||
|
ON_CALL(helper, OneArg).WillByDefault(Return(20));
|
||||||
|
ON_CALL(helper, TwoArgs).WillByDefault(Return(30));
|
||||||
|
|
||||||
|
EXPECT_EQ(10, helper.NoArgs());
|
||||||
|
EXPECT_EQ(20, helper.OneArg(1));
|
||||||
|
EXPECT_EQ(30, helper.TwoArgs('\1', 2));
|
||||||
|
|
||||||
|
EXPECT_CALL(helper, NoArgs).Times(1);
|
||||||
|
EXPECT_CALL(helper, OneArg).WillOnce(Return(100));
|
||||||
|
EXPECT_CALL(helper, OneArg(17)).WillOnce(Return(200));
|
||||||
|
EXPECT_CALL(helper, TwoArgs).Times(0);
|
||||||
|
|
||||||
|
EXPECT_EQ(10, helper.NoArgs());
|
||||||
|
EXPECT_EQ(100, helper.OneArg(1));
|
||||||
|
EXPECT_EQ(200, helper.OneArg(17));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
|
// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
|
||||||
// matches the matcher.
|
// matches the matcher.
|
||||||
TEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
|
TEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
|
||||||
@ -6723,7 +6767,4 @@ TEST(NotTest, WorksOnMoveOnlyType) {
|
|||||||
} // namespace gmock_matchers_test
|
} // namespace gmock_matchers_test
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
#if defined_MSC_VER
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -89,6 +89,7 @@ using testing::Mock;
|
|||||||
using testing::NaggyMock;
|
using testing::NaggyMock;
|
||||||
using testing::Ne;
|
using testing::Ne;
|
||||||
using testing::Return;
|
using testing::Return;
|
||||||
|
using testing::SaveArg;
|
||||||
using testing::Sequence;
|
using testing::Sequence;
|
||||||
using testing::SetArgPointee;
|
using testing::SetArgPointee;
|
||||||
using testing::internal::ExpectationTester;
|
using testing::internal::ExpectationTester;
|
||||||
@ -2681,6 +2682,75 @@ TEST(SynchronizationTest, CanCallMockMethodInAction) {
|
|||||||
// EXPECT_CALL() did not specify an action.
|
// EXPECT_CALL() did not specify an action.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ParameterlessExpectationsTest, CanSetExpectationsWithoutMatchers) {
|
||||||
|
MockA a;
|
||||||
|
int do_a_arg0 = 0;
|
||||||
|
ON_CALL(a, DoA).WillByDefault(SaveArg<0>(&do_a_arg0));
|
||||||
|
int do_a_47_arg0 = 0;
|
||||||
|
ON_CALL(a, DoA(47)).WillByDefault(SaveArg<0>(&do_a_47_arg0));
|
||||||
|
|
||||||
|
a.DoA(17);
|
||||||
|
EXPECT_THAT(do_a_arg0, 17);
|
||||||
|
EXPECT_THAT(do_a_47_arg0, 0);
|
||||||
|
a.DoA(47);
|
||||||
|
EXPECT_THAT(do_a_arg0, 17);
|
||||||
|
EXPECT_THAT(do_a_47_arg0, 47);
|
||||||
|
|
||||||
|
ON_CALL(a, Binary).WillByDefault(Return(true));
|
||||||
|
ON_CALL(a, Binary(_, 14)).WillByDefault(Return(false));
|
||||||
|
EXPECT_THAT(a.Binary(14, 17), true);
|
||||||
|
EXPECT_THAT(a.Binary(17, 14), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ParameterlessExpectationsTest, CanSetExpectationsForOverloadedMethods) {
|
||||||
|
MockB b;
|
||||||
|
ON_CALL(b, DoB()).WillByDefault(Return(9));
|
||||||
|
ON_CALL(b, DoB(5)).WillByDefault(Return(11));
|
||||||
|
|
||||||
|
EXPECT_THAT(b.DoB(), 9);
|
||||||
|
EXPECT_THAT(b.DoB(1), 0); // default value
|
||||||
|
EXPECT_THAT(b.DoB(5), 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MockWithConstMethods {
|
||||||
|
public:
|
||||||
|
MOCK_CONST_METHOD1(Foo, int(int));
|
||||||
|
MOCK_CONST_METHOD2(Bar, int(int, const char*));
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(ParameterlessExpectationsTest, CanSetExpectationsForConstMethods) {
|
||||||
|
MockWithConstMethods mock;
|
||||||
|
ON_CALL(mock, Foo).WillByDefault(Return(7));
|
||||||
|
ON_CALL(mock, Bar).WillByDefault(Return(33));
|
||||||
|
|
||||||
|
EXPECT_THAT(mock.Foo(17), 7);
|
||||||
|
EXPECT_THAT(mock.Bar(27, "purple"), 33);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MockConstOverload {
|
||||||
|
public:
|
||||||
|
MOCK_METHOD1(Overloaded, int(int));
|
||||||
|
MOCK_CONST_METHOD1(Overloaded, int(int));
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(ParameterlessExpectationsTest,
|
||||||
|
CanSetExpectationsForConstOverloadedMethods) {
|
||||||
|
MockConstOverload mock;
|
||||||
|
ON_CALL(mock, Overloaded(_)).WillByDefault(Return(7));
|
||||||
|
ON_CALL(mock, Overloaded(5)).WillByDefault(Return(9));
|
||||||
|
ON_CALL(Const(mock), Overloaded(5)).WillByDefault(Return(11));
|
||||||
|
ON_CALL(Const(mock), Overloaded(7)).WillByDefault(Return(13));
|
||||||
|
|
||||||
|
EXPECT_THAT(mock.Overloaded(1), 7);
|
||||||
|
EXPECT_THAT(mock.Overloaded(5), 9);
|
||||||
|
EXPECT_THAT(mock.Overloaded(7), 7);
|
||||||
|
|
||||||
|
const MockConstOverload& const_mock = mock;
|
||||||
|
EXPECT_THAT(const_mock.Overloaded(1), 0);
|
||||||
|
EXPECT_THAT(const_mock.Overloaded(5), 11);
|
||||||
|
EXPECT_THAT(const_mock.Overloaded(7), 13);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// Allows the user to define their own main and then invoke gmock_main
|
// Allows the user to define their own main and then invoke gmock_main
|
||||||
|
Loading…
x
Reference in New Issue
Block a user