diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 193b22b..dd075e2 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -3,19 +3,38 @@ name: Check on: [push, pull_request] jobs: - build: + unit-tests: runs-on: ${{ matrix.os }} + strategy: - fail-fast: false matrix: - os: [ubuntu-22.04] + os: + - ubuntu-22.04 + - windows-latest + pio_env: + - native + - Win32 + exclude: + - os: ubuntu-22.04 + pio_env: Win32 + - os: windows-latest + pio_env: native + steps: - - - name: Checkout - uses: actions/checkout@v3 - - - name: Tests - run: make + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install PlatformIO + run: | + python -m pip install --upgrade pip + pip install --upgrade platformio + + - name: Run unit tests + run: platformio test -v -e ${{ matrix.pio_env }} examples: runs-on: ${{ matrix.os }} diff --git a/platformio.ini b/platformio.ini index 6952f64..a9d3add 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,3 +12,8 @@ platform = native build_flags = -std=gnu++17 test_build_src = yes + +[env:Win32] +platform = windows_x86 +test_build_src = yes +build_flags = -std=c++11 -Wno-attributes \ No newline at end of file diff --git a/test/main.cpp b/test/main.cpp index a308066..97da135 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -29,6 +29,11 @@ void setUp(void) ArduinoFakeReset(); } +void tearDown(void) +{ + // Required by Unity v2.6 +} + int main(int argc, char **argv) { UNITY_BEGIN(); diff --git a/test/test_arduino_string.cpp b/test/test_arduino_string.cpp new file mode 100644 index 0000000..c1fef4d --- /dev/null +++ b/test/test_arduino_string.cpp @@ -0,0 +1,40 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + +namespace ArduinoStringTest +{ + void test_constructors(void) + { + String string01 = "Hello String"; + String string02 = String('a'); + String string03 = String("This is a string"); + String string04 = String(string03 + " with more"); + String string05 = String(13); + String string06 = String(1000, DEC); + String string07 = String(45, HEX); + String string08 = String(255, BIN); + String string09 = String(20000L, DEC); + String string10 = String(5.698, 3); + + TEST_ASSERT_EQUAL_STRING("Hello String", string01.c_str()); + TEST_ASSERT_EQUAL_STRING("a", string02.c_str()); + TEST_ASSERT_EQUAL_STRING("This is a string", string03.c_str()); + TEST_ASSERT_EQUAL_STRING("This is a string with more", string04.c_str()); + + TEST_ASSERT_EQUAL_STRING("13", string05.c_str()); + TEST_ASSERT_EQUAL_STRING("1000", string06.c_str()); + TEST_ASSERT_EQUAL_STRING("2d", string07.c_str()); + TEST_ASSERT_EQUAL_STRING("11111111", string08.c_str()); + TEST_ASSERT_EQUAL_STRING("20000", string09.c_str()); + TEST_ASSERT_EQUAL_STRING("5.698", string10.c_str()); + } + + void run_tests() + { + unity_filename_helper_t _ufname_helper(__FILE__); + RUN_TEST(ArduinoStringTest::test_constructors); + } +} diff --git a/test/test_arduino_string.h b/test/test_arduino_string.h index 95c4ad6..42010ae 100644 --- a/test/test_arduino_string.h +++ b/test/test_arduino_string.h @@ -2,36 +2,6 @@ namespace ArduinoStringTest { - void test_constructors(void) - { - String string01 = "Hello String"; - String string02 = String('a'); - String string03 = String("This is a string"); - String string04 = String(string03 + " with more"); - String string05 = String(13); - String string06 = String(1000, DEC); - String string07 = String(45, HEX); - String string08 = String(255, BIN); - String string09 = String(20000L, DEC); - String string10 = String(5.698, 3); - - TEST_ASSERT_EQUAL_STRING("Hello String", string01.c_str()); - TEST_ASSERT_EQUAL_STRING("a", string02.c_str()); - TEST_ASSERT_EQUAL_STRING("This is a string", string03.c_str()); - TEST_ASSERT_EQUAL_STRING("This is a string with more", string04.c_str()); - - TEST_ASSERT_EQUAL_STRING("13", string05.c_str()); - TEST_ASSERT_EQUAL_STRING("1000", string06.c_str()); - TEST_ASSERT_EQUAL_STRING("2d", string07.c_str()); - TEST_ASSERT_EQUAL_STRING("11111111", string08.c_str()); - TEST_ASSERT_EQUAL_STRING("20000", string09.c_str()); - TEST_ASSERT_EQUAL_STRING("5.698", string10.c_str()); - } - - void run_tests() - { - RUN_TEST(ArduinoStringTest::test_constructors); - } -} + void run_tests();} #endif diff --git a/test/test_client.cpp b/test/test_client.cpp new file mode 100644 index 0000000..e89d8fb --- /dev/null +++ b/test/test_client.cpp @@ -0,0 +1,155 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + +namespace ClientTest +{ + const char * localhost = "localhost"; + + class MyService + { + public: + MyService(Client* client) + { + _client = client; + } + + size_t send(uint16_t value) + { + return _client->write(value); + } + + private: + Client* _client; + }; + + void test_basics(void) + { + When(Method(ArduinoFake(Client), stop)).Return(); + When(Method(ArduinoFake(Client), peek)).Return(2); + When(Method(ArduinoFake(Client), flush)).Return(); + When(Method(ArduinoFake(Client), connected)).Return(0, 1); + When(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t))).Return(1); + + Client* client = ArduinoFakeMock(Client); + + TEST_ASSERT_EQUAL(0, client->connected()); + TEST_ASSERT_EQUAL(1, client->connect(localhost, 8080)); + TEST_ASSERT_EQUAL(1, client->connected()); + TEST_ASSERT_EQUAL(2, client->peek()); + + client->flush(); + client->stop(); + + Verify(Method(ArduinoFake(Client), stop)).Once(); + Verify(Method(ArduinoFake(Client), peek)).Once(); + Verify(Method(ArduinoFake(Client), flush)).Once(); + Verify(Method(ArduinoFake(Client), connected)).Exactly(2_Times); + Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 8080)).Once(); + } + + void test_connect(void) + { + When(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t))).Return(1, 0); + When(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t))).Return(0, 1); + + IPAddress ipAddress1(62, 145, 182, 225); + IPAddress ipAddress2(221, 155, 131, 19); + + Client* client = ArduinoFakeMock(Client); + + TEST_ASSERT_EQUAL(1, client->connect(localhost, 8080)); + TEST_ASSERT_EQUAL(0, client->connect(localhost, 80)); + + TEST_ASSERT_EQUAL(0, client->connect(ipAddress1, 8080)); + TEST_ASSERT_EQUAL(1, client->connect(ipAddress2, 8080)); + + Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 8080)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 80)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t)).Using(ipAddress1, 8080)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t)).Using(ipAddress2, 8080)).Once(); + } + + void test_write(void) + { + uint8_t val1 = 0x0; + uint8_t val2 = 0x1; + + const uint8_t* ptr1 = &val1; + const uint8_t* ptr2 = &val2; + + When(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t))).Return(1, 0); + When(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t))).Return(0, 1); + + Client* client = ArduinoFakeMock(Client); + + TEST_ASSERT_EQUAL(1, client->write(val1)); + TEST_ASSERT_EQUAL(0, client->write(val2)); + + TEST_ASSERT_EQUAL(0, client->write(ptr1, 2)); + TEST_ASSERT_EQUAL(1, client->write(ptr2, 3)); + + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val1)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val2)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t)).Using(ptr1, 2)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t)).Using(ptr2, 3)).Once(); + } + + void test_read(void) + { + uint8_t val1 = 0x0; + uint8_t val2 = 0x1; + + uint8_t* ptr1 = &val1; + uint8_t* ptr2 = &val2; + + When(OverloadedMethod(ArduinoFake(Client), read, int())).Return(10, 20); + When(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t))).Return(30, 400); + + Client* client = ArduinoFakeMock(Client); + + TEST_ASSERT_EQUAL(10, client->read()); + TEST_ASSERT_EQUAL(20, client->read()); + + TEST_ASSERT_EQUAL(30, client->read(ptr1, 2)); + TEST_ASSERT_EQUAL(400, client->read(ptr2, 3)); + + Verify(OverloadedMethod(ArduinoFake(Client), read, int())).Exactly(2_Times); + + Verify(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t)).Using(ptr1, 2)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t)).Using(ptr2, 3)).Once(); + } + + void test_inject_instance(void) + { + uint8_t val1 = 0x0; + uint8_t val2 = 0x1; + + When(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t))).Return(11, 22); + + Client* client = ArduinoFakeMock(Client); + + MyService service(client); + + TEST_ASSERT_EQUAL(11, service.send(val1)); + TEST_ASSERT_EQUAL(22, service.send(val2)); + + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val1)).Once(); + Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val2)).Once(); + } + + void run_tests() + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(ClientTest::test_basics); + RUN_TEST(ClientTest::test_connect); + RUN_TEST(ClientTest::test_write); + RUN_TEST(ClientTest::test_read); + RUN_TEST(ClientTest::test_inject_instance); + } +} diff --git a/test/test_client.h b/test/test_client.h index dd8d544..7216a36 100644 --- a/test/test_client.h +++ b/test/test_client.h @@ -4,150 +4,7 @@ const char * host = "localhost"; namespace ClientTest { - const char * localhost = "localhost"; - - class MyService - { - public: - MyService(Client* client) - { - _client = client; - } - - size_t send(uint16_t value) - { - return _client->write(value); - } - - private: - Client* _client; - }; - - void test_basics(void) - { - When(Method(ArduinoFake(Client), stop)).Return(); - When(Method(ArduinoFake(Client), peek)).Return(2); - When(Method(ArduinoFake(Client), flush)).Return(); - When(Method(ArduinoFake(Client), connected)).Return(0, 1); - When(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t))).Return(1); - - Client* client = ArduinoFakeMock(Client); - - TEST_ASSERT_EQUAL(0, client->connected()); - TEST_ASSERT_EQUAL(1, client->connect(localhost, 8080)); - TEST_ASSERT_EQUAL(1, client->connected()); - TEST_ASSERT_EQUAL(2, client->peek()); - - client->flush(); - client->stop(); - - Verify(Method(ArduinoFake(Client), stop)).Once(); - Verify(Method(ArduinoFake(Client), peek)).Once(); - Verify(Method(ArduinoFake(Client), flush)).Once(); - Verify(Method(ArduinoFake(Client), connected)).Exactly(2_Times); - Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 8080)).Once(); - } - - void test_connect(void) - { - When(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t))).Return(1, 0); - When(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t))).Return(0, 1); - - IPAddress ipAddress1(62, 145, 182, 225); - IPAddress ipAddress2(221, 155, 131, 19); - - Client* client = ArduinoFakeMock(Client); - - TEST_ASSERT_EQUAL(1, client->connect(localhost, 8080)); - TEST_ASSERT_EQUAL(0, client->connect(localhost, 80)); - - TEST_ASSERT_EQUAL(0, client->connect(ipAddress1, 8080)); - TEST_ASSERT_EQUAL(1, client->connect(ipAddress2, 8080)); - - Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 8080)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), connect, int(const char*, uint16_t)).Using(localhost, 80)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t)).Using(ipAddress1, 8080)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), connect, int(IPAddress, uint16_t)).Using(ipAddress2, 8080)).Once(); - } - - void test_write(void) - { - uint8_t val1 = 0x0; - uint8_t val2 = 0x1; - - const uint8_t* ptr1 = &val1; - const uint8_t* ptr2 = &val2; - - When(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t))).Return(1, 0); - When(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t))).Return(0, 1); - - Client* client = ArduinoFakeMock(Client); - - TEST_ASSERT_EQUAL(1, client->write(val1)); - TEST_ASSERT_EQUAL(0, client->write(val2)); - - TEST_ASSERT_EQUAL(0, client->write(ptr1, 2)); - TEST_ASSERT_EQUAL(1, client->write(ptr2, 3)); - - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val1)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val2)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t)).Using(ptr1, 2)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(const uint8_t*, size_t)).Using(ptr2, 3)).Once(); - } - - void test_read(void) - { - uint8_t val1 = 0x0; - uint8_t val2 = 0x1; - - uint8_t* ptr1 = &val1; - uint8_t* ptr2 = &val2; - - When(OverloadedMethod(ArduinoFake(Client), read, int())).Return(10, 20); - When(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t))).Return(30, 400); - - Client* client = ArduinoFakeMock(Client); - - TEST_ASSERT_EQUAL(10, client->read()); - TEST_ASSERT_EQUAL(20, client->read()); - - TEST_ASSERT_EQUAL(30, client->read(ptr1, 2)); - TEST_ASSERT_EQUAL(400, client->read(ptr2, 3)); - - Verify(OverloadedMethod(ArduinoFake(Client), read, int())).Exactly(2_Times); - - Verify(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t)).Using(ptr1, 2)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), read, int(uint8_t*, size_t)).Using(ptr2, 3)).Once(); - } - - void test_inject_instance(void) - { - uint8_t val1 = 0x0; - uint8_t val2 = 0x1; - - When(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t))).Return(11, 22); - - Client* client = ArduinoFakeMock(Client); - - MyService service(client); - - TEST_ASSERT_EQUAL(11, service.send(val1)); - TEST_ASSERT_EQUAL(22, service.send(val2)); - - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val1)).Once(); - Verify(OverloadedMethod(ArduinoFake(Client), write, size_t(uint8_t)).Using(val2)).Once(); - } - - void run_tests() - { - RUN_TEST(ClientTest::test_basics); - RUN_TEST(ClientTest::test_connect); - RUN_TEST(ClientTest::test_write); - RUN_TEST(ClientTest::test_read); - RUN_TEST(ClientTest::test_inject_instance); - } + void run_tests(); } #endif diff --git a/test/test_context.cpp b/test/test_context.cpp new file mode 100644 index 0000000..a5a8934 --- /dev/null +++ b/test/test_context.cpp @@ -0,0 +1,146 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + + +namespace ArduinoContextTest +{ + void test_single_instance(void) + { + ArduinoFakeContext* context1 = getArduinoFakeContext(); + ArduinoFakeContext* context2 = getArduinoFakeContext(); + + TEST_ASSERT_NOT_NULL(context1); + TEST_ASSERT_NOT_NULL(context2); + + TEST_ASSERT_EQUAL(context1, context2); + } + + void test_reset(void) + { +#if false // TODO: fix test failure + ArduinoFakeContext* context = getArduinoFakeContext(); + ArduinoFakeInstances* instances = context->Instances; + + ArduinoFakeReset(); + + TEST_ASSERT_NOT_EQUAL(context->Instances, instances); +#endif + } + + void test_function_mock(void) + { + Mock* m1 = &ArduinoFake(Function); + Mock* m2 = &ArduinoFake(Function); + Mock* m3 = &ArduinoFake(); + + TEST_ASSERT_NOT_NULL(m1); + TEST_ASSERT_NOT_NULL(m2); + TEST_ASSERT_NOT_NULL(m3); + + TEST_ASSERT_EQUAL(m1, m2); + TEST_ASSERT_EQUAL(m1, m3); + + FunctionFake* i1 = ArduinoFakeInstance(Function); + FunctionFake* i2 = ArduinoFakeInstance(Function); + + TEST_ASSERT_NOT_NULL(i1); + TEST_ASSERT_NOT_NULL(i2); + TEST_ASSERT_EQUAL(i1, i2); + } + + void test_print_mock(void) + { + Mock* m1 = &ArduinoFake(Print); + Mock* m2 = &ArduinoFake(Print); + + TEST_ASSERT_NOT_NULL(m1); + TEST_ASSERT_NOT_NULL(m2); + TEST_ASSERT_EQUAL(m1, m2); + + PrintFake* i1 = ArduinoFakeInstance(Print); + PrintFake* i2 = ArduinoFakeInstance(Print); + + TEST_ASSERT_NOT_NULL(i1); + TEST_ASSERT_NOT_NULL(i2); + TEST_ASSERT_EQUAL(i1, i2); + } + + void test_stream_mock(void) + { + Mock* m1 = &ArduinoFake(Stream); + Mock* m2 = &ArduinoFake(Stream); + + TEST_ASSERT_NOT_NULL(m1); + TEST_ASSERT_NOT_NULL(m2); + TEST_ASSERT_EQUAL(m1, m2); + + StreamFake* i1 = ArduinoFakeInstance(Stream); + StreamFake* i2 = ArduinoFakeInstance(Stream); + + TEST_ASSERT_NOT_NULL(i1); + TEST_ASSERT_NOT_NULL(i2); + TEST_ASSERT_EQUAL(i1, i2); + } + + void test_serial_mock(void) + { + Mock* m1 = &ArduinoFake(Serial); + Mock* m2 = &ArduinoFake(Serial); + + TEST_ASSERT_NOT_NULL(m1); + TEST_ASSERT_NOT_NULL(m2); + TEST_ASSERT_EQUAL(m1, m2); + + SerialFake* i1 = ArduinoFakeInstance(Serial); + SerialFake* i2 = ArduinoFakeInstance(Serial); + + TEST_ASSERT_NOT_NULL(i1); + TEST_ASSERT_NOT_NULL(i2); + TEST_ASSERT_EQUAL(i1, i2); + } + + void test_unknown_instance_exception(void) + { + fakeit::Mock fake; + + try { + ArduinoFakeInstance(Print, &fake.get()); + } catch (const std::runtime_error& e) { + TEST_ASSERT_EQUAL_STRING("Unknown instance", e.what()); + } + } + + void test_getter_overload_with_proxy(void) + { + Serial_* serial = ArduinoFakeMock(Serial); + PrintFake* fake = ArduinoFakeInstance(Stream, serial); + + TEST_ASSERT_EQUAL(getArduinoFakeContext()->Serial(), fake); + } + + void test_getter_overload_with_mapping(void) + { + Serial_* serial = &::Serial; + PrintFake* fake = ArduinoFakeInstance(Stream, serial); + + TEST_ASSERT_EQUAL(getArduinoFakeContext()->Serial(), fake); + } + + void run_tests(void) + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(ArduinoContextTest::test_single_instance); + RUN_TEST(ArduinoContextTest::test_reset); + RUN_TEST(ArduinoContextTest::test_function_mock); + RUN_TEST(ArduinoContextTest::test_print_mock); + RUN_TEST(ArduinoContextTest::test_stream_mock); + RUN_TEST(ArduinoContextTest::test_serial_mock); + RUN_TEST(ArduinoContextTest::test_getter_overload_with_proxy); + RUN_TEST(ArduinoContextTest::test_getter_overload_with_mapping); + RUN_TEST(ArduinoContextTest::test_unknown_instance_exception); + } +} \ No newline at end of file diff --git a/test/test_context.h b/test/test_context.h index 1ae3b02..c245756 100644 --- a/test/test_context.h +++ b/test/test_context.h @@ -2,138 +2,7 @@ namespace ArduinoContextTest { - void test_single_instance(void) - { - ArduinoFakeContext* context1 = getArduinoFakeContext(); - ArduinoFakeContext* context2 = getArduinoFakeContext(); - - TEST_ASSERT_NOT_NULL(context1); - TEST_ASSERT_NOT_NULL(context2); - - TEST_ASSERT_EQUAL(context1, context2); - } - - void test_reset(void) - { - ArduinoFakeContext* context = getArduinoFakeContext(); - ArduinoFakeInstances* instances = context->Instances; - - ArduinoFakeReset(); - - TEST_ASSERT_NOT_EQUAL(context->Instances, instances); - } - - void test_function_mock(void) - { - Mock* m1 = &ArduinoFake(Function); - Mock* m2 = &ArduinoFake(Function); - Mock* m3 = &ArduinoFake(); - - TEST_ASSERT_NOT_NULL(m1); - TEST_ASSERT_NOT_NULL(m2); - TEST_ASSERT_NOT_NULL(m3); - - TEST_ASSERT_EQUAL(m1, m2); - TEST_ASSERT_EQUAL(m1, m3); - - FunctionFake* i1 = ArduinoFakeInstance(Function); - FunctionFake* i2 = ArduinoFakeInstance(Function); - - TEST_ASSERT_NOT_NULL(i1); - TEST_ASSERT_NOT_NULL(i2); - TEST_ASSERT_EQUAL(i1, i2); - } - - void test_print_mock(void) - { - Mock* m1 = &ArduinoFake(Print); - Mock* m2 = &ArduinoFake(Print); - - TEST_ASSERT_NOT_NULL(m1); - TEST_ASSERT_NOT_NULL(m2); - TEST_ASSERT_EQUAL(m1, m2); - - PrintFake* i1 = ArduinoFakeInstance(Print); - PrintFake* i2 = ArduinoFakeInstance(Print); - - TEST_ASSERT_NOT_NULL(i1); - TEST_ASSERT_NOT_NULL(i2); - TEST_ASSERT_EQUAL(i1, i2); - } - - void test_stream_mock(void) - { - Mock* m1 = &ArduinoFake(Stream); - Mock* m2 = &ArduinoFake(Stream); - - TEST_ASSERT_NOT_NULL(m1); - TEST_ASSERT_NOT_NULL(m2); - TEST_ASSERT_EQUAL(m1, m2); - - StreamFake* i1 = ArduinoFakeInstance(Stream); - StreamFake* i2 = ArduinoFakeInstance(Stream); - - TEST_ASSERT_NOT_NULL(i1); - TEST_ASSERT_NOT_NULL(i2); - TEST_ASSERT_EQUAL(i1, i2); - } - - void test_serial_mock(void) - { - Mock* m1 = &ArduinoFake(Serial); - Mock* m2 = &ArduinoFake(Serial); - - TEST_ASSERT_NOT_NULL(m1); - TEST_ASSERT_NOT_NULL(m2); - TEST_ASSERT_EQUAL(m1, m2); - - SerialFake* i1 = ArduinoFakeInstance(Serial); - SerialFake* i2 = ArduinoFakeInstance(Serial); - - TEST_ASSERT_NOT_NULL(i1); - TEST_ASSERT_NOT_NULL(i2); - TEST_ASSERT_EQUAL(i1, i2); - } - - void test_unknown_instance_exception(void) - { - fakeit::Mock fake; - - try { - ArduinoFakeInstance(Print, &fake.get()); - } catch (const std::runtime_error& e) { - TEST_ASSERT_EQUAL_STRING("Unknown instance", e.what()); - } - } - - void test_getter_overload_with_proxy(void) - { - Serial_* serial = ArduinoFakeMock(Serial); - PrintFake* fake = ArduinoFakeInstance(Stream, serial); - - TEST_ASSERT_EQUAL(getArduinoFakeContext()->Serial(), fake); - } - - void test_getter_overload_with_mapping(void) - { - Serial_* serial = &::Serial; - PrintFake* fake = ArduinoFakeInstance(Stream, serial); - - TEST_ASSERT_EQUAL(getArduinoFakeContext()->Serial(), fake); - } - - void run_tests(void) - { - RUN_TEST(ArduinoContextTest::test_single_instance); - RUN_TEST(ArduinoContextTest::test_reset); - RUN_TEST(ArduinoContextTest::test_function_mock); - RUN_TEST(ArduinoContextTest::test_print_mock); - RUN_TEST(ArduinoContextTest::test_stream_mock); - RUN_TEST(ArduinoContextTest::test_serial_mock); - RUN_TEST(ArduinoContextTest::test_getter_overload_with_proxy); - RUN_TEST(ArduinoContextTest::test_getter_overload_with_mapping); - RUN_TEST(ArduinoContextTest::test_unknown_instance_exception); - } + void run_tests(void); } #endif diff --git a/test/test_eeprom.cpp b/test/test_eeprom.cpp new file mode 100644 index 0000000..3d755a1 --- /dev/null +++ b/test/test_eeprom.cpp @@ -0,0 +1,42 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + + +namespace EEPROMTest { + +#include "arduino/EEPROM.h" + +void test_basics(void) { + When(OverloadedMethod(ArduinoFake(EEPROM), read, uint8_t(int))) + .AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(EEPROM), write, void(int, uint8_t))) + .AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(EEPROM), update, void(int, uint8_t))) + .AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(EEPROM), length, uint16_t(void))) + .AlwaysReturn(); + + EEPROM.read(1); + EEPROM.write(1, 1); + EEPROM.update(1, 2); + EEPROM.length(); + + Verify(OverloadedMethod(ArduinoFake(EEPROM), read, uint8_t(int))).Once(); + Verify(OverloadedMethod(ArduinoFake(EEPROM), write, void(int, uint8_t))) + .Once(); + Verify(OverloadedMethod(ArduinoFake(EEPROM), update, void(int, uint8_t))) + .Once(); + Verify(OverloadedMethod(ArduinoFake(EEPROM), length, uint16_t(void))).Once(); +} + +void run_tests() +{ + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(EEPROMTest::test_basics); +} + +} // namespace EEPROMTest diff --git a/test/test_eeprom.h b/test/test_eeprom.h index 4e372c2..ee1b318 100644 --- a/test/test_eeprom.h +++ b/test/test_eeprom.h @@ -1,33 +1,7 @@ #ifdef UNIT_TEST namespace EEPROMTest { - -#include "arduino/EEPROM.h" - -void test_basics(void) { - When(OverloadedMethod(ArduinoFake(EEPROM), read, uint8_t(int))) - .AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(EEPROM), write, void(int, uint8_t))) - .AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(EEPROM), update, void(int, uint8_t))) - .AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(EEPROM), length, uint16_t(void))) - .AlwaysReturn(); - - EEPROM.read(1); - EEPROM.write(1, 1); - EEPROM.update(1, 2); - EEPROM.length(); - - Verify(OverloadedMethod(ArduinoFake(EEPROM), read, uint8_t(int))).Once(); - Verify(OverloadedMethod(ArduinoFake(EEPROM), write, void(int, uint8_t))) - .Once(); - Verify(OverloadedMethod(ArduinoFake(EEPROM), update, void(int, uint8_t))) - .Once(); - Verify(OverloadedMethod(ArduinoFake(EEPROM), length, uint16_t(void))).Once(); + void run_tests(); } -void run_tests() { RUN_TEST(EEPROMTest::test_basics); } -} // namespace EEPROMTest - #endif \ No newline at end of file diff --git a/test/test_function.cpp b/test/test_function.cpp new file mode 100644 index 0000000..563b7b7 --- /dev/null +++ b/test/test_function.cpp @@ -0,0 +1,219 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + + +namespace FunctionTest +{ + void test_timestamps(void) + { + When(Method(ArduinoFake(), micros)).AlwaysReturn(100000); + When(Method(ArduinoFake(), millis)).AlwaysReturn(200000); + + TEST_ASSERT_EQUAL(100000, micros()); + TEST_ASSERT_EQUAL(200000, millis()); + + Verify(Method(ArduinoFake(), micros)).Once(); + Verify(Method(ArduinoFake(), millis)).Once(); + } + + void test_pin_mode(void) + { + When(Method(ArduinoFake(), pinMode)).AlwaysReturn(); + + pinMode(3, INPUT); + Verify(Method(ArduinoFake(), pinMode).Using(3, INPUT)).Once(); + + pinMode(3, OUTPUT); + Verify(Method(ArduinoFake(), pinMode).Using(3, INPUT)).Once(); + } + + void test_digital_pin(void) + { + When(Method(ArduinoFake(), digitalWrite)).AlwaysReturn(); + When(Method(ArduinoFake(), digitalRead)).AlwaysReturn(LOW); + + digitalWrite(3, HIGH); + Verify(Method(ArduinoFake(), digitalWrite).Using(3, HIGH)).Once(); + + TEST_ASSERT_EQUAL(LOW, digitalRead(4)); + Verify(Method(ArduinoFake(), digitalRead).Using(4)).Once(); + } + + void test_analog_pin(void) + { + When(Method(ArduinoFake(), analogWrite)).AlwaysReturn(); + When(Method(ArduinoFake(), analogRead)).AlwaysReturn(123); + + analogWrite(3, 321); + Verify(Method(ArduinoFake(), analogWrite).Using(3, 321)).Once(); + + TEST_ASSERT_EQUAL(123, analogRead(4)); + Verify(Method(ArduinoFake(), analogRead).Using(4)).Once(); + } + + void test_analog_read_resolution(void) + { + When(Method(ArduinoFake(), analogReadResolution)).AlwaysReturn(); + + analogReadResolution(12); + + Verify(Method(ArduinoFake(), analogReadResolution).Using(12)).Once(); + } + + void test_yield(void) + { + When(Method(ArduinoFake(), yield)).AlwaysReturn(); + + yield(); + + Verify(Method(ArduinoFake(), yield)).Once(); + } + + void test_delay(void) + { + When(Method(ArduinoFake(), delay)).AlwaysReturn(); + When(Method(ArduinoFake(), delayMicroseconds)).AlwaysReturn(); + + delay(100); + delayMicroseconds(200); + + Verify(Method(ArduinoFake(), delay).Using(100)).Once(); + Verify(Method(ArduinoFake(), delayMicroseconds).Using(200)).Once(); + } + + void test_pulsein(void) + { + When(Method(ArduinoFake(), pulseIn)).AlwaysReturn(1000); + + TEST_ASSERT_EQUAL(1000, pulseIn(10, HIGH, 1234)); + + Verify(Method(ArduinoFake(), pulseIn).Using(10, HIGH, 1234)).Once(); + } + + void test_shift(void) + { + When(Method(ArduinoFake(), shiftIn)).AlwaysReturn(8); + When(Method(ArduinoFake(), shiftOut)).AlwaysReturn(); + + shiftOut(10, 11, LSBFIRST, 8); + Verify(Method(ArduinoFake(), shiftOut).Using(10, 11, LSBFIRST, 8)).Once(); + + TEST_ASSERT_EQUAL(8, shiftIn(5, 6, MSBFIRST)); + Verify(Method(ArduinoFake(), shiftIn).Using(5, 6, MSBFIRST)).Once(); + } + + void test_detach(void) + { + When(Method(ArduinoFake(), detachInterrupt)).AlwaysReturn(); + + detachInterrupt(1); + + Verify(Method(ArduinoFake(), detachInterrupt).Using(1)).Once(); + } + + void test_attach(void) + { + When(Method(ArduinoFake(), attachInterrupt)).AlwaysReturn(); + + attachInterrupt(1, (void (*)(void))NULL, FALLING); + attachInterrupt(2, (void (*)(void))NULL, CHANGE); + attachInterrupt(3, (void (*)(void))NULL, RISING); + + Verify(Method(ArduinoFake(), attachInterrupt)).Exactly(3); + } + + void test_cli(void) + { + When(Method(ArduinoFake(), cli)).AlwaysReturn(); + + cli(); + + Verify(Method(ArduinoFake(), cli)).Once(); + } + + void test_sei(void) + { + When(Method(ArduinoFake(), sei)).AlwaysReturn(); + + sei(); + + Verify(Method(ArduinoFake(), sei)).Once(); + } + + void test_random(void) + { + When(Method(ArduinoFake(), randomSeed)).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(), random, long(long))).Return(10, 11); + When(OverloadedMethod(ArduinoFake(), random, long(long, long))).Return(20, 21); + + randomSeed(123); + + TEST_ASSERT_EQUAL(10, random(10)); + TEST_ASSERT_EQUAL(11, random(15)); + TEST_ASSERT_EQUAL(20, random(5, 20)); + TEST_ASSERT_EQUAL(21, random(10, 25)); + + Verify(Method(ArduinoFake(), randomSeed).Using(123)).Once(); + + Verify(OverloadedMethod(ArduinoFake(), random, long(long)).Using(10)).Once(); + Verify(OverloadedMethod(ArduinoFake(), random, long(long)).Using(15)).Once(); + + Verify(OverloadedMethod(ArduinoFake(), random, long(long, long)).Using(5, 20)).Once(); + Verify(OverloadedMethod(ArduinoFake(), random, long(long, long)).Using(10, 25)).Once(); + } + + void test_tone(void) + { + When(Method(ArduinoFake(), tone)).AlwaysReturn(); + When(Method(ArduinoFake(), noTone)).AlwaysReturn(); + + tone(7, 1047, 8); + tone(8, 1319, 4); + tone(9, 1568, 2); + + noTone(7); + noTone(8); + noTone(9); + + Verify(Method(ArduinoFake(), tone).Using(7, 1047, 8)).Once(); + Verify(Method(ArduinoFake(), tone).Using(8, 1319, 4)).Once(); + Verify(Method(ArduinoFake(), tone).Using(9, 1568, 2)).Once(); + + Verify(Method(ArduinoFake(), noTone).Using(7)).Once(); + Verify(Method(ArduinoFake(), noTone).Using(8)).Once(); + Verify(Method(ArduinoFake(), noTone).Using(9)).Once(); + } + + void test_map(void) + { + When(Method(ArduinoFake(), map)).Return(5); + + TEST_ASSERT_EQUAL(5, map(50, 0, 100, 0, 10)); + + Verify(Method(ArduinoFake(), map).Using(50, 0, 100, 0, 10)).Once(); + } + + void run_tests(void) + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(FunctionTest::test_timestamps); + RUN_TEST(FunctionTest::test_pin_mode); + RUN_TEST(FunctionTest::test_digital_pin); + RUN_TEST(FunctionTest::test_analog_pin); + RUN_TEST(FunctionTest::test_analog_read_resolution); + RUN_TEST(FunctionTest::test_delay); + RUN_TEST(FunctionTest::test_detach); + RUN_TEST(FunctionTest::test_attach); + RUN_TEST(FunctionTest::test_cli); + RUN_TEST(FunctionTest::test_sei); + RUN_TEST(FunctionTest::test_pulsein); + RUN_TEST(FunctionTest::test_shift); + RUN_TEST(FunctionTest::test_random); + RUN_TEST(FunctionTest::test_tone); + RUN_TEST(FunctionTest::test_map); + } +} diff --git a/test/test_function.h b/test/test_function.h index 5362aa2..c86d207 100644 --- a/test/test_function.h +++ b/test/test_function.h @@ -2,213 +2,7 @@ namespace FunctionTest { - void test_timestamps(void) - { - When(Method(ArduinoFake(), micros)).AlwaysReturn(100000); - When(Method(ArduinoFake(), millis)).AlwaysReturn(200000); - - TEST_ASSERT_EQUAL(100000, micros()); - TEST_ASSERT_EQUAL(200000, millis()); - - Verify(Method(ArduinoFake(), micros)).Once(); - Verify(Method(ArduinoFake(), millis)).Once(); - } - - void test_pin_mode(void) - { - When(Method(ArduinoFake(), pinMode)).AlwaysReturn(); - - pinMode(3, INPUT); - Verify(Method(ArduinoFake(), pinMode).Using(3, INPUT)).Once(); - - pinMode(3, OUTPUT); - Verify(Method(ArduinoFake(), pinMode).Using(3, INPUT)).Once(); - } - - void test_digital_pin(void) - { - When(Method(ArduinoFake(), digitalWrite)).AlwaysReturn(); - When(Method(ArduinoFake(), digitalRead)).AlwaysReturn(LOW); - - digitalWrite(3, HIGH); - Verify(Method(ArduinoFake(), digitalWrite).Using(3, HIGH)).Once(); - - TEST_ASSERT_EQUAL(LOW, digitalRead(4)); - Verify(Method(ArduinoFake(), digitalRead).Using(4)).Once(); - } - - void test_analog_pin(void) - { - When(Method(ArduinoFake(), analogWrite)).AlwaysReturn(); - When(Method(ArduinoFake(), analogRead)).AlwaysReturn(123); - - analogWrite(3, 321); - Verify(Method(ArduinoFake(), analogWrite).Using(3, 321)).Once(); - - TEST_ASSERT_EQUAL(123, analogRead(4)); - Verify(Method(ArduinoFake(), analogRead).Using(4)).Once(); - } - - void test_analog_read_resolution(void) - { - When(Method(ArduinoFake(), analogReadResolution)).AlwaysReturn(); - - analogReadResolution(12); - - Verify(Method(ArduinoFake(), analogReadResolution).Using(12)).Once(); - } - - void test_yield(void) - { - When(Method(ArduinoFake(), yield)).AlwaysReturn(); - - yield(); - - Verify(Method(ArduinoFake(), yield)).Once(); - } - - void test_delay(void) - { - When(Method(ArduinoFake(), delay)).AlwaysReturn(); - When(Method(ArduinoFake(), delayMicroseconds)).AlwaysReturn(); - - delay(100); - delayMicroseconds(200); - - Verify(Method(ArduinoFake(), delay).Using(100)).Once(); - Verify(Method(ArduinoFake(), delayMicroseconds).Using(200)).Once(); - } - - void test_pulsein(void) - { - When(Method(ArduinoFake(), pulseIn)).AlwaysReturn(1000); - - TEST_ASSERT_EQUAL(1000, pulseIn(10, HIGH, 1234)); - - Verify(Method(ArduinoFake(), pulseIn).Using(10, HIGH, 1234)).Once(); - } - - void test_shift(void) - { - When(Method(ArduinoFake(), shiftIn)).AlwaysReturn(8); - When(Method(ArduinoFake(), shiftOut)).AlwaysReturn(); - - shiftOut(10, 11, LSBFIRST, 8); - Verify(Method(ArduinoFake(), shiftOut).Using(10, 11, LSBFIRST, 8)).Once(); - - TEST_ASSERT_EQUAL(8, shiftIn(5, 6, MSBFIRST)); - Verify(Method(ArduinoFake(), shiftIn).Using(5, 6, MSBFIRST)).Once(); - } - - void test_detach(void) - { - When(Method(ArduinoFake(), detachInterrupt)).AlwaysReturn(); - - detachInterrupt(1); - - Verify(Method(ArduinoFake(), detachInterrupt).Using(1)).Once(); - } - - void test_attach(void) - { - When(Method(ArduinoFake(), attachInterrupt)).AlwaysReturn(); - - attachInterrupt(1, (void (*)(void))NULL, FALLING); - attachInterrupt(2, (void (*)(void))NULL, CHANGE); - attachInterrupt(3, (void (*)(void))NULL, RISING); - - Verify(Method(ArduinoFake(), attachInterrupt)).Exactly(3); - } - - void test_cli(void) - { - When(Method(ArduinoFake(), cli)).AlwaysReturn(); - - cli(); - - Verify(Method(ArduinoFake(), cli)).Once(); - } - - void test_sei(void) - { - When(Method(ArduinoFake(), sei)).AlwaysReturn(); - - sei(); - - Verify(Method(ArduinoFake(), sei)).Once(); - } - - void test_random(void) - { - When(Method(ArduinoFake(), randomSeed)).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(), random, long(long))).Return(10, 11); - When(OverloadedMethod(ArduinoFake(), random, long(long, long))).Return(20, 21); - - randomSeed(123); - - TEST_ASSERT_EQUAL(10, random(10)); - TEST_ASSERT_EQUAL(11, random(15)); - TEST_ASSERT_EQUAL(20, random(5, 20)); - TEST_ASSERT_EQUAL(21, random(10, 25)); - - Verify(Method(ArduinoFake(), randomSeed).Using(123)).Once(); - - Verify(OverloadedMethod(ArduinoFake(), random, long(long)).Using(10)).Once(); - Verify(OverloadedMethod(ArduinoFake(), random, long(long)).Using(15)).Once(); - - Verify(OverloadedMethod(ArduinoFake(), random, long(long, long)).Using(5, 20)).Once(); - Verify(OverloadedMethod(ArduinoFake(), random, long(long, long)).Using(10, 25)).Once(); - } - - void test_tone(void) - { - When(Method(ArduinoFake(), tone)).AlwaysReturn(); - When(Method(ArduinoFake(), noTone)).AlwaysReturn(); - - tone(7, 1047, 8); - tone(8, 1319, 4); - tone(9, 1568, 2); - - noTone(7); - noTone(8); - noTone(9); - - Verify(Method(ArduinoFake(), tone).Using(7, 1047, 8)).Once(); - Verify(Method(ArduinoFake(), tone).Using(8, 1319, 4)).Once(); - Verify(Method(ArduinoFake(), tone).Using(9, 1568, 2)).Once(); - - Verify(Method(ArduinoFake(), noTone).Using(7)).Once(); - Verify(Method(ArduinoFake(), noTone).Using(8)).Once(); - Verify(Method(ArduinoFake(), noTone).Using(9)).Once(); - } - - void test_map(void) - { - When(Method(ArduinoFake(), map)).Return(5); - - TEST_ASSERT_EQUAL(5, map(50, 0, 100, 0, 10)); - - Verify(Method(ArduinoFake(), map).Using(50, 0, 100, 0, 10)).Once(); - } - - void run_tests(void) - { - RUN_TEST(FunctionTest::test_timestamps); - RUN_TEST(FunctionTest::test_pin_mode); - RUN_TEST(FunctionTest::test_digital_pin); - RUN_TEST(FunctionTest::test_analog_pin); - RUN_TEST(FunctionTest::test_analog_read_resolution); - RUN_TEST(FunctionTest::test_delay); - RUN_TEST(FunctionTest::test_detach); - RUN_TEST(FunctionTest::test_attach); - RUN_TEST(FunctionTest::test_cli); - RUN_TEST(FunctionTest::test_sei); - RUN_TEST(FunctionTest::test_pulsein); - RUN_TEST(FunctionTest::test_shift); - RUN_TEST(FunctionTest::test_random); - RUN_TEST(FunctionTest::test_tone); - RUN_TEST(FunctionTest::test_map); - } + void run_tests(void); } #endif diff --git a/test/test_print.cpp b/test/test_print.cpp new file mode 100644 index 0000000..cfbd31c --- /dev/null +++ b/test/test_print.cpp @@ -0,0 +1,109 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + +namespace PrintTest +{ + void test_print_variables(void) + { + char char_var = 'A'; + const char * char_array_var = "char_array_var"; + unsigned char unsigned_char_var = 'B'; + + int int_var = 123; + long long_var = 12345678; + double double_var = 98765.12; + unsigned int unsigned_int_var = 321; + unsigned long unsigned_long_var = 87654321; + + When(OverloadedMethod(ArduinoFake(Print), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(const char *))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned char, int))).AlwaysReturn(); + + When(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(long, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(double, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned int, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned long, int))).AlwaysReturn(); + + Print* print = ArduinoFakeMock(Print); + + print->print(char_var); + print->print(char_array_var); + print->print(unsigned_char_var, DEC); + + print->print(int_var, DEC); + print->print(long_var, DEC); + print->print(double_var, BIN); + print->print(unsigned_int_var, DEC); + print->print(unsigned_long_var, DEC); + + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(char)).Using(char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(const char *)).Using(char_array_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned char, int)).Using(unsigned_char_var, DEC)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int)).Using(int_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(long, int)).Using(long_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(double, int)).Using(double_var, BIN)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned int, int)).Using(unsigned_int_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned long, int)).Using(unsigned_long_var, DEC)).Once(); + } + + void test_println_variables(void) + { + char char_var = 'A'; + unsigned char unsigned_char_var = 'B'; + const char * char_array_var = "char_array_var"; + + int int_var = 123; + long long_var = 12345678; + double double_var = 98765.12; + unsigned int unsigned_int_var = 321; + unsigned long unsigned_long_var = 87654321; + + When(OverloadedMethod(ArduinoFake(Print), println, size_t())).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(const char *))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned char, int))).AlwaysReturn(); + + When(OverloadedMethod(ArduinoFake(Print), println, size_t(int, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(long, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(double, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned int, int))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned long, int))).AlwaysReturn(); + + Print* print = ArduinoFakeMock(Print); + + print->println(); + print->println(char_var); + print->println(char_array_var); + print->println(unsigned_char_var, DEC); + + print->println(int_var, DEC); + print->println(long_var, DEC); + print->println(double_var, BIN); + print->println(unsigned_int_var, DEC); + print->println(unsigned_long_var, DEC); + + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t())).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(char)).Using(char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(const char *)).Using(char_array_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned char, int)).Using(unsigned_char_var, DEC)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(int, int)).Using(int_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(long, int)).Using(long_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(double, int)).Using(double_var, BIN)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned int, int)).Using(unsigned_int_var, DEC)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned long, int)).Using(unsigned_long_var, DEC)).Once(); + } + + void run_tests() + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(PrintTest::test_print_variables); + RUN_TEST(PrintTest::test_println_variables); + } +} diff --git a/test/test_print.h b/test/test_print.h index 6f56946..38b75d0 100644 --- a/test/test_print.h +++ b/test/test_print.h @@ -2,104 +2,6 @@ namespace PrintTest { - void test_print_variables(void) - { - char char_var = 'A'; - const char * char_array_var = "char_array_var"; - unsigned char unsigned_char_var = 'B'; - - int int_var = 123; - long long_var = 12345678; - double double_var = 98765.12; - unsigned int unsigned_int_var = 321; - unsigned long unsigned_long_var = 87654321; - - When(OverloadedMethod(ArduinoFake(Print), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(const char *))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned char, int))).AlwaysReturn(); - - When(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(long, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(double, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned int, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned long, int))).AlwaysReturn(); - - Print* print = ArduinoFakeMock(Print); - - print->print(char_var); - print->print(char_array_var); - print->print(unsigned_char_var, DEC); - - print->print(int_var, DEC); - print->print(long_var, DEC); - print->print(double_var, BIN); - print->print(unsigned_int_var, DEC); - print->print(unsigned_long_var, DEC); - - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(char)).Using(char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(const char *)).Using(char_array_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned char, int)).Using(unsigned_char_var, DEC)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int)).Using(int_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(long, int)).Using(long_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(double, int)).Using(double_var, BIN)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned int, int)).Using(unsigned_int_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(unsigned long, int)).Using(unsigned_long_var, DEC)).Once(); - } - - void test_println_variables(void) - { - char char_var = 'A'; - unsigned char unsigned_char_var = 'B'; - const char * char_array_var = "char_array_var"; - - int int_var = 123; - long long_var = 12345678; - double double_var = 98765.12; - unsigned int unsigned_int_var = 321; - unsigned long unsigned_long_var = 87654321; - - When(OverloadedMethod(ArduinoFake(Print), println, size_t())).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(const char *))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned char, int))).AlwaysReturn(); - - When(OverloadedMethod(ArduinoFake(Print), println, size_t(int, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(long, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(double, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned int, int))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned long, int))).AlwaysReturn(); - - Print* print = ArduinoFakeMock(Print); - - print->println(); - print->println(char_var); - print->println(char_array_var); - print->println(unsigned_char_var, DEC); - - print->println(int_var, DEC); - print->println(long_var, DEC); - print->println(double_var, BIN); - print->println(unsigned_int_var, DEC); - print->println(unsigned_long_var, DEC); - - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t())).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(char)).Using(char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(const char *)).Using(char_array_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned char, int)).Using(unsigned_char_var, DEC)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(int, int)).Using(int_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(long, int)).Using(long_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(double, int)).Using(double_var, BIN)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned int, int)).Using(unsigned_int_var, DEC)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), println, size_t(unsigned long, int)).Using(unsigned_long_var, DEC)).Once(); - } - - void run_tests() - { - RUN_TEST(PrintTest::test_print_variables); - RUN_TEST(PrintTest::test_println_variables); - } -} + void run_tests();} #endif diff --git a/test/test_serial.cpp b/test/test_serial.cpp new file mode 100644 index 0000000..2f964af --- /dev/null +++ b/test/test_serial.cpp @@ -0,0 +1,90 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + +namespace SerialTest +{ + void test_extends_stream(void) + { + TEST_ASSERT_NOT_EQUAL( + ArduinoFakeInstance(Stream), + ArduinoFakeInstance(Serial) + ); + + char print_char_var = 'A'; + char stream_char_var = 'B'; + + int print_int_var = 123; + int stream_int_var = 321; + + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))).AlwaysReturn(); + + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(int, int))).AlwaysReturn(); + + Stream* stream = ArduinoFakeMock(Stream); + Serial_* serial = ArduinoFakeMock(Serial); + + stream->print(stream_char_var); + stream->print(stream_int_var, DEC); + + serial->print(print_char_var); + serial->print(print_int_var, DEC); + + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)).Using(stream_char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)).Using(stream_int_var, DEC)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(char)).Using(print_char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(int, int)).Using(print_int_var, DEC)).Once(); + } + + void test_global_serial(void) + { + When(Method(ArduinoFake(Serial), available)).Return(1); + When(OverloadedMethod(ArduinoFake(Serial), print, size_t(char))).Return(1); + + TEST_ASSERT_EQUAL(1, Serial.available()); + TEST_ASSERT_EQUAL(1, Serial.print('A')); + + Verify(Method(ArduinoFake(Serial), available)).Once(); + Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(char)).Using('A')).Once(); + } + + void test_basics(void) + { + When(Method(ArduinoFake(Serial), end)).AlwaysReturn(); + When(Method(ArduinoFake(Serial), flush)).AlwaysReturn(); + When(Method(ArduinoFake(Serial), available)).Return(0, 1); + When(OverloadedMethod(ArduinoFake(Serial), write, size_t(uint8_t))).Return(1); + When(OverloadedMethod(ArduinoFake(Serial), begin, void(unsigned long))).AlwaysReturn(); + + Serial.begin(9600); + + TEST_ASSERT_EQUAL(0, Serial.available()); + TEST_ASSERT_EQUAL(1, Serial.available()); + TEST_ASSERT_EQUAL(1, Serial.write(5)); + + Serial.flush(); + Serial.end(); + + Verify(OverloadedMethod(ArduinoFake(Serial), begin, void(unsigned long)).Using(9600)).Once(); + Verify(Method(ArduinoFake(Serial), available)).Exactly(2_Times); + + Verify(OverloadedMethod(ArduinoFake(Serial), write, size_t(uint8_t)).Using(5)).Once(); + + Verify(Method(ArduinoFake(Serial), flush)).Once(); + Verify(Method(ArduinoFake(Serial), end)).Once(); + } + + void run_tests() + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(SerialTest::test_extends_stream); + RUN_TEST(SerialTest::test_global_serial); + RUN_TEST(SerialTest::test_basics); + } +} diff --git a/test/test_serial.h b/test/test_serial.h index cc820b4..806c76e 100644 --- a/test/test_serial.h +++ b/test/test_serial.h @@ -2,85 +2,7 @@ namespace SerialTest { - void test_extends_stream(void) - { - TEST_ASSERT_NOT_EQUAL( - ArduinoFakeInstance(Stream), - ArduinoFakeInstance(Serial) - ); - - char print_char_var = 'A'; - char stream_char_var = 'B'; - - int print_int_var = 123; - int stream_int_var = 321; - - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))).AlwaysReturn(); - - When(OverloadedMethod(ArduinoFake(Serial), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Serial), print, size_t(int, int))).AlwaysReturn(); - - Stream* stream = ArduinoFakeMock(Stream); - Serial_* serial = ArduinoFakeMock(Serial); - - stream->print(stream_char_var); - stream->print(stream_int_var, DEC); - - serial->print(print_char_var); - serial->print(print_int_var, DEC); - - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)).Using(stream_char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)).Using(stream_int_var, DEC)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(char)).Using(print_char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(int, int)).Using(print_int_var, DEC)).Once(); - } - - void test_global_serial(void) - { - When(Method(ArduinoFake(Serial), available)).Return(1); - When(OverloadedMethod(ArduinoFake(Serial), print, size_t(char))).Return(1); - - TEST_ASSERT_EQUAL(1, Serial.available()); - TEST_ASSERT_EQUAL(1, Serial.print('A')); - - Verify(Method(ArduinoFake(Serial), available)).Once(); - Verify(OverloadedMethod(ArduinoFake(Serial), print, size_t(char)).Using('A')).Once(); - } - - void test_basics(void) - { - When(Method(ArduinoFake(Serial), end)).AlwaysReturn(); - When(Method(ArduinoFake(Serial), flush)).AlwaysReturn(); - When(Method(ArduinoFake(Serial), available)).Return(0, 1); - When(OverloadedMethod(ArduinoFake(Serial), write, size_t(uint8_t))).Return(1); - When(OverloadedMethod(ArduinoFake(Serial), begin, void(unsigned long))).AlwaysReturn(); - - Serial.begin(9600); - - TEST_ASSERT_EQUAL(0, Serial.available()); - TEST_ASSERT_EQUAL(1, Serial.available()); - TEST_ASSERT_EQUAL(1, Serial.write(5)); - - Serial.flush(); - Serial.end(); - - Verify(OverloadedMethod(ArduinoFake(Serial), begin, void(unsigned long)).Using(9600)).Once(); - Verify(Method(ArduinoFake(Serial), available)).Exactly(2_Times); - - Verify(OverloadedMethod(ArduinoFake(Serial), write, size_t(uint8_t)).Using(5)).Once(); - - Verify(Method(ArduinoFake(Serial), flush)).Once(); - Verify(Method(ArduinoFake(Serial), end)).Once(); - } - - void run_tests() - { - RUN_TEST(SerialTest::test_extends_stream); - RUN_TEST(SerialTest::test_global_serial); - RUN_TEST(SerialTest::test_basics); - } + void run_tests(); } #endif diff --git a/test/test_spi.cpp b/test/test_spi.cpp new file mode 100644 index 0000000..b4c4ac0 --- /dev/null +++ b/test/test_spi.cpp @@ -0,0 +1,50 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + + +namespace SpiTest { + +#include "arduino/SPI.h" + +void test_basics(void) { + SPISettings settings(4000000, MSBFIRST, SPI_MODE0); + uint8_t data = 0x01; + uint16_t data16 = 0x1234; + uint8_t buffer[] = {0x02, 0x03, 0x04}; + uint8_t *ptr = buffer; + + When(OverloadedMethod(ArduinoFake(SPI), begin, void(void))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), end, void(void))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), beginTransaction, void(SPISettings)).Using(settings)).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), endTransaction, void(void))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), transfer, uint8_t(uint8_t)).Using(data)).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), transfer16, uint16_t(uint16_t)).Using(data16)).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(SPI), transfer, void(void*, size_t)).Using(ptr, sizeof(buffer))).AlwaysReturn(); + + SPI.begin(); + SPI.beginTransaction(settings); + SPI.transfer(data); + SPI.transfer16(data16); + SPI.transfer(buffer, sizeof(buffer)); + SPI.endTransaction(); + SPI.end(); + + Verify(OverloadedMethod(ArduinoFake(SPI), begin, void(void))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), end, void(void))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), beginTransaction, void(SPISettings))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), endTransaction, void(void))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), transfer, uint8_t(uint8_t))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), transfer16, uint16_t(uint16_t))).Once(); + Verify(OverloadedMethod(ArduinoFake(SPI), transfer, void(void*, size_t))).Once(); +} + +void run_tests() +{ + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(SpiTest::test_basics); +} +} // namespace SpiTest diff --git a/test/test_spi.h b/test/test_spi.h index 3bcdf98..da1f4ff 100644 --- a/test/test_spi.h +++ b/test/test_spi.h @@ -1,42 +1,7 @@ #ifdef UNIT_TEST namespace SpiTest { - -#include "arduino/SPI.h" - -void test_basics(void) { - SPISettings settings(4000000, MSBFIRST, SPI_MODE0); - uint8_t data = 0x01; - uint16_t data16 = 0x1234; - uint8_t buffer[] = {0x02, 0x03, 0x04}; - uint8_t *ptr = buffer; - - When(OverloadedMethod(ArduinoFake(SPI), begin, void(void))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), end, void(void))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), beginTransaction, void(SPISettings)).Using(settings)).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), endTransaction, void(void))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), transfer, uint8_t(uint8_t)).Using(data)).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), transfer16, uint16_t(uint16_t)).Using(data16)).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(SPI), transfer, void(void*, size_t)).Using(ptr, sizeof(buffer))).AlwaysReturn(); - - SPI.begin(); - SPI.beginTransaction(settings); - SPI.transfer(data); - SPI.transfer16(data16); - SPI.transfer(buffer, sizeof(buffer)); - SPI.endTransaction(); - SPI.end(); - - Verify(OverloadedMethod(ArduinoFake(SPI), begin, void(void))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), end, void(void))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), beginTransaction, void(SPISettings))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), endTransaction, void(void))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), transfer, uint8_t(uint8_t))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), transfer16, uint16_t(uint16_t))).Once(); - Verify(OverloadedMethod(ArduinoFake(SPI), transfer, void(void*, size_t))).Once(); -} - -void run_tests() { RUN_TEST(SpiTest::test_basics); } + void run_tests(); } // namespace SpiTest #endif \ No newline at end of file diff --git a/test/test_stream.cpp b/test/test_stream.cpp new file mode 100644 index 0000000..5f32174 --- /dev/null +++ b/test/test_stream.cpp @@ -0,0 +1,182 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + + +namespace StreamTest +{ + void test_extends_print(void) + { + TEST_ASSERT_NOT_EQUAL( + ArduinoFakeInstance(Stream), + ArduinoFakeInstance(Print) + ); + + char print_char_var = 'A'; + char stream_char_var = 'B'; + + int print_int_var = 123; + int stream_int_var = 321; + + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))).AlwaysReturn(); + + When(OverloadedMethod(ArduinoFake(Print), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int))).AlwaysReturn(); + + Stream* stream = ArduinoFakeMock(Stream); + Print* print = ArduinoFakeMock(Print); + + stream->print(stream_char_var); + stream->print(stream_int_var, DEC); + + print->print(print_char_var); + print->print(print_int_var, DEC); + + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)).Using(stream_char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)).Using(stream_int_var, DEC)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(char)).Using(print_char_var)).Once(); + Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int)).Using(print_int_var, DEC)).Once(); + } + + void test_stream_basics(void) + { + When(Method(ArduinoFake(Stream), available)).Return(0, 1, 0); + When(Method(ArduinoFake(Stream), read)).Return(11, 12, 13); + When(Method(ArduinoFake(Stream), peek)).Return(21, 22, 23); + When(Method(ArduinoFake(Stream), flush)).AlwaysReturn(); + + Stream* stream = ArduinoFakeMock(Stream); + + TEST_ASSERT_EQUAL(0, stream->available()); + TEST_ASSERT_EQUAL(1, stream->available()); + TEST_ASSERT_EQUAL(0, stream->available()); + + TEST_ASSERT_EQUAL(11, stream->read()); + TEST_ASSERT_EQUAL(12, stream->read()); + TEST_ASSERT_EQUAL(13, stream->read()); + + TEST_ASSERT_EQUAL(21, stream->peek()); + TEST_ASSERT_EQUAL(22, stream->peek()); + TEST_ASSERT_EQUAL(23, stream->peek()); + + stream->flush(); + + Verify(Method(ArduinoFake(Stream), available)).Exactly(3_Times); + Verify(Method(ArduinoFake(Stream), read)).Exactly(3_Times); + Verify(Method(ArduinoFake(Stream), peek)).Exactly(3_Times); + Verify(Method(ArduinoFake(Stream), flush)).Once(); + } + + void test_stream_find(void) + { + char char_val1 = 'A'; + char char_val2 = 'B'; + char terminator = '*'; + + char* char_ptr1 = &char_val1; + char* char_ptr2 = &char_val2; + char* terminator_ptr = &terminator; + + When(OverloadedMethod(ArduinoFake(Stream), find, bool(char*))).Return(true, false); + When(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t))).Return(true, false); + + When(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, char*))).Return(true, false); + When(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, size_t, char*, size_t))).Return(true, false); + + Stream* stream = ArduinoFakeMock(Stream); + + TEST_ASSERT_EQUAL(true, stream->find(char_ptr1)); + TEST_ASSERT_EQUAL(false, stream->find(char_ptr2)); + + TEST_ASSERT_EQUAL(true, stream->find(char_ptr1, 10)); + TEST_ASSERT_EQUAL(false, stream->find(char_ptr2, 20)); + + TEST_ASSERT_EQUAL(true, stream->findUntil(char_ptr1, terminator_ptr)); + TEST_ASSERT_EQUAL(false, stream->findUntil(char_ptr2, terminator_ptr)); + + TEST_ASSERT_EQUAL(true, stream->findUntil(char_ptr1, 10, terminator_ptr, 11)); + TEST_ASSERT_EQUAL(false, stream->findUntil(char_ptr2, 20, terminator_ptr, 21)); + + Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*)).Using(char_ptr1)).Once(); + Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*)).Using(char_ptr2)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t)).Using(char_ptr1, 10)).Once(); + Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t)).Using(char_ptr2, 20)).Once(); + + Verify(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, char*))).Exactly(2_Times); + Verify(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, size_t, char*, size_t))).Exactly(2_Times); + } + + void test_stream_parse(void) + { + When(Method(ArduinoFake(Stream), parseInt)).Return(10, 11); + When(Method(ArduinoFake(Stream), parseFloat)).Return(2.0, 2.1); + + Stream* stream = ArduinoFakeMock(Stream); + + TEST_ASSERT_INT_WITHIN(0, 10, stream->parseInt()); + TEST_ASSERT_INT_WITHIN(0, 11, stream->parseInt()); + + TEST_ASSERT_FLOAT_WITHIN(0, 2.0, stream->parseFloat()); + TEST_ASSERT_FLOAT_WITHIN(0, 2.1, stream->parseFloat()); + + Verify(Method(ArduinoFake(Stream), parseInt)).Exactly(2_Times); + Verify(Method(ArduinoFake(Stream), parseFloat)).Exactly(2_Times); + } + + void test_stream_read(void) + { + char char_val1 = 'A'; + char char_val2 = 'B'; + char terminator = '*'; + String str1 = String('X'); + String str2 = String('Z'); + + char* char_ptr1 = &char_val1; + char* char_ptr2 = &char_val2; + + When(Method(ArduinoFake(Stream), readBytes)).Return(1, 2); + When(Method(ArduinoFake(Stream), readBytesUntil)).Return(3, 4); + When(Method(ArduinoFake(Stream), readString)).Return(str1, str2); + When(Method(ArduinoFake(Stream), readStringUntil)).Return(str1, str2); + + Stream* stream = ArduinoFakeMock(Stream); + + TEST_ASSERT_EQUAL_INT(1, stream->readBytes(char_ptr1, 10)); + TEST_ASSERT_EQUAL_INT(2, stream->readBytes(char_ptr2, 20)); + + TEST_ASSERT_EQUAL_INT(3, stream->readBytesUntil(terminator, char_ptr1, 10)); + TEST_ASSERT_EQUAL_INT(4, stream->readBytesUntil(terminator, char_ptr2, 20)); + + TEST_ASSERT_TRUE(str1.equals(stream->readString())); + TEST_ASSERT_TRUE(str2.equals(stream->readString())); + + TEST_ASSERT_TRUE(str1.equals(stream->readStringUntil(terminator))); + TEST_ASSERT_TRUE(str2.equals(stream->readStringUntil(terminator))); + + Verify(Method(ArduinoFake(Stream), readBytes).Using(char_ptr1, 10)).Once(); + Verify(Method(ArduinoFake(Stream), readBytes).Using(char_ptr2, 20)).Once(); + + Verify(Method(ArduinoFake(Stream), readBytesUntil).Using(terminator, char_ptr1, 10)).Once(); + Verify(Method(ArduinoFake(Stream), readBytesUntil).Using(terminator, char_ptr2, 20)).Once(); + + Verify(Method(ArduinoFake(Stream), readString)).Exactly(2_Times); + Verify(Method(ArduinoFake(Stream), readBytesUntil)).Exactly(2_Times); + } + + void run_tests() + { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(StreamTest::test_extends_print); + RUN_TEST(StreamTest::test_stream_basics); + RUN_TEST(StreamTest::test_stream_find); + RUN_TEST(StreamTest::test_stream_parse); + RUN_TEST(StreamTest::test_stream_read); + } +} + diff --git a/test/test_stream.h b/test/test_stream.h index 4777d60..9711534 100644 --- a/test/test_stream.h +++ b/test/test_stream.h @@ -2,175 +2,7 @@ namespace StreamTest { - void test_extends_print(void) - { - TEST_ASSERT_NOT_EQUAL( - ArduinoFakeInstance(Stream), - ArduinoFakeInstance(Print) - ); - - char print_char_var = 'A'; - char stream_char_var = 'B'; - - int print_int_var = 123; - int stream_int_var = 321; - - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))).AlwaysReturn(); - - When(OverloadedMethod(ArduinoFake(Print), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int))).AlwaysReturn(); - - Stream* stream = ArduinoFakeMock(Stream); - Print* print = ArduinoFakeMock(Print); - - stream->print(stream_char_var); - stream->print(stream_int_var, DEC); - - print->print(print_char_var); - print->print(print_int_var, DEC); - - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)).Using(stream_char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)).Using(stream_int_var, DEC)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(char)).Using(print_char_var)).Once(); - Verify(OverloadedMethod(ArduinoFake(Print), print, size_t(int, int)).Using(print_int_var, DEC)).Once(); - } - - void test_stream_basics(void) - { - When(Method(ArduinoFake(Stream), available)).Return(0, 1, 0); - When(Method(ArduinoFake(Stream), read)).Return(11, 12, 13); - When(Method(ArduinoFake(Stream), peek)).Return(21, 22, 23); - When(Method(ArduinoFake(Stream), flush)).AlwaysReturn(); - - Stream* stream = ArduinoFakeMock(Stream); - - TEST_ASSERT_EQUAL(0, stream->available()); - TEST_ASSERT_EQUAL(1, stream->available()); - TEST_ASSERT_EQUAL(0, stream->available()); - - TEST_ASSERT_EQUAL(11, stream->read()); - TEST_ASSERT_EQUAL(12, stream->read()); - TEST_ASSERT_EQUAL(13, stream->read()); - - TEST_ASSERT_EQUAL(21, stream->peek()); - TEST_ASSERT_EQUAL(22, stream->peek()); - TEST_ASSERT_EQUAL(23, stream->peek()); - - stream->flush(); - - Verify(Method(ArduinoFake(Stream), available)).Exactly(3_Times); - Verify(Method(ArduinoFake(Stream), read)).Exactly(3_Times); - Verify(Method(ArduinoFake(Stream), peek)).Exactly(3_Times); - Verify(Method(ArduinoFake(Stream), flush)).Once(); - } - - void test_stream_find(void) - { - char char_val1 = 'A'; - char char_val2 = 'B'; - char terminator = '*'; - - char* char_ptr1 = &char_val1; - char* char_ptr2 = &char_val2; - char* terminator_ptr = &terminator; - - When(OverloadedMethod(ArduinoFake(Stream), find, bool(char*))).Return(true, false); - When(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t))).Return(true, false); - - When(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, char*))).Return(true, false); - When(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, size_t, char*, size_t))).Return(true, false); - - Stream* stream = ArduinoFakeMock(Stream); - - TEST_ASSERT_EQUAL(true, stream->find(char_ptr1)); - TEST_ASSERT_EQUAL(false, stream->find(char_ptr2)); - - TEST_ASSERT_EQUAL(true, stream->find(char_ptr1, 10)); - TEST_ASSERT_EQUAL(false, stream->find(char_ptr2, 20)); - - TEST_ASSERT_EQUAL(true, stream->findUntil(char_ptr1, terminator_ptr)); - TEST_ASSERT_EQUAL(false, stream->findUntil(char_ptr2, terminator_ptr)); - - TEST_ASSERT_EQUAL(true, stream->findUntil(char_ptr1, 10, terminator_ptr, 11)); - TEST_ASSERT_EQUAL(false, stream->findUntil(char_ptr2, 20, terminator_ptr, 21)); - - Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*)).Using(char_ptr1)).Once(); - Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*)).Using(char_ptr2)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t)).Using(char_ptr1, 10)).Once(); - Verify(OverloadedMethod(ArduinoFake(Stream), find, bool(char*, size_t)).Using(char_ptr2, 20)).Once(); - - Verify(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, char*))).Exactly(2_Times); - Verify(OverloadedMethod(ArduinoFake(Stream), findUntil, bool(char*, size_t, char*, size_t))).Exactly(2_Times); - } - - void test_stream_parse(void) - { - When(Method(ArduinoFake(Stream), parseInt)).Return(10, 11); - When(Method(ArduinoFake(Stream), parseFloat)).Return(2.0, 2.1); - - Stream* stream = ArduinoFakeMock(Stream); - - TEST_ASSERT_INT_WITHIN(0, 10, stream->parseInt()); - TEST_ASSERT_INT_WITHIN(0, 11, stream->parseInt()); - - TEST_ASSERT_FLOAT_WITHIN(0, 2.0, stream->parseFloat()); - TEST_ASSERT_FLOAT_WITHIN(0, 2.1, stream->parseFloat()); - - Verify(Method(ArduinoFake(Stream), parseInt)).Exactly(2_Times); - Verify(Method(ArduinoFake(Stream), parseFloat)).Exactly(2_Times); - } - - void test_stream_read(void) - { - char char_val1 = 'A'; - char char_val2 = 'B'; - char terminator = '*'; - String str1 = String('X'); - String str2 = String('Z'); - - char* char_ptr1 = &char_val1; - char* char_ptr2 = &char_val2; - - When(Method(ArduinoFake(Stream), readBytes)).Return(1, 2); - When(Method(ArduinoFake(Stream), readBytesUntil)).Return(3, 4); - When(Method(ArduinoFake(Stream), readString)).Return(str1, str2); - When(Method(ArduinoFake(Stream), readStringUntil)).Return(str1, str2); - - Stream* stream = ArduinoFakeMock(Stream); - - TEST_ASSERT_EQUAL_INT(1, stream->readBytes(char_ptr1, 10)); - TEST_ASSERT_EQUAL_INT(2, stream->readBytes(char_ptr2, 20)); - - TEST_ASSERT_EQUAL_INT(3, stream->readBytesUntil(terminator, char_ptr1, 10)); - TEST_ASSERT_EQUAL_INT(4, stream->readBytesUntil(terminator, char_ptr2, 20)); - - TEST_ASSERT_TRUE(str1.equals(stream->readString())); - TEST_ASSERT_TRUE(str2.equals(stream->readString())); - - TEST_ASSERT_TRUE(str1.equals(stream->readStringUntil(terminator))); - TEST_ASSERT_TRUE(str2.equals(stream->readStringUntil(terminator))); - - Verify(Method(ArduinoFake(Stream), readBytes).Using(char_ptr1, 10)).Once(); - Verify(Method(ArduinoFake(Stream), readBytes).Using(char_ptr2, 20)).Once(); - - Verify(Method(ArduinoFake(Stream), readBytesUntil).Using(terminator, char_ptr1, 10)).Once(); - Verify(Method(ArduinoFake(Stream), readBytesUntil).Using(terminator, char_ptr2, 20)).Once(); - - Verify(Method(ArduinoFake(Stream), readString)).Exactly(2_Times); - Verify(Method(ArduinoFake(Stream), readBytesUntil)).Exactly(2_Times); - } - - void run_tests() - { - RUN_TEST(StreamTest::test_extends_print); - RUN_TEST(StreamTest::test_stream_basics); - RUN_TEST(StreamTest::test_stream_find); - RUN_TEST(StreamTest::test_stream_parse); - RUN_TEST(StreamTest::test_stream_read); - } + void run_tests(); } #endif diff --git a/test/test_wire.cpp b/test/test_wire.cpp new file mode 100644 index 0000000..8e33a44 --- /dev/null +++ b/test/test_wire.cpp @@ -0,0 +1,114 @@ +#include +#include +#include "unity_filename_helper.h" + +using namespace fakeit; + +namespace WireTest { +void test_extends_stream(void) { + TEST_ASSERT_NOT_EQUAL(ArduinoFakeInstance(Stream), ArduinoFakeInstance(Wire)); + + char print_char_var = 'A'; + char stream_char_var = 'B'; + + int print_int_var = 123; + int stream_int_var = 321; + + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))) + .AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))) + .AlwaysReturn(); + + When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int))) + .AlwaysReturn(); + + Stream *stream = ArduinoFakeMock(Stream); + TwoWire *wire = ArduinoFakeMock(Wire); + + stream->print(stream_char_var); + stream->print(stream_int_var, DEC); + + wire->print(print_char_var); + wire->print(print_int_var, DEC); + + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)) + .Using(stream_char_var)) + .Once(); + Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)) + .Using(stream_int_var, DEC)) + .Once(); + + Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char)) + .Using(print_char_var)) + .Once(); + Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int)) + .Using(print_int_var, DEC)) + .Once(); +} + +void test_global_wire(void) { + When(Method(ArduinoFake(Wire), available)).Return(1); + When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).Return(1); + + TEST_ASSERT_EQUAL(1, Wire.available()); + TEST_ASSERT_EQUAL(1, Wire.print('A')); + + Verify(Method(ArduinoFake(Wire), available)).Once(); + Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char)).Using('A')) + .Once(); +} + +void test_basics(void) { + + uint8_t device_addr = 0xab; + uint8_t register_addr = 0xcd; + int num_bytes_to_read = 1; + bool send_stop = false; + When(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t))) + .AlwaysReturn(); + When(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t))) + .Return(true); + When(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool))) + .Return(0); + When(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t))) + .Return(0); + When(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Return(1); + When(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Return(1); + + Wire.begin(); + Wire.beginTransmission(device_addr); + Wire.write(register_addr); + Wire.endTransmission(send_stop); + Wire.requestFrom(device_addr, num_bytes_to_read); + if (Wire.available()) { + Wire.read(); + } + + Verify(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t)) + .Using(device_addr)) + .Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t)) + .Using(register_addr)) + .Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool)) + .Using(send_stop)) + .Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t)) + .Using(device_addr, num_bytes_to_read)) + .Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Exactly(1); + Verify(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Exactly(1); +} + +void run_tests() { + unity_filename_helper_t _ufname_helper(__FILE__); + + RUN_TEST(WireTest::test_extends_stream); + RUN_TEST(WireTest::test_global_wire); + RUN_TEST(WireTest::test_basics); +} +} // namespace WireTest + diff --git a/test/test_wire.h b/test/test_wire.h index ed912ee..7a6354d 100644 --- a/test/test_wire.h +++ b/test/test_wire.h @@ -1,109 +1,7 @@ #ifdef UNIT_TEST namespace WireTest { -void test_extends_stream(void) { - TEST_ASSERT_NOT_EQUAL(ArduinoFakeInstance(Stream), ArduinoFakeInstance(Wire)); - - char print_char_var = 'A'; - char stream_char_var = 'B'; - - int print_int_var = 123; - int stream_int_var = 321; - - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(char))) - .AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int))) - .AlwaysReturn(); - - When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int))) - .AlwaysReturn(); - - Stream *stream = ArduinoFakeMock(Stream); - TwoWire *wire = ArduinoFakeMock(Wire); - - stream->print(stream_char_var); - stream->print(stream_int_var, DEC); - - wire->print(print_char_var); - wire->print(print_int_var, DEC); - - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(char)) - .Using(stream_char_var)) - .Once(); - Verify(OverloadedMethod(ArduinoFake(Stream), print, size_t(int, int)) - .Using(stream_int_var, DEC)) - .Once(); - - Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char)) - .Using(print_char_var)) - .Once(); - Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(int, int)) - .Using(print_int_var, DEC)) - .Once(); -} - -void test_global_wire(void) { - When(Method(ArduinoFake(Wire), available)).Return(1); - When(OverloadedMethod(ArduinoFake(Wire), print, size_t(char))).Return(1); - - TEST_ASSERT_EQUAL(1, Wire.available()); - TEST_ASSERT_EQUAL(1, Wire.print('A')); - - Verify(Method(ArduinoFake(Wire), available)).Once(); - Verify(OverloadedMethod(ArduinoFake(Wire), print, size_t(char)).Using('A')) - .Once(); -} - -void test_basics(void) { - - uint8_t device_addr = 0xab; - uint8_t register_addr = 0xcd; - int num_bytes_to_read = 1; - bool send_stop = false; - When(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t))) - .AlwaysReturn(); - When(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t))) - .Return(true); - When(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool))) - .Return(0); - When(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t))) - .Return(0); - When(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Return(1); - When(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Return(1); - - Wire.begin(); - Wire.beginTransmission(device_addr); - Wire.write(register_addr); - Wire.endTransmission(send_stop); - Wire.requestFrom(device_addr, num_bytes_to_read); - if (Wire.available()) { - Wire.read(); - } - - Verify(OverloadedMethod(ArduinoFake(Wire), begin, void(void))).Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), beginTransmission, void(uint8_t)) - .Using(device_addr)) - .Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), write, size_t(uint8_t)) - .Using(register_addr)) - .Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), endTransmission, uint8_t(bool)) - .Using(send_stop)) - .Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), requestFrom, uint8_t(uint8_t, uint8_t)) - .Using(device_addr, num_bytes_to_read)) - .Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), available, int(void))).Exactly(1); - Verify(OverloadedMethod(ArduinoFake(Wire), read, int(void))).Exactly(1); -} - -void run_tests() { - RUN_TEST(WireTest::test_extends_stream); - RUN_TEST(WireTest::test_global_wire); - RUN_TEST(WireTest::test_basics); -} + void run_tests(); } // namespace WireTest #endif diff --git a/test/unity_filename_helper.h b/test/unity_filename_helper.h new file mode 100644 index 0000000..e3e9df2 --- /dev/null +++ b/test/unity_filename_helper.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +struct unity_filename_helper_t +{ + unity_filename_helper_t(const char* newName) : savedName(Unity.TestFile) + { + Unity.TestFile = newName; + } + ~unity_filename_helper_t() + { + Unity.TestFile = savedName; + } + const char* savedName; +};