Skip to content

Commit 1e7fe87

Browse files
authored
chore: Refactor Notecard unit-tests to use abstractions (#59)
* chore: Refactor tests to use mock abstractions - Complete mock headers - rename mock files to follow naming convention - update test runner script * feat: Enable `run_all_tests.sh` to execute without `gcovr` * fix: `Notecard.test.cpp` compile comment
1 parent c693fd1 commit 1e7fe87

File tree

10 files changed

+635
-142
lines changed

10 files changed

+635
-142
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*.gcda
66
*.gcno
77
*.gcov
8+
89
Doxyfile*
910
doxygen_sqlite3.db
1011
html

src/Notecard.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,6 @@
4848

4949
namespace
5050
{
51-
NoteLog *noteLog(nullptr);
52-
53-
size_t noteLogPrint(const char * str_)
54-
{
55-
size_t result;
56-
if (noteLog)
57-
{
58-
result = noteLog->print(str_);
59-
}
60-
else
61-
{
62-
result = 0;
63-
}
64-
return result;
65-
}
66-
6751
NoteI2c *noteI2c(nullptr);
6852

6953
const char *noteI2cReceive(uint16_t device_address_, uint8_t *buffer_, uint16_t size_, uint32_t *available_)
@@ -108,6 +92,22 @@ namespace
10892
return result;
10993
}
11094

95+
NoteLog *noteLog(nullptr);
96+
97+
size_t noteLogPrint(const char * str_)
98+
{
99+
size_t result;
100+
if (noteLog)
101+
{
102+
result = noteLog->print(str_);
103+
}
104+
else
105+
{
106+
result = 0;
107+
}
108+
return result;
109+
}
110+
111111
NoteSerial *noteSerial(nullptr);
112112

113113
bool noteSerialAvailable(void)

test/Notecard.test.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
#include "TestFunction.hpp"
88
#include "mock/mock-arduino.hpp"
99
#include "mock/mock-parameters.hpp"
10+
#include "mock/NoteI2c_Mock.hpp"
11+
#include "mock/NoteLog_Mock.hpp"
12+
#include "mock/NoteSerial_Mock.hpp"
1013

11-
// Compile command: g++ -Wall -Wextra -Wpedantic mock/mock-arduino.cpp mock/mock-note-c-note.c ../src/Notecard.cpp ../src/NoteI2c_Arduino.cpp ../src/NoteLog_Arduino.cpp ../src/NoteSerial_Arduino.cpp Notecard.test.cpp -std=c++11 -I. -I../src -DNOTE_MOCK && ./a.out || echo "Tests Result: $?"
14+
// Compile command: g++ -Wall -Wextra -Wpedantic mock/mock-arduino.cpp mock/mock-note-c-note.c mock/NoteI2c_Mock.cpp mock/NoteLog_Mock.cpp mock/NoteSerial_Mock.cpp ../src/Notecard.cpp Notecard.test.cpp -std=c++11 -I. -I../src -DNOTE_MOCK && ./a.out || echo "Tests Result: $?"
1215

1316
int test_notecard_begin_i2c_shares_a_memory_allocation_functon_pointer()
1417
{
@@ -323,57 +326,57 @@ int test_notecard_begin_i2c_default_parameter_for_i2c_address_is_passed_to_note_
323326
return result;
324327
}
325328

326-
int test_notecard_begin_i2c_default_parameter_for_wirePort_has_begin_method_called()
329+
int test_notecard_begin_i2c_default_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wire()
327330
{
328331
int result;
329332

330333
// Arrange
331334
Notecard notecard;
332335

333-
twoWireBegin_Parameters.reset();
336+
make_note_i2c_Parameters.reset();
334337

335338
// Action
336339
notecard.begin();
337340

338341
// Assert
339-
if (twoWireBegin_Parameters.invoked)
342+
if (&Wire == make_note_i2c_Parameters.i2c_bus)
340343
{
341344
result = 0;
342345
}
343346
else
344347
{
345348
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
346349
std::cout << "FAILED] " << __FILE__ << ":" << __LINE__ << std::endl;
347-
std::cout << "\ttwoWireBegin_Parameters.invoked == " << !!twoWireBegin_Parameters.invoked << ", EXPECTED: " << true << std::endl;
350+
std::cout << "\tmake_note_i2c_Parameters.i2c_bus == " << !!make_note_i2c_Parameters.i2c_bus << ", EXPECTED: " << &Wire << std::endl;
348351
std::cout << "[";
349352
}
350353

351354
return result;
352355
}
353356

354-
int test_notecard_begin_i2c_parameter_for_wirePort_has_begin_method_called()
357+
int test_notecard_begin_i2c_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wirePort()
355358
{
356359
int result;
357360

358361
// Arrange
359362
Notecard notecard;
360363
TwoWire mockWire;
361364

362-
twoWireBegin_Parameters.reset();
365+
make_note_i2c_Parameters.reset();
363366

364367
// Action
365368
notecard.begin(NOTE_I2C_ADDR_DEFAULT, NOTE_I2C_MAX_DEFAULT, mockWire);
366369

367370
// Assert
368-
if (twoWireBegin_Parameters.invoked)
371+
if (&mockWire == make_note_i2c_Parameters.i2c_bus)
369372
{
370373
result = 0;
371374
}
372375
else
373376
{
374377
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
375378
std::cout << "FAILED] " << __FILE__ << ":" << __LINE__ << std::endl;
376-
std::cout << "\ttwoWireBegin_Parameters.invoked == " << !!twoWireBegin_Parameters.invoked << ", EXPECTED: " << true << std::endl;
379+
std::cout << "\tmake_note_i2c_Parameters.i2c_bus == " << make_note_i2c_Parameters.i2c_bus << ", EXPECTED: " << &mockWire << std::endl;
377380
std::cout << "[";
378381
}
379382

@@ -641,50 +644,50 @@ int test_notecard_begin_serial_initializes_the_provided_serial_interface_with_pr
641644
Notecard notecard;
642645
const unsigned int EXPECTED_BAUD_RATE = 9600;
643646

644-
hardwareSerialBegin_Parameters.reset();
647+
make_note_serial_Parameters.reset();
645648

646649
// Action
647650
notecard.begin(Serial, EXPECTED_BAUD_RATE);
648651

649652
// Assert
650-
if (EXPECTED_BAUD_RATE == hardwareSerialBegin_Parameters.baud)
653+
if (EXPECTED_BAUD_RATE == make_note_serial_Parameters.baud_rate)
651654
{
652655
result = 0;
653656
}
654657
else
655658
{
656659
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
657660
std::cout << "FAILED] " << __FILE__ << ":" << __LINE__ << std::endl;
658-
std::cout << "\thardwareSerialBegin_Parameters.baud == " << hardwareSerialBegin_Parameters.baud << ", EXPECTED: " << EXPECTED_BAUD_RATE << std::endl;
661+
std::cout << "\tmake_note_serial_Parameters.baud_rate == " << make_note_serial_Parameters.baud_rate << ", EXPECTED: " << EXPECTED_BAUD_RATE << std::endl;
659662
std::cout << "[";
660663
}
661664

662665
return result;
663666
}
664667

665-
int test_notecard_begin_serial_default_parameter_for_baud_rate_is_passed_to_note_c()
668+
int test_notecard_begin_serial_initializes_the_provided_serial_interface_with_default_speed()
666669
{
667670
int result;
668671

669672
// Arrange
670673
Notecard notecard;
671674
const unsigned int EXPECTED_BAUD_RATE = 9600;
672675

673-
hardwareSerialBegin_Parameters.reset();
676+
make_note_serial_Parameters.reset();
674677

675678
// Action
676679
notecard.begin(Serial);
677680

678681
// Assert
679-
if (EXPECTED_BAUD_RATE == hardwareSerialBegin_Parameters.baud)
682+
if (EXPECTED_BAUD_RATE == make_note_serial_Parameters.baud_rate)
680683
{
681684
result = 0;
682685
}
683686
else
684687
{
685688
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
686689
std::cout << "FAILED] " << __FILE__ << ":" << __LINE__ << std::endl;
687-
std::cout << "\thardwareSerialBegin_Parameters.baud == " << hardwareSerialBegin_Parameters.baud << ", EXPECTED: " << EXPECTED_BAUD_RATE << std::endl;
690+
std::cout << "\tmake_note_serial_Parameters.baud_rate == " << make_note_serial_Parameters.baud_rate << ", EXPECTED: " << EXPECTED_BAUD_RATE << std::endl;
688691
std::cout << "[";
689692
}
690693

@@ -1315,8 +1318,8 @@ int main(void)
13151318
{test_notecard_begin_i2c_shares_an_i2c_receive_functon_pointer, "test_notecard_begin_i2c_shares_an_i2c_receive_functon_pointer"},
13161319
{test_notecard_begin_i2c_default_parameter_for_i2c_max_is_passed_to_note_c, "test_notecard_begin_i2c_default_parameter_for_i2c_max_is_passed_to_note_c"},
13171320
{test_notecard_begin_i2c_default_parameter_for_i2c_address_is_passed_to_note_c, "test_notecard_begin_i2c_default_parameter_for_i2c_address_is_passed_to_note_c"},
1318-
{test_notecard_begin_i2c_default_parameter_for_wirePort_has_begin_method_called, "test_notecard_begin_i2c_default_parameter_for_wirePort_has_begin_method_called"},
1319-
{test_notecard_begin_i2c_parameter_for_wirePort_has_begin_method_called, "test_notecard_begin_i2c_parameter_for_wirePort_has_begin_method_called"},
1321+
{test_notecard_begin_i2c_default_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wire, "test_notecard_begin_i2c_default_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wire"},
1322+
{test_notecard_begin_i2c_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wirePort, "test_notecard_begin_i2c_parameter_for_wirePort_instantiates_the_note_i2c_interface_with_wirePort"},
13201323
{test_notecard_begin_i2c_sets_user_agent_to_note_arduino, "test_notecard_begin_i2c_sets_user_agent_to_note_arduino"},
13211324
{test_notecard_begin_serial_shares_a_memory_allocation_functon_pointer, "test_notecard_begin_serial_shares_a_memory_allocation_functon_pointer"},
13221325
{test_notecard_begin_serial_shares_a_memory_free_functon_pointer, "test_notecard_begin_serial_shares_a_memory_free_functon_pointer"},
@@ -1327,7 +1330,7 @@ int main(void)
13271330
{test_notecard_begin_serial_shares_a_serial_available_functon_pointer, "test_notecard_begin_serial_shares_a_serial_available_functon_pointer"},
13281331
{test_notecard_begin_serial_shares_a_serial_receive_functon_pointer, "test_notecard_begin_serial_shares_a_serial_receive_functon_pointer"},
13291332
{test_notecard_begin_serial_initializes_the_provided_serial_interface_with_provided_speed, "test_notecard_begin_serial_initializes_the_provided_serial_interface_with_provided_speed"},
1330-
{test_notecard_begin_serial_default_parameter_for_baud_rate_is_passed_to_note_c, "test_notecard_begin_serial_default_parameter_for_baud_rate_is_passed_to_note_c"},
1333+
{test_notecard_begin_serial_initializes_the_provided_serial_interface_with_default_speed, "test_notecard_begin_serial_initializes_the_provided_serial_interface_with_default_speed"},
13311334
{test_notecard_begin_serial_sets_user_agent_to_note_arduino, "test_notecard_begin_serial_sets_user_agent_to_note_arduino"},
13321335
{test_notecard_setDebugOutputStream_shares_a_debug_log_functon_pointer, "test_notecard_setDebugOutputStream_shares_a_debug_log_functon_pointer"},
13331336
{test_notecard_clearDebugOutputStream_clears_the_debug_log_functon_pointer, "test_notecard_clearDebugOutputStream_clears_the_debug_log_functon_pointer"},

test/mock/NoteI2c_Mock.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "mock/NoteI2c_Mock.hpp"
2+
3+
#include "NoteI2c_Arduino.hpp"
4+
5+
MakeNoteI2c_Parameters make_note_i2c_Parameters;
6+
NoteI2cReceive_Parameters noteI2cReceive_Parameters;
7+
NoteI2cReset_Parameters noteI2cReset_Parameters;
8+
NoteI2cTransmit_Parameters noteI2cTransmit_Parameters;
9+
10+
NoteI2c *
11+
make_note_i2c (
12+
NoteI2c::bus_t i2c_bus_
13+
)
14+
{
15+
// Record invocation(s)
16+
++make_note_i2c_Parameters.invoked;
17+
18+
// Stash parameter(s)
19+
make_note_i2c_Parameters.i2c_bus = i2c_bus_;
20+
21+
// Return user-supplied result
22+
return make_note_i2c_Parameters.result;
23+
}
24+
25+
const char *
26+
NoteI2c_Arduino::receive (
27+
uint16_t device_address_,
28+
uint8_t * buffer_,
29+
uint16_t requested_byte_count_,
30+
uint32_t * available_
31+
) {
32+
// Record invocation(s)
33+
++noteI2cReceive_Parameters.invoked;
34+
35+
// Stash parameter(s)
36+
noteI2cReceive_Parameters.device_address = device_address_;
37+
noteI2cReceive_Parameters.buffer = buffer_;
38+
noteI2cReceive_Parameters.requested_byte_count = requested_byte_count_;
39+
noteI2cReceive_Parameters.available = available_;
40+
41+
// Return user-supplied result
42+
return noteI2cReceive_Parameters.result;
43+
}
44+
45+
bool
46+
NoteI2c_Arduino::reset (
47+
uint16_t device_address_
48+
) {
49+
// Record invocation(s)
50+
++noteI2cReset_Parameters.invoked;
51+
52+
// Stash parameter(s)
53+
noteI2cReset_Parameters.device_address = device_address_;
54+
55+
// Return user-supplied result
56+
return noteI2cReset_Parameters.result;
57+
}
58+
59+
const char *
60+
NoteI2c_Arduino::transmit (
61+
uint16_t device_address_,
62+
uint8_t * buffer_,
63+
uint16_t size_
64+
) {
65+
// Record invocation(s)
66+
++noteI2cTransmit_Parameters.invoked;
67+
68+
// Stash parameter(s)
69+
noteI2cTransmit_Parameters.device_address = device_address_;
70+
noteI2cTransmit_Parameters.buffer = buffer_;
71+
noteI2cTransmit_Parameters.size = size_;
72+
73+
// Return user-supplied result
74+
return noteI2cTransmit_Parameters.result;
75+
}

test/mock/NoteI2c_Mock.hpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#ifndef MOCK_I2C_ARDUINO_HPP
2+
#define MOCK_I2C_ARDUINO_HPP
3+
4+
#include <stddef.h>
5+
#include <stdint.h>
6+
7+
#include "NoteI2c.hpp"
8+
9+
struct MakeNoteI2c_Parameters {
10+
MakeNoteI2c_Parameters(
11+
void
12+
) :
13+
invoked(0),
14+
i2c_bus(nullptr),
15+
result(nullptr)
16+
{ }
17+
void reset (
18+
void
19+
) {
20+
invoked = 0;
21+
i2c_bus = nullptr;
22+
result = nullptr;
23+
}
24+
size_t invoked;
25+
NoteI2c::bus_t i2c_bus;
26+
NoteI2c * result;
27+
};
28+
29+
struct NoteI2cReceive_Parameters {
30+
NoteI2cReceive_Parameters(
31+
void
32+
) :
33+
invoked(0),
34+
device_address(0),
35+
buffer(nullptr),
36+
requested_byte_count(0),
37+
available(nullptr),
38+
result(nullptr)
39+
{ }
40+
void reset (
41+
void
42+
) {
43+
invoked = 0;
44+
device_address = 0;
45+
buffer = nullptr;
46+
requested_byte_count = 0;
47+
available = nullptr;
48+
result = nullptr;
49+
}
50+
size_t invoked;
51+
uint16_t device_address;
52+
uint8_t * buffer;
53+
uint16_t requested_byte_count;
54+
uint32_t * available;
55+
const char * result;
56+
};
57+
58+
struct NoteI2cReset_Parameters {
59+
NoteI2cReset_Parameters(
60+
void
61+
) :
62+
invoked(0),
63+
device_address(0),
64+
result(false)
65+
{ }
66+
void reset (
67+
void
68+
) {
69+
invoked = 0;
70+
device_address = 0;
71+
result = false;
72+
}
73+
size_t invoked;
74+
uint16_t device_address;
75+
bool result;
76+
};
77+
78+
struct NoteI2cTransmit_Parameters {
79+
NoteI2cTransmit_Parameters(
80+
void
81+
) :
82+
invoked(0),
83+
device_address(0),
84+
buffer(nullptr),
85+
size(0),
86+
result(nullptr)
87+
{ }
88+
void reset (
89+
void
90+
) {
91+
invoked = 0;
92+
device_address = 0;
93+
buffer = nullptr;
94+
size = 0;
95+
result = nullptr;
96+
}
97+
size_t invoked;
98+
uint16_t device_address;
99+
uint8_t * buffer;
100+
uint16_t size;
101+
const char * result;
102+
};
103+
104+
extern MakeNoteI2c_Parameters make_note_i2c_Parameters;
105+
extern NoteI2cReceive_Parameters noteI2cReceive_Parameters;
106+
extern NoteI2cReset_Parameters noteI2cReset_Parameters;
107+
extern NoteI2cTransmit_Parameters noteI2cTransmit_Parameters;
108+
109+
#endif // MOCK_I2C_ARDUINO_HPP

0 commit comments

Comments
 (0)