Fix override and nested-type issues

This commit is contained in:
nautical-exact 2026-06-14 15:31:38 -04:00
parent faf2028a33
commit 2b448fc5d6
4 changed files with 44 additions and 24 deletions

View File

@ -226,8 +226,6 @@ using internal::FunctionMocker;
_Args, _Spec) \
GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \
GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \
GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \
GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \
GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \
GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \
GMOCK_PP_NARG0 _Args, _MockClass, _MethodName, \
@ -236,7 +234,9 @@ using internal::FunctionMocker;
GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \
GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \
GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \
(GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))
(GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)), \
GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \
GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))
#define GMOCK_INTERNAL_DEFINE_MOCK_METHOD_ARG_6(...) \
GMOCK_INTERNAL_DEFINE_MOCK_METHOD_WRONG_ARITY(__VA_ARGS__)
@ -336,14 +336,13 @@ using internal::FunctionMocker;
#define GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \
_N, _MockClass, _MethodName, _Constness, _Override, _Final, _NoexceptSpec, \
_CallType, _RefSpec, _Signature) \
typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS( \
_Signature)>::Result \
GMOCK_INTERNAL_EXPAND(_CallType) _MockClass::_MethodName( \
_CallType, _RefSpec, _Signature, _InClassAssertions) \
auto GMOCK_INTERNAL_EXPAND(_CallType) _MockClass::_MethodName( \
GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \
GMOCK_PP_IF(_Constness, const, ) \
_RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \
GMOCK_PP_IF(_Final, final, ) { \
GMOCK_PP_IF(_Constness, const, ) _RefSpec _NoexceptSpec -> \
typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS( \
_Signature)>::Result { \
_InClassAssertions; \
auto& mocker = gmock_get_mocker_##_MethodName( \
::testing::internal::TypeTag<GMOCK_PP_REMOVE_PARENS( \
_Signature) GMOCK_PP_IF(_Constness, const, ) _RefSpec>{}); \
@ -351,10 +350,10 @@ using internal::FunctionMocker;
return mocker.Invoke( \
GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \
} \
::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> \
_MockClass::gmock_##_MethodName( \
GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \
GMOCK_PP_IF(_Constness, const, ) _RefSpec { \
auto _MockClass::gmock_##_MethodName( \
GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \
GMOCK_PP_IF(_Constness, const, ) \
_RefSpec->::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> { \
auto& mocker = gmock_get_mocker_##_MethodName( \
::testing::internal::TypeTag<GMOCK_PP_REMOVE_PARENS( \
_Signature) GMOCK_PP_IF(_Constness, const, ) _RefSpec>{}); \
@ -362,12 +361,11 @@ using internal::FunctionMocker;
return mocker.With( \
GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \
} \
::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> \
_MockClass::gmock_##_MethodName( \
const ::testing::internal::WithoutMatchers&, \
GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \
GMOCK_PP_REMOVE_PARENS(_Signature)>*) \
const _RefSpec _NoexceptSpec { \
auto _MockClass::gmock_##_MethodName( \
const ::testing::internal::WithoutMatchers&, \
GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \
GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec \
->::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> { \
return ::testing::internal::ThisRefAdjuster<GMOCK_PP_IF( \
_Constness, const, ) int _RefSpec>::Adjust(*this) \
.gmock_##_MethodName(GMOCK_PP_REPEAT( \
@ -1047,11 +1045,11 @@ using internal::FunctionMocker;
#define GMOCK_INTERNAL_DEFINE_MOCK_METHODN(constness, ct, Class, Method, \
args_num, ...) \
GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \
args_num, ::testing::internal::identity_t<__VA_ARGS__>); \
GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \
args_num, Class, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \
(::testing::internal::identity_t<__VA_ARGS__>))
(::testing::internal::identity_t<__VA_ARGS__>), \
GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \
args_num, ::testing::internal::identity_t<__VA_ARGS__>))
#define GMOCK_MOCKER_(arity, constness, Method) \
GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)

View File

@ -592,6 +592,9 @@ TEST(SplitMockTest, CallMockMethods) {
EXPECT_CALL(mock_split, func_legacy(16, 17)).WillOnce(Return(18));
EXPECT_CALL(mock_split, func_legacy_const(19)).WillOnce(Return(20));
EXPECT_CALL(mock_split, func_inherited(21)).WillOnce(Return(22));
EXPECT_CALL(mock_split, func_nested_typedef(23)).WillOnce(Return(24));
EXPECT_EQ(mock_split.func(1), 2);
EXPECT_EQ(std::as_const(mock_split).func_const(3), 4);
@ -603,6 +606,9 @@ TEST(SplitMockTest, CallMockMethods) {
EXPECT_EQ(mock_split.func_legacy(16, 17), 18);
EXPECT_EQ(std::as_const(mock_split).func_legacy_const(19), 20);
EXPECT_EQ(mock_split.func_inherited(21), 22);
EXPECT_EQ(mock_split.func_nested_typedef(23), 24);
}
class MockB {

View File

@ -55,3 +55,9 @@ DEFINE_MOCK_METHOD2(MockSplitDeclarationAndDefinition, func_legacy,
int(int, int));
DEFINE_MOCK_CONST_METHOD1(MockSplitDeclarationAndDefinition, func_legacy_const,
int(int));
DEFINE_MOCK_METHOD(MockSplitDeclarationAndDefinition, int, func_inherited,
(int), (override final));
DEFINE_MOCK_METHOD(MockSplitDeclarationAndDefinition, NESTED_TYPEDEF,
func_nested_typedef, (NESTED_TYPEDEF));

View File

@ -35,7 +35,12 @@
#include "gmock/gmock-function-mocker.h"
struct MockSplitDeclarationAndDefinition {
struct MockSplitDeclarationAndDefinitionBase {
virtual int func_inherited(int) = 0;
};
struct MockSplitDeclarationAndDefinition
: MockSplitDeclarationAndDefinitionBase {
MockSplitDeclarationAndDefinition();
~MockSplitDeclarationAndDefinition();
@ -50,6 +55,11 @@ struct MockSplitDeclarationAndDefinition {
DECLARE_MOCK_METHOD2(func_legacy, int(int, int));
DECLARE_MOCK_CONST_METHOD1(func_legacy_const, int(int));
DECLARE_MOCK_METHOD(int, func_inherited, (int), (override final));
using NESTED_TYPEDEF = int;
DECLARE_MOCK_METHOD(NESTED_TYPEDEF, func_nested_typedef, (NESTED_TYPEDEF));
};
#endif // GOOGLEMOCK_TEST_SPLIT_MOCK_TEST_HELPER_H_