CppUnit project page
FAQ
CppUnit home page
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
include
cppunit
TestAssert.h
Go to the documentation of this file.
1
#ifndef CPPUNIT_TESTASSERT_H
2
#define CPPUNIT_TESTASSERT_H
3
4
#include <
cppunit/Portability.h
>
5
#include <
cppunit/Exception.h
>
6
#include <
cppunit/Asserter.h
>
7
#include <
cppunit/portability/Stream.h
>
8
#include <stdio.h>
9
#include <float.h>
// For struct assertion_traits<double>
10
11
12
CPPUNIT_NS_BEGIN
13
14
38
template
<
class
T>
39
struct
assertion_traits
40
{
41
static
bool
equal
(
const
T& x,
const
T& y )
42
{
43
return
x == y;
44
}
45
46
static
std::string
toString
(
const
T& x )
47
{
48
OStringStream ost;
49
ost << x;
50
return
ost.str();
51
}
52
};
53
54
63
template
<>
64
struct
assertion_traits
<double>
65
{
66
static
bool
equal
(
double
x,
double
y )
67
{
68
return
x == y;
69
}
70
71
static
std::string
toString
(
double
x )
72
{
73
#ifdef DBL_DIG
74
const
int
precision = DBL_DIG;
75
#else
76
const
int
precision = 15;
77
#endif // #ifdef DBL_DIG
78
char
buffer[128];
79
#ifdef __STDC_SECURE_LIB__ // Use secure version with visual studio 2005 to avoid warning.
80
sprintf_s(buffer,
sizeof
(buffer),
"%.*g"
, precision, x);
81
#else
82
sprintf(buffer,
"%.*g"
, precision, x);
83
#endif
84
return
buffer;
85
}
86
};
87
88
93
template
<
class
T>
94
void
assertEquals
(
const
T& expected,
95
const
T& actual,
96
SourceLine
sourceLine,
97
const
std::string &message )
98
{
99
if
( !
assertion_traits<T>::equal
(expected,actual) )
// lazy toString conversion...
100
{
101
Asserter::failNotEqual
(
assertion_traits<T>::toString
(expected),
102
assertion_traits<T>::toString
(actual),
103
sourceLine,
104
message );
105
}
106
}
107
108
114
void
CPPUNIT_API
assertDoubleEquals
(
double
expected,
115
double
actual,
116
double
delta,
117
SourceLine
sourceLine,
118
const
std::string &message );
119
120
121
/* A set of macros which allow us to get the line number
122
* and file name at the point of an error.
123
* Just goes to show that preprocessors do have some
124
* redeeming qualities.
125
*/
126
#if CPPUNIT_HAVE_CPP_SOURCE_ANNOTATION
127
130
#define CPPUNIT_ASSERT(condition) \
131
( CPPUNIT_NS::Asserter::failIf( !(condition), \
132
CPPUNIT_NS::Message( "assertion failed", \
133
"Expression: " #condition), \
134
CPPUNIT_SOURCELINE() ) )
135
#else
136
#define CPPUNIT_ASSERT(condition) \
137
( CPPUNIT_NS::Asserter::failIf( !(condition), \
138
CPPUNIT_NS::Message( "assertion failed" ), \
139
CPPUNIT_SOURCELINE() ) )
140
#endif
141
149
#define CPPUNIT_ASSERT_MESSAGE(message,condition) \
150
( CPPUNIT_NS::Asserter::failIf( !(condition), \
151
CPPUNIT_NS::Message( "assertion failed", \
152
"Expression: " \
153
#condition, \
154
message ), \
155
CPPUNIT_SOURCELINE() ) )
156
161
#define CPPUNIT_FAIL( message ) \
162
( CPPUNIT_NS::Asserter::fail( CPPUNIT_NS::Message( "forced failure", \
163
message ), \
164
CPPUNIT_SOURCELINE() ) )
165
166
#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
167
#define CPPUNIT_ASSERT_EQUAL(expected,actual) \
169
( CPPUNIT_NS::assertEquals( (expected), \
170
(actual), \
171
__LINE__, __FILE__ ) )
172
#else
173
189
#define CPPUNIT_ASSERT_EQUAL(expected,actual) \
190
( CPPUNIT_NS::assertEquals( (expected), \
191
(actual), \
192
CPPUNIT_SOURCELINE(), \
193
"" ) )
194
213
#define CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,actual) \
214
( CPPUNIT_NS::assertEquals( (expected), \
215
(actual), \
216
CPPUNIT_SOURCELINE(), \
217
(message) ) )
218
#endif
219
230
#define CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,actual,delta) \
231
( CPPUNIT_NS::assertDoubleEquals( (expected), \
232
(actual), \
233
(delta), \
234
CPPUNIT_SOURCELINE(), \
235
"" ) )
236
237
243
#define CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(message,expected,actual,delta) \
244
( CPPUNIT_NS::assertDoubleEquals( (expected), \
245
(actual), \
246
(delta), \
247
CPPUNIT_SOURCELINE(), \
248
(message) ) )
249
250
259
# define CPPUNIT_ASSERT_THROW( expression, ExceptionType ) \
260
CPPUNIT_ASSERT_THROW_MESSAGE( CPPUNIT_NS::AdditionalMessage(), \
261
expression, \
262
ExceptionType )
263
264
265
// implementation detail
266
#if CPPUNIT_USE_TYPEINFO_NAME
267
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
268
CPPUNIT_NS::TypeInfoHelper::getClassName( typeid(exception) )
269
#else
270
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
271
std::string( no_rtti_message )
272
#endif // CPPUNIT_USE_TYPEINFO_NAME
273
274
// implementation detail
275
#define CPPUNIT_GET_PARAMETER_STRING( parameter ) #parameter
276
286
# define CPPUNIT_ASSERT_THROW_MESSAGE( message, expression, ExceptionType ) \
287
do { \
288
bool cpputCorrectExceptionThrown_ = false; \
289
CPPUNIT_NS::Message cpputMsg_( "expected exception not thrown" ); \
290
cpputMsg_.addDetail( message ); \
291
cpputMsg_.addDetail( "Expected: " \
292
CPPUNIT_GET_PARAMETER_STRING( ExceptionType ) ); \
293
\
294
try { \
295
expression; \
296
} catch ( const ExceptionType & ) { \
297
cpputCorrectExceptionThrown_ = true; \
298
} catch ( const std::exception &e) { \
299
cpputMsg_.addDetail( "Actual : " + \
300
CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e, \
301
"std::exception or derived") ); \
302
cpputMsg_.addDetail( std::string("What() : ") + e.what() ); \
303
} catch ( ... ) { \
304
cpputMsg_.addDetail( "Actual : unknown."); \
305
} \
306
\
307
if ( cpputCorrectExceptionThrown_ ) \
308
break; \
309
\
310
CPPUNIT_NS::Asserter::fail( cpputMsg_, \
311
CPPUNIT_SOURCELINE() ); \
312
} while ( false )
313
314
324
# define CPPUNIT_ASSERT_NO_THROW( expression ) \
325
CPPUNIT_ASSERT_NO_THROW_MESSAGE( CPPUNIT_NS::AdditionalMessage(), \
326
expression )
327
328
339
# define CPPUNIT_ASSERT_NO_THROW_MESSAGE( message, expression ) \
340
do { \
341
CPPUNIT_NS::Message cpputMsg_( "unexpected exception caught" ); \
342
cpputMsg_.addDetail( message ); \
343
\
344
try { \
345
expression; \
346
} catch ( const std::exception &e ) { \
347
cpputMsg_.addDetail( "Caught: " + \
348
CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e, \
349
"std::exception or derived" ) ); \
350
cpputMsg_.addDetail( std::string("What(): ") + e.what() ); \
351
CPPUNIT_NS::Asserter::fail( cpputMsg_, \
352
CPPUNIT_SOURCELINE() ); \
353
} catch ( ... ) { \
354
cpputMsg_.addDetail( "Caught: unknown." ); \
355
CPPUNIT_NS::Asserter::fail( cpputMsg_, \
356
CPPUNIT_SOURCELINE() ); \
357
} \
358
} while ( false )
359
360
369
# define CPPUNIT_ASSERT_ASSERTION_FAIL( assertion ) \
370
CPPUNIT_ASSERT_THROW( assertion, CPPUNIT_NS::Exception )
371
372
382
# define CPPUNIT_ASSERT_ASSERTION_FAIL_MESSAGE( message, assertion ) \
383
CPPUNIT_ASSERT_THROW_MESSAGE( message, assertion, CPPUNIT_NS::Exception )
384
385
394
# define CPPUNIT_ASSERT_ASSERTION_PASS( assertion ) \
395
CPPUNIT_ASSERT_NO_THROW( assertion )
396
397
407
# define CPPUNIT_ASSERT_ASSERTION_PASS_MESSAGE( message, assertion ) \
408
CPPUNIT_ASSERT_NO_THROW_MESSAGE( message, assertion )
409
410
411
412
413
// Backwards compatibility
414
415
#if CPPUNIT_ENABLE_NAKED_ASSERT
416
417
#undef assert
418
#define assert(c) CPPUNIT_ASSERT(c)
419
#define assertEqual(e,a) CPPUNIT_ASSERT_EQUAL(e,a)
420
#define assertDoublesEqual(e,a,d) CPPUNIT_ASSERT_DOUBLES_EQUAL(e,a,d)
421
#define assertLongsEqual(e,a) CPPUNIT_ASSERT_EQUAL(e,a)
422
423
#endif
424
425
426
CPPUNIT_NS_END
427
428
#endif // CPPUNIT_TESTASSERT_H
hosts this site.
Send comments to:
CppUnit Developers