00001 #ifndef CPPUNIT_EXTENSIONS_TESTSUITEBUILDER_H
00002 #define CPPUNIT_EXTENSIONS_TESTSUITEBUILDER_H
00003
00004 #include <cppunit/Portability.h>
00005 #include <memory>
00006 #include <cppunit/TestSuite.h>
00007 #include <cppunit/TestCaller.h>
00008
00009 #if CPPUNIT_USE_TYPEINFO_NAME
00010 # include <cppunit/extensions/TypeInfoHelper.h>
00011 #endif
00012
00013 namespace CppUnit {
00014
00023 template<typename Fixture>
00024 class TestSuiteBuilder
00025 {
00026 public:
00027 typedef void (Fixture::*TestMethod)();
00028
00029 #if CPPUNIT_USE_TYPEINFO_NAME
00030 TestSuiteBuilder() :
00031 m_suite( new TestSuite(
00032 TypeInfoHelper::getClassName( typeid(Fixture) ) ) )
00033 {
00034 }
00035 #endif
00036
00037 TestSuiteBuilder( TestSuite *suite ) : m_suite( suite )
00038 {
00039 }
00040
00041 TestSuiteBuilder(std::string name) : m_suite( new TestSuite(name) )
00042 {
00043 }
00044
00045 TestSuite *suite() const
00046 {
00047 return m_suite.get();
00048 }
00049
00050 TestSuite *takeSuite()
00051 {
00052 return m_suite.release();
00053 }
00054
00055 void addTest( Test *test )
00056 {
00057 m_suite->addTest( test );
00058 }
00059
00060 void addTestCaller( std::string methodName,
00061 TestMethod testMethod )
00062 {
00063 Test *test =
00064 new TestCaller<Fixture>( makeTestName( methodName ),
00065 testMethod );
00066 addTest( test );
00067 }
00068
00069 void addTestCaller( std::string methodName,
00070 TestMethod testMethod,
00071 Fixture *fixture )
00072 {
00073 Test *test =
00074 new TestCaller<Fixture>( makeTestName( methodName ),
00075 testMethod,
00076 fixture);
00077 addTest( test );
00078 }
00079
00080 template<typename ExceptionType>
00081 void addTestCallerForException( std::string methodName,
00082 TestMethod testMethod,
00083 Fixture *fixture,
00084 ExceptionType *dummyPointer )
00085 {
00086 Test *test = new TestCaller<Fixture,ExceptionType>(
00087 makeTestName( methodName ),
00088 testMethod,
00089 fixture);
00090 addTest( test );
00091 }
00092
00093
00094 std::string makeTestName( const std::string &methodName )
00095 {
00096 return m_suite->getName() + "." + methodName;
00097 }
00098
00099 private:
00100 std::auto_ptr<TestSuite> m_suite;
00101 };
00102
00103 }
00104
00105 #endif // CPPUNIT_EXTENSIONS_TESTSUITEBUILDER_H