#ifndef TEST_H
#define TEST_H
#include <stdlib.h>
#include <stdio.h>
#include "Namespace.h"
BEGIN_NAMESPACE
// Runs all the unit tests
void runUnitTests(int a_verbosity);
#if defined(NDEBUG)
#define UNIT_TEST(TestName, Verbose) static void UnitTest##TestName() // Ensures test names are unique, even in release
#define CHECK(val) ((val)) // Ensures abusing this macro will have consistent side-effects
#else
#define UNIT_TEST(TestName, Verbose) struct UnitTest##TestName : public UnitTestBase { \
UnitTest##TestName() : UnitTestBase(#TestName, Verbose) {} \
void runTest(); \
} g_run##TestName; \
void UnitTest##TestName::runTest()
#define CHECK(val) checkHelper((val), #val, __FILE__, __LINE__)
#endif
// Implementation detail, not intended as part of the user accessed API
struct UnitTestBase
{
UnitTestBase(const char* name, int a_verbosity);
void checkHelper(bool res, const char* str, const char* file, int line);
virtual void runTest() = 0;
const char* testName;
int passCount, failCount, verbose;
UnitTestBase* nextTest;
};
END_NAMESPACE
#endif // TEST_H