TestAssert.h
Go to the documentation of this file.00001 
#ifndef CPPUNIT_TESTASSERT_H
00002 
#define CPPUNIT_TESTASSERT_H
00003 
00004 
#include <cppunit/Portability.h>
00005 
#include <cppunit/Exception.h>
00006 
#include <cppunit/Asserter.h>
00007 
00008 
00009 
CPPUNIT_NS_BEGIN
00010 
00011 
00035 
template <
class T>
00036 struct assertion_traits 
00037 {  
00038     static bool equal( 
const T& x, 
const T& y )
00039     {
00040         
return x == y;
00041     }
00042 
00043     static std::string 
toString( 
const T& x )
00044     {
00045         OStringStream ost;
00046         ost << x;
00047         
return ost.str();
00048     }
00049 };
00050 
00051 
00056 
template <
class T>
00057 void assertEquals( 
const T& expected,
00058                    
const T& actual,
00059                    
SourceLine sourceLine,
00060                    
const std::string &message )
00061 {
00062   
if ( !
assertion_traits<T>::equal(expected,actual) ) 
00063   {
00064     Asserter::failNotEqual( 
assertion_traits<T>::toString(expected),
00065                             
assertion_traits<T>::toString(actual),
00066                             sourceLine,
00067                             message );
00068   }
00069 }
00070 
00075 
void CPPUNIT_API 
assertDoubleEquals( 
double expected,
00076                                      
double actual,
00077                                      
double delta,
00078                                      
SourceLine sourceLine );
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
#if CPPUNIT_HAVE_CPP_SOURCE_ANNOTATION
00087 
00090 #define CPPUNIT_ASSERT(condition)                                                 \
00091 
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                                   \
00092 
                                 CPPUNIT_NS::Message( "assertion failed",         \
00093 
                                                      "Expression: " #condition), \
00094 
                                 CPPUNIT_SOURCELINE() ) )
00095 
#else
00096 
#define CPPUNIT_ASSERT(condition)                                            \
00097 
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                              \
00098 
                                  CPPUNIT_NS::Message( "assertion failed" ), \
00099 
                                  CPPUNIT_SOURCELINE() ) )
00100 
#endif
00101 
00109 #define CPPUNIT_ASSERT_MESSAGE(message,condition)          \
00110 
  ( CPPUNIT_NS::Asserter::failIf( !(condition),            \
00111 
                                  (message),               \
00112 
                                  CPPUNIT_SOURCELINE() ) )
00113 
00118 #define CPPUNIT_FAIL( message )                                         \
00119 
  ( CPPUNIT_NS::Asserter::fail( CPPUNIT_NS::Message( "forced failure",  \
00120 
                                                     message ),         \
00121 
                                CPPUNIT_SOURCELINE() ) )
00122 
00123 
#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
00124 
00125 
#define CPPUNIT_ASSERT_EQUAL(expected,actual)                     \
00126 
  ( CPPUNIT_NS::assertEquals( (expected),             \
00127 
                              (actual),               \
00128 
                              __LINE__, __FILE__ ) )
00129 
#else
00130 
00146 #define CPPUNIT_ASSERT_EQUAL(expected,actual)          \
00147 
  ( CPPUNIT_NS::assertEquals( (expected),              \
00148 
                              (actual),                \
00149 
                              CPPUNIT_SOURCELINE(),    \
00150 
                              "" ) )
00151 
00170 #define CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,actual)      \
00171 
  ( CPPUNIT_NS::assertEquals( (expected),              \
00172 
                              (actual),                \
00173 
                              CPPUNIT_SOURCELINE(),    \
00174 
                              (message) ) )
00175 
#endif
00176 
00180 #define CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,actual,delta)        \
00181 
  ( CPPUNIT_NS::assertDoubleEquals( (expected),        \
00182 
                                    (actual),          \
00183 
                                    (delta),           \
00184 
                                    CPPUNIT_SOURCELINE() ) )
00185 
00186 
00195 # define CPPUNIT_ASSERT_THROW( expression, ExceptionType )          \
00196 
   do {                                                             \
00197 
      bool cpputExceptionThrown_ = false;                           \
00198 
      try {                                                         \
00199 
         expression;                                                \
00200 
      } catch ( const ExceptionType & ) {                           \
00201 
         cpputExceptionThrown_ = true;                              \
00202 
      }                                                             \
00203 
                                                                    \
00204 
      if ( cpputExceptionThrown_ )                                  \
00205 
         break;                                                     \
00206 
                                                                    \
00207 
      CPPUNIT_NS::Asserter::fail(                                   \
00208 
                     "Expected exception: " #ExceptionType          \
00209 
                     " not thrown.",                                \
00210 
                     CPPUNIT_SOURCELINE() );                        \
00211 
   } while ( false )
00212 
00213 
00214 
00215 
#if CPPUNIT_USE_TYPEINFO_NAME
00216 
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
00217 
   CPPUNIT_NS::TypeInfoHelper::getClassName( typeid(exception) )
00218 
#else
00219 #define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
00220 
   std::string( no_rtti_message )
00221 
#endif // CPPUNIT_USE_TYPEINFO_NAME
00222 
00232 # define CPPUNIT_ASSERT_NO_THROW( expression )                             \
00233 
   try {                                                                   \
00234 
      expression;                                                          \
00235 
   } catch ( const std::exception &e ) {                                   \
00236 
      CPPUNIT_NS::Message message( "Unexpected exception caught" );        \
00237 
      message.addDetail( "Type: " +                                        \
00238 
                   CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e,                     \
00239 
                                       "std::exception or derived" ) );    \
00240 
      message.addDetail( std::string("What: ") + e.what() );               \
00241 
      CPPUNIT_NS::Asserter::fail( message,                                 \
00242 
                                  CPPUNIT_SOURCELINE() );                  \
00243 
   } catch ( ... ) {                                                       \
00244 
      CPPUNIT_NS::Asserter::fail( "Unexpected exception caught",           \
00245 
                                  CPPUNIT_SOURCELINE() );                  \
00246 
   }
00247 
00256 # define CPPUNIT_ASSERT_ASSERTION_FAIL( assertion )                 \
00257 
   CPPUNIT_ASSERT_THROW( assertion, CPPUNIT_NS::Exception )
00258 
00259 
00268 # define CPPUNIT_ASSERT_ASSERTION_PASS( assertion )                 \
00269 
   CPPUNIT_ASSERT_NO_THROW( assertion )
00270 
00271 
00272 
00273 
00274 
00275 
00276 
#if CPPUNIT_ENABLE_NAKED_ASSERT
00277 
00278 
#undef assert
00279 
#define assert(c)                 CPPUNIT_ASSERT(c)
00280 
#define assertEqual(e,a)          CPPUNIT_ASSERT_EQUAL(e,a)
00281 
#define assertDoublesEqual(e,a,d) CPPUNIT_ASSERT_DOUBLES_EQUAL(e,a,d)
00282 
#define assertLongsEqual(e,a)     CPPUNIT_ASSERT_EQUAL(e,a)
00283 
00284 
#endif
00285 
00286 
00287 
CPPUNIT_NS_END
00288 
00289 
#endif  // CPPUNIT_TESTASSERT_H