00001 #ifndef UNITTEST_TESTMACROS_H
00002 #define UNITTEST_TESTMACROS_H
00003
00004 #include "Config.h"
00005 #include "ExecuteTest.h"
00006 #include "AssertException.h"
00007 #include "TestDetails.h"
00008 #include "MemoryOutStream.h"
00009
00010 #ifndef UNITTEST_POSIX
00011 #define UNITTEST_THROW_SIGNALS
00012 #else
00013 #include "Posix/SignalTranslator.h"
00014 #endif
00015
00016 #ifdef TEST
00017 #error UnitTest++ redefines TEST
00018 #endif
00019
00020 #ifdef TEST_EX
00021 #error UnitTest++ redefines TEST_EX
00022 #endif
00023
00024 #ifdef TEST_FIXTURE_EX
00025 #error UnitTest++ redefines TEST_FIXTURE_EX
00026 #endif
00027
00028 #define SUITE(Name) \
00029 namespace Suite##Name { \
00030 namespace UnitTestSuite { \
00031 inline char const* GetSuiteName () { \
00032 return #Name ; \
00033 } \
00034 } \
00035 } \
00036 namespace Suite##Name
00037
00038 #define TEST_EX(Name, List) \
00039 class Test##Name : public UnitTest::Test \
00040 { \
00041 public: \
00042 Test##Name() : Test(#Name, UnitTestSuite::GetSuiteName(), __FILE__, __LINE__) {} \
00043 private: \
00044 virtual void RunImpl() const; \
00045 } test##Name##Instance; \
00046 \
00047 UnitTest::ListAdder adder##Name (List, &test##Name##Instance); \
00048 \
00049 void Test##Name::RunImpl() const
00050
00051
00052 #define TEST(Name) TEST_EX(Name, UnitTest::Test::GetTestList())
00053
00054
00055 #define TEST_FIXTURE_EX(Fixture, Name, List) \
00056 class Fixture##Name##Helper : public Fixture \
00057 { \
00058 public: \
00059 explicit Fixture##Name##Helper(UnitTest::TestDetails const& details) : m_details(details) {} \
00060 void RunImpl(); \
00061 UnitTest::TestDetails const& m_details; \
00062 private: \
00063 Fixture##Name##Helper(Fixture##Name##Helper const&); \
00064 Fixture##Name##Helper& operator =(Fixture##Name##Helper const&); \
00065 }; \
00066 \
00067 class Test##Fixture##Name : public UnitTest::Test \
00068 { \
00069 public: \
00070 Test##Fixture##Name() : Test(#Name, UnitTestSuite::GetSuiteName(), __FILE__, __LINE__) {} \
00071 private: \
00072 virtual void RunImpl() const; \
00073 } test##Fixture##Name##Instance; \
00074 \
00075 UnitTest::ListAdder adder##Fixture##Name (List, &test##Fixture##Name##Instance); \
00076 \
00077 void Test##Fixture##Name::RunImpl() const \
00078 { \
00079 bool ctorOk = false; \
00080 try { \
00081 Fixture##Name##Helper fixtureHelper(m_details); \
00082 ctorOk = true; \
00083 UnitTest::ExecuteTest(fixtureHelper, m_details); \
00084 } \
00085 catch (UnitTest::AssertException const& e) \
00086 { \
00087 UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details.testName, m_details.suiteName, e.Filename(), e.LineNumber()), e.what()); \
00088 } \
00089 catch (std::exception const& e) \
00090 { \
00091 UnitTest::MemoryOutStream stream; \
00092 stream << "Unhandled exception: " << e.what(); \
00093 UnitTest::CurrentTest::Results()->OnTestFailure(m_details, stream.GetText()); \
00094 } \
00095 catch (...) { \
00096 if (ctorOk) \
00097 { \
00098 UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details, __LINE__), \
00099 "Unhandled exception while destroying fixture " #Fixture); \
00100 } \
00101 else \
00102 { \
00103 UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details, __LINE__), \
00104 "Unhandled exception while constructing fixture " #Fixture); \
00105 } \
00106 } \
00107 } \
00108 void Fixture##Name##Helper::RunImpl()
00109
00110 #define TEST_FIXTURE(Fixture,Name) TEST_FIXTURE_EX(Fixture, Name, UnitTest::Test::GetTestList())
00111
00112
00113 #endif