Blame include/cppunit/TestCaller.h

Packit Service e31359
#ifndef CPPUNIT_TESTCALLER_H    // -*- C++ -*-
Packit Service e31359
#define CPPUNIT_TESTCALLER_H
Packit Service e31359
Packit Service e31359
#include <cppunit/Exception.h>
Packit Service e31359
#include <cppunit/TestCase.h>
Packit Service e31359
Packit Service e31359
#include <functional>
Packit Service e31359
Packit Service e31359
Packit Service e31359
#if defined(CPPUNIT_USE_TYPEINFO_NAME)
Packit Service e31359
#  include <cppunit/extensions/TypeInfoHelper.h>
Packit Service e31359
#endif
Packit Service e31359
Packit Service e31359
Packit Service e31359
CPPUNIT_NS_BEGIN
Packit Service e31359
Packit Service e31359
#if 0
Packit Service e31359
/*! \brief Marker class indicating that no exception is expected by TestCaller.
Packit Service e31359
 * This class is an implementation detail. You should never use this class directly.
Packit Service e31359
 */
Packit Service e31359
class CPPUNIT_API NoExceptionExpected
Packit Service e31359
{
Packit Service e31359
private:
Packit Service e31359
  //! Prevent class instantiation.
Packit Service e31359
  NoExceptionExpected();
Packit Service e31359
};
Packit Service e31359
Packit Service e31359
Packit Service e31359
/*! \brief (Implementation) Traits used by TestCaller to expect an exception.
Packit Service e31359
 *
Packit Service e31359
 * This class is an implementation detail. You should never use this class directly.
Packit Service e31359
 */
Packit Service e31359
template<class ExceptionType>
Packit Service e31359
struct ExpectedExceptionTraits
Packit Service e31359
{
Packit Service e31359
  static void expectedException()
Packit Service e31359
  {
Packit Service e31359
#if defined(CPPUNIT_USE_TYPEINFO_NAME)
Packit Service e31359
    throw Exception( Message(
Packit Service e31359
                         "expected exception not thrown",
Packit Service e31359
                         "Expected exception type: " + 
Packit Service e31359
                           TypeInfoHelper::getClassName( typeid( ExceptionType ) ) ) );
Packit Service e31359
#else
Packit Service e31359
    throw Exception( "expected exception not thrown" );
Packit Service e31359
#endif
Packit Service e31359
  }
Packit Service e31359
};
Packit Service e31359
Packit Service e31359
Packit Service e31359
/*! \brief (Implementation) Traits specialization used by TestCaller to 
Packit Service e31359
 * expect no exception.
Packit Service e31359
 *
Packit Service e31359
 * This class is an implementation detail. You should never use this class directly.
Packit Service e31359
 */
Packit Service e31359
template<>
Packit Service e31359
struct ExpectedExceptionTraits<NoExceptionExpected>
Packit Service e31359
{
Packit Service e31359
  static void expectedException()
Packit Service e31359
  {
Packit Service e31359
  }
Packit Service e31359
};
Packit Service e31359
Packit Service e31359
Packit Service e31359
#endif
Packit Service e31359
Packit Service e31359
//*** FIXME: rework this when class Fixture is implemented. ***//
Packit Service e31359
Packit Service e31359
Packit Service e31359
/*! \brief Generate a test case from a fixture method.
Packit Service e31359
 * \ingroup WritingTestFixture
Packit Service e31359
 *
Packit Service e31359
 * A test caller provides access to a test case method 
Packit Service e31359
 * on a test fixture class.  Test callers are useful when 
Packit Service e31359
 * you want to run an individual test or add it to a 
Packit Service e31359
 * suite.
Packit Service e31359
 * Test Callers invoke only one Test (i.e. test method) on one 
Packit Service e31359
 * Fixture of a TestFixture.
Packit Service e31359
 * 
Packit Service e31359
 * Here is an example:
Packit Service e31359
 * \code
Packit Service e31359
 * class MathTest : public CppUnit::TestFixture {
Packit Service e31359
 *         ...
Packit Service e31359
 *     public:
Packit Service e31359
 *         void         setUp();
Packit Service e31359
 *         void         tearDown();
Packit Service e31359
 *
Packit Service e31359
 *         void         testAdd();
Packit Service e31359
 *         void         testSubtract();
Packit Service e31359
 * };
Packit Service e31359
 *
Packit Service e31359
 * CppUnit::Test *MathTest::suite() {
Packit Service e31359
 *     CppUnit::TestSuite *suite = new CppUnit::TestSuite;
Packit Service e31359
 *
Packit Service e31359
 *     suite->addTest( new CppUnit::TestCaller<MathTest>( "testAdd", testAdd ) );
Packit Service e31359
 *     return suite;
Packit Service e31359
 * }
Packit Service e31359
 * \endcode
Packit Service e31359
 *
Packit Service e31359
 * You can use a TestCaller to bind any test method on a TestFixture
Packit Service e31359
 * class, as long as it accepts void and returns void.
Packit Service e31359
 * 
Packit Service e31359
 * \see TestCase
Packit Service e31359
 */
Packit Service e31359
Packit Service e31359
template <class Fixture>
Packit Service e31359
class TestCaller : public TestCase
Packit Service e31359
{ 
Packit Service e31359
  typedef void (Fixture::*TestMethod)();
Packit Service e31359
    
Packit Service e31359
public:
Packit Service e31359
  /*!
Packit Service e31359
   * Constructor for TestCaller. This constructor builds a new Fixture
Packit Service e31359
   * instance owned by the TestCaller.
Packit Service e31359
   * \param name name of this TestCaller
Packit Service e31359
   * \param test the method this TestCaller calls in runTest()
Packit Service e31359
   */
Packit Service e31359
  TestCaller( std::string name, TestMethod test ) :
Packit Service e31359
	    TestCase( name ), 
Packit Service e31359
	    m_ownFixture( true ),
Packit Service e31359
	    m_fixture( new Fixture() ),
Packit Service e31359
	    m_test_function( std::bind(test, m_fixture) )
Packit Service e31359
  {
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
  /*!
Packit Service e31359
   * Constructor for TestCaller. 
Packit Service e31359
   * This constructor does not create a new Fixture instance but accepts
Packit Service e31359
   * an existing one as parameter. The TestCaller will not own the
Packit Service e31359
   * Fixture object.
Packit Service e31359
   * \param name name of this TestCaller
Packit Service e31359
   * \param test the method this TestCaller calls in runTest()
Packit Service e31359
   * \param fixture the Fixture to invoke the test method on.
Packit Service e31359
   */
Packit Service e31359
  TestCaller(std::string name, TestMethod test, Fixture& fixture) :
Packit Service e31359
	    TestCase( name ), 
Packit Service e31359
	    m_ownFixture( false ),
Packit Service e31359
	    m_fixture( &fixture ),
Packit Service e31359
	    m_test_function( std::bind(test, &fixture) )
Packit Service e31359
  {
Packit Service e31359
  }
Packit Service e31359
    
Packit Service e31359
  /*!
Packit Service e31359
   * Constructor for TestCaller. 
Packit Service e31359
   * This constructor does not create a new Fixture instance but accepts
Packit Service e31359
   * an existing one as parameter. The TestCaller will own the
Packit Service e31359
   * Fixture object and delete it in its destructor.
Packit Service e31359
   * \param name name of this TestCaller
Packit Service e31359
   * \param test the method this TestCaller calls in runTest()
Packit Service e31359
   * \param fixture the Fixture to invoke the test method on.
Packit Service e31359
   */
Packit Service e31359
  TestCaller(std::string name, TestMethod test, Fixture* fixture) :
Packit Service e31359
	    TestCase( name ), 
Packit Service e31359
	    m_ownFixture( true ),
Packit Service e31359
	    m_fixture( fixture ),
Packit Service e31359
	    m_test_function( std::bind(test, fixture) )
Packit Service e31359
  {
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
  TestCaller(std::string name, std::function<void()> test_function, Fixture* fixture):
Packit Service e31359
      TestCase(name),
Packit Service e31359
      m_ownFixture(true),
Packit Service e31359
      m_fixture(fixture),
Packit Service e31359
      m_test_function(test_function)
Packit Service e31359
    {
Packit Service e31359
    }
Packit Service e31359
    
Packit Service e31359
  ~TestCaller() 
Packit Service e31359
  {
Packit Service e31359
    if (m_ownFixture)
Packit Service e31359
      delete m_fixture;
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
  void runTest()
Packit Service e31359
  { 
Packit Service e31359
      m_test_function();
Packit Service e31359
  }  
Packit Service e31359
Packit Service e31359
  void setUp()
Packit Service e31359
  { 
Packit Service e31359
  	m_fixture->setUp (); 
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
  void tearDown()
Packit Service e31359
  { 
Packit Service e31359
	  m_fixture->tearDown (); 
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
  std::string toString() const
Packit Service e31359
  { 
Packit Service e31359
  	return "TestCaller " + getName(); 
Packit Service e31359
  }
Packit Service e31359
Packit Service e31359
private: 
Packit Service e31359
  TestCaller( const TestCaller &other ); 
Packit Service e31359
  TestCaller &operator =( const TestCaller &other );
Packit Service e31359
Packit Service e31359
private:
Packit Service e31359
  bool m_ownFixture;
Packit Service e31359
  Fixture *m_fixture;
Packit Service e31359
  std::function<void()> m_test_function;
Packit Service e31359
};
Packit Service e31359
Packit Service e31359
Packit Service e31359
Packit Service e31359
CPPUNIT_NS_END
Packit Service e31359
Packit Service e31359
#endif // CPPUNIT_TESTCALLER_H