CppUnit project page FAQ CppUnit home page

Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members | Related Pages

TestCaller.h

Go to the documentation of this file.
00001 #ifndef CPPUNIT_TESTCALLER_H    // -*- C++ -*-
00002 #define CPPUNIT_TESTCALLER_H
00003 
00004 #include <cppunit/Exception.h>
00005 #include <cppunit/TestCase.h>
00006 
00007 
00008 #if CPPUNIT_USE_TYPEINFO_NAME
00009 #  include <cppunit/extensions/TypeInfoHelper.h>
00010 #endif
00011 
00012 
00013 namespace CppUnit {
00014 
00018 class CPPUNIT_API NoExceptionExpected
00019 {
00020 private:
00022   NoExceptionExpected();
00023 };
00024 
00025 
00030 template<typename ExceptionType>
00031 struct ExpectedExceptionTraits
00032 {
00033   static void expectedException()
00034   {
00035 #if CPPUNIT_USE_TYPEINFO_NAME
00036           std::string message( "Expected exception of type " );
00037           message += TypeInfoHelper::getClassName( typeid( ExceptionType ) );
00038           message += ", but got none";
00039 #else
00040     std::string message( "Expected exception but got none" );
00041 #endif
00042           throw Exception( message );
00043   }
00044 };
00045 
00046 
00052 template<>
00053 struct ExpectedExceptionTraits<NoExceptionExpected>
00054 {
00055   static void expectedException()
00056   {
00057   }
00058 };
00059 
00060 
00061 
00062 //*** FIXME: rework this when class Fixture is implemented. ***//
00063 
00064 
00101 template <typename Fixture,  
00102           typename ExpectedException = NoExceptionExpected>
00103 class TestCaller : public TestCase
00104 { 
00105   typedef void (Fixture::*TestMethod)();
00106     
00107 public:
00114   TestCaller( std::string name, TestMethod test ) :
00115             TestCase( name ), 
00116             m_ownFixture( true ),
00117             m_fixture( new Fixture() ),
00118             m_test( test )
00119   {
00120   }
00121 
00131   TestCaller(std::string name, TestMethod test, Fixture& fixture) :
00132             TestCase( name ), 
00133             m_ownFixture( false ),
00134             m_fixture( &fixture ),
00135             m_test( test )
00136   {
00137   }
00138     
00148   TestCaller(std::string name, TestMethod test, Fixture* fixture) :
00149             TestCase( name ), 
00150             m_ownFixture( true ),
00151             m_fixture( fixture ),
00152             m_test( test )
00153   {
00154   }
00155     
00156   ~TestCaller() 
00157   {
00158     if (m_ownFixture)
00159       delete m_fixture;
00160   }
00161 
00162 protected:
00163   void runTest()
00164   { 
00165           try {
00166             (m_fixture->*m_test)();
00167           }
00168           catch ( ExpectedException & ) {
00169             return;
00170           }
00171 
00172         ExpectedExceptionTraits<ExpectedException>::expectedException();
00173   }  
00174 
00175   void setUp()
00176   { 
00177         m_fixture->setUp (); 
00178   }
00179 
00180   void tearDown()
00181   { 
00182           m_fixture->tearDown (); 
00183   }
00184 
00185   std::string toString() const
00186   { 
00187         return "TestCaller " + getName(); 
00188   }
00189 
00190 private: 
00191   TestCaller( const TestCaller &other ); 
00192   TestCaller &operator =( const TestCaller &other );
00193 
00194 private:
00195   bool m_ownFixture;
00196   Fixture *m_fixture;
00197   TestMethod m_test;
00198 };
00199 
00200 
00201 
00202 } // namespace CppUnit
00203 
00204 #endif // CPPUNIT_TESTCALLER_H

SourceForge Logo hosts this site. Send comments to:
CppUnit Developers