diff --git a/src/cmake/modules/CUnit/include/CUnit/Test.h b/src/cmake/modules/CUnit/include/CUnit/Test.h index 687fbc5..4e9f2d4 100644 --- a/src/cmake/modules/CUnit/include/CUnit/Test.h +++ b/src/cmake/modules/CUnit/include/CUnit/Test.h @@ -17,7 +17,7 @@ typedef struct { cu_test_fini_func_t fini; int disabled; /* Parsed by CMake, used at test registration in main. */ int timeout; /* Parsed by CMake, used at test registration in CMake. */ -} cu_test_data_t; +} cu_data_t; #define CU_InitName(suite) \ CU_Init_ ## suite @@ -41,28 +41,50 @@ typedef struct { /* CU_Test generates a wrapper function that takes care of per-test initialization and deinitialization, if provided in the CU_Test signature. */ -#define CU_Test(suite, test, ...) \ - static void CU_TestName(suite, test)(void); \ - \ - void CU_TestProxyName(suite, test)(void) { \ - static const cu_test_data_t data = { __VA_ARGS__ }; \ - \ - if (data.init != NULL) { \ - data.init(); \ - } \ - \ - CU_TestName(suite, test)(); \ - \ - if (data.fini != NULL) { \ - data.fini(); \ - } \ - } \ - \ +#define CU_Test(suite, test, ...) \ + static void CU_TestName(suite, test)(void); \ + \ + void CU_TestProxyName(suite, test)(void) { \ + cu_data_t data = CU_Fixture(__VA_ARGS__); \ + \ + if (data.init != NULL) { \ + data.init(); \ + } \ + \ + CU_TestName(suite, test)(); \ + \ + if (data.fini != NULL) { \ + data.fini(); \ + } \ + } \ + \ static void CU_TestName(suite, test)(void) #define CU_TestDecl(suite, test) \ extern void CU_TestProxyName(suite, test)(void) +/* Microsoft Visual Studio does not like empty struct initializers, i.e. + no fixtures are specified. To work around that issue CU_Fixture inserts a + NULL initializer as fall back. */ +#define CU_Comma() , +#define CU_Reduce(one, ...) one + +#ifdef _WIN32 +/* Microsoft Visual Studio does not expand __VA_ARGS__ correctly. */ +#define CU_Fixture__(...) CU_Fixture____((__VA_ARGS__)) +#define CU_Fixture____(tuple) CU_Fixture___ tuple +#else +#define CU_Fixture__(...) CU_Fixture___(__VA_ARGS__) +#endif /* _WIN32 */ + +#define CU_Fixture___(throw, away, value, ...) value + +#define CU_Fixture(...) \ + CU_Fixture_( CU_Comma CU_Reduce(__VA_ARGS__,) (), __VA_ARGS__ ) + +#define CU_Fixture_(throwaway, ...) \ + CU_Fixture__(throwaway, ((cu_data_t){ 0 }), ((cu_data_t){ __VA_ARGS__ })) + #if defined (__cplusplus) } #endif diff --git a/src/cmake/modules/CUnit/include/CUnit/Theory.h b/src/cmake/modules/CUnit/include/CUnit/Theory.h index 11b541f..81dd7f7 100644 --- a/src/cmake/modules/CUnit/include/CUnit/Theory.h +++ b/src/cmake/modules/CUnit/include/CUnit/Theory.h @@ -46,7 +46,7 @@ extern "C" { static void CU_TestName(suite, test) signature; \ \ void CU_TestProxyName(suite, test)(void) { \ - static const cu_test_data_t data = { __VA_ARGS__ }; \ + cu_data_t data = CU_Fixture(__VA_ARGS__); \ size_t i, n; \ \ if (data.init != NULL) { \