boost/test/test_case_template.hpp
// (C) Copyright Gennadiy Rozental 2003.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/libs/test for the library home page.
//
// File : $RCSfile: test_case_template.hpp,v $
//
// Version : $Revision: 1.8 $
//
// Description : implements support for test cases templates instantiated with
// sequence of test types
// ***************************************************************************
#ifndef BOOST_TEST_CASE_TEMPLATE_HPP_071894GER
#define BOOST_TEST_CASE_TEMPLATE_HPP_071894GER
// Boost.Test
#include <boost/test/unit_test_suite.hpp>
// Boost
#include "boost/mpl/size.hpp"
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/identity.hpp>
//____________________________________________________________________________//
#define BOOST_META_FUNC_TEST_CASE( the_function ) \
struct meta_ ## the_function { \
template<typename T> \
static void execute( T* = 0 ) \
{ \
the_function<T>(); \
} \
} \
/**/
#define BOOST_FUNC_TEMPLATE_TEST_CASE( the_function, typelist ) \
boost::unit_test::create_test_case_template( meta_ ## the_function(), typelist(), #the_function )
namespace boost {
namespace unit_test {
namespace ut_detail {
// ************************************************************************** //
// ************** test_case_template_instance ************** //
// ************************************************************************** //
// Generate test case by supplied test case template and test type
template<typename TestCaseTemplate,typename TestType>
class test_case_template_instance : public test_case {
typedef TestType* test_type_ptr;
public:
explicit test_case_template_instance( const_string template_name_ )
: test_case( template_name_, true, 1 ) {}
protected:
// test case implementation
void do_run() { TestCaseTemplate::execute( test_type_ptr() ); }
};
//____________________________________________________________________________//
// ************************************************************************** //
// ************** test_case_instance_runner ************** //
// ************************************************************************** //
// Instantiate generated test case and run it.
template<typename TestCaseTemplate>
struct test_case_instance_runner {
explicit test_case_instance_runner( const_string template_name_ )
: m_template_name( template_name_ ) {}
template<typename TestType>
void operator()( ::boost::mpl::identity<TestType> )
{
test_case_template_instance<TestCaseTemplate,TestType> the_instance( m_template_name ); //!! could this throw?
the_instance.run();
}
const_string m_template_name;
};
} // namespace ut_detail
// ************************************************************************** //
// ************** test_case_template ************** //
// ************************************************************************** //
template<typename TestCaseTemplate,typename TestTypesList>
class test_case_template : public test_case {
public:
// Constructor
explicit test_case_template( const_string name_ )
: test_case( name_, false, 1, false ), m_template_holder( p_name.get() ) {}
// access methods
unit_test_counter size() const { return ::boost::mpl::size<TestTypesList>::value; }
protected:
// test case implementation
void do_run()
{
::boost::mpl::for_each<TestTypesList,mpl::make_identity<boost::mpl::_> >( m_template_holder );
}
// Data members
ut_detail::test_case_instance_runner<TestCaseTemplate> m_template_holder; // need instance to match for_each interface
};
//____________________________________________________________________________//
// ************************************************************************** //
// ************** object generators ************** //
// ************************************************************************** //
template<typename TestCaseTemplate, typename TestTypesList>
inline test_case*
create_test_case_template( TestCaseTemplate, TestTypesList, std::string name_ )
{
return new test_case_template<TestCaseTemplate,TestTypesList>( ut_detail::normalize_test_case_name( name_ ) );
}
//____________________________________________________________________________//
} // unit_test
} // namespace boost
// ***************************************************************************
// Revision History :
//
// $Log: test_case_template.hpp,v $
// Revision 1.8 2004/07/19 12:14:34 rogeeff
// guard rename
//
// Revision 1.7 2004/06/07 07:33:49 rogeeff
// detail namespace renamed
//
// Revision 1.6 2004/05/21 06:19:35 rogeeff
// licence update
//
// Revision 1.5 2004/05/11 11:00:35 rogeeff
// basic_cstring introduced and used everywhere
// class properties reworked
//
// Revision 1.4 2003/12/01 00:41:56 rogeeff
// prerelease cleaning
//
// ***************************************************************************
#endif // BOOST_TEST_CASE_TEMPLATE_HPP_071894GER