Blame include/cppunit/TestAssert.h

Packit 8c9aa0
#ifndef CPPUNIT_TESTASSERT_H
Packit 8c9aa0
#define CPPUNIT_TESTASSERT_H
Packit 8c9aa0
Packit 8c9aa0
#include <cppunit/Portability.h>
Packit 8c9aa0
#include <cppunit/Exception.h>
Packit 8c9aa0
#include <cppunit/Asserter.h>
Packit 8c9aa0
#include <cppunit/portability/Stream.h>
Packit 8c9aa0
#include <cppunit/tools/StringHelper.h>
Packit 8c9aa0
#include <stdio.h>
Packit 8c9aa0
#include <float.h> // For struct assertion_traits<double>
Packit 8c9aa0
Packit 8c9aa0
// Work around "passing 'T' chooses 'int' over 'unsigned int'" warnings when T
Packit 8c9aa0
// is an enum type:
Packit 8c9aa0
#if defined __GNUC__ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
Packit 8c9aa0
#pragma GCC system_header
Packit 8c9aa0
#endif
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
/*! \brief Traits used by CPPUNIT_ASSERT* macros.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Here is an example of specialising these traits: 
Packit 8c9aa0
 *
Packit 8c9aa0
 * \code
Packit 8c9aa0
 * template<>
Packit 8c9aa0
 * struct assertion_traits<std::string>   // specialization for the std::string type
Packit 8c9aa0
 * {
Packit 8c9aa0
 *   static bool equal( const std::string& x, const std::string& y )
Packit 8c9aa0
 *   {
Packit 8c9aa0
 *     return x == y;
Packit 8c9aa0
 *   }
Packit 8c9aa0
 *
Packit 8c9aa0
 *   static bool less( const std::string& x, const std::string& y )
Packit 8c9aa0
 *   {
Packit 8c9aa0
 *      return x < y;
Packit 8c9aa0
 *   }
Packit 8c9aa0
 *
Packit 8c9aa0
 *   static bool lessEqual( const std::string& x, const std::string& y )
Packit 8c9aa0
 *   {
Packit 8c9aa0
 *      return x <= y;
Packit 8c9aa0
 *   }
Packit 8c9aa0
 *
Packit 8c9aa0
 *   static std::string toString( const std::string& x )
Packit 8c9aa0
 *   {
Packit 8c9aa0
 *     std::string text = '"' + x + '"';    // adds quote around the string to see whitespace
Packit 8c9aa0
 *     OStringStream ost;
Packit 8c9aa0
 *     ost << text;
Packit 8c9aa0
 *     return ost.str();
Packit 8c9aa0
 *   }
Packit 8c9aa0
 * };
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
struct assertion_traits 
Packit 8c9aa0
{  
Packit 8c9aa0
    static bool equal( const T& x, const T& y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x == y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static bool less( const T& x, const T& y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x < y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static bool lessEqual( const T& x, const T& y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x <= y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static std::string toString( const T& x )
Packit 8c9aa0
    {
Packit 8c9aa0
        return CPPUNIT_NS::StringHelper::toString(x);
Packit 8c9aa0
    }
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
/*! \brief Traits used by CPPUNIT_ASSERT_DOUBLES_EQUAL(). 
Packit 8c9aa0
 * 
Packit 8c9aa0
 * This specialisation from @c struct @c assertion_traits<> ensures that 
Packit 8c9aa0
 * doubles are converted in full, instead of being rounded to the default 
Packit 8c9aa0
 * 6 digits of precision. Use the system defined ISO C99 macro DBL_DIG 
Packit 8c9aa0
 * within float.h is available to define the maximum precision, otherwise
Packit 8c9aa0
 * use the hard-coded maximum precision of 15.
Packit 8c9aa0
 */
Packit 8c9aa0
template <>
Packit 8c9aa0
struct assertion_traits<double>
Packit 8c9aa0
{  
Packit 8c9aa0
    static bool equal( double x, double y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x == y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static bool less( double x, double y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x < y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static bool lessEqual( double x, double y )
Packit 8c9aa0
    {
Packit 8c9aa0
        return x <= y;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    static std::string toString( double x )
Packit 8c9aa0
    {
Packit 8c9aa0
#ifdef DBL_DIG
Packit 8c9aa0
       const int precision = DBL_DIG;
Packit 8c9aa0
#else
Packit 8c9aa0
       const int precision = 15;
Packit 8c9aa0
#endif  // #ifdef DBL_DIG
Packit 8c9aa0
       char buffer[128];
Packit 8c9aa0
#ifdef __STDC_SECURE_LIB__ // Use secure version with visual studio 2005 to avoid warning.
Packit 8c9aa0
       sprintf_s(buffer, sizeof(buffer), "%.*g", precision, x); 
Packit 8c9aa0
#else	
Packit 8c9aa0
       sprintf(buffer, "%.*g", precision, x); 
Packit 8c9aa0
#endif
Packit 8c9aa0
       return buffer;
Packit 8c9aa0
    }
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that two objects of the same type are equals.
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_EQUAL instead of this function.
Packit 8c9aa0
 * \sa assertion_traits, Asserter::failNotEqual().
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
void assertEquals( const T& expected,
Packit 8c9aa0
                   const T& actual,
Packit 8c9aa0
                   SourceLine sourceLine,
Packit 8c9aa0
                   const std::string &message )
Packit 8c9aa0
{
Packit 8c9aa0
  if ( !assertion_traits<T>::equal(expected,actual) ) // lazy toString conversion...
Packit 8c9aa0
  {
Packit 8c9aa0
    Asserter::failNotEqual( assertion_traits<T>::toString(expected),
Packit 8c9aa0
                            assertion_traits<T>::toString(actual),
Packit 8c9aa0
                            sourceLine,
Packit 8c9aa0
                            message );
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that two double are equals given a tolerance.
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_DOUBLES_EQUAL instead of this function.
Packit 8c9aa0
 * \sa Asserter::failNotEqual().
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_DOUBLES_EQUAL for detailed semantic of the assertion.
Packit 8c9aa0
 */
Packit 8c9aa0
void CPPUNIT_API assertDoubleEquals( double expected,
Packit 8c9aa0
                                     double actual,
Packit 8c9aa0
                                     double delta,
Packit 8c9aa0
                                     SourceLine sourceLine, 
Packit 8c9aa0
                                     const std::string &message );
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that an object is less than another one of the same type
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_LESS, CPPUNIT_ASSERT_GREATER instead of this function.
Packit 8c9aa0
 * \sa assertion_traits, Asserter::failNotLess().
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
void assertLess( const T& expected,
Packit 8c9aa0
                 const T& actual,
Packit 8c9aa0
                 SourceLine sourceLine,
Packit 8c9aa0
                 const std::string& message )
Packit 8c9aa0
{
Packit 8c9aa0
    if ( !assertion_traits<T>::less(actual,expected) )
Packit 8c9aa0
    {
Packit 8c9aa0
        Asserter::failNotLess( assertion_traits<T>::toString(expected),
Packit 8c9aa0
                               assertion_traits<T>::toString(actual),
Packit 8c9aa0
                               sourceLine,
Packit 8c9aa0
                               message );
Packit 8c9aa0
    }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that an object is less than another one of the same type
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_LESS, CPPUNIT_ASSERT_GREATER instead of this function.
Packit 8c9aa0
 * \sa assertion_traits, Asserter::failNotLess().
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
void assertGreater( const T& expected,
Packit 8c9aa0
                 const T& actual,
Packit 8c9aa0
                 SourceLine sourceLine,
Packit 8c9aa0
                 const std::string& message )
Packit 8c9aa0
{
Packit 8c9aa0
    if ( !assertion_traits<T>::less(expected,actual) )
Packit 8c9aa0
    {
Packit 8c9aa0
        Asserter::failNotGreater( assertion_traits<T>::toString(expected),
Packit 8c9aa0
                               assertion_traits<T>::toString(actual),
Packit 8c9aa0
                               sourceLine,
Packit 8c9aa0
                               message );
Packit 8c9aa0
    }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that two objects of the same type are equals.
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_LESSEQUAL, CPPUNIT_ASSERT_GREATEREQUAL instead of this function.
Packit 8c9aa0
 * \sa assertion_traits, Asserter::failNotLessEqual().
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
void assertLessEqual( const T& expected,
Packit 8c9aa0
                      const T& actual,
Packit 8c9aa0
                      SourceLine sourceLine,
Packit 8c9aa0
                      const std::string& message )
Packit 8c9aa0
{
Packit 8c9aa0
    if ( !assertion_traits<T>::lessEqual(actual,expected) )
Packit 8c9aa0
    {
Packit 8c9aa0
        Asserter::failNotLessEqual( assertion_traits<T>::toString(expected),
Packit 8c9aa0
                               assertion_traits<T>::toString(actual),
Packit 8c9aa0
                               sourceLine,
Packit 8c9aa0
                               message );
Packit 8c9aa0
    }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
/*! \brief (Implementation) Asserts that two objects of the same type are equals.
Packit 8c9aa0
 * Use CPPUNIT_ASSERT_LESSEQUAL, CPPUNIT_ASSERT_GREATEREQUAL instead of this function.
Packit 8c9aa0
 * \sa assertion_traits, Asserter::failNotLessEqual().
Packit 8c9aa0
 */
Packit 8c9aa0
template <class T>
Packit 8c9aa0
void assertGreaterEqual( const T& expected,
Packit 8c9aa0
                      const T& actual,
Packit 8c9aa0
                      SourceLine sourceLine,
Packit 8c9aa0
                      const std::string& message )
Packit 8c9aa0
{
Packit 8c9aa0
    if ( !assertion_traits<T>::lessEqual(expected,actual) )
Packit 8c9aa0
    {
Packit 8c9aa0
        Asserter::failNotGreaterEqual( assertion_traits<T>::toString(expected),
Packit 8c9aa0
                               assertion_traits<T>::toString(actual),
Packit 8c9aa0
                               sourceLine,
Packit 8c9aa0
                               message );
Packit 8c9aa0
    }
Packit 8c9aa0
}
Packit 8c9aa0
/* A set of macros which allow us to get the line number
Packit 8c9aa0
 * and file name at the point of an error.
Packit 8c9aa0
 * Just goes to show that preprocessors do have some
Packit 8c9aa0
 * redeeming qualities.
Packit 8c9aa0
 */
Packit 8c9aa0
#if CPPUNIT_HAVE_CPP_SOURCE_ANNOTATION
Packit 8c9aa0
/** Assertions that a condition is \c true.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT(condition)                                                 \
Packit 8c9aa0
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                                   \
Packit 8c9aa0
                                 CPPUNIT_NS::Message( "assertion failed",         \
Packit 8c9aa0
                                                      "Expression: " #condition), \
Packit 8c9aa0
                                 CPPUNIT_SOURCELINE() ) )
Packit 8c9aa0
#else
Packit 8c9aa0
#define CPPUNIT_ASSERT(condition)                                            \
Packit 8c9aa0
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                              \
Packit 8c9aa0
                                  CPPUNIT_NS::Message( "assertion failed" ), \
Packit 8c9aa0
                                  CPPUNIT_SOURCELINE() ) )
Packit 8c9aa0
#endif
Packit 8c9aa0
Packit 8c9aa0
/** Assertion with a user specified message.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * \param message Message reported in diagnostic if \a condition evaluates
Packit 8c9aa0
 *                to \c false.
Packit 8c9aa0
 * \param condition If this condition evaluates to \c false then the
Packit 8c9aa0
 *                  test failed.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_MESSAGE(message,condition)                          \
Packit 8c9aa0
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                            \
Packit 8c9aa0
                                  CPPUNIT_NS::Message( "assertion failed", \
Packit 8c9aa0
                                                       "Expression: "      \
Packit 8c9aa0
                                                       #condition,         \
Packit 8c9aa0
                                                       message ),          \
Packit 8c9aa0
                                  CPPUNIT_SOURCELINE() ) )
Packit 8c9aa0
Packit 8c9aa0
/** Fails with the specified message.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * \param message Message reported in diagnostic.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_FAIL( message )                                         \
Packit 8c9aa0
  ( CPPUNIT_NS::Asserter::fail( CPPUNIT_NS::Message( "forced failure",  \
Packit 8c9aa0
                                                     message ),         \
Packit 8c9aa0
                                CPPUNIT_SOURCELINE() ) )
Packit 8c9aa0
Packit 8c9aa0
#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
Packit 8c9aa0
/// Generalized macro for primitive value comparisons
Packit 8c9aa0
#define CPPUNIT_ASSERT_EQUAL(expected,actual)                     \
Packit 8c9aa0
  ( CPPUNIT_NS::assertEquals( (expected),             \
Packit 8c9aa0
                              (actual),               \
Packit 8c9aa0
                              __LINE__, __FILE__ ) )
Packit 8c9aa0
#else
Packit 8c9aa0
/** Asserts that two values are equals.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * Equality and string representation can be defined with
Packit 8c9aa0
 * an appropriate CppUnit::assertion_traits class.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual and expected values disagree.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator ==. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_EQUAL(expected,actual)          \
Packit 8c9aa0
  ( CPPUNIT_NS::assertEquals( (expected),              \
Packit 8c9aa0
                              (actual),                \
Packit 8c9aa0
                              CPPUNIT_SOURCELINE(),    \
Packit 8c9aa0
                              "" ) )
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that two values are equals, provides additional message on failure.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * Equality and string representation can be defined with
Packit 8c9aa0
 * an appropriate assertion_traits class.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual and expected values disagree.
Packit 8c9aa0
 * The message is printed in addition to the expected and actual value
Packit 8c9aa0
 * to provide additional information.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator ==. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,actual)      \
Packit 8c9aa0
  ( CPPUNIT_NS::assertEquals( (expected),              \
Packit 8c9aa0
                              (actual),                \
Packit 8c9aa0
                              CPPUNIT_SOURCELINE(),    \
Packit 8c9aa0
                              (message) ) )
Packit 8c9aa0
#endif
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that actual is less than expected, provides additional message on failure.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * Less and string representation can be defined with
Packit 8c9aa0
 * an appropriate assertion_traits class.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual is less than expected.
Packit 8c9aa0
 * The message is printed in addition to the expected and actual value
Packit 8c9aa0
 * to provide additional information.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator <. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 *
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_GREATER
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_LESS(expected, actual)          \
Packit 8c9aa0
    ( CPPUNIT_NS::assertLess( (expected),              \
Packit 8c9aa0
                              (actual),                \
Packit 8c9aa0
                              CPPUNIT_SOURCELINE(),    \
Packit 8c9aa0
                              "" ) )
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that actual is greater than expected, provides additional message on failure.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * String representation can be defined with
Packit 8c9aa0
 * an appropriate assertion_traits class. For comparison assertLess is used.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual is less than expected.
Packit 8c9aa0
 * The message is printed in addition to the expected and actual value
Packit 8c9aa0
 * to provide additional information.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator<. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 *
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_LESS
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_GREATER(expected, actual)       \
Packit 8c9aa0
    ( CPPUNIT_NS::assertGreater( (expected),           \
Packit 8c9aa0
                                 (actual),             \
Packit 8c9aa0
                                 CPPUNIT_SOURCELINE(), \
Packit 8c9aa0
                                 "" ) )
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that actual is less or equal than expected, provides additional message on failure.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * LessEqual and string representation can be defined with
Packit 8c9aa0
 * an appropriate assertion_traits class.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual is greater than expected.
Packit 8c9aa0
 * The message is printed in addition to the expected and actual value
Packit 8c9aa0
 * to provide additional information.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator <=. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 *
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_GREATEREQUAL
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_LESSEQUAL(expected, actual)               \
Packit 8c9aa0
    ( CPPUNIT_NS::assertLessEqual( (expected),              \
Packit 8c9aa0
                                   (actual),                \
Packit 8c9aa0
                                   CPPUNIT_SOURCELINE(),    \
Packit 8c9aa0
                                   "" ) )
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that actual is greater than expected, provides additional message on failure.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * String representation can be defined with
Packit 8c9aa0
 * an appropriate assertion_traits class. For comparison assertLess is used.
Packit 8c9aa0
 *
Packit 8c9aa0
 * A diagnostic is printed if actual is less than expected.
Packit 8c9aa0
 * The message is printed in addition to the expected and actual value
Packit 8c9aa0
 * to provide additional information.
Packit 8c9aa0
 *
Packit 8c9aa0
 * Requirement for \a expected and \a actual parameters:
Packit 8c9aa0
 * - They are exactly of the same type
Packit 8c9aa0
 * - They are serializable into a std::strstream using operator <<.
Packit 8c9aa0
 * - They can be compared using operator<=. 
Packit 8c9aa0
 *
Packit 8c9aa0
 * The last two requirements (serialization and comparison) can be
Packit 8c9aa0
 * removed by specializing the CppUnit::assertion_traits.
Packit 8c9aa0
 *
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_LESSEQUAL
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_GREATEREQUAL(expected, actual)            \
Packit 8c9aa0
    ( CPPUNIT_NS::assertGreaterEqual( (expected),                \
Packit 8c9aa0
                                      (actual),              \
Packit 8c9aa0
                                      CPPUNIT_SOURCELINE(),    \
Packit 8c9aa0
                                      "" ) )
Packit 8c9aa0
/*! \brief Macro for primitive double value comparisons. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 *
Packit 8c9aa0
 * The assertion pass if both expected and actual are finite and
Packit 8c9aa0
 * \c fabs( \c expected - \c actual ) <= \c delta.
Packit 8c9aa0
 * If either \c expected or actual are infinite (+/- inf), the 
Packit 8c9aa0
 * assertion pass if \c expected == \c actual.
Packit 8c9aa0
 * If either \c expected or \c actual is a NaN (not a number), then
Packit 8c9aa0
 * the assertion fails.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,actual,delta)        \
Packit 8c9aa0
  ( CPPUNIT_NS::assertDoubleEquals( (expected),            \
Packit 8c9aa0
                                    (actual),              \
Packit 8c9aa0
                                    (delta),               \
Packit 8c9aa0
                                    CPPUNIT_SOURCELINE(),  \
Packit 8c9aa0
                                    "" ) )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/*! \brief Macro for primitive double value comparisons, setting a 
Packit 8c9aa0
 * user-supplied message in case of failure. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * \sa CPPUNIT_ASSERT_DOUBLES_EQUAL for detailed semantic of the assertion.
Packit 8c9aa0
 */
Packit 8c9aa0
#define CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(message,expected,actual,delta)  \
Packit 8c9aa0
  ( CPPUNIT_NS::assertDoubleEquals( (expected),            \
Packit 8c9aa0
                                    (actual),              \
Packit 8c9aa0
                                    (delta),               \
Packit 8c9aa0
                                    CPPUNIT_SOURCELINE(),  \
Packit 8c9aa0
                                    (message) ) )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that the given expression throws an exception of the specified type. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   std::vector<int> v;
Packit 8c9aa0
 *  CPPUNIT_ASSERT_THROW( v.at( 50 ), std::out_of_range );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_THROW( expression, ExceptionType )              \
Packit 8c9aa0
   CPPUNIT_ASSERT_THROW_MESSAGE( CPPUNIT_NS::AdditionalMessage(),       \
Packit 8c9aa0
                                 expression,                            \
Packit 8c9aa0
                                 ExceptionType )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
// implementation detail
Packit 8c9aa0
#if defined(CPPUNIT_USE_TYPEINFO_NAME)
Packit 8c9aa0
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
Packit 8c9aa0
   CPPUNIT_NS::TypeInfoHelper::getClassName( typeid(exception) )
Packit 8c9aa0
#else
Packit 8c9aa0
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
Packit 8c9aa0
   std::string( no_rtti_message )
Packit 8c9aa0
#endif // CPPUNIT_USE_TYPEINFO_NAME
Packit 8c9aa0
Packit 8c9aa0
// implementation detail
Packit 8c9aa0
#define CPPUNIT_GET_PARAMETER_STRING( parameter ) #parameter
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that the given expression throws an exception of the specified type, 
Packit 8c9aa0
 * setting a user supplied message in case of failure. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   std::vector<int> v;
Packit 8c9aa0
 *  CPPUNIT_ASSERT_THROW_MESSAGE( "- std::vector<int> v;", v.at( 50 ), std::out_of_range );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_THROW_MESSAGE( message, expression, ExceptionType )   \
Packit 8c9aa0
   do {                                                                       \
Packit 8c9aa0
      bool cpputCorrectExceptionThrown_ = false;                              \
Packit 8c9aa0
      CPPUNIT_NS::Message cpputMsg_( "expected exception not thrown" );       \
Packit 8c9aa0
      cpputMsg_.addDetail( message );                                         \
Packit 8c9aa0
      cpputMsg_.addDetail( "Expected: "                                       \
Packit 8c9aa0
                           CPPUNIT_GET_PARAMETER_STRING( ExceptionType ) );   \
Packit 8c9aa0
                                                                              \
Packit 8c9aa0
      try {                                                                   \
Packit 8c9aa0
         expression;                                                          \
Packit 8c9aa0
      } catch ( const ExceptionType & ) {                                     \
Packit 8c9aa0
         cpputCorrectExceptionThrown_ = true;                                 \
Packit 8c9aa0
      } catch ( const std::exception &e) {                                    \
Packit 8c9aa0
         cpputMsg_.addDetail( "Actual  : " +                                  \
Packit 8c9aa0
                              CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e,             \
Packit 8c9aa0
                                          "std::exception or derived") );     \
Packit 8c9aa0
         cpputMsg_.addDetail( std::string("What()  : ") + e.what() );         \
Packit 8c9aa0
      } catch ( ... ) {                                                       \
Packit 8c9aa0
         cpputMsg_.addDetail( "Actual  : unknown.");                          \
Packit 8c9aa0
      }                                                                       \
Packit 8c9aa0
                                                                              \
Packit 8c9aa0
      if ( cpputCorrectExceptionThrown_ )                                     \
Packit 8c9aa0
         break;                                                               \
Packit 8c9aa0
                                                                              \
Packit 8c9aa0
      CPPUNIT_NS::Asserter::fail( cpputMsg_,                                  \
Packit 8c9aa0
                                  CPPUNIT_SOURCELINE() );                     \
Packit 8c9aa0
   } while ( false )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that the given expression does not throw any exceptions.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   std::vector<int> v;
Packit 8c9aa0
 *   v.push_back( 10 );
Packit 8c9aa0
 *  CPPUNIT_ASSERT_NO_THROW( v.at( 0 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_NO_THROW( expression )                             \
Packit 8c9aa0
   CPPUNIT_ASSERT_NO_THROW_MESSAGE( CPPUNIT_NS::AdditionalMessage(),       \
Packit 8c9aa0
                                    expression )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that the given expression does not throw any exceptions, 
Packit 8c9aa0
 * setting a user supplied message in case of failure. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   std::vector<int> v;
Packit 8c9aa0
 *   v.push_back( 10 );
Packit 8c9aa0
 *  CPPUNIT_ASSERT_NO_THROW( "std::vector<int> v;", v.at( 0 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_NO_THROW_MESSAGE( message, expression )               \
Packit 8c9aa0
   do {                                                                       \
Packit 8c9aa0
      CPPUNIT_NS::Message cpputMsg_( "unexpected exception caught" );         \
Packit 8c9aa0
      cpputMsg_.addDetail( message );                                         \
Packit 8c9aa0
                                                                              \
Packit 8c9aa0
      try {                                                                   \
Packit 8c9aa0
         expression;                                                          \
Packit 8c9aa0
      } catch ( const std::exception &e ) {                                   \
Packit 8c9aa0
         cpputMsg_.addDetail( "Caught: " +                                    \
Packit 8c9aa0
                              CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e,             \
Packit 8c9aa0
                                          "std::exception or derived" ) );    \
Packit 8c9aa0
         cpputMsg_.addDetail( std::string("What(): ") + e.what() );           \
Packit 8c9aa0
         CPPUNIT_NS::Asserter::fail( cpputMsg_,                               \
Packit 8c9aa0
                                     CPPUNIT_SOURCELINE() );                  \
Packit 8c9aa0
      } catch ( ... ) {                                                       \
Packit 8c9aa0
         cpputMsg_.addDetail( "Caught: unknown." );                           \
Packit 8c9aa0
         CPPUNIT_NS::Asserter::fail( cpputMsg_,                               \
Packit 8c9aa0
                                     CPPUNIT_SOURCELINE() );                  \
Packit 8c9aa0
      }                                                                       \
Packit 8c9aa0
   } while ( false )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that an assertion fail.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Use to test assertions.
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT( 1 == 2 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_ASSERTION_FAIL( assertion )                 \
Packit 8c9aa0
   CPPUNIT_ASSERT_THROW( assertion, CPPUNIT_NS::Exception )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that an assertion fail, with a user-supplied message in 
Packit 8c9aa0
 * case of error.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Use to test assertions.
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   CPPUNIT_ASSERT_ASSERTION_FAIL_MESSAGE( "1 == 2", CPPUNIT_ASSERT( 1 == 2 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_ASSERTION_FAIL_MESSAGE( message, assertion )    \
Packit 8c9aa0
   CPPUNIT_ASSERT_THROW_MESSAGE( message, assertion, CPPUNIT_NS::Exception )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that an assertion pass.
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Use to test assertions.
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( 1 == 1 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_ASSERTION_PASS( assertion )                 \
Packit 8c9aa0
   CPPUNIT_ASSERT_NO_THROW( assertion )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
/** Asserts that an assertion pass, with a user-supplied message in 
Packit 8c9aa0
 * case of failure. 
Packit 8c9aa0
 * \ingroup Assertions
Packit 8c9aa0
 * Use to test assertions.
Packit 8c9aa0
 * Example of usage:
Packit 8c9aa0
 * \code
Packit 8c9aa0
 *   CPPUNIT_ASSERT_ASSERTION_PASS_MESSAGE( "1 != 1", CPPUNIT_ASSERT( 1 == 1 ) );
Packit 8c9aa0
 * \endcode
Packit 8c9aa0
 */
Packit 8c9aa0
# define CPPUNIT_ASSERT_ASSERTION_PASS_MESSAGE( message, assertion )    \
Packit 8c9aa0
   CPPUNIT_ASSERT_NO_THROW_MESSAGE( message, assertion )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
// Backwards compatibility
Packit 8c9aa0
Packit 8c9aa0
#if CPPUNIT_ENABLE_NAKED_ASSERT
Packit 8c9aa0
Packit 8c9aa0
#undef assert
Packit 8c9aa0
#define assert(c)                 CPPUNIT_ASSERT(c)
Packit 8c9aa0
#define assertEqual(e,a)          CPPUNIT_ASSERT_EQUAL(e,a)
Packit 8c9aa0
#define assertDoublesEqual(e,a,d) CPPUNIT_ASSERT_DOUBLES_EQUAL(e,a,d)
Packit 8c9aa0
#define assertLongsEqual(e,a)     CPPUNIT_ASSERT_EQUAL(e,a)
Packit 8c9aa0
Packit 8c9aa0
#endif
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_END
Packit 8c9aa0
Packit 8c9aa0
#endif  // CPPUNIT_TESTASSERT_H