diff --git a/src/Notecard.cpp b/src/Notecard.cpp index 258023a..52a341d 100644 --- a/src/Notecard.cpp +++ b/src/Notecard.cpp @@ -288,16 +288,26 @@ void Notecard::deleteResponse(J *rsp) const /**************************************************************************/ void Notecard::end(void) { - // Clear Communication Interfaces - NoteSetFnI2C(0, 0, nullptr, nullptr, nullptr); - NoteSetFnSerial(nullptr, nullptr, nullptr, nullptr); + // Clear I2C Interface + i2cTransmitFn i2c_is_set = nullptr; + NoteGetFnI2C(nullptr, nullptr, nullptr, &i2c_is_set, nullptr); + if (i2c_is_set) { + // Delete Singletons + noteI2c = make_note_i2c(nullptr); + NoteSetFnI2C(0, 0, nullptr, nullptr, nullptr); + } + + // Clear Serial Interface + serialTransmitFn serial_is_set = nullptr; + NoteGetFnSerial(nullptr, &serial_is_set, nullptr, nullptr); + if (serial_is_set) { + // Delete Singletons + noteSerial = make_note_serial(nullptr); + NoteSetFnSerial(nullptr, nullptr, nullptr, nullptr); + } // Clear Platform Callbacks platformInit(false); - - // Delete Singletons - noteI2c = make_note_i2c(nullptr); - noteSerial = make_note_serial(nullptr); } /**************************************************************************/ diff --git a/test/Notecard.test.cpp b/test/Notecard.test.cpp index 4a6112f..c670c69 100644 --- a/test/Notecard.test.cpp +++ b/test/Notecard.test.cpp @@ -1372,7 +1372,46 @@ int test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_w return result; } -int test_notecard_end_clears_all_i2c_interface_function_pointers() +int test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated() +{ + int result; + + // Arrange + //////////// + + Notecard notecard; + NoteSerial_Mock mockSerial; + noteSetFnSerial_Parameters.reset(); + twoWireEnd_Parameters.reset(); + notecard.begin(&mockSerial); + noteGetFnI2C_Parameters.reset(); + noteGetFnSerial_Parameters.reset(); + make_note_i2c_Parameters.reset(); + + // Action + /////////// + + notecard.end(); + + // Assert + /////////// + + if (!make_note_i2c_Parameters.invoked) + { + result = 0; + } + else + { + result = static_cast('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd'); + std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl; + std::cout << "\ttwoWireEnd_Parameters.invoked == " << !!twoWireEnd_Parameters.invoked << ", 0 (false)" << std::endl; + std::cout << "["; + } + + return result; +} + +int test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated() { int result; @@ -1383,6 +1422,9 @@ int test_notecard_end_clears_all_i2c_interface_function_pointers() NoteI2c_Mock mockI2c; noteSetFnI2C_Parameters.reset(); notecard.begin(&mockI2c); + noteGetFnSerial_Parameters.reset(); + noteGetFnI2C_Parameters.reset(); + noteGetFnI2C_Parameters.transmitFn_result = reinterpret_cast(0x1); // Action /////////// @@ -1411,7 +1453,46 @@ int test_notecard_end_clears_all_i2c_interface_function_pointers() return result; } -int test_notecard_end_clears_all_serial_interface_function_pointers() +int test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated() +{ + int result; + + // Arrange + //////////// + + Notecard notecard; + NoteSerial_Mock mockI2c; + noteSetFnDefault_Parameters.reset(); + notecard.begin(&mockI2c); + hardwareSerialEnd_Parameters.reset(); + noteGetFnI2C_Parameters.reset(); + noteGetFnSerial_Parameters.reset(); + make_note_serial_Parameters.reset(); + + // Action + /////////// + + notecard.end(); + + // Assert + /////////// + + if (!make_note_serial_Parameters.invoked) + { + result = 0; + } + else + { + result = static_cast('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd'); + std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl; + std::cout << "\thardwareSerialEnd_Parameters.invoked == " << !!hardwareSerialEnd_Parameters.invoked << ", EXPECTED: 0 (false)" << std::endl; + std::cout << "["; + } + + return result; +} + +int test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated() { int result; @@ -1422,6 +1503,9 @@ int test_notecard_end_clears_all_serial_interface_function_pointers() NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked) noteSetFnDefault_Parameters.reset(); notecard.begin(&mockSerial); + noteGetFnI2C_Parameters.reset(); + noteGetFnSerial_Parameters.reset(); + noteGetFnSerial_Parameters.transmitFn_result = reinterpret_cast(0x1); // Action /////////// @@ -1493,7 +1577,7 @@ int test_notecard_end_clears_all_platform_interface_function_pointers() return result; } -int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory() +int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated() { int result; @@ -1505,6 +1589,9 @@ int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memor make_note_i2c_Parameters.reset(); make_note_i2c_Parameters.i2c_parameters = &Wire; notecard.begin(&mockI2c); + noteGetFnSerial_Parameters.reset(); + noteGetFnI2C_Parameters.reset(); + noteGetFnI2C_Parameters.transmitFn_result = reinterpret_cast(0x1); // Action //////////// @@ -1529,7 +1616,7 @@ int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memor return result; } -int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory() +int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated() { int result; @@ -1541,6 +1628,9 @@ int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated make_note_serial_Parameters.reset(); make_note_serial_Parameters.serial_parameters = &Serial; notecard.begin(&mockSerial); + noteGetFnI2C_Parameters.reset(); + noteGetFnSerial_Parameters.reset(); + noteGetFnSerial_Parameters.transmitFn_result = reinterpret_cast(0x1); // Action //////////// @@ -4828,11 +4918,13 @@ int main(void) {test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"}, {test_notecard_begin_serial_shares_a_serial_receive_function_pointer, "test_notecard_begin_serial_shares_a_serial_receive_function_pointer"}, {test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"}, - {test_notecard_end_clears_all_i2c_interface_function_pointers, "test_notecard_end_clears_all_i2c_interface_function_pointers"}, - {test_notecard_end_clears_all_serial_interface_function_pointers, "test_notecard_end_clears_all_serial_interface_function_pointers"}, + {test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated, "test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated"}, + {test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated, "test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated"}, + {test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated, "test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated"}, + {test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated, "test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated"}, {test_notecard_end_clears_all_platform_interface_function_pointers, "test_notecard_end_clears_all_platform_interface_function_pointers"}, - {test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory, "test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory"}, - {test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory, "test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory"}, + {test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated, "test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated"}, + {test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated, "test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated"}, {test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer, "test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer"}, {test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided, "test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided"}, {test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer, "test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer"}, diff --git a/test/mock/mock-note-c-note.c b/test/mock/mock-note-c-note.c index 8a1ad81..e0fc554 100644 --- a/test/mock/mock-note-c-note.c +++ b/test/mock/mock-note-c-note.c @@ -4,6 +4,8 @@ JAddIntToObject_Parameters jAddIntToObject_Parameters; NoteDebug_Parameters noteDebug_Parameters; NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters; NoteDeleteResponse_Parameters noteDeleteResponse_Parameters; +NoteGetFnI2C_Parameters noteGetFnI2C_Parameters; +NoteGetFnSerial_Parameters noteGetFnSerial_Parameters; NoteNewCommand_Parameters noteNewCommand_Parameters; NoteNewRequest_Parameters noteNewRequest_Parameters; NoteRequest_Parameters noteRequest_Parameters; @@ -97,6 +99,65 @@ NoteDebugSyncStatus( return noteDebugSyncStatus_Parameters.result; } +void NoteGetFnI2C(uint32_t *notecardAddr, uint32_t *maxTransmitSize, + i2cResetFn *resetFn, i2cTransmitFn *transmitFn, + i2cReceiveFn *receiveFn +) { + // Record invocation(s) + ++noteGetFnI2C_Parameters.invoked; + + // Stash parameter(s) + noteGetFnI2C_Parameters.notecardAddr = notecardAddr; + noteGetFnI2C_Parameters.maxTransmitSize = maxTransmitSize; + noteGetFnI2C_Parameters.resetFn = resetFn; + noteGetFnI2C_Parameters.transmitFn = transmitFn; + noteGetFnI2C_Parameters.receiveFn = receiveFn; + + // Return user-supplied result + if (notecardAddr) { + *notecardAddr = noteGetFnI2C_Parameters.notecardAddr_result; + } + if (maxTransmitSize) { + *maxTransmitSize = noteGetFnI2C_Parameters.maxTransmitSize_result; + } + if (resetFn) { + *resetFn = noteGetFnI2C_Parameters.resetFn_result; + } + if (transmitFn) { + *transmitFn = noteGetFnI2C_Parameters.transmitFn_result; + } + if (receiveFn) { + *receiveFn = noteGetFnI2C_Parameters.receiveFn_result; + } +} + +void NoteGetFnSerial(serialResetFn *resetFn, serialTransmitFn *transmitFn, + serialAvailableFn *availFn, serialReceiveFn *receiveFn +) { + // Record invocation(s) + ++noteGetFnSerial_Parameters.invoked; + + // Stash parameter(s) + noteGetFnSerial_Parameters.resetFn = resetFn; + noteGetFnSerial_Parameters.transmitFn = transmitFn; + noteGetFnSerial_Parameters.availFn = availFn; + noteGetFnSerial_Parameters.receiveFn = receiveFn; + + // Return user-supplied result + if (resetFn) { + *resetFn = noteGetFnSerial_Parameters.resetFn_result; + } + if (transmitFn) { + *transmitFn = noteGetFnSerial_Parameters.transmitFn_result; + } + if (availFn) { + *availFn = noteGetFnSerial_Parameters.availFn_result; + } + if (receiveFn) { + *receiveFn = noteGetFnSerial_Parameters.receiveFn_result; + } +} + J * NoteNewCommand( const char * request_ diff --git a/test/mock/mock-parameters.hpp b/test/mock/mock-parameters.hpp index 37eda5d..fb2ba30 100644 --- a/test/mock/mock-parameters.hpp +++ b/test/mock/mock-parameters.hpp @@ -1,6 +1,7 @@ #ifndef MOCK_PARAMETERS_HPP #define MOCK_PARAMETERS_HPP +#include #include #include @@ -111,6 +112,90 @@ struct NoteDeleteResponse_Parameters { J *response; }; +struct NoteGetFnI2C_Parameters { + NoteGetFnI2C_Parameters( + void + ) : + invoked(0), + notecardAddr(nullptr), + maxTransmitSize(nullptr), + resetFn(nullptr), + transmitFn(nullptr), + receiveFn(nullptr), + notecardAddr_result(0), + maxTransmitSize_result(0), + resetFn_result(nullptr), + transmitFn_result(nullptr), + receiveFn_result(nullptr) + { } + void + reset ( + void + ) { + invoked = 0; + notecardAddr = nullptr; + maxTransmitSize = nullptr; + resetFn = nullptr; + transmitFn = nullptr; + receiveFn = nullptr; + notecardAddr_result = 0; + maxTransmitSize_result = 0; + resetFn_result = nullptr; + transmitFn_result = nullptr; + receiveFn_result = nullptr; + } + size_t invoked; + uint32_t * notecardAddr; + uint32_t * maxTransmitSize; + i2cResetFn * resetFn; + i2cTransmitFn * transmitFn; + i2cReceiveFn * receiveFn; + uint32_t notecardAddr_result; + uint32_t maxTransmitSize_result; + i2cResetFn resetFn_result; + i2cTransmitFn transmitFn_result; + i2cReceiveFn receiveFn_result; +}; + +struct NoteGetFnSerial_Parameters { + NoteGetFnSerial_Parameters( + void + ) : + invoked(0), + resetFn(nullptr), + transmitFn(nullptr), + availFn(nullptr), + receiveFn(nullptr), + resetFn_result(nullptr), + transmitFn_result(nullptr), + availFn_result(nullptr), + receiveFn_result(nullptr) + { } + void + reset ( + void + ) { + invoked = 0; + resetFn = nullptr; + transmitFn = nullptr; + availFn = nullptr; + receiveFn = nullptr; + resetFn_result = nullptr; + transmitFn_result = nullptr; + availFn_result = nullptr; + receiveFn_result = nullptr; + } + size_t invoked; + serialResetFn * resetFn; + serialTransmitFn * transmitFn; + serialAvailableFn * availFn; + serialReceiveFn * receiveFn; + serialResetFn resetFn_result; + serialTransmitFn transmitFn_result; + serialAvailableFn availFn_result; + serialReceiveFn receiveFn_result; +}; + struct NoteNewCommand_Parameters { NoteNewCommand_Parameters( void @@ -457,6 +542,8 @@ extern JAddIntToObject_Parameters jAddIntToObject_Parameters; extern NoteDebug_Parameters noteDebug_Parameters; extern NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters; extern NoteDeleteResponse_Parameters noteDeleteResponse_Parameters; +extern NoteGetFnI2C_Parameters noteGetFnI2C_Parameters; +extern NoteGetFnSerial_Parameters noteGetFnSerial_Parameters; extern NoteNewCommand_Parameters noteNewCommand_Parameters; extern NoteNewRequest_Parameters noteNewRequest_Parameters; extern NoteRequest_Parameters noteRequest_Parameters;