00001 #ifndef UNITTEST_CHECKMACROS_H 
00002 #define UNITTEST_CHECKMACROS_H
00003 
00004 #include "Checks.h"
00005 #include "AssertException.h"
00006 #include "MemoryOutStream.h"
00007 #include "TestDetails.h"
00008 #include "CurrentTest.h"
00009 
00010 #ifdef CHECK
00011     #error UnitTest++ redefines CHECK
00012 #endif
00013 
00014 #ifdef CHECK_EQUAL
00015         #error UnitTest++ redefines CHECK_EQUAL
00016 #endif
00017 
00018 #ifdef CHECK_CLOSE
00019         #error UnitTest++ redefines CHECK_CLOSE
00020 #endif
00021 
00022 #ifdef CHECK_ARRAY_EQUAL
00023         #error UnitTest++ redefines CHECK_ARRAY_EQUAL
00024 #endif
00025 
00026 #ifdef CHECK_ARRAY_CLOSE
00027         #error UnitTest++ redefines CHECK_ARRAY_CLOSE
00028 #endif
00029 
00030 #ifdef CHECK_ARRAY2D_CLOSE
00031         #error UnitTest++ redefines CHECK_ARRAY2D_CLOSE
00032 #endif
00033 
00034 #define CHECK(value) \
00035     do \
00036     { \
00037         try { \
00038             if (!UnitTest::Check(value)) \
00039                 UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), #value); \
00040         } \
00041         catch (...) { \
00042             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00043                     "Unhandled exception in CHECK(" #value ")"); \
00044         } \
00045     } while (0)
00046 
00047 #define CHECK_EQUAL(expected, actual) \
00048     do \
00049     { \
00050         try { \
00051             UnitTest::CheckEqual(*UnitTest::CurrentTest::Results(), expected, actual, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
00052         } \
00053         catch (...) { \
00054             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00055                     "Unhandled exception in CHECK_EQUAL(" #expected ", " #actual ")"); \
00056         } \
00057     } while (0)
00058 
00059 #define CHECK_CLOSE(expected, actual, tolerance) \
00060     do \
00061     { \
00062         try { \
00063             UnitTest::CheckClose(*UnitTest::CurrentTest::Results(), expected, actual, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
00064         } \
00065         catch (...) { \
00066             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00067                     "Unhandled exception in CHECK_CLOSE(" #expected ", " #actual ")"); \
00068         } \
00069     } while (0)
00070 
00071 #define CHECK_ARRAY_EQUAL(expected, actual, count) \
00072     do \
00073     { \
00074         try { \
00075             UnitTest::CheckArrayEqual(*UnitTest::CurrentTest::Results(), expected, actual, count, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
00076         } \
00077         catch (...) { \
00078             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00079                     "Unhandled exception in CHECK_ARRAY_EQUAL(" #expected ", " #actual ")"); \
00080         } \
00081     } while (0)
00082 
00083 #define CHECK_ARRAY_CLOSE(expected, actual, count, tolerance) \
00084     do \
00085     { \
00086         try { \
00087             UnitTest::CheckArrayClose(*UnitTest::CurrentTest::Results(), expected, actual, count, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
00088         } \
00089         catch (...) { \
00090             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00091                     "Unhandled exception in CHECK_ARRAY_CLOSE(" #expected ", " #actual ")"); \
00092         } \
00093     } while (0)
00094 
00095 #define CHECK_ARRAY2D_CLOSE(expected, actual, rows, columns, tolerance) \
00096     do \
00097     { \
00098         try { \
00099             UnitTest::CheckArray2DClose(*UnitTest::CurrentTest::Results(), expected, actual, rows, columns, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
00100         } \
00101         catch (...) { \
00102             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
00103                     "Unhandled exception in CHECK_ARRAY_CLOSE(" #expected ", " #actual ")"); \
00104         } \
00105     } while (0)
00106 
00107 
00108 #define CHECK_THROW(expression, ExpectedExceptionType) \
00109     do \
00110     { \
00111         bool caught_ = false; \
00112         try { expression; } \
00113         catch (ExpectedExceptionType const&) { caught_ = true; } \
00114         catch (...) {} \
00115         if (!caught_) \
00116             UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), "Expected exception: \"" #ExpectedExceptionType "\" not thrown"); \
00117     } while(0)
00118 
00119 #define CHECK_ASSERT(expression) \
00120     CHECK_THROW(expression, UnitTest::AssertException);
00121 
00122 #endif