142 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			142 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  (C) Copyright Gennadiy Rozental 2001. | ||
|  | //  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 | ||
|  | /// Defines template_test_case_gen | ||
|  | // *************************************************************************** | ||
|  | 
 | ||
|  | #ifndef BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER | ||
|  | #define BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER | ||
|  | 
 | ||
|  | // Boost.Test | ||
|  | #include <boost/test/detail/config.hpp> | ||
|  | #include <boost/test/detail/global_typedef.hpp> | ||
|  | #include <boost/test/detail/fwd_decl.hpp> | ||
|  | #include <boost/test/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #include <boost/test/utils/class_properties.hpp> | ||
|  | 
 | ||
|  | #include <boost/test/tree/observer.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | // Boost | ||
|  | #include <boost/shared_ptr.hpp> | ||
|  | #include <boost/mpl/for_each.hpp> | ||
|  | #include <boost/mpl/identity.hpp> | ||
|  | #include <boost/type.hpp> | ||
|  | #include <boost/type_traits/is_const.hpp> | ||
|  | #include <boost/function/function0.hpp> | ||
|  | 
 | ||
|  | #if defined(BOOST_NO_TYPEID) || defined(BOOST_NO_RTTI) | ||
|  | #  include <boost/current_function.hpp> | ||
|  | #else | ||
|  | #  include <boost/core/demangle.hpp> | ||
|  | #endif | ||
|  | 
 | ||
|  | // STL | ||
|  | #include <string>   // for std::string | ||
|  | #include <list>     // for std::list | ||
|  | 
 | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace unit_test { | ||
|  | namespace ut_detail { | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************          test_case_template_invoker          ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | template<typename TestCaseTemplate,typename TestType> | ||
|  | class test_case_template_invoker { | ||
|  | public: | ||
|  |     void    operator()()    { TestCaseTemplate::run( (boost::type<TestType>*)0 ); } | ||
|  | }; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************           generate_test_case_4_type          ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | template<typename Generator,typename TestCaseTemplate> | ||
|  | struct generate_test_case_4_type { | ||
|  |     explicit    generate_test_case_4_type( const_string tc_name, const_string tc_file, std::size_t tc_line, Generator& G ) | ||
|  |     : m_test_case_name( tc_name ) | ||
|  |     , m_test_case_file( tc_file ) | ||
|  |     , m_test_case_line( tc_line ) | ||
|  |     , m_holder( G ) | ||
|  |     {} | ||
|  | 
 | ||
|  |     template<typename TestType> | ||
|  |     void        operator()( mpl::identity<TestType> ) | ||
|  |     { | ||
|  |         std::string full_name; | ||
|  |         assign_op( full_name, m_test_case_name, 0 ); | ||
|  |         full_name += '<'; | ||
|  | #if !defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI) | ||
|  |         full_name += boost::core::demangle(typeid(TestType).name()); // same as execution_monitor.ipp | ||
|  | #else | ||
|  |         full_name += BOOST_CURRENT_FUNCTION; | ||
|  | #endif | ||
|  |         if( boost::is_const<TestType>::value ) | ||
|  |             full_name += "_const"; | ||
|  |         full_name += '>'; | ||
|  | 
 | ||
|  |         m_holder.m_test_cases.push_back( new test_case( ut_detail::normalize_test_case_name( full_name ), | ||
|  |                                                         m_test_case_file, | ||
|  |                                                         m_test_case_line, | ||
|  |                                                         test_case_template_invoker<TestCaseTemplate,TestType>() ) ); | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     // Data members | ||
|  |     const_string    m_test_case_name; | ||
|  |     const_string    m_test_case_file; | ||
|  |     std::size_t     m_test_case_line; | ||
|  |     Generator&      m_holder; | ||
|  | }; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************              test_case_template              ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | template<typename TestCaseTemplate,typename TestTypesList> | ||
|  | class template_test_case_gen : public test_unit_generator { | ||
|  | public: | ||
|  |     // Constructor | ||
|  |     template_test_case_gen( const_string tc_name, const_string tc_file, std::size_t tc_line ) | ||
|  |     { | ||
|  |         typedef generate_test_case_4_type<template_test_case_gen<TestCaseTemplate,TestTypesList>,TestCaseTemplate> single_test_gen; | ||
|  | 
 | ||
|  |         mpl::for_each<TestTypesList,mpl::make_identity<mpl::_> >( single_test_gen( tc_name, tc_file, tc_line, *this ) ); | ||
|  |     } | ||
|  | 
 | ||
|  |     virtual test_unit* next() const | ||
|  |     { | ||
|  |         if( m_test_cases.empty() ) | ||
|  |             return 0; | ||
|  | 
 | ||
|  |         test_unit* res = m_test_cases.front(); | ||
|  |         m_test_cases.pop_front(); | ||
|  | 
 | ||
|  |         return res; | ||
|  |     } | ||
|  | 
 | ||
|  |     // Data members | ||
|  |     mutable std::list<test_unit*> m_test_cases; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace ut_detail | ||
|  | } // unit_test | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | 
 | ||
|  | #endif // BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER |