1 // (C) Copyright Gennadiy Rozental 2001-2005.
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: auto_unit_test.hpp,v $
9 //
10 // Version : $Revision: 1.1.1.1 $
11 //
12 // Description : support for automated test cases registration mechanism
13 // for simple function based test cases
14 // ***************************************************************************
15
16 #ifndef BOOST_TEST_AUTO_UNIT_TEST_HPP_071894GER
17 #define BOOST_TEST_AUTO_UNIT_TEST_HPP_071894GER
18
19 // Boost.Test
20 #include <boost/test/unit_test.hpp>
21
22 #include <boost/test/detail/suppress_warnings.hpp>
23
24 // STL
25 #include <list>
26
27 //____________________________________________________________________________//
28
29 // ************************************************************************** //
30 // ************** auto_test_unit_registrar ************** //
31 // ************************************************************************** //
32
33 namespace boost {
34 namespace unit_test {
35
36 struct auto_unit_test_suite_t : test_suite {
auto_unit_test_suite_tboost::unit_test::auto_unit_test_suite_t37 auto_unit_test_suite_t()
38 : test_suite( "Master Test Suite" )
39 , argc( 0 )
40 , argv( 0 )
41 {}
42
43 // Data members
44 int argc;
45 char** argv;
46 };
47
48 //____________________________________________________________________________//
49
50 inline auto_unit_test_suite_t*
auto_unit_test_suite()51 auto_unit_test_suite()
52 {
53 static auto_unit_test_suite_t* inst = new auto_unit_test_suite_t;
54
55 return inst;
56 }
57
58 //____________________________________________________________________________//
59
60 namespace ut_detail {
61
62 struct auto_test_unit_registrar
63 {
64 // Constructor
auto_test_unit_registrarboost::unit_test::ut_detail::auto_test_unit_registrar65 explicit auto_test_unit_registrar( test_case* tc, counter_t exp_fail )
66 {
67 curr_ts_store().back()->add( tc, exp_fail );
68 }
auto_test_unit_registrarboost::unit_test::ut_detail::auto_test_unit_registrar69 explicit auto_test_unit_registrar( test_suite* ts )
70 {
71 curr_ts_store().back()->add( ts );
72
73 curr_ts_store().push_back( ts );
74 }
auto_test_unit_registrarboost::unit_test::ut_detail::auto_test_unit_registrar75 explicit auto_test_unit_registrar( test_unit_generator const& tc_gen )
76 {
77 curr_ts_store().back()->add( tc_gen );
78 }
auto_test_unit_registrarboost::unit_test::ut_detail::auto_test_unit_registrar79 explicit auto_test_unit_registrar( int )
80 {
81 if( curr_ts_store().size() > 1 )
82 curr_ts_store().pop_back();
83 // else report error
84 }
85
86 private:
curr_ts_storeboost::unit_test::ut_detail::auto_test_unit_registrar87 static std::list<test_suite*>& curr_ts_store()
88 {
89 static std::list<test_suite*> inst( 1, auto_unit_test_suite() );
90 return inst;
91 }
92 };
93
94 //____________________________________________________________________________//
95
96 template<typename T>
97 struct auto_tc_exp_fail {
98 enum { value = 0 };
99 };
100
101 } // namespace ut_detail
102
103 } // namespace unit_test
104 } // namespace boost
105
106 #define BOOST_AUTO_TC_REGISTRAR( test_name ) \
107 static boost::unit_test::ut_detail::auto_test_unit_registrar BOOST_JOIN( test_name, _registrar )
108 #define BOOST_AUTO_TC_INVOKER( test_name ) BOOST_JOIN( test_name, _invoker )
109 #define BOOST_AUTO_TC_UNIQUE_ID( test_name ) BOOST_JOIN( test_name, _id )
110
111 // ************************************************************************** //
112 // ************** BOOST_AUTO_TEST_SUITE ************** //
113 // ************************************************************************** //
114
115 #define BOOST_AUTO_TEST_SUITE( suite_name ) \
116 BOOST_AUTO_TC_REGISTRAR( suite_name )( BOOST_TEST_SUITE( \
117 BOOST_STRINGIZE( suite_name ) ) ) \
118 /**/
119
120 // ************************************************************************** //
121 // ************** BOOST_AUTO_TEST_SUITE_END ************** //
122 // ************************************************************************** //
123
124 #define BOOST_AUTO_TEST_SUITE_END() \
125 BOOST_AUTO_TC_REGISTRAR( BOOST_JOIN( end_suite, __LINE__ ) )( 1 ) \
126 /**/
127
128 // ************************************************************************** //
129 // ************** BOOST_AUTO_TEST_CASE ************** //
130 // ************************************************************************** //
131
132 #define BOOST_AUTO_TEST_CASE( test_name ) \
133 struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; \
134 \
135 static void test_name(); \
136 BOOST_AUTO_TC_REGISTRAR( test_name )( BOOST_TEST_CASE( test_name ), \
137 boost::unit_test::ut_detail::auto_tc_exp_fail< \
138 BOOST_AUTO_TC_UNIQUE_ID( test_name )>::value ); \
139 static void test_name() \
140 /**/
141
142 // ************************************************************************** //
143 // ************** BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES ************** //
144 // ************************************************************************** //
145
146 #define BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( test_name, n ) \
147 struct BOOST_AUTO_TC_UNIQUE_ID( test_name ); \
148 namespace boost { namespace unit_test { namespace ut_detail { \
149 \
150 template<> \
151 struct auto_tc_exp_fail<BOOST_AUTO_TC_UNIQUE_ID( test_name ) > { \
152 enum { value = n }; \
153 }; \
154 \
155 }}} \
156 /**/
157
158 // ************************************************************************** //
159 // ************** BOOST_FIXTURE_TEST_CASE ************** //
160 // ************************************************************************** //
161
162 #define BOOST_FIXTURE_TEST_CASE( test_name, F ) \
163 struct test_name : public F { void test_method(); }; \
164 \
165 void BOOST_AUTO_TC_INVOKER( test_name )() \
166 { \
167 test_name t; \
168 t.test_method(); \
169 } \
170 \
171 struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; \
172 \
173 BOOST_AUTO_TC_REGISTRAR( test_name )( \
174 boost::unit_test::make_test_case( \
175 &BOOST_AUTO_TC_INVOKER( test_name ), #test_name ), \
176 boost::unit_test::ut_detail::auto_tc_exp_fail< \
177 BOOST_AUTO_TC_UNIQUE_ID( test_name )>::value ); \
178 \
179 void test_name::test_method() \
180 /**/
181
182 // ************************************************************************** //
183 // ************** BOOST_AUTO_TEST_CASE_TEMPLATE ************** //
184 // ************************************************************************** //
185
186 #define BOOST_AUTO_TEST_CASE_TEMPLATE( test_name, type_name, TL ) \
187 template<typename type_name> \
188 void test_name( boost::type<type_name>* ); \
189 \
190 struct BOOST_AUTO_TC_INVOKER( test_name ) { \
191 template<typename TestType> \
192 static void run( boost::type<TestType>* frwrd = 0 ) \
193 { \
194 test_name( frwrd ); \
195 } \
196 }; \
197 \
198 BOOST_AUTO_TC_REGISTRAR( test_nase )( \
199 boost::unit_test::ut_detail::template_test_case_gen< \
200 BOOST_AUTO_TC_INVOKER( test_name ),TL >( \
201 BOOST_STRINGIZE( test_name ) ) ); \
202 \
203 template<typename type_name> \
204 void test_name( boost::type<type_name>* ) \
205 /**/
206
207 // ************************************************************************** //
208 // ************** BOOST_AUTO_TEST_MAIN ************** //
209 // ************************************************************************** //
210
211 #ifdef BOOST_AUTO_TEST_MAIN
212 boost::unit_test::test_suite*
init_unit_test_suite(int argc,char * argv[])213 init_unit_test_suite( int argc, char* argv[] ) {
214 boost::unit_test::auto_unit_test_suite_t* master_test_suite = boost::unit_test::auto_unit_test_suite();
215
216 boost::unit_test::const_string new_name = boost::unit_test::const_string( BOOST_AUTO_TEST_MAIN );
217
218 if( !new_name.is_empty() )
219 boost::unit_test::assign_op( master_test_suite->p_name.value, new_name, 0 );
220
221 master_test_suite->argc = argc;
222 master_test_suite->argv = argv;
223
224 return master_test_suite;
225 }
226 #endif
227
228 //____________________________________________________________________________//
229
230 // deprecated
231 #define BOOST_AUTO_UNIT_TEST( f ) BOOST_AUTO_TEST_CASE( f )
232
233 //____________________________________________________________________________//
234
235 #include <boost/test/detail/enable_warnings.hpp>
236
237 // ***************************************************************************
238 // Revision History :
239 //
240 // $Log: auto_unit_test.hpp,v $
241 // Revision 1.1.1.1 2006/03/20 20:15:27 ewalkup
242 // boost libraries
243 //
244 // Revision 1.17 2005/05/08 08:55:00 rogeeff
245 // typos and missing descriptions fixed
246 //
247 // Revision 1.16 2005/05/03 03:38:35 rogeeff
248 // bug in fixture test cases fixed
249 //
250 // Revision 1.15 2005/04/18 04:54:36 rogeeff
251 // Major rework in auto unit test facilities\n1. auto test suite ability introduced\n2.fixtures abilities introduced\n3. Expected failures support\n4. Master test suite renaming support
252 //
253 // Revision 1.14 2005/03/22 06:56:13 rogeeff
254 // provided access to argc/argv in auto facilities
255 //
256 // Revision 1.13 2005/02/20 08:27:05 rogeeff
257 // This a major update for Boost.Test framework. See release docs for complete list of fixes/updates
258 //
259 // Revision 1.12 2005/02/01 06:40:06 rogeeff
260 // copyright update
261 // old log entries removed
262 // minor stilistic changes
263 // depricated tools removed
264 //
265 // ***************************************************************************
266
267 #endif // BOOST_TEST_AUTO_UNIT_TEST_HPP_071894GER
268