diff --git a/platformio.ini b/platformio.ini index 6952f64..100d47d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,5 +10,7 @@ [env:native] platform = native -build_flags = -std=gnu++17 +build_flags = -std=gnu++17 -Wa,-mbig-obj test_build_src = yes +;build_type = debug +;debug_test = * \ No newline at end of file diff --git a/src/ArduinoFake.h b/src/ArduinoFake.h index 7eaa22b..a7660c3 100644 --- a/src/ArduinoFake.h +++ b/src/ArduinoFake.h @@ -122,10 +122,11 @@ class ArduinoFakeContext void reset(void) { + ArduinoFakeInstances* newInstances = new ArduinoFakeInstances(); if (this->Instances) { delete this->Instances; } - this->Instances = new ArduinoFakeInstances(); + this->Instances = newInstances; this->Mocks->Function.Reset(); this->Mocks->Stream.Reset(); diff --git a/src/PrintFake.cpp b/src/PrintFake.cpp index 757c510..3ae8822 100644 --- a/src/PrintFake.cpp +++ b/src/PrintFake.cpp @@ -1,11 +1,40 @@ #include "ArduinoFake.h" #include "PrintFake.h" +#include size_t Print::write(const uint8_t *buffer, size_t size) { return ArduinoFakeInstance(Print, this)->write(buffer, size); } + +size_t Print::printf(const char *format, ...) { + va_list arg; + va_start(arg, format); + + char loc_buf[64]; + char *temp = loc_buf; + int len = vsnprintf(temp, sizeof(loc_buf), format, arg); + if (len < 0) { + va_end(arg); + return 0; + } + if (len >= (int)sizeof(loc_buf)) { // comparison of same sign type for the compiler + temp = (char *)malloc(len + 1); + if (temp == NULL) { + va_end(arg); + return 0; + } + len = vsnprintf(temp, len + 1, format, arg); + } + va_end(arg); + len = write((uint8_t *)temp, len); + if (temp != loc_buf) { + free(temp); + } + return len; +} + size_t Print::print(const __FlashStringHelper *ifsh) { return ArduinoFakeInstance(Print, this)->print(ifsh); diff --git a/src/PrintFake.h b/src/PrintFake.h index 6173f82..eaf0b52 100644 --- a/src/PrintFake.h +++ b/src/PrintFake.h @@ -8,6 +8,9 @@ struct PrintFake virtual size_t write(const uint8_t *buffer, size_t size) = 0; virtual size_t write(uint8_t) = 0; + virtual size_t printf(const char *format, ...) = 0; + + virtual size_t print(const __FlashStringHelper *) = 0; virtual size_t print(const String &) = 0; virtual size_t print(const char[]) = 0; diff --git a/src/arduino/Print.h b/src/arduino/Print.h index f2cdb51..0d81ca3 100644 --- a/src/arduino/Print.h +++ b/src/arduino/Print.h @@ -57,6 +57,9 @@ class Print size_t write(const char *buffer, size_t size) { return write((const uint8_t *)buffer, size); } + + + size_t printf(const char *format, ...) __attribute__((format(printf, 2, 3))); size_t print(const __FlashStringHelper *); size_t print(const String &); diff --git a/test/main.cpp b/test/main.cpp index a308066..fa63358 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -28,6 +28,10 @@ void setUp(void) { ArduinoFakeReset(); } +void tearDown(void) +{ + +} int main(int argc, char **argv) { diff --git a/test/test_print.h b/test/test_print.h index 6f56946..4a73cae 100644 --- a/test/test_print.h +++ b/test/test_print.h @@ -95,10 +95,27 @@ namespace PrintTest Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned long, int)).Using(unsigned_long_var, DEC)).Once(); } + + void test_printf(void) + { + const char * format = "format %d %s"; + int int_var = 123; + const char * char_array_var = "char_array_var"; + const char * expected_output = "format 123 char_array_var"; + + When(OverloadedMethod(ArduinoFake(Print), write, size_t(const uint8_t *, size_t ))).AlwaysReturn(strlen(expected_output)); + Print* print = ArduinoFakeMock(Print); + + size_t result = print->printf(format, int_var, char_array_var); + TEST_ASSERT_EQUAL(strlen(expected_output), result); + + } + void run_tests() { - RUN_TEST(PrintTest::test_print_variables); RUN_TEST(PrintTest::test_println_variables); + RUN_TEST(PrintTest::test_print_variables); + RUN_TEST(PrintTest::test_printf); } }