|
|
@@ -27,6 +27,11 @@ namespace lol |
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
/* |
|
|
|
* This is the base class for all fixtures. It keeps track of all |
|
|
|
* fixtures registered through the LOLUNIT_FIXTURE macro and puts them |
|
|
|
* in a linked list. |
|
|
|
*/ |
|
|
|
class FixtureBase |
|
|
|
{ |
|
|
|
friend class TextTestRunner; |
|
|
@@ -67,6 +72,26 @@ protected: |
|
|
|
std::stringstream m_errorlog, m_context; |
|
|
|
}; |
|
|
|
|
|
|
|
#define LOLUNIT_FIXTURE(FixtureName) \ |
|
|
|
class FixtureName; \ |
|
|
|
template<typename T> struct Make##FixtureName \ |
|
|
|
{ \ |
|
|
|
Make##FixtureName() { p = new T(); } \ |
|
|
|
~Make##FixtureName() { delete p; } \ |
|
|
|
T *p; \ |
|
|
|
}; \ |
|
|
|
Make##FixtureName<FixtureName> lol_unit_fixture_##FixtureName; \ |
|
|
|
static char const *LolUnitFixtureName(FixtureName *p) \ |
|
|
|
{ \ |
|
|
|
(void)p; \ |
|
|
|
return #FixtureName; \ |
|
|
|
} \ |
|
|
|
class FixtureName : public lol::Fixture<FixtureName> |
|
|
|
|
|
|
|
/* |
|
|
|
* This template specialises FixtureBase and provides registration of |
|
|
|
* test cases in a linked list through the LOLUNIT_TEST macro. |
|
|
|
*/ |
|
|
|
template<class T> class Fixture : protected FixtureBase |
|
|
|
{ |
|
|
|
public: |
|
|
@@ -129,6 +154,23 @@ public: |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
#define LOLUNIT_TEST(TestCaseName) \ |
|
|
|
class TestCase##TestCaseName : public TestCase \ |
|
|
|
{ \ |
|
|
|
public: \ |
|
|
|
TestCase##TestCaseName() \ |
|
|
|
{ \ |
|
|
|
AddTestCase(this, #TestCaseName, \ |
|
|
|
(void (FixtureClass::*)()) &FixtureClass::TestCaseName); \ |
|
|
|
} \ |
|
|
|
}; \ |
|
|
|
TestCase##TestCaseName lol_unit_test_case_##TestCaseName; \ |
|
|
|
void TestCaseName() |
|
|
|
|
|
|
|
/* |
|
|
|
* This simple class runs all automatically registered tests and reports |
|
|
|
* on error and success in the standard output. |
|
|
|
*/ |
|
|
|
class TextTestRunner |
|
|
|
{ |
|
|
|
public: |
|
|
@@ -172,35 +214,6 @@ public: |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
#define LOLUNIT_FIXTURE(FixtureName) \ |
|
|
|
class FixtureName; \ |
|
|
|
template<typename T> struct Make##FixtureName \ |
|
|
|
{ \ |
|
|
|
Make##FixtureName() { p = new T(); } \ |
|
|
|
~Make##FixtureName() { delete p; } \ |
|
|
|
T *p; \ |
|
|
|
}; \ |
|
|
|
Make##FixtureName<FixtureName> lol_unit_fixture_##FixtureName; \ |
|
|
|
static char const *LolUnitFixtureName(FixtureName *p) \ |
|
|
|
{ \ |
|
|
|
(void)p; \ |
|
|
|
return #FixtureName; \ |
|
|
|
} \ |
|
|
|
class FixtureName : public lol::Fixture<FixtureName> |
|
|
|
|
|
|
|
#define LOLUNIT_TEST(TestCaseName) \ |
|
|
|
class TestCase##TestCaseName : public TestCase \ |
|
|
|
{ \ |
|
|
|
public: \ |
|
|
|
TestCase##TestCaseName() \ |
|
|
|
{ \ |
|
|
|
AddTestCase(this, #TestCaseName, \ |
|
|
|
(void (FixtureClass::*)()) &FixtureClass::TestCaseName); \ |
|
|
|
} \ |
|
|
|
}; \ |
|
|
|
TestCase##TestCaseName lol_unit_test_case_##TestCaseName; \ |
|
|
|
void TestCaseName() |
|
|
|
|
|
|
|
#define LOLUNIT_ASSERT_GENERIC(msg, cond) \ |
|
|
|
do { \ |
|
|
|
m_asserts++; \ |
|
|
@@ -266,6 +279,10 @@ public: |
|
|
|
} \ |
|
|
|
} while(!True()) |
|
|
|
|
|
|
|
/* |
|
|
|
* Public assert macros |
|
|
|
*/ |
|
|
|
|
|
|
|
#define LOLUNIT_FAIL(msg) \ |
|
|
|
do { \ |
|
|
|
m_asserts++; \ |
|
|
@@ -275,7 +292,7 @@ public: |
|
|
|
<< " (F) line: " << __LINE__ << " " \ |
|
|
|
<< __FILE__ << std::endl; \ |
|
|
|
m_errorlog << "forced failure" << std::endl; \ |
|
|
|
m_errorlog << "- " << msg << std::endl; \ |
|
|
|
m_errorlog << LOLUNIT_MSG(msg); \ |
|
|
|
m_errorlog << m_context.str(); \ |
|
|
|
m_failure = true; \ |
|
|
|
return; \ |
|
|
@@ -286,6 +303,7 @@ public: |
|
|
|
m_context.str(""); \ |
|
|
|
m_context << "- Context : " << #n << " = " << (n) << std::endl; \ |
|
|
|
} while(!True()) |
|
|
|
|
|
|
|
#define LOLUNIT_UNSET_CONTEXT(n) \ |
|
|
|
m_context.str("") |
|
|
|
|
|
|
@@ -349,7 +367,7 @@ public: |
|
|
|
#define LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, t) \ |
|
|
|
LOLUNIT_ASSERT_DOUBLES_EQUAL_GENERIC("", a, b, t) |
|
|
|
#define LOLUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(msg, a, b, t) \ |
|
|
|
LOLUNIT_ASSERT_DOUBLES_EQUAL_GENERIC("- " << msg << std::endl, a, b, t) |
|
|
|
LOLUNIT_ASSERT_DOUBLES_EQUAL_GENERIC(LOLUNIT_MSG(msg), a, b, t) |
|
|
|
|
|
|
|
} /* namespace lol */ |
|
|
|
|
|
|
|