Skip to content

Commit d9d0f9e

Browse files
committed
feat: add linkage param to detail facade factory macros
1 parent 9e62da6 commit d9d0f9e

File tree

2 files changed

+53
-42
lines changed

2 files changed

+53
-42
lines changed

include/mimic++/macros/InterfaceMocking.hpp

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,13 @@ namespace mimicpp
203203
* \param traits The interface traits.
204204
* \param mock_name The mock name.
205205
* \param fn_name The function name.
206+
* \param linkage The linkage specifier(s).
206207
* \param signatures The given signatures. Enclosing parentheses will be stripped.
207208
*/
208-
#define MIMICPP_DETAIL_MAKE_OVERLOADED_MOCK(traits, mock_name, fn_name, signatures) \
209-
typename traits::mock_type<MIMICPP_DETAIL_STRIP_PARENS(signatures)> mock_name \
210-
{ \
211-
traits::make_settings(*this, #fn_name) \
209+
#define MIMICPP_DETAIL_MAKE_OVERLOADED_MOCK(traits, mock_name, fn_name, linkage, signatures) \
210+
linkage typename traits::mock_type<MIMICPP_DETAIL_STRIP_PARENS(signatures)> mock_name \
211+
{ \
212+
traits::make_settings(*this, #fn_name) \
212213
}
213214

214215
namespace mimicpp
@@ -393,36 +394,38 @@ namespace mimicpp
393394
* \param traits The interface traits.
394395
* \param mock_name The mock name.
395396
* \param fn_name The function name.
397+
* \param linkage The linkage for both, the facade functions and the target.
396398
* \param ret The return type.
397399
* \param call_convention The call-convention.
398400
* \param param_type_list The parameter types.
399401
* \param specs Additional specifiers (e.g. ``const``, ``noexcept``, etc.).
400402
* \param param_list Enclosed parameter list.
401403
* \param forward_list Enclosed forward statements.
402404
*/
403-
#define MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE(ignore, traits, mock_name, fn_name, ret, call_convention, param_type_list, specs, param_list, forward_list, ...) \
404-
MIMICPP_DETAIL_MAKE_FACADE_FUNCTION( \
405-
traits, \
406-
(MIMICPP_DETAIL_STRIP_PARENS(ret) call_convention fn_name param_list specs override), \
407-
(MIMICPP_DETAIL_STRIP_PARENS(ret) param_type_list specs), \
408-
mock_name, \
405+
#define MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE(ignore, traits, mock_name, fn_name, linkage, ret, call_convention, param_type_list, specs, param_list, forward_list, ...) \
406+
MIMICPP_DETAIL_MAKE_FACADE_FUNCTION( \
407+
traits, \
408+
(linkage MIMICPP_DETAIL_STRIP_PARENS(ret) call_convention fn_name param_list specs override), \
409+
(MIMICPP_DETAIL_STRIP_PARENS(ret) param_type_list specs), \
410+
mock_name, \
409411
(this, ::std::tuple_cat(MIMICPP_DETAIL_STRIP_PARENS(forward_list))))
410412

411413
/**
412414
* \brief Creates all overloads for a specific function facade.
413415
* \ingroup MOCK_INTERFACES_DETAIL_MAKE_FACADES
414-
* \param traits The interface traits.
415416
* \param op The operation for each element (see `MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE` as an example for the list of required arguments).
417+
* \param traits The interface traits.
416418
* \param mock_name The mock name.
417419
* \param fn_name The function name to be overloaded.
418-
*/
419-
#define MIMICPP_DETAIL_MAKE_INTERFACE_FACADE_OVERLOADS(traits, op, mock_name, fn_name, ...) \
420-
MIMICPP_DETAIL_FOR_EACH_EXT( \
421-
op, \
422-
, \
423-
MIMICPP_DETAIL_NO_DELIMITER, \
424-
MIMICPP_DETAIL_STRIP_PARENS, \
425-
(traits, mock_name, fn_name), \
420+
* \param linkage The linkage for both, the facade functions and the target.
421+
*/
422+
#define MIMICPP_DETAIL_MAKE_INTERFACE_FACADE_OVERLOADS(op, traits, mock_name, fn_name, linkage, ...) \
423+
MIMICPP_DETAIL_FOR_EACH_EXT( \
424+
op, \
425+
, \
426+
MIMICPP_DETAIL_NO_DELIMITER, \
427+
MIMICPP_DETAIL_STRIP_PARENS, \
428+
(traits, mock_name, fn_name, linkage), \
426429
__VA_ARGS__)
427430

428431
/**
@@ -431,13 +434,15 @@ namespace mimicpp
431434
* \param traits The interface traits.
432435
* \param mock_name The mock name.
433436
* \param fn_name The function name to be overloaded.
434-
*/
435-
#define MIMICPP_DETAIL_MAKE_INTERFACE_FACADE(traits, mock_name, fn_name, ...) \
436-
MIMICPP_DETAIL_MAKE_INTERFACE_FACADE_OVERLOADS(traits, MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE, mock_name, fn_name, __VA_ARGS__) \
437-
MIMICPP_DETAIL_MAKE_OVERLOADED_MOCK( \
438-
traits, \
439-
mock_name, \
440-
fn_name, \
437+
* \param linkage The linkage for both, the facade functions and the target.
438+
*/
439+
#define MIMICPP_DETAIL_MAKE_INTERFACE_FACADE(fn_op, traits, mock_name, fn_name, linkage, ...) \
440+
MIMICPP_DETAIL_MAKE_INTERFACE_FACADE_OVERLOADS(fn_op, traits, mock_name, fn_name, linkage, __VA_ARGS__) \
441+
MIMICPP_DETAIL_MAKE_OVERLOADED_MOCK( \
442+
traits, \
443+
mock_name, \
444+
fn_name, \
445+
linkage, \
441446
(MIMICPP_DETAIL_MAKE_SIGNATURE_LIST(__VA_ARGS__)))
442447

443448
/**
@@ -453,11 +458,29 @@ namespace mimicpp
453458
*/
454459
#define MIMICPP_MOCK_OVERLOADED_METHOD(fn_name, ...) \
455460
MIMICPP_DETAIL_MAKE_INTERFACE_FACADE( \
461+
MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE, \
456462
::mimicpp::detail::interface_mock_traits, \
457463
fn_name##_, \
458464
fn_name, \
465+
, \
459466
__VA_ARGS__)
460467

468+
/**
469+
* \brief Entry point for mocking a single interface method.
470+
* \ingroup MOCK_INTERFACES
471+
* \param fn_name The method name.
472+
* \param param_type_list The list of parameter types.
473+
* \param ... Optional qualifiers (e.g., ``const``, ``noexcept``).
474+
* \details
475+
* This macro defines a single mock object for one method signature and generates a corresponding
476+
* override method. The override method forwards calls to the mock object.
477+
* \snippet InterfaceMock.cpp interface mock simple
478+
*/
479+
#define MIMICPP_MOCK_METHOD(fn_name, ret, param_type_list, ...) \
480+
MIMICPP_MOCK_OVERLOADED_METHOD( \
481+
fn_name, \
482+
MIMICPP_ADD_OVERLOAD(ret, param_type_list __VA_OPT__(, ) __VA_ARGS__))
483+
461484
/**
462485
* \brief Entry point for mocking an overloaded interface method with an explicit *this* pointer.
463486
* \ingroup MOCK_INTERFACES
@@ -476,27 +499,13 @@ namespace mimicpp
476499
*/
477500
#define MIMICPP_MOCK_OVERLOADED_METHOD_WITH_THIS(fn_name, ...) \
478501
MIMICPP_DETAIL_MAKE_INTERFACE_FACADE( \
502+
MIMICPP_DETAIL_MAKE_METHOD_OVERRIDE, \
479503
::mimicpp::detail::interface_mock_with_this_traits<self_type>, \
480504
fn_name##_, \
481505
fn_name, \
506+
, \
482507
__VA_ARGS__)
483508

484-
/**
485-
* \brief Entry point for mocking a single interface method.
486-
* \ingroup MOCK_INTERFACES
487-
* \param fn_name The method name.
488-
* \param param_type_list The list of parameter types.
489-
* \param ... Optional qualifiers (e.g., ``const``, ``noexcept``).
490-
* \details
491-
* This macro defines a single mock object for one method signature and generates a corresponding
492-
* override method. The override method forwards calls to the mock object.
493-
* \snippet InterfaceMock.cpp interface mock simple
494-
*/
495-
#define MIMICPP_MOCK_METHOD(fn_name, ret, param_type_list, ...) \
496-
MIMICPP_MOCK_OVERLOADED_METHOD( \
497-
fn_name, \
498-
MIMICPP_ADD_OVERLOAD(ret, param_type_list __VA_OPT__(, ) __VA_ARGS__))
499-
500509
/**
501510
* \brief Entry point for mocking a single interface method with an explicit *this* pointer.
502511
* \ingroup MOCK_INTERFACES

test/unit-tests/InterfaceMock.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ TEST_CASE(
8686
detail::interface_mock_traits,
8787
mock,
8888
test,
89+
/*linkage*/,
8990
(void()));
9091
};
9192

@@ -100,6 +101,7 @@ TEST_CASE(
100101
detail::interface_mock_traits,
101102
mock,
102103
test,
104+
/*linkage*/,
103105
(float&(int&&)));
104106
};
105107

0 commit comments

Comments
 (0)