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