diff --git a/CMakeLists.txt b/CMakeLists.txt index b82f16c..e1d38a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,8 @@ project(arduino_midi_library) set(ROOT_SOURCE_DIR ${PROJECT_SOURCE_DIR}) include_directories(${ROOT_SOURCE_DIR}) +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + add_subdirectory(external) add_subdirectory(src) add_subdirectory(test) diff --git a/test/mocks/test-mocks_SerialMock.hpp b/test/mocks/test-mocks_SerialMock.hpp index 082d47b..8bd0999 100644 --- a/test/mocks/test-mocks_SerialMock.hpp +++ b/test/mocks/test-mocks_SerialMock.hpp @@ -26,11 +26,11 @@ int RingBuffer::getLength() const } else if (mWriteHead > mReadHead) { - return mWriteHead - mReadHead; + return int(mWriteHead - mReadHead); } else { - return Size - mReadHead + mWriteHead; + return int(mWriteHead - mData) + Size - int(mReadHead - mData); } } diff --git a/test/unit-tests/CMakeLists.txt b/test/unit-tests/CMakeLists.txt index 3affcdc..097f2f6 100644 --- a/test/unit-tests/CMakeLists.txt +++ b/test/unit-tests/CMakeLists.txt @@ -15,6 +15,10 @@ add_executable(unit-tests tests/unit-tests_MidiMessage.cpp tests/unit-tests_Settings.cpp tests/unit-tests_SysExCodec.cpp + tests/unit-tests_SerialMock.cpp + tests/unit-tests_MidiInput.cpp + tests/unit-tests_MidiOutput.cpp + tests/unit-tests_MidiThru.cpp ) target_link_libraries(unit-tests diff --git a/test/unit-tests/tests/unit-tests_MidiInput.cpp b/test/unit-tests/tests/unit-tests_MidiInput.cpp new file mode 100644 index 0000000..1c271f0 --- /dev/null +++ b/test/unit-tests/tests/unit-tests_MidiInput.cpp @@ -0,0 +1,67 @@ +#include "unit-tests.h" +#include +#include + +BEGIN_MIDI_NAMESPACE + +END_MIDI_NAMESPACE + +// ----------------------------------------------------------------------------- + +BEGIN_UNNAMED_NAMESPACE + +typedef test_mocks::SerialMock<32> SerialMock; +typedef midi::MidiInterface MidiInterface; + +TEST(MidiInput, getTypeFromStatusByte) +{ + // Channel Messages + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0x81), midi::NoteOff); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0x92), midi::NoteOn); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xa3), midi::AfterTouchPoly); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xb4), midi::ControlChange); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xc5), midi::ProgramChange); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xd6), midi::AfterTouchChannel); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xe7), midi::PitchBend); + + // System Messages + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf0), midi::SystemExclusive); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf1), midi::TimeCodeQuarterFrame); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf2), midi::SongPosition); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf3), midi::SongSelect); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf6), midi::TuneRequest); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf8), midi::Clock); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfa), midi::Start); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfb), midi::Continue); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfc), midi::Stop); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfe), midi::ActiveSensing); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xff), midi::SystemReset); + + // Invalid Messages + for (int i = 0; i < 0x80; ++i) + { + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(i), midi::InvalidType); + } + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf4), midi::InvalidType); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf5), midi::InvalidType); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xf9), midi::InvalidType); + EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfd), midi::InvalidType); +} + +TEST(MidiInput, begin) +{ + SerialMock serial; + MidiInterface midi(serial); + + // Default channel + midi.begin(); + EXPECT_EQ(serial.mBaudrate, 31250); + EXPECT_EQ(midi.getInputChannel(), 1); + + // Specific channel + midi.begin(12); + EXPECT_EQ(serial.mBaudrate, 31250); + EXPECT_EQ(midi.getInputChannel(), 12); +} + +END_UNNAMED_NAMESPACE diff --git a/test/unit-tests/tests/unit-tests_MidiOutput.cpp b/test/unit-tests/tests/unit-tests_MidiOutput.cpp new file mode 100644 index 0000000..e69de29 diff --git a/test/unit-tests/tests/unit-tests_MidiThru.cpp b/test/unit-tests/tests/unit-tests_MidiThru.cpp new file mode 100644 index 0000000..e69de29 diff --git a/test/unit-tests/tests/unit-tests_SerialMock.cpp b/test/unit-tests/tests/unit-tests_SerialMock.cpp new file mode 100644 index 0000000..b3555c0 --- /dev/null +++ b/test/unit-tests/tests/unit-tests_SerialMock.cpp @@ -0,0 +1,64 @@ +#include "unit-tests.h" +#include + +BEGIN_UNNAMED_NAMESPACE + +USING_NAMESPACE_TEST_MOCKS +using namespace testing; + +TEST(RingBuffer, initialState) +{ + typedef RingBuffer Buffer; + Buffer buffer; + EXPECT_EQ(buffer.getLength(), 0); + EXPECT_EQ(buffer.isEmpty(), true); + buffer.clear(); + EXPECT_EQ(buffer.getLength(), 0); + EXPECT_EQ(buffer.isEmpty(), true); +} + +TEST(RingBuffer, uint8) +{ + typedef RingBuffer Buffer; + Buffer buffer; + + buffer.write(42); + EXPECT_EQ(buffer.getLength(), 1); + EXPECT_EQ(buffer.isEmpty(), false); + + const uint8 read = buffer.read(); + EXPECT_EQ(read, 42); + EXPECT_EQ(buffer.getLength(), 0); + EXPECT_EQ(buffer.isEmpty(), true); + + const uint8 data[] = "Hello, World!"; + buffer.write(data, 13); + EXPECT_EQ(buffer.getLength(), 5); // 13 % 8 + EXPECT_EQ(buffer.isEmpty(), false); + + uint8 output[8] = { 0 }; + buffer.read(output, 8); + const uint8 expected[8] = { + 'o', 'r', 'l', 'd', '!', ',', ' ', 'W', + }; + EXPECT_THAT(output, ContainerEq(expected)); + + buffer.clear(); + EXPECT_EQ(buffer.getLength(), 0); + EXPECT_EQ(buffer.isEmpty(), true); +} + +TEST(RingBuffer, uint32) +{ + typedef RingBuffer Buffer; + Buffer buffer; + buffer.write(42); + EXPECT_EQ(buffer.getLength(), 1); + EXPECT_EQ(buffer.isEmpty(), false); + const uint8 read = buffer.read(); + EXPECT_EQ(read, 42); + EXPECT_EQ(buffer.getLength(), 0); + EXPECT_EQ(buffer.isEmpty(), true); +} + +END_UNNAMED_NAMESPACE