From c6002871294a00cfdfcde8bc2f128aeb24acd2d5 Mon Sep 17 00:00:00 2001 From: Francois Best Date: Mon, 3 Oct 2016 19:18:36 -0700 Subject: [PATCH] Added test library and CMake scaffolding. --- .vscode/.cmaketools.json | 3 + CMakeLists.txt | 5 + src/CMakeLists.txt | 11 ++ test/CMakeLists.txt | 2 + test/mocks/CMakeLists.txt | 11 ++ test/mocks/test-mocks.cpp | 5 + test/mocks/test-mocks.h | 7 ++ test/mocks/test-mocks_Defs.h | 10 ++ test/mocks/test-mocks_Namespace.h | 11 ++ test/mocks/test-mocks_SerialMock.cpp | 5 + test/mocks/test-mocks_SerialMock.h | 61 +++++++++++ test/mocks/test-mocks_SerialMock.hpp | 147 +++++++++++++++++++++++++++ test/runner/CMakeLists.txt | 9 ++ test/runner/test-runner.cpp | 5 + test/runner/test-runner.h | 7 ++ test/runner/test-runner_Main.cpp | 10 ++ test/runner/test-runner_Main.h | 7 ++ test/runner/test-runner_Namespace.h | 11 ++ 18 files changed, 327 insertions(+) create mode 100644 .vscode/.cmaketools.json create mode 100644 CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 test/CMakeLists.txt create mode 100644 test/mocks/CMakeLists.txt create mode 100644 test/mocks/test-mocks.cpp create mode 100644 test/mocks/test-mocks.h create mode 100644 test/mocks/test-mocks_Defs.h create mode 100644 test/mocks/test-mocks_Namespace.h create mode 100644 test/mocks/test-mocks_SerialMock.cpp create mode 100644 test/mocks/test-mocks_SerialMock.h create mode 100644 test/mocks/test-mocks_SerialMock.hpp create mode 100644 test/runner/CMakeLists.txt create mode 100644 test/runner/test-runner.cpp create mode 100644 test/runner/test-runner.h create mode 100644 test/runner/test-runner_Main.cpp create mode 100644 test/runner/test-runner_Main.h create mode 100644 test/runner/test-runner_Namespace.h diff --git a/.vscode/.cmaketools.json b/.vscode/.cmaketools.json new file mode 100644 index 0000000..cd1a614 --- /dev/null +++ b/.vscode/.cmaketools.json @@ -0,0 +1,3 @@ +{ + "selectedBuildType": "Debug" +} diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2f63516 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.3.0) +project(arduino_midi_library) + +add_subdirectory(src) +add_subdirectory(test) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..7dc7b16 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,11 @@ +project(midi) + +add_library(midi STATIC + midi_Namespace.h + midi_Defs.h + midi_Message.h + midi_Settings.h + MIDI.cpp + MIDI.hpp + MIDI.h +) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..3dcdacf --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(mocks) +add_subdirectory(runner) diff --git a/test/mocks/CMakeLists.txt b/test/mocks/CMakeLists.txt new file mode 100644 index 0000000..af82728 --- /dev/null +++ b/test/mocks/CMakeLists.txt @@ -0,0 +1,11 @@ +project(test-mocks) + +add_library(test-mocks STATIC + test-mocks.cpp + test-mocks.h + test-mocks_Namespace.h + test-mocks_Defs.h + test-mocks_SerialMock.cpp + test-mocks_SerialMock.hpp + test-mocks_SerialMock.h +) diff --git a/test/mocks/test-mocks.cpp b/test/mocks/test-mocks.cpp new file mode 100644 index 0000000..3b25fca --- /dev/null +++ b/test/mocks/test-mocks.cpp @@ -0,0 +1,5 @@ +#include "test-mocks.h" + +BEGIN_TEST_MOCKS_NAMESPACE + +END_TEST_MOCKS_NAMESPACE diff --git a/test/mocks/test-mocks.h b/test/mocks/test-mocks.h new file mode 100644 index 0000000..aeb3ede --- /dev/null +++ b/test/mocks/test-mocks.h @@ -0,0 +1,7 @@ +#pragma once + +#include "test-mocks_Namespace.h" + +BEGIN_TEST_MOCKS_NAMESPACE + +END_TEST_MOCKS_NAMESPACE diff --git a/test/mocks/test-mocks_Defs.h b/test/mocks/test-mocks_Defs.h new file mode 100644 index 0000000..9ed453a --- /dev/null +++ b/test/mocks/test-mocks_Defs.h @@ -0,0 +1,10 @@ +#pragma once + +#include "test-mocks.h" +#include + +BEGIN_TEST_MOCKS_NAMESPACE + +typedef uint8_t uint8; + +END_TEST_MOCKS_NAMESPACE diff --git a/test/mocks/test-mocks_Namespace.h b/test/mocks/test-mocks_Namespace.h new file mode 100644 index 0000000..99f971b --- /dev/null +++ b/test/mocks/test-mocks_Namespace.h @@ -0,0 +1,11 @@ +#pragma once + +#define TEST_MOCKS_NAMESPACE test_mocks +#define BEGIN_TEST_MOCKS_NAMESPACE namespace TEST_MOCKS_NAMESPACE { +#define END_TEST_MOCKS_NAMESPACE } + +#define USING_NAMESPACE_TEST_MOCKS using namespace TEST_MOCKS_NAMESPACE; + +BEGIN_TEST_MOCKS_NAMESPACE + +END_TEST_MOCKS_NAMESPACE diff --git a/test/mocks/test-mocks_SerialMock.cpp b/test/mocks/test-mocks_SerialMock.cpp new file mode 100644 index 0000000..d316788 --- /dev/null +++ b/test/mocks/test-mocks_SerialMock.cpp @@ -0,0 +1,5 @@ +#include "test-mocks_SerialMock.h" + +BEGIN_TEST_MOCKS_NAMESPACE + +END_TEST_MOCKS_NAMESPACE diff --git a/test/mocks/test-mocks_SerialMock.h b/test/mocks/test-mocks_SerialMock.h new file mode 100644 index 0000000..a934d2f --- /dev/null +++ b/test/mocks/test-mocks_SerialMock.h @@ -0,0 +1,61 @@ +#pragma once + +#include "test-mocks.h" +#include "test-mocks_Defs.h" + +BEGIN_TEST_MOCKS_NAMESPACE + +template +class RingBuffer +{ +public: + RingBuffer(); + ~RingBuffer(); + +public: + int getLength() const; + bool isEmpty() const; + +public: + void write(DataType inData); + void write(const DataType* inData, int inSize); + void clear(); + +public: + DataType read(); + void read(DataType* outData, int inSize); + +private: + DataType mData[Size]; + DataType* mWriteHead; + DataType* mReadHead; +}; + +// ----------------------------------------------------------------------------- + +template +class SerialMock +{ +public: + SerialMock(); + ~SerialMock(); + +public: // Arduino Serial API + void begin(int inBaudrate); + int available() const; + void write(uint8 inData); + uint8 read(); + +public: // Test Helpers API + void moveTxToRx(); // Simulate loopback + +public: + typedef RingBuffer Buffer; + Buffer mTxBuffer; + Buffer mRxBuffer; + int mBaudrate; +}; + +END_TEST_MOCKS_NAMESPACE + +#include "test-mocks_SerialMock.hpp" diff --git a/test/mocks/test-mocks_SerialMock.hpp b/test/mocks/test-mocks_SerialMock.hpp new file mode 100644 index 0000000..082d47b --- /dev/null +++ b/test/mocks/test-mocks_SerialMock.hpp @@ -0,0 +1,147 @@ +#pragma once + +BEGIN_TEST_MOCKS_NAMESPACE + +template +RingBuffer::RingBuffer() + : mWriteHead(mData) + , mReadHead(mData) +{ + memset(mData, DataType(0), Size * sizeof(DataType)); +} + +template +RingBuffer::~RingBuffer() +{ +} + +// ----------------------------------------------------------------------------- + +template +int RingBuffer::getLength() const +{ + if (mReadHead == mWriteHead) + { + return 0; + } + else if (mWriteHead > mReadHead) + { + return mWriteHead - mReadHead; + } + else + { + return Size - mReadHead + mWriteHead; + } +} + +template +bool RingBuffer::isEmpty() const +{ + return mReadHead == mWriteHead; +} + +// ----------------------------------------------------------------------------- + +template +void RingBuffer::write(DataType inData) +{ + *mWriteHead++ = inData; + if (mWriteHead >= mData + Size) + { + mWriteHead = mData; + } +} + +template +void RingBuffer::write(const DataType* inData, int inSize) +{ + for (int i = 0; i < inSize; ++i) + { + write(inData[i]); + } +} + +template +void RingBuffer::clear() +{ + memset(mData, DataType(0), Size * sizeof(DataType)); + mReadHead = mData; + mWriteHead = mData; +} + +// ----------------------------------------------------------------------------- + +template +DataType RingBuffer::read() +{ + const DataType data = *mReadHead++; + if (mReadHead >= mData + Size) + { + mReadHead = mData; + } + return data; +} + +template +void RingBuffer::read(DataType* outData, int inSize) +{ + for (int i = 0; i < inSize; ++i) + { + outData[i] = read(); + } +} + +// ============================================================================= + +template +SerialMock::SerialMock() +{ +} + +template +SerialMock::~SerialMock() +{ +} + +// ----------------------------------------------------------------------------- + +template +void SerialMock::begin(int inBaudrate) +{ + mBaudrate = inBaudrate; + mTxBuffer.clear(); + mRxBuffer.clear(); +} + +template +int SerialMock::available() const +{ + return mRxBuffer.getSize(); +} + +template +void SerialMock::write(uint8 inData) +{ + mTxBuffer.write(inData); +} + +template +uint8 SerialMock::read() +{ + return mRxBuffer.read(); +} + +// ----------------------------------------------------------------------------- + +template +void SerialMock::moveTxToRx() +{ + mRxBuffer.clear(); + const int size = mTxBuffer.getSize(); + for (int i = 0; i < size; ++i) + { + mRxBuffer.write(mTxBuffer.read()); + } +} + +END_TEST_MOCKS_NAMESPACE diff --git a/test/runner/CMakeLists.txt b/test/runner/CMakeLists.txt new file mode 100644 index 0000000..50efab6 --- /dev/null +++ b/test/runner/CMakeLists.txt @@ -0,0 +1,9 @@ +project(test-runner) + +add_executable(test-runner + test-runner.cpp + test-runner.h + test-runner_Namespace.h + test-runner_Main.cpp + test-runner_Main.h +) diff --git a/test/runner/test-runner.cpp b/test/runner/test-runner.cpp new file mode 100644 index 0000000..29269a9 --- /dev/null +++ b/test/runner/test-runner.cpp @@ -0,0 +1,5 @@ +#include "test-runner.h" + +BEGIN_TEST_RUNNER_NAMESPACE + +END_TEST_RUNNER_NAMESPACE diff --git a/test/runner/test-runner.h b/test/runner/test-runner.h new file mode 100644 index 0000000..43b051e --- /dev/null +++ b/test/runner/test-runner.h @@ -0,0 +1,7 @@ +#pragma once + +#include "test-runner_Namespace.h" + +BEGIN_TEST_RUNNER_NAMESPACE + +END_TEST_RUNNER_NAMESPACE diff --git a/test/runner/test-runner_Main.cpp b/test/runner/test-runner_Main.cpp new file mode 100644 index 0000000..fe960a7 --- /dev/null +++ b/test/runner/test-runner_Main.cpp @@ -0,0 +1,10 @@ +#include "test-runner_Main.h" + +BEGIN_TEST_RUNNER_NAMESPACE + +END_TEST_RUNNER_NAMESPACE + +int main() +{ + return 0; +} diff --git a/test/runner/test-runner_Main.h b/test/runner/test-runner_Main.h new file mode 100644 index 0000000..826c393 --- /dev/null +++ b/test/runner/test-runner_Main.h @@ -0,0 +1,7 @@ +#pragma once + +#include "test-runner.h" + +BEGIN_TEST_RUNNER_NAMESPACE + +END_TEST_RUNNER_NAMESPACE diff --git a/test/runner/test-runner_Namespace.h b/test/runner/test-runner_Namespace.h new file mode 100644 index 0000000..839dbf3 --- /dev/null +++ b/test/runner/test-runner_Namespace.h @@ -0,0 +1,11 @@ +#pragma once + +#define TEST_RUNNER_NAMESPACE test_runner +#define BEGIN_TEST_RUNNER_NAMESPACE namespace TEST_RUNNER_NAMESPACE { +#define END_TEST_RUNNER_NAMESPACE } + +#define USING_NAMESPACE_TEST_RUNNER using namespace TEST_RUNNER_NAMESPACE; + +BEGIN_TEST_RUNNER_NAMESPACE + +END_TEST_RUNNER_NAMESPACE