]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright Gennadiy Rozental 2001. |
2 | // Distributed under the Boost Software License, Version 1.0. | |
3 | // (See accompanying file LICENSE_1_0.txt or copy at | |
4 | // http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | // See http://www.boost.org/libs/test for the library home page. | |
7 | // | |
8 | // File : $RCSfile$ | |
9 | // | |
10 | // Version : $Revision: -1 $ | |
11 | // | |
12 | // Description : defines template_test_case_gen | |
13 | // *************************************************************************** | |
14 | ||
15 | #ifndef BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER | |
16 | #define BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER | |
17 | ||
18 | // Boost.Test | |
19 | #include <boost/test/detail/config.hpp> | |
20 | #include <boost/test/detail/global_typedef.hpp> | |
21 | #include <boost/test/detail/fwd_decl.hpp> | |
22 | #include <boost/test/detail/workaround.hpp> | |
23 | ||
24 | #include <boost/test/utils/class_properties.hpp> | |
25 | ||
26 | #include <boost/test/tree/observer.hpp> | |
27 | ||
28 | ||
29 | // Boost | |
30 | #include <boost/shared_ptr.hpp> | |
31 | #include <boost/mpl/for_each.hpp> | |
32 | #include <boost/mpl/identity.hpp> | |
33 | #include <boost/type.hpp> | |
34 | #include <boost/type_traits/is_const.hpp> | |
35 | #include <boost/function/function0.hpp> | |
36 | ||
37 | #ifndef BOOST_NO_RTTI | |
38 | #include <typeinfo> // for typeid | |
39 | #else | |
40 | #include <boost/current_function.hpp> | |
41 | #endif | |
42 | ||
43 | // STL | |
44 | #include <string> // for std::string | |
45 | #include <list> // for std::list | |
46 | ||
47 | #include <boost/test/detail/suppress_warnings.hpp> | |
48 | ||
49 | ||
50 | //____________________________________________________________________________// | |
51 | ||
52 | namespace boost { | |
53 | namespace unit_test { | |
54 | namespace ut_detail { | |
55 | ||
56 | // ************************************************************************** // | |
57 | // ************** test_case_template_invoker ************** // | |
58 | // ************************************************************************** // | |
59 | ||
60 | template<typename TestCaseTemplate,typename TestType> | |
61 | class test_case_template_invoker { | |
62 | public: | |
63 | void operator()() { TestCaseTemplate::run( (boost::type<TestType>*)0 ); } | |
64 | }; | |
65 | ||
66 | // ************************************************************************** // | |
67 | // ************** generate_test_case_4_type ************** // | |
68 | // ************************************************************************** // | |
69 | ||
70 | template<typename Generator,typename TestCaseTemplate> | |
71 | struct generate_test_case_4_type { | |
72 | explicit generate_test_case_4_type( const_string tc_name, const_string tc_file, std::size_t tc_line, Generator& G ) | |
73 | : m_test_case_name( tc_name ) | |
74 | , m_test_case_file( tc_file ) | |
75 | , m_test_case_line( tc_line ) | |
76 | , m_holder( G ) | |
77 | {} | |
78 | ||
79 | template<typename TestType> | |
80 | void operator()( mpl::identity<TestType> ) | |
81 | { | |
82 | std::string full_name; | |
83 | assign_op( full_name, m_test_case_name, 0 ); | |
84 | full_name += '<'; | |
85 | #ifndef BOOST_NO_RTTI | |
86 | full_name += typeid(TestType).name(); | |
87 | #else | |
88 | full_name += BOOST_CURRENT_FUNCTION; | |
89 | #endif | |
90 | if( boost::is_const<TestType>::value ) | |
91 | full_name += "_const"; | |
92 | full_name += '>'; | |
93 | ||
94 | m_holder.m_test_cases.push_back( new test_case( ut_detail::normalize_test_case_name( full_name ), | |
95 | m_test_case_file, | |
96 | m_test_case_line, | |
97 | test_case_template_invoker<TestCaseTemplate,TestType>() ) ); | |
98 | } | |
99 | ||
100 | private: | |
101 | // Data members | |
102 | const_string m_test_case_name; | |
103 | const_string m_test_case_file; | |
104 | std::size_t m_test_case_line; | |
105 | Generator& m_holder; | |
106 | }; | |
107 | ||
108 | // ************************************************************************** // | |
109 | // ************** test_case_template ************** // | |
110 | // ************************************************************************** // | |
111 | ||
112 | template<typename TestCaseTemplate,typename TestTypesList> | |
113 | class template_test_case_gen : public test_unit_generator { | |
114 | public: | |
115 | // Constructor | |
116 | template_test_case_gen( const_string tc_name, const_string tc_file, std::size_t tc_line ) | |
117 | { | |
118 | typedef generate_test_case_4_type<template_test_case_gen<TestCaseTemplate,TestTypesList>,TestCaseTemplate> single_test_gen; | |
119 | ||
120 | mpl::for_each<TestTypesList,mpl::make_identity<mpl::_> >( single_test_gen( tc_name, tc_file, tc_line, *this ) ); | |
121 | } | |
122 | ||
123 | virtual test_unit* next() const | |
124 | { | |
125 | if( m_test_cases.empty() ) | |
126 | return 0; | |
127 | ||
128 | test_unit* res = m_test_cases.front(); | |
129 | m_test_cases.pop_front(); | |
130 | ||
131 | return res; | |
132 | } | |
133 | ||
134 | // Data members | |
135 | mutable std::list<test_unit*> m_test_cases; | |
136 | }; | |
137 | ||
138 | } // namespace ut_detail | |
139 | } // unit_test | |
140 | } // namespace boost | |
141 | ||
142 | #include <boost/test/detail/enable_warnings.hpp> | |
143 | ||
144 | #endif // BOOST_TEST_TREE_TEST_CASE_TEMPLATE_HPP_091911GER |