Derive-C
Loading...
Searching...
No Matches
mock.h
Go to the documentation of this file.
1
2#pragma once
3
5
6// JUSTIFY: No macro parens
7// - So we can take a single argument `args` that is bracketed.
8// NOLINTBEGIN(bugprone-macro-parentheses)
9
10#if defined ENABLE_MOCKING
11 #define DC_MOCKABLE_REAL(name) __real_##name
12 #define DC_MOCKABLE_SET(name) __mock_set_##name
13 #define DC_MOCKABLE_TYPE(name) __type_##name
14
15 // JUSTIFY: No Semicolon after
16 // - Users may want to add additional attributes to the declaration
17 // so we leave the termination of the real declaration to the user.
25 #define DC_MOCKABLE_DECLARE(ret, name, args) \
26 typedef ret(*DC_MOCKABLE_TYPE(name)) args; \
27 extern DC_MOCKABLE_TYPE(name) name; \
28 void DC_MOCKABLE_SET(name)(DC_MOCKABLE_TYPE(name) func); \
29 ret DC_MOCKABLE_REAL(name) args
30
31 #define DC_MOCKABLE_DEFINE(ret, name, args) \
32 DC_MOCKABLE_TYPE(name) name = DC_MOCKABLE_REAL(name); \
33 void DC_MOCKABLE_SET(name)(DC_MOCKABLE_TYPE(name) func) { name = func; } \
34 ret DC_MOCKABLE_REAL(name) args
35
36 #define DC_MOCKABLE_ENABLED(name) (name != DC_MOCKABLE_REAL(name))
37#else
38 #define DC_MOCKABLE_DECLARE(ret, name, args) DC_PUBLIC ret name args
39 #define DC_MOCKABLE_DEFINE(ret, name, args) DC_PUBLIC ret name args
40 #define DC_MOCKABLE_ENABLED(name) false
41#endif
42
44#define DC_MOCKABLE(ret, name, args) \
45 DC_MOCKABLE_DECLARE(ret, name, args); \
46 DC_MOCKABLE_DEFINE(ret, name, args)
47
48// NOLINTEND(bugprone-macro-parentheses)