Commit 68be111b by zhanyong.wan

Allows mock methods overloaded on argument number or the const-ness of this…

Allows mock methods overloaded on argument number or the const-ness of this object to appear on the same source line.
parent 62417be8
...@@ -118,7 +118,8 @@ using internal::FunctionMocker; ...@@ -118,7 +118,8 @@ using internal::FunctionMocker;
// The variable for mocking the given method. // The variable for mocking the given method.
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
#define GMOCK_MOCKER_(Method) GMOCK_CONCAT_TOKEN_(gmock_##Method##_, __LINE__) #define GMOCK_MOCKER_(arity, constness, Method) \
GMOCK_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
$for i [[ $for i [[
...@@ -134,14 +135,14 @@ $var matcher_as = [[$for j, \ ...@@ -134,14 +135,14 @@ $var matcher_as = [[$for j, \
GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \ GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \
tn ::testing::internal::Function<F>::ArgumentTuple>::value == $i, \ tn ::testing::internal::Function<F>::ArgumentTuple>::value == $i, \
this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \ this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \
GMOCK_MOCKER_(Method).SetOwnerAndName(this, #Method); \ GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \
return GMOCK_MOCKER_(Method).Invoke($as); \ return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \
} \ } \
::testing::MockSpec<F>& \ ::testing::MockSpec<F>& \
gmock_##Method($matcher_as) constness { \ gmock_##Method($matcher_as) constness { \
return GMOCK_MOCKER_(Method).RegisterOwner(this).With($as); \ return GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this).With($as); \
} \ } \
mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(Method) mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_($i, constness, Method)
]] ]]
......
...@@ -422,5 +422,45 @@ TEST(TemplateMockTestWithCallType, Works) { ...@@ -422,5 +422,45 @@ TEST(TemplateMockTestWithCallType, Works) {
} }
#endif // GTEST_OS_WINDOWS #endif // GTEST_OS_WINDOWS
#define MY_MOCK_METHODS1_ \
MOCK_METHOD0(Overloaded, void()); \
MOCK_CONST_METHOD1(Overloaded, int(int n)); \
MOCK_METHOD2(Overloaded, bool(bool f, int n))
class MockOverloadedOnArgNumber {
public:
MY_MOCK_METHODS1_;
};
TEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
MockOverloadedOnArgNumber mock;
EXPECT_CALL(mock, Overloaded());
EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));
mock.Overloaded();
EXPECT_EQ(2, mock.Overloaded(1));
EXPECT_TRUE(mock.Overloaded(true, 1));
}
#define MY_MOCK_METHODS2_ \
MOCK_CONST_METHOD1(Overloaded, int(int n)); \
MOCK_METHOD1(Overloaded, int(int n));
class MockOverloadedOnConstness {
public:
MY_MOCK_METHODS2_;
};
TEST(OverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
MockOverloadedOnConstness mock;
const MockOverloadedOnConstness* const_mock = &mock;
EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));
EXPECT_EQ(2, mock.Overloaded(1));
EXPECT_EQ(3, const_mock->Overloaded(1));
}
} // namespace gmock_generated_function_mockers_test } // namespace gmock_generated_function_mockers_test
} // namespace testing } // namespace testing
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment