95 lines
2.5 KiB
C
95 lines
2.5 KiB
C
|
#ifndef CPPUNIT_PROTECTOR_H
|
||
|
#define CPPUNIT_PROTECTOR_H
|
||
|
|
||
|
#include <cppunit/SourceLine.h>
|
||
|
|
||
|
CPPUNIT_NS_BEGIN
|
||
|
|
||
|
class Exception;
|
||
|
class Message;
|
||
|
class ProtectorContext;
|
||
|
class TestResult;
|
||
|
|
||
|
|
||
|
class CPPUNIT_API Functor
|
||
|
{
|
||
|
public:
|
||
|
virtual ~Functor();
|
||
|
|
||
|
virtual bool operator()() const =0;
|
||
|
};
|
||
|
|
||
|
|
||
|
/*! \brief Protects one or more test case run.
|
||
|
*
|
||
|
* Protector are used to globably 'decorate' a test case. The most common
|
||
|
* usage of Protector is to catch exception that do not subclass std::exception,
|
||
|
* such as MFC CException class or Rogue Wave RWXMsg class, and capture the
|
||
|
* message associated to the exception. In fact, CppUnit capture message from
|
||
|
* Exception and std::exception using a Protector.
|
||
|
*
|
||
|
* Protector are chained. When you add a Protector using
|
||
|
* TestResult::pushProtector(), your protector is in fact passed as a Functor
|
||
|
* to the first protector of the chain.
|
||
|
*
|
||
|
* TestCase protects call to setUp(), runTest() and tearDown() by calling
|
||
|
* TestResult::protect().
|
||
|
*
|
||
|
* Because the protector chain is handled by TestResult, a protector can be
|
||
|
* active for a single test, or a complete test run.
|
||
|
*
|
||
|
* Here are some possible usages:
|
||
|
* - run all test case in a separate thread and assumes the test failed if it
|
||
|
* did not finish in a given time (infinite loop work around)
|
||
|
* - performance tracing : time only the runTest() time.
|
||
|
* \sa TestResult, TestCase, TestListener.
|
||
|
*/
|
||
|
class CPPUNIT_API Protector
|
||
|
{
|
||
|
public:
|
||
|
virtual ~Protector();
|
||
|
|
||
|
virtual bool protect( const Functor &functor,
|
||
|
const ProtectorContext &context ) =0;
|
||
|
|
||
|
protected:
|
||
|
void reportError( const ProtectorContext &context,
|
||
|
const Exception &error ) const;
|
||
|
|
||
|
void reportError( const ProtectorContext &context,
|
||
|
const Message &message,
|
||
|
const SourceLine &sourceLine = SourceLine() ) const;
|
||
|
|
||
|
void reportFailure( const ProtectorContext &context,
|
||
|
const Exception &failure ) const;
|
||
|
|
||
|
Message actualMessage( const Message &message,
|
||
|
const ProtectorContext &context ) const;
|
||
|
};
|
||
|
|
||
|
|
||
|
/*! \brief Scoped protector push to TestResult.
|
||
|
*
|
||
|
* Adds the specified Protector to the specified TestResult for the object
|
||
|
* life-time.
|
||
|
*/
|
||
|
class CPPUNIT_API ProtectorGuard
|
||
|
{
|
||
|
public:
|
||
|
/// Pushes the specified protector.
|
||
|
ProtectorGuard( TestResult *result,
|
||
|
Protector *protector );
|
||
|
|
||
|
/// Pops the protector.
|
||
|
~ProtectorGuard();
|
||
|
|
||
|
private:
|
||
|
TestResult *m_result;
|
||
|
};
|
||
|
|
||
|
CPPUNIT_NS_END
|
||
|
|
||
|
|
||
|
#endif // CPPUNIT_PROTECTOR_H
|
||
|
|