source: NonGTP/Boost/boost/test/impl/unit_test_suite.ipp @ 857

Revision 857, 8.0 KB checked in by igarcia, 18 years ago (diff)
Line 
1//  (C) Copyright Gennadiy Rozental 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: unit_test_suite.ipp,v $
9//
10//  Version     : $Revision: 1.10 $
11//
12//  Description : privide core implementation for Unit Test Framework.
13//  Extensions could be provided in separate files
14// ***************************************************************************
15
16#ifndef BOOST_TEST_UNIT_TEST_SUITE_IPP_012205GER
17#define BOOST_TEST_UNIT_TEST_SUITE_IPP_012205GER
18
19// Boost.Test
20#include <boost/detail/workaround.hpp>
21#include <boost/test/unit_test_suite.hpp>
22#include <boost/test/framework.hpp>
23#include <boost/test/utils/foreach.hpp>
24#include <boost/test/results_collector.hpp>
25#include <boost/test/detail/unit_test_parameters.hpp>
26
27// Boost
28#include <boost/timer.hpp>
29
30// STL
31#include <algorithm>
32#include <vector>
33
34#include <boost/test/detail/suppress_warnings.hpp>
35
36#if BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \
37    BOOST_WORKAROUND(_STLPORT_VERSION, <= 0x450) \
38    /**/
39    using std::rand; // rand is in std and random_shuffle is in _STL
40#endif
41
42//____________________________________________________________________________//
43
44namespace boost {
45
46namespace unit_test {
47
48// ************************************************************************** //
49// **************                   test_unit                  ************** //
50// ************************************************************************** //
51
52test_unit::test_unit( const_string name, test_unit_type t )
53: p_type( t )
54, p_type_name( t == tut_case ? "case" : "suite" )
55, p_id( INV_TEST_UNIT_ID )
56, p_name( std::string( name.begin(), name.size() ) )
57{
58}
59
60//____________________________________________________________________________//
61
62void
63test_unit::depends_on( test_unit* tu )
64{
65    m_dependencies.push_back( tu->p_id );
66}
67
68//____________________________________________________________________________//
69
70bool
71test_unit::check_dependencies() const
72{
73#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x530) )
74    BOOST_TEST_FOREACH( test_unit_id, tu_id, const_cast<test_unit*>(this)->m_dependencies ) {
75#else
76    BOOST_TEST_FOREACH( test_unit_id, tu_id, m_dependencies ) {
77#endif
78        if( !unit_test::results_collector.results( tu_id ).passed() )
79            return false;
80    }
81
82    return true;
83}
84
85//____________________________________________________________________________//
86
87// ************************************************************************** //
88// **************                   test_case                  ************** //
89// ************************************************************************** //
90
91test_case::test_case( const_string name, callback0<> const& test_func )
92: test_unit( name, (test_unit_type)type )
93, m_test_func( test_func )
94{
95    // !! weirdest MSVC BUG; try to remove this statement; looks like it eats first token of next statement
96#if BOOST_WORKAROUND(BOOST_MSVC,<1300)
97    0;
98#endif
99
100    framework::register_test_unit( this );
101}
102
103//____________________________________________________________________________//
104
105// ************************************************************************** //
106// **************                  test_suite                  ************** //
107// ************************************************************************** //
108
109//____________________________________________________________________________//
110
111test_suite::test_suite( const_string name )
112: test_unit( name, (test_unit_type)type )
113{
114    framework::register_test_unit( this );
115}
116
117//____________________________________________________________________________//
118
119// !! need to prevent modifing test unit once it is added to tree
120
121void
122test_suite::add( test_unit* tu, counter_t expected_failures, unsigned timeout )
123{
124    if( expected_failures != 0 )
125        tu->p_expected_failures.value = expected_failures;
126
127    p_expected_failures.value += tu->p_expected_failures;
128
129    if( timeout != 0 )
130        tu->p_timeout.value = timeout;
131
132    m_members.push_back( tu->p_id );
133}
134
135//____________________________________________________________________________//
136
137void
138test_suite::add( test_unit_generator const& gen, unsigned timeout )
139{
140    test_unit* tu;
141    while((tu = gen.next(), tu))
142        add( tu, 0, timeout );
143}
144
145//____________________________________________________________________________//
146
147// ************************************************************************** //
148// **************               traverse_test_tree             ************** //
149// ************************************************************************** //
150
151void
152traverse_test_tree( test_case const& tc, test_tree_visitor& V )
153{
154    V.visit( tc );
155}
156
157//____________________________________________________________________________//
158
159void    traverse_test_tree( test_suite const& suite, test_tree_visitor& V )
160{
161    if( !V.test_suite_start( suite ) )
162        return;
163
164    try {
165        if( runtime_config::random_seed() == 0 ) {
166            BOOST_TEST_FOREACH( test_unit_id, id, suite.m_members )
167                traverse_test_tree( id, V );
168        }
169        else {
170            std::vector<test_unit_id> members( suite.m_members );
171//#if !defined(__BORLANDC__) || !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
172            std::random_shuffle( members.begin(), members.end() );
173//#else
174//    bool random_test_order_not_supported_on_borland = false;
175//    assert(random_test_order_not_supported_on_borland);
176//#endif
177            BOOST_TEST_FOREACH( test_unit_id, id, members )
178                traverse_test_tree( id, V );
179        }
180       
181    } catch( test_aborted const& ) {
182        V.test_suite_finish( suite );
183
184        throw;
185    }
186
187    V.test_suite_finish( suite );
188}
189
190//____________________________________________________________________________//
191
192void
193traverse_test_tree( test_unit_id id, test_tree_visitor& V )
194{
195    if( test_id_2_unit_type( id ) == tut_case )
196        traverse_test_tree( framework::get<test_case>( id ), V );
197    else
198        traverse_test_tree( framework::get<test_suite>( id ), V );
199}
200
201//____________________________________________________________________________//
202
203// ************************************************************************** //
204// **************               object generators              ************** //
205// ************************************************************************** //
206
207namespace ut_detail {
208
209std::string
210normalize_test_case_name( const_string name )
211{
212    return ( name[0] == '&'
213                ? std::string( name.begin()+1, name.size()-1 )
214                : std::string( name.begin(), name.size() ) );
215}
216
217//____________________________________________________________________________//
218
219} // namespace ut_detail
220
221} // namespace unit_test
222
223} // namespace boost
224
225//____________________________________________________________________________//
226
227#include <boost/test/detail/enable_warnings.hpp>
228
229// ***************************************************************************
230//  Revision History :
231//
232//  $Log: unit_test_suite.ipp,v $
233//  Revision 1.10  2005/04/18 04:55:36  rogeeff
234//  test unit name made read/write
235//
236//  Revision 1.9  2005/03/23 21:02:25  rogeeff
237//  Sunpro CC 5.3 fixes
238//
239//  Revision 1.8  2005/03/21 15:33:15  rogeeff
240//  check reworked
241//
242//  Revision 1.7  2005/02/25 21:27:44  turkanis
243//  fix for random_shuffle on Borland 5.x w/ STLPort
244//
245//  Revision 1.6  2005/02/21 10:12:24  rogeeff
246//  Support for random order of test cases implemented
247//
248//  Revision 1.5  2005/02/20 08:27:07  rogeeff
249//  This a major update for Boost.Test framework. See release docs for complete list of fixes/updates
250//
251// ***************************************************************************
252
253#endif // BOOST_TEST_UNIT_TEST_SUITE_IPP_012205GER
Note: See TracBrowser for help on using the repository browser.