diff --git a/fakegen.rb b/fakegen.rb index 790c287..3fd08ae 100644 --- a/fakegen.rb +++ b/fakegen.rb @@ -77,7 +77,7 @@ end def define_save_arg_helper putd "" putd "#define SAVE_ARG(FUNCNAME, n) \\" - putd " FUNCNAME##_fake.arg##n##_val = arg##n" + putd " memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));" end def define_room_for_more_history @@ -89,7 +89,7 @@ end def define_save_arg_history_helper putd "" putd "#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \\" - putd " FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count] = arg##ARGN" + putd " memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));" end def define_history_dropped_helper diff --git a/fff.h b/fff.h index b94f4dd..24ab426 100644 --- a/fff.h +++ b/fff.h @@ -29,13 +29,13 @@ unsigned int arg_histories_dropped; \ #define SAVE_ARG(FUNCNAME, n) \ - FUNCNAME##_fake.arg##n##_val = arg##n + memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n)); #define ROOM_FOR_MORE_HISTORY(FUNCNAME) \ FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN #define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \ - FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count] = arg##ARGN + memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN)); #define HISTORY_DROPPED(FUNCNAME) \ FUNCNAME##_fake.arg_histories_dropped++ diff --git a/test/fff_test_c.c b/test/fff_test_c.c index ff0d47c..99a0489 100644 --- a/test/fff_test_c.c +++ b/test/fff_test_c.c @@ -28,6 +28,7 @@ FAKE_VALUE_FUNC(long, longfunc0); FAKE_VALUE_FUNC(enum MYBOOL, enumfunc0); FAKE_VALUE_FUNC(struct MyStruct, structfunc0); FAKE_VOID_FUNC3_VARARG(voidfunc3var, char *, int, ...); +FAKE_VALUE_FUNC(int, strlcpy3, char* const, const char* const, const size_t); void setup() @@ -38,6 +39,7 @@ void setup() RESET_FAKE(enumfunc0); RESET_FAKE(structfunc0); RESET_FAKE(voidfunc3var); + RESET_FAKE(strlcpy3); FFF_RESET_HISTORY(); } @@ -70,6 +72,7 @@ int main() RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_then_last_args_captured); RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_twice_then_last_args_captured); RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_and_reset_then_captured_arg_is_zero); + RUN_TEST(FFFTestSuite, when_fake_func_called_then_const_arguments_captured); RUN_TEST(FFFTestSuite, when_fake_func_created_default_history_is_fifty_calls); RUN_TEST(FFFTestSuite, when_fake_func_called_then_arguments_captured_in_history); diff --git a/test/fff_test_global_c.c b/test/fff_test_global_c.c index 62f1e55..a3eecdb 100644 --- a/test/fff_test_global_c.c +++ b/test/fff_test_global_c.c @@ -14,6 +14,7 @@ void setup() RESET_FAKE(enumfunc0); RESET_FAKE(structfunc0); RESET_FAKE(voidfunc3var); + RESET_FAKE(strlcpy3); FFF_RESET_HISTORY(); } @@ -40,6 +41,7 @@ int main() RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_then_last_args_captured); RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_twice_then_last_args_captured); RUN_TEST(FFFTestSuite, when_void_func_with_2_char_args_called_and_reset_then_captured_arg_is_zero); + RUN_TEST(FFFTestSuite, when_fake_func_called_then_const_arguments_captured); RUN_TEST(FFFTestSuite, when_fake_func_created_default_history_is_fifty_calls); RUN_TEST(FFFTestSuite, when_fake_func_called_then_arguments_captured_in_history); diff --git a/test/global_fakes.c b/test/global_fakes.c index 8da82fc..1d7ff4e 100644 --- a/test/global_fakes.c +++ b/test/global_fakes.c @@ -7,3 +7,6 @@ DEFINE_FAKE_VALUE_FUNC0(long, longfunc0); DEFINE_FAKE_VALUE_FUNC0(enum MYBOOL, enumfunc0); DEFINE_FAKE_VALUE_FUNC0(struct MyStruct, structfunc0); DEFINE_FAKE_VOID_FUNC3_VARARG(voidfunc3var, const char *, int, ...); +#ifndef __cplusplus +DEFINE_FAKE_VALUE_FUNC3(int, strlcpy3, char* const, const char* const, const size_t); +#endif /* __cplusplus */ diff --git a/test/global_fakes.h b/test/global_fakes.h index e530260..24d31d0 100644 --- a/test/global_fakes.h +++ b/test/global_fakes.h @@ -3,6 +3,7 @@ #define GLOBAL_FAKES_H_ #include "../fff.h" +#include "string.h" //// Imaginary production code header file /// @@ -26,5 +27,8 @@ DECLARE_FAKE_VALUE_FUNC0(long, longfunc0); DECLARE_FAKE_VALUE_FUNC0(enum MYBOOL, enumfunc0); DECLARE_FAKE_VALUE_FUNC0(struct MyStruct, structfunc0); DECLARE_FAKE_VOID_FUNC3_VARARG(voidfunc3var, const char *, int, ...); +#ifndef __cplusplus +DECLARE_FAKE_VALUE_FUNC3(int, strlcpy3, char* const, const char* const, const size_t); +#endif /* __cplusplus */ #endif /* GLOBAL_FAKES_H_ */ diff --git a/test/test_cases.include b/test/test_cases.include index 4a804f9..eca85df 100644 --- a/test/test_cases.include +++ b/test/test_cases.include @@ -63,6 +63,14 @@ TEST_F(FFFTestSuite, when_void_func_with_2_char_args_called_and_reset_then_captu ASSERT_EQ(voidfunc2_fake.arg1_val, 0); } +#ifndef __cplusplus +TEST_F(FFFTestSuite, when_fake_func_called_then_const_arguments_captured) +{ + char dst[80]; + strlcpy3(dst, __FUNCTION__, sizeof(__FUNCTION__)); +} +#endif /* __cplusplus */ + // Argument history TEST_F(FFFTestSuite, when_fake_func_created_default_history_is_fifty_calls) {