Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2005-2008.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description : implements framework API - main driver for the test
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_FRAMEWORK_IPP_021005GER
|
Chris@16
|
16 #define BOOST_TEST_FRAMEWORK_IPP_021005GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost.Test
|
Chris@16
|
19 #include <boost/test/framework.hpp>
|
Chris@16
|
20 #include <boost/test/execution_monitor.hpp>
|
Chris@16
|
21 #include <boost/test/debug.hpp>
|
Chris@16
|
22 #include <boost/test/unit_test_suite_impl.hpp>
|
Chris@16
|
23 #include <boost/test/unit_test_log.hpp>
|
Chris@16
|
24 #include <boost/test/unit_test_monitor.hpp>
|
Chris@16
|
25 #include <boost/test/test_observer.hpp>
|
Chris@16
|
26 #include <boost/test/results_collector.hpp>
|
Chris@16
|
27 #include <boost/test/progress_monitor.hpp>
|
Chris@16
|
28 #include <boost/test/results_reporter.hpp>
|
Chris@16
|
29 #include <boost/test/test_tools.hpp>
|
Chris@16
|
30
|
Chris@16
|
31 #include <boost/test/detail/unit_test_parameters.hpp>
|
Chris@16
|
32 #include <boost/test/detail/global_typedef.hpp>
|
Chris@16
|
33
|
Chris@16
|
34 #include <boost/test/utils/foreach.hpp>
|
Chris@16
|
35
|
Chris@16
|
36 // Boost
|
Chris@16
|
37 #include <boost/timer.hpp>
|
Chris@16
|
38
|
Chris@16
|
39 // STL
|
Chris@16
|
40 #include <map>
|
Chris@16
|
41 #include <set>
|
Chris@16
|
42 #include <cstdlib>
|
Chris@16
|
43 #include <ctime>
|
Chris@16
|
44
|
Chris@16
|
45 #ifdef BOOST_NO_STDC_NAMESPACE
|
Chris@16
|
46 namespace std { using ::time; using ::srand; }
|
Chris@16
|
47 #endif
|
Chris@16
|
48
|
Chris@16
|
49 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
50
|
Chris@16
|
51 //____________________________________________________________________________//
|
Chris@16
|
52
|
Chris@16
|
53 namespace boost {
|
Chris@16
|
54
|
Chris@16
|
55 namespace unit_test {
|
Chris@16
|
56
|
Chris@16
|
57 // ************************************************************************** //
|
Chris@16
|
58 // ************** test_start calls wrapper ************** //
|
Chris@16
|
59 // ************************************************************************** //
|
Chris@16
|
60
|
Chris@16
|
61 namespace ut_detail {
|
Chris@16
|
62
|
Chris@16
|
63 struct test_start_caller {
|
Chris@16
|
64 test_start_caller( test_observer* to, counter_t tc_amount )
|
Chris@16
|
65 : m_to( to )
|
Chris@16
|
66 , m_tc_amount( tc_amount )
|
Chris@16
|
67 {}
|
Chris@16
|
68
|
Chris@16
|
69 int operator()()
|
Chris@16
|
70 {
|
Chris@16
|
71 m_to->test_start( m_tc_amount );
|
Chris@16
|
72 return 0;
|
Chris@16
|
73 }
|
Chris@16
|
74
|
Chris@16
|
75 private:
|
Chris@16
|
76 // Data members
|
Chris@16
|
77 test_observer* m_to;
|
Chris@16
|
78 counter_t m_tc_amount;
|
Chris@16
|
79 };
|
Chris@16
|
80
|
Chris@16
|
81 //____________________________________________________________________________//
|
Chris@16
|
82
|
Chris@16
|
83 struct test_init_caller {
|
Chris@16
|
84 explicit test_init_caller( init_unit_test_func init_func )
|
Chris@16
|
85 : m_init_func( init_func )
|
Chris@16
|
86 {}
|
Chris@16
|
87 int operator()()
|
Chris@16
|
88 {
|
Chris@16
|
89 #ifdef BOOST_TEST_ALTERNATIVE_INIT_API
|
Chris@16
|
90 if( !(*m_init_func)() )
|
Chris@16
|
91 throw std::runtime_error( "test module initialization failed" );
|
Chris@16
|
92 #else
|
Chris@16
|
93 test_suite* manual_test_units = (*m_init_func)( framework::master_test_suite().argc, framework::master_test_suite().argv );
|
Chris@16
|
94
|
Chris@16
|
95 if( manual_test_units )
|
Chris@16
|
96 framework::master_test_suite().add( manual_test_units );
|
Chris@16
|
97 #endif
|
Chris@16
|
98 return 0;
|
Chris@16
|
99 }
|
Chris@16
|
100
|
Chris@16
|
101 // Data members
|
Chris@16
|
102 init_unit_test_func m_init_func;
|
Chris@16
|
103 };
|
Chris@16
|
104
|
Chris@16
|
105 }
|
Chris@16
|
106
|
Chris@16
|
107 // ************************************************************************** //
|
Chris@16
|
108 // ************** framework ************** //
|
Chris@16
|
109 // ************************************************************************** //
|
Chris@16
|
110
|
Chris@16
|
111 class framework_impl : public test_tree_visitor {
|
Chris@16
|
112 public:
|
Chris@16
|
113 framework_impl()
|
Chris@16
|
114 : m_master_test_suite( 0 )
|
Chris@16
|
115 , m_curr_test_case( INV_TEST_UNIT_ID )
|
Chris@16
|
116 , m_next_test_case_id( MIN_TEST_CASE_ID )
|
Chris@16
|
117 , m_next_test_suite_id( MIN_TEST_SUITE_ID )
|
Chris@16
|
118 , m_is_initialized( false )
|
Chris@16
|
119 , m_test_in_progress( false )
|
Chris@16
|
120 {}
|
Chris@16
|
121
|
Chris@16
|
122 ~framework_impl() { clear(); }
|
Chris@16
|
123
|
Chris@16
|
124 void clear()
|
Chris@16
|
125 {
|
Chris@16
|
126 while( !m_test_units.empty() ) {
|
Chris@16
|
127 test_unit_store::value_type const& tu = *m_test_units.begin();
|
Chris@16
|
128 test_unit* tu_ptr = tu.second;
|
Chris@16
|
129
|
Chris@16
|
130 // the delete will erase this element from map
|
Chris@16
|
131 if( ut_detail::test_id_2_unit_type( tu.second->p_id ) == tut_suite )
|
Chris@16
|
132 delete (test_suite const*)tu_ptr;
|
Chris@16
|
133 else
|
Chris@16
|
134 delete (test_case const*)tu_ptr;
|
Chris@16
|
135 }
|
Chris@16
|
136 }
|
Chris@16
|
137
|
Chris@16
|
138 void set_tu_id( test_unit& tu, test_unit_id id ) { tu.p_id.value = id; }
|
Chris@16
|
139
|
Chris@16
|
140 // test_tree_visitor interface implementation
|
Chris@16
|
141 void visit( test_case const& tc )
|
Chris@16
|
142 {
|
Chris@16
|
143 if( !tc.check_dependencies() ) {
|
Chris@16
|
144 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
145 to->test_unit_skipped( tc );
|
Chris@16
|
146
|
Chris@16
|
147 return;
|
Chris@16
|
148 }
|
Chris@16
|
149
|
Chris@16
|
150 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
151 to->test_unit_start( tc );
|
Chris@16
|
152
|
Chris@16
|
153 boost::timer tc_timer;
|
Chris@16
|
154 test_unit_id bkup = m_curr_test_case;
|
Chris@16
|
155 m_curr_test_case = tc.p_id;
|
Chris@16
|
156 unit_test_monitor_t::error_level run_result = unit_test_monitor.execute_and_translate( tc );
|
Chris@16
|
157
|
Chris@16
|
158 unsigned long elapsed = static_cast<unsigned long>( tc_timer.elapsed() * 1e6 );
|
Chris@16
|
159
|
Chris@16
|
160 if( unit_test_monitor.is_critical_error( run_result ) ) {
|
Chris@16
|
161 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
162 to->test_aborted();
|
Chris@16
|
163 }
|
Chris@16
|
164
|
Chris@16
|
165 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
166 to->test_unit_finish( tc, elapsed );
|
Chris@16
|
167
|
Chris@16
|
168 m_curr_test_case = bkup;
|
Chris@16
|
169
|
Chris@16
|
170 if( unit_test_monitor.is_critical_error( run_result ) )
|
Chris@16
|
171 throw test_being_aborted();
|
Chris@16
|
172 }
|
Chris@16
|
173
|
Chris@16
|
174 bool test_suite_start( test_suite const& ts )
|
Chris@16
|
175 {
|
Chris@16
|
176 if( !ts.check_dependencies() ) {
|
Chris@16
|
177 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
178 to->test_unit_skipped( ts );
|
Chris@16
|
179
|
Chris@16
|
180 return false;
|
Chris@16
|
181 }
|
Chris@16
|
182
|
Chris@16
|
183 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
184 to->test_unit_start( ts );
|
Chris@16
|
185
|
Chris@16
|
186 return true;
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189 void test_suite_finish( test_suite const& ts )
|
Chris@16
|
190 {
|
Chris@16
|
191 BOOST_TEST_FOREACH( test_observer*, to, m_observers )
|
Chris@16
|
192 to->test_unit_finish( ts, 0 );
|
Chris@16
|
193 }
|
Chris@16
|
194
|
Chris@16
|
195 //////////////////////////////////////////////////////////////////
|
Chris@16
|
196 struct priority_order {
|
Chris@16
|
197 bool operator()( test_observer* lhs, test_observer* rhs ) const
|
Chris@16
|
198 {
|
Chris@16
|
199 return (lhs->priority() < rhs->priority()) || ((lhs->priority() == rhs->priority()) && (lhs < rhs));
|
Chris@16
|
200 }
|
Chris@16
|
201 };
|
Chris@16
|
202
|
Chris@16
|
203 typedef std::map<test_unit_id,test_unit*> test_unit_store;
|
Chris@16
|
204 typedef std::set<test_observer*,priority_order> observer_store;
|
Chris@16
|
205
|
Chris@16
|
206 master_test_suite_t* m_master_test_suite;
|
Chris@16
|
207 test_unit_id m_curr_test_case;
|
Chris@16
|
208 test_unit_store m_test_units;
|
Chris@16
|
209
|
Chris@16
|
210 test_unit_id m_next_test_case_id;
|
Chris@16
|
211 test_unit_id m_next_test_suite_id;
|
Chris@16
|
212
|
Chris@16
|
213 bool m_is_initialized;
|
Chris@16
|
214 bool m_test_in_progress;
|
Chris@16
|
215
|
Chris@16
|
216 observer_store m_observers;
|
Chris@16
|
217 };
|
Chris@16
|
218
|
Chris@16
|
219 //____________________________________________________________________________//
|
Chris@16
|
220
|
Chris@16
|
221 namespace {
|
Chris@16
|
222
|
Chris@16
|
223 #if defined(__CYGWIN__)
|
Chris@16
|
224 framework_impl& s_frk_impl() { static framework_impl* the_inst = 0; if(!the_inst) the_inst = new framework_impl; return *the_inst; }
|
Chris@16
|
225 #else
|
Chris@16
|
226 framework_impl& s_frk_impl() { static framework_impl the_inst; return the_inst; }
|
Chris@16
|
227 #endif
|
Chris@16
|
228
|
Chris@16
|
229 } // local namespace
|
Chris@16
|
230
|
Chris@16
|
231 //____________________________________________________________________________//
|
Chris@16
|
232
|
Chris@16
|
233 namespace framework {
|
Chris@16
|
234
|
Chris@16
|
235 void
|
Chris@16
|
236 init( init_unit_test_func init_func, int argc, char* argv[] )
|
Chris@16
|
237 {
|
Chris@16
|
238 runtime_config::init( argc, argv );
|
Chris@16
|
239
|
Chris@16
|
240 // set the log level and format
|
Chris@16
|
241 unit_test_log.set_threshold_level( runtime_config::log_level() );
|
Chris@16
|
242 unit_test_log.set_format( runtime_config::log_format() );
|
Chris@16
|
243
|
Chris@16
|
244 // set the report level and format
|
Chris@16
|
245 results_reporter::set_level( runtime_config::report_level() );
|
Chris@16
|
246 results_reporter::set_format( runtime_config::report_format() );
|
Chris@16
|
247
|
Chris@16
|
248 register_observer( results_collector );
|
Chris@16
|
249 register_observer( unit_test_log );
|
Chris@16
|
250
|
Chris@16
|
251 if( runtime_config::show_progress() )
|
Chris@16
|
252 register_observer( progress_monitor );
|
Chris@16
|
253
|
Chris@16
|
254 if( runtime_config::detect_memory_leaks() > 0 ) {
|
Chris@16
|
255 debug::detect_memory_leaks( true );
|
Chris@16
|
256 debug::break_memory_alloc( runtime_config::detect_memory_leaks() );
|
Chris@16
|
257 }
|
Chris@16
|
258
|
Chris@16
|
259 // init master unit test suite
|
Chris@16
|
260 master_test_suite().argc = argc;
|
Chris@16
|
261 master_test_suite().argv = argv;
|
Chris@16
|
262
|
Chris@16
|
263 try {
|
Chris@16
|
264 boost::execution_monitor em;
|
Chris@16
|
265
|
Chris@16
|
266 ut_detail::test_init_caller tic( init_func );
|
Chris@16
|
267
|
Chris@16
|
268 em.execute( tic );
|
Chris@16
|
269 }
|
Chris@16
|
270 catch( execution_exception const& ex ) {
|
Chris@16
|
271 throw setup_error( ex.what() );
|
Chris@16
|
272 }
|
Chris@16
|
273
|
Chris@16
|
274 s_frk_impl().m_is_initialized = true;
|
Chris@16
|
275 }
|
Chris@16
|
276
|
Chris@16
|
277 //____________________________________________________________________________//
|
Chris@16
|
278
|
Chris@16
|
279 bool
|
Chris@16
|
280 is_initialized()
|
Chris@16
|
281 {
|
Chris@16
|
282 return s_frk_impl().m_is_initialized;
|
Chris@16
|
283 }
|
Chris@16
|
284
|
Chris@16
|
285 //____________________________________________________________________________//
|
Chris@16
|
286
|
Chris@16
|
287 void
|
Chris@16
|
288 register_test_unit( test_case* tc )
|
Chris@16
|
289 {
|
Chris@16
|
290 BOOST_TEST_SETUP_ASSERT( tc->p_id == INV_TEST_UNIT_ID, BOOST_TEST_L( "test case already registered" ) );
|
Chris@16
|
291
|
Chris@16
|
292 test_unit_id new_id = s_frk_impl().m_next_test_case_id;
|
Chris@16
|
293
|
Chris@16
|
294 BOOST_TEST_SETUP_ASSERT( new_id != MAX_TEST_CASE_ID, BOOST_TEST_L( "too many test cases" ) );
|
Chris@16
|
295
|
Chris@16
|
296 typedef framework_impl::test_unit_store::value_type map_value_type;
|
Chris@16
|
297
|
Chris@16
|
298 s_frk_impl().m_test_units.insert( map_value_type( new_id, tc ) );
|
Chris@16
|
299 s_frk_impl().m_next_test_case_id++;
|
Chris@16
|
300
|
Chris@16
|
301 s_frk_impl().set_tu_id( *tc, new_id );
|
Chris@16
|
302 }
|
Chris@16
|
303
|
Chris@16
|
304 //____________________________________________________________________________//
|
Chris@16
|
305
|
Chris@16
|
306 void
|
Chris@16
|
307 register_test_unit( test_suite* ts )
|
Chris@16
|
308 {
|
Chris@16
|
309 BOOST_TEST_SETUP_ASSERT( ts->p_id == INV_TEST_UNIT_ID, BOOST_TEST_L( "test suite already registered" ) );
|
Chris@16
|
310
|
Chris@16
|
311 test_unit_id new_id = s_frk_impl().m_next_test_suite_id;
|
Chris@16
|
312
|
Chris@16
|
313 BOOST_TEST_SETUP_ASSERT( new_id != MAX_TEST_SUITE_ID, BOOST_TEST_L( "too many test suites" ) );
|
Chris@16
|
314
|
Chris@16
|
315 typedef framework_impl::test_unit_store::value_type map_value_type;
|
Chris@16
|
316 s_frk_impl().m_test_units.insert( map_value_type( new_id, ts ) );
|
Chris@16
|
317 s_frk_impl().m_next_test_suite_id++;
|
Chris@16
|
318
|
Chris@16
|
319 s_frk_impl().set_tu_id( *ts, new_id );
|
Chris@16
|
320 }
|
Chris@16
|
321
|
Chris@16
|
322 //____________________________________________________________________________//
|
Chris@16
|
323
|
Chris@16
|
324 void
|
Chris@16
|
325 deregister_test_unit( test_unit* tu )
|
Chris@16
|
326 {
|
Chris@16
|
327 s_frk_impl().m_test_units.erase( tu->p_id );
|
Chris@16
|
328 }
|
Chris@16
|
329
|
Chris@16
|
330 //____________________________________________________________________________//
|
Chris@16
|
331
|
Chris@16
|
332 void
|
Chris@16
|
333 clear()
|
Chris@16
|
334 {
|
Chris@16
|
335 s_frk_impl().clear();
|
Chris@16
|
336 }
|
Chris@16
|
337
|
Chris@16
|
338 //____________________________________________________________________________//
|
Chris@16
|
339
|
Chris@16
|
340 void
|
Chris@16
|
341 register_observer( test_observer& to )
|
Chris@16
|
342 {
|
Chris@16
|
343 s_frk_impl().m_observers.insert( &to );
|
Chris@16
|
344 }
|
Chris@16
|
345
|
Chris@16
|
346 //____________________________________________________________________________//
|
Chris@16
|
347
|
Chris@16
|
348 void
|
Chris@16
|
349 deregister_observer( test_observer& to )
|
Chris@16
|
350 {
|
Chris@16
|
351 s_frk_impl().m_observers.erase( &to );
|
Chris@16
|
352 }
|
Chris@16
|
353
|
Chris@16
|
354 //____________________________________________________________________________//
|
Chris@16
|
355
|
Chris@16
|
356 void
|
Chris@16
|
357 reset_observers()
|
Chris@16
|
358 {
|
Chris@16
|
359 s_frk_impl().m_observers.clear();
|
Chris@16
|
360 }
|
Chris@16
|
361
|
Chris@16
|
362 //____________________________________________________________________________//
|
Chris@16
|
363
|
Chris@16
|
364 master_test_suite_t&
|
Chris@16
|
365 master_test_suite()
|
Chris@16
|
366 {
|
Chris@16
|
367 if( !s_frk_impl().m_master_test_suite )
|
Chris@16
|
368 s_frk_impl().m_master_test_suite = new master_test_suite_t;
|
Chris@16
|
369
|
Chris@16
|
370 return *s_frk_impl().m_master_test_suite;
|
Chris@16
|
371 }
|
Chris@16
|
372
|
Chris@16
|
373 //____________________________________________________________________________//
|
Chris@16
|
374
|
Chris@16
|
375 test_case const&
|
Chris@16
|
376 current_test_case()
|
Chris@16
|
377 {
|
Chris@16
|
378 return get<test_case>( s_frk_impl().m_curr_test_case );
|
Chris@16
|
379 }
|
Chris@16
|
380
|
Chris@16
|
381 //____________________________________________________________________________//
|
Chris@16
|
382
|
Chris@16
|
383 test_unit&
|
Chris@16
|
384 get( test_unit_id id, test_unit_type t )
|
Chris@16
|
385 {
|
Chris@16
|
386 test_unit* res = s_frk_impl().m_test_units[id];
|
Chris@16
|
387
|
Chris@16
|
388 if( (res->p_type & t) == 0 )
|
Chris@16
|
389 throw internal_error( "Invalid test unit type" );
|
Chris@16
|
390
|
Chris@16
|
391 return *res;
|
Chris@16
|
392 }
|
Chris@16
|
393
|
Chris@16
|
394 //____________________________________________________________________________//
|
Chris@16
|
395
|
Chris@16
|
396 void
|
Chris@16
|
397 run( test_unit_id id, bool continue_test )
|
Chris@16
|
398 {
|
Chris@16
|
399 if( id == INV_TEST_UNIT_ID )
|
Chris@16
|
400 id = master_test_suite().p_id;
|
Chris@16
|
401
|
Chris@16
|
402 test_case_counter tcc;
|
Chris@16
|
403 traverse_test_tree( id, tcc );
|
Chris@16
|
404
|
Chris@16
|
405 BOOST_TEST_SETUP_ASSERT( tcc.p_count != 0 , runtime_config::test_to_run().is_empty()
|
Chris@16
|
406 ? BOOST_TEST_L( "test tree is empty" )
|
Chris@16
|
407 : BOOST_TEST_L( "no test cases matching filter" ) );
|
Chris@16
|
408
|
Chris@16
|
409 bool call_start_finish = !continue_test || !s_frk_impl().m_test_in_progress;
|
Chris@16
|
410 bool was_in_progress = s_frk_impl().m_test_in_progress;
|
Chris@16
|
411
|
Chris@16
|
412 s_frk_impl().m_test_in_progress = true;
|
Chris@16
|
413
|
Chris@16
|
414 if( call_start_finish ) {
|
Chris@16
|
415 BOOST_TEST_FOREACH( test_observer*, to, s_frk_impl().m_observers ) {
|
Chris@16
|
416 boost::execution_monitor em;
|
Chris@16
|
417
|
Chris@16
|
418 try {
|
Chris@16
|
419 em.execute( ut_detail::test_start_caller( to, tcc.p_count ) );
|
Chris@16
|
420 }
|
Chris@16
|
421 catch( execution_exception const& ex ) {
|
Chris@16
|
422 throw setup_error( ex.what() );
|
Chris@16
|
423 }
|
Chris@16
|
424 }
|
Chris@16
|
425 }
|
Chris@16
|
426
|
Chris@16
|
427 switch( runtime_config::random_seed() ) {
|
Chris@16
|
428 case 0:
|
Chris@16
|
429 break;
|
Chris@16
|
430 case 1: {
|
Chris@16
|
431 unsigned int seed = static_cast<unsigned int>( std::time( 0 ) );
|
Chris@16
|
432 BOOST_TEST_MESSAGE( "Test cases order is shuffled using seed: " << seed );
|
Chris@16
|
433 std::srand( seed );
|
Chris@16
|
434 break;
|
Chris@16
|
435 }
|
Chris@16
|
436 default:
|
Chris@16
|
437 BOOST_TEST_MESSAGE( "Test cases order is shuffled using seed: " << runtime_config::random_seed() );
|
Chris@16
|
438 std::srand( runtime_config::random_seed() );
|
Chris@16
|
439 }
|
Chris@16
|
440
|
Chris@16
|
441 try {
|
Chris@16
|
442 traverse_test_tree( id, s_frk_impl() );
|
Chris@16
|
443 }
|
Chris@16
|
444 catch( test_being_aborted const& ) {
|
Chris@16
|
445 // abort already reported
|
Chris@16
|
446 }
|
Chris@16
|
447
|
Chris@16
|
448 if( call_start_finish ) {
|
Chris@16
|
449 BOOST_TEST_FOREACH( test_observer*, to, s_frk_impl().m_observers )
|
Chris@16
|
450 to->test_finish();
|
Chris@16
|
451 }
|
Chris@16
|
452
|
Chris@16
|
453 s_frk_impl().m_test_in_progress = was_in_progress;
|
Chris@16
|
454 }
|
Chris@16
|
455
|
Chris@16
|
456 //____________________________________________________________________________//
|
Chris@16
|
457
|
Chris@16
|
458 void
|
Chris@16
|
459 run( test_unit const* tu, bool continue_test )
|
Chris@16
|
460 {
|
Chris@16
|
461 run( tu->p_id, continue_test );
|
Chris@16
|
462 }
|
Chris@16
|
463
|
Chris@16
|
464 //____________________________________________________________________________//
|
Chris@16
|
465
|
Chris@16
|
466 void
|
Chris@16
|
467 assertion_result( bool passed )
|
Chris@16
|
468 {
|
Chris@16
|
469 BOOST_TEST_FOREACH( test_observer*, to, s_frk_impl().m_observers )
|
Chris@16
|
470 to->assertion_result( passed );
|
Chris@16
|
471 }
|
Chris@16
|
472
|
Chris@16
|
473 //____________________________________________________________________________//
|
Chris@16
|
474
|
Chris@16
|
475 void
|
Chris@16
|
476 exception_caught( execution_exception const& ex )
|
Chris@16
|
477 {
|
Chris@16
|
478 BOOST_TEST_FOREACH( test_observer*, to, s_frk_impl().m_observers )
|
Chris@16
|
479 to->exception_caught( ex );
|
Chris@16
|
480 }
|
Chris@16
|
481
|
Chris@16
|
482 //____________________________________________________________________________//
|
Chris@16
|
483
|
Chris@16
|
484 void
|
Chris@16
|
485 test_unit_aborted( test_unit const& tu )
|
Chris@16
|
486 {
|
Chris@16
|
487 BOOST_TEST_FOREACH( test_observer*, to, s_frk_impl().m_observers )
|
Chris@16
|
488 to->test_unit_aborted( tu );
|
Chris@16
|
489 }
|
Chris@16
|
490
|
Chris@16
|
491 //____________________________________________________________________________//
|
Chris@16
|
492
|
Chris@16
|
493 } // namespace framework
|
Chris@16
|
494
|
Chris@16
|
495 } // namespace unit_test
|
Chris@16
|
496
|
Chris@16
|
497 } // namespace boost
|
Chris@16
|
498
|
Chris@16
|
499 //____________________________________________________________________________//
|
Chris@16
|
500
|
Chris@16
|
501 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
502
|
Chris@16
|
503 #endif // BOOST_TEST_FRAMEWORK_IPP_021005GER
|