Я хочу раз и навсегда создать красивую и блестящую версию этого моков для кода C< /а>.
Я хочу создать макрос котла, как показано ниже:
#define MOCK_FREE_FUNCTION(NAME, SIGN, MOCK) \
/* whatever goes here */
В коде (или заголовке) это должно использоваться так: MOCK_FREE_FUNCTION2(myFunc, void(char *, const char *), myFuncMock);
и расширяться во что-то
struct Whatever_myFunc {
MOCK_CONST_METHOD2(myFunc, void (char *x, char *y));
};
Whatever_myFunc myFuncMock;
extern "C" {
void myFunc(char *x, char *y) {
myFuncMock.(x,y);
}
}
/* maybe some convenience EXPECT_CALL thing */
Я прекрасно понимаю, что не все возможно, но я хочу приблизиться к этому как можно ближе. Пока компоновщик не жалуется и находит свои символы, я тоже не буду жаловаться. И я не возражаю, если это два разных макроса: один для определения статических членов, а другой для прототипов.
Дополнение из комментария
генерировать большую часть материала легко, проблема, которую я не могу решить, заключается в том, как gmock удается получить от
MOCK_METHOD2(foo, void(char *, char*)
что-то вроде void foo(char *, char*)
Это самое близкое, что я мог придумать:
#include <stdio.h>
#define MOCK_FREE_FUNCTION2(NAME, MOCK, RET, ARGS) \
typedef RET (*NAME ## Type) ARGS; \
NAME ## Type NAME = barfoo_f;
/* ok it's callable, but how do I get my own code inside here? */
void barfoo_f(int i, int j) {
printf ("hello world %d %d\n", i, j);
}
// How does google mock get rid of , in the prototype
MOCK_FREE_FUNCTION2(FooBar, XXX, void, (int,int));
int main(int argc, char **argv) {
FooBar(1,2);
}