Added test library and CMake scaffolding.

This commit is contained in:
Francois Best 2016-10-03 19:18:36 -07:00
parent 3c1c65fd69
commit c600287129
18 changed files with 327 additions and 0 deletions

3
.vscode/.cmaketools.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"selectedBuildType": "Debug"
}

5
CMakeLists.txt Normal file
View File

@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.3.0)
project(arduino_midi_library)
add_subdirectory(src)
add_subdirectory(test)

11
src/CMakeLists.txt Normal file
View File

@ -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
)

2
test/CMakeLists.txt Normal file
View File

@ -0,0 +1,2 @@
add_subdirectory(mocks)
add_subdirectory(runner)

11
test/mocks/CMakeLists.txt Normal file
View File

@ -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
)

View File

@ -0,0 +1,5 @@
#include "test-mocks.h"
BEGIN_TEST_MOCKS_NAMESPACE
END_TEST_MOCKS_NAMESPACE

7
test/mocks/test-mocks.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include "test-mocks_Namespace.h"
BEGIN_TEST_MOCKS_NAMESPACE
END_TEST_MOCKS_NAMESPACE

View File

@ -0,0 +1,10 @@
#pragma once
#include "test-mocks.h"
#include <inttypes.h>
BEGIN_TEST_MOCKS_NAMESPACE
typedef uint8_t uint8;
END_TEST_MOCKS_NAMESPACE

View File

@ -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

View File

@ -0,0 +1,5 @@
#include "test-mocks_SerialMock.h"
BEGIN_TEST_MOCKS_NAMESPACE
END_TEST_MOCKS_NAMESPACE

View File

@ -0,0 +1,61 @@
#pragma once
#include "test-mocks.h"
#include "test-mocks_Defs.h"
BEGIN_TEST_MOCKS_NAMESPACE
template<typename DataType, int Size>
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<int BufferSize>
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<uint8, BufferSize> Buffer;
Buffer mTxBuffer;
Buffer mRxBuffer;
int mBaudrate;
};
END_TEST_MOCKS_NAMESPACE
#include "test-mocks_SerialMock.hpp"

View File

@ -0,0 +1,147 @@
#pragma once
BEGIN_TEST_MOCKS_NAMESPACE
template<typename DataType, int Size>
RingBuffer<DataType, Size>::RingBuffer()
: mWriteHead(mData)
, mReadHead(mData)
{
memset(mData, DataType(0), Size * sizeof(DataType));
}
template<typename DataType, int Size>
RingBuffer<DataType, Size>::~RingBuffer()
{
}
// -----------------------------------------------------------------------------
template<typename DataType, int Size>
int RingBuffer<DataType, Size>::getLength() const
{
if (mReadHead == mWriteHead)
{
return 0;
}
else if (mWriteHead > mReadHead)
{
return mWriteHead - mReadHead;
}
else
{
return Size - mReadHead + mWriteHead;
}
}
template<typename DataType, int Size>
bool RingBuffer<DataType, Size>::isEmpty() const
{
return mReadHead == mWriteHead;
}
// -----------------------------------------------------------------------------
template<typename DataType, int Size>
void RingBuffer<DataType, Size>::write(DataType inData)
{
*mWriteHead++ = inData;
if (mWriteHead >= mData + Size)
{
mWriteHead = mData;
}
}
template<typename DataType, int Size>
void RingBuffer<DataType, Size>::write(const DataType* inData, int inSize)
{
for (int i = 0; i < inSize; ++i)
{
write(inData[i]);
}
}
template<typename DataType, int Size>
void RingBuffer<DataType, Size>::clear()
{
memset(mData, DataType(0), Size * sizeof(DataType));
mReadHead = mData;
mWriteHead = mData;
}
// -----------------------------------------------------------------------------
template<typename DataType, int Size>
DataType RingBuffer<DataType, Size>::read()
{
const DataType data = *mReadHead++;
if (mReadHead >= mData + Size)
{
mReadHead = mData;
}
return data;
}
template<typename DataType, int Size>
void RingBuffer<DataType, Size>::read(DataType* outData, int inSize)
{
for (int i = 0; i < inSize; ++i)
{
outData[i] = read();
}
}
// =============================================================================
template<int BufferSize>
SerialMock<BufferSize>::SerialMock()
{
}
template<int BufferSize>
SerialMock<BufferSize>::~SerialMock()
{
}
// -----------------------------------------------------------------------------
template<int BufferSize>
void SerialMock<BufferSize>::begin(int inBaudrate)
{
mBaudrate = inBaudrate;
mTxBuffer.clear();
mRxBuffer.clear();
}
template<int BufferSize>
int SerialMock<BufferSize>::available() const
{
return mRxBuffer.getSize();
}
template<int BufferSize>
void SerialMock<BufferSize>::write(uint8 inData)
{
mTxBuffer.write(inData);
}
template<int BufferSize>
uint8 SerialMock<BufferSize>::read()
{
return mRxBuffer.read();
}
// -----------------------------------------------------------------------------
template<int BufferSize>
void SerialMock<BufferSize>::moveTxToRx()
{
mRxBuffer.clear();
const int size = mTxBuffer.getSize();
for (int i = 0; i < size; ++i)
{
mRxBuffer.write(mTxBuffer.read());
}
}
END_TEST_MOCKS_NAMESPACE

View File

@ -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
)

View File

@ -0,0 +1,5 @@
#include "test-runner.h"
BEGIN_TEST_RUNNER_NAMESPACE
END_TEST_RUNNER_NAMESPACE

View File

@ -0,0 +1,7 @@
#pragma once
#include "test-runner_Namespace.h"
BEGIN_TEST_RUNNER_NAMESPACE
END_TEST_RUNNER_NAMESPACE

View File

@ -0,0 +1,10 @@
#include "test-runner_Main.h"
BEGIN_TEST_RUNNER_NAMESPACE
END_TEST_RUNNER_NAMESPACE
int main()
{
return 0;
}

View File

@ -0,0 +1,7 @@
#pragma once
#include "test-runner.h"
BEGIN_TEST_RUNNER_NAMESPACE
END_TEST_RUNNER_NAMESPACE

View File

@ -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