|
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
|