Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/test/impl/results_collector.ipp @ 44

Last change on this file since 44 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 8.6 KB
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: results_collector.ipp,v $
9//
10//  Version     : $Revision: 1.5 $
11//
12//  Description : implements Unit Test results collecting facility.
13// ***************************************************************************
14
15#ifndef BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
16#define BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
17
18// Boost.Test
19#include <boost/test/unit_test_suite_impl.hpp>
20#include <boost/test/unit_test_log.hpp>
21#include <boost/test/results_collector.hpp>
22#include <boost/test/framework.hpp>
23
24// Boost
25#include <boost/cstdlib.hpp>
26
27// STL
28#include <map>
29
30#include <boost/test/detail/suppress_warnings.hpp>
31
32//____________________________________________________________________________//
33
34namespace boost {
35
36namespace unit_test {
37
38// ************************************************************************** //
39// **************                 test_results                 ************** //
40// ************************************************************************** //
41
42test_results::test_results()
43{
44    clear();
45}
46
47//____________________________________________________________________________//
48
49bool
50test_results::passed() const
51{
52    return  !p_skipped                                  &&
53            p_test_cases_failed == 0                    &&
54            p_assertions_failed <= p_expected_failures  &&
55            !p_aborted;
56}
57
58//____________________________________________________________________________//
59
60int
61test_results::result_code() const
62{
63    return passed() ? exit_success
64           : ( (p_assertions_failed > p_expected_failures || p_skipped )
65                    ? exit_test_failure
66                    : exit_exception_failure );
67}
68
69//____________________________________________________________________________//
70
71void
72test_results::operator+=( test_results const& tr )
73{
74    p_assertions_passed.value   += tr.p_assertions_passed;
75    p_assertions_failed.value   += tr.p_assertions_failed;
76    p_test_cases_passed.value   += tr.p_test_cases_passed;
77    p_test_cases_failed.value   += tr.p_test_cases_failed;
78    p_test_cases_skipped.value  += tr.p_test_cases_skipped;
79    p_test_cases_aborted.value  += tr.p_test_cases_aborted;
80}
81
82//____________________________________________________________________________//
83
84void
85test_results::clear()
86{
87    p_assertions_passed.value    = 0;
88    p_assertions_failed.value    = 0;
89    p_expected_failures.value    = 0;
90    p_test_cases_passed.value    = 0;
91    p_test_cases_failed.value    = 0;
92    p_test_cases_skipped.value   = 0;
93    p_test_cases_aborted.value   = 0;
94    p_aborted.value              = false;
95    p_skipped.value              = true;
96}
97
98//____________________________________________________________________________//
99   
100// ************************************************************************** //
101// **************               results_collector              ************** //
102// ************************************************************************** //
103
104#if !BOOST_WORKAROUND(BOOST_MSVC, <1300)
105
106namespace {
107
108struct results_collector_impl {
109    std::map<test_unit_id,test_results> m_results_store;
110};
111
112results_collector_impl& s_rc_impl() { static results_collector_impl the_inst; return the_inst; }
113
114} // local namespace
115
116#else
117
118struct results_collector_impl {
119    std::map<test_unit_id,test_results> m_results_store;
120};
121
122static results_collector_impl& s_rc_impl() { static results_collector_impl the_inst; return the_inst; }
123
124#endif
125
126//____________________________________________________________________________//
127
128void
129results_collector_t::test_start( counter_t )
130{
131    s_rc_impl().m_results_store.clear();
132}
133
134//____________________________________________________________________________//
135
136void
137results_collector_t::test_finish()
138{
139    // do nothing
140}
141
142//____________________________________________________________________________//
143
144void
145results_collector_t::test_aborted()
146{
147    // do nothing
148}
149
150//____________________________________________________________________________//
151
152void
153results_collector_t::test_unit_start( test_unit const& tu )
154{
155    // init test_results entry
156    test_results& tr = s_rc_impl().m_results_store[tu.p_id];
157
158    tr.clear();
159   
160    tr.p_expected_failures.value    = tu.p_expected_failures;
161    tr.p_skipped.value              = false;
162}
163
164//____________________________________________________________________________//
165
166class results_collect_helper : public test_tree_visitor {
167public:
168    explicit results_collect_helper( test_results& tr, test_unit const& ts ) : m_tr( tr ), m_ts( ts ) {}
169
170    void    visit( test_case const& tc )
171    {
172        test_results const& tr = results_collector.results( tc.p_id );
173        m_tr += tr;
174
175        if( tr.passed() )
176            m_tr.p_test_cases_passed.value++;
177        else if( tr.p_skipped )
178            m_tr.p_test_cases_skipped.value++;
179        else {
180            if( tr.p_aborted )
181                m_tr.p_test_cases_aborted.value++;
182            m_tr.p_test_cases_failed.value++;
183        }
184    }
185    bool    test_suite_start( test_suite const& ts )
186    {
187        if( m_ts.p_id == ts.p_id )
188            return true;
189        else {
190            m_tr += results_collector.results( ts.p_id );
191            return false;
192        }
193    }
194
195private:
196    // Data members
197    test_results&       m_tr;
198    test_unit const&    m_ts;
199};
200
201//____________________________________________________________________________//
202
203void
204results_collector_t::test_unit_finish( test_unit const& tu, unsigned long )
205{
206    if( tu.p_type == tut_suite ) {
207        results_collect_helper ch( s_rc_impl().m_results_store[tu.p_id], tu );
208
209        traverse_test_tree( tu, ch );
210    }
211    else {
212        test_results const& tr = s_rc_impl().m_results_store[tu.p_id];
213       
214        bool num_failures_match = tr.p_aborted || tr.p_assertions_failed >= tr.p_expected_failures;
215        if( !num_failures_match )
216            BOOST_TEST_MESSAGE( "Test case has less failures then expected" );
217    }
218}
219
220//____________________________________________________________________________//
221
222void
223results_collector_t::test_unit_skipped( test_unit const& tu )
224{
225    if( tu.p_type == tut_suite ) {
226        test_case_counter tcc;
227        traverse_test_tree( tu, tcc );
228
229        test_results& tr = s_rc_impl().m_results_store[tu.p_id];
230
231        tr.clear();
232   
233        tr.p_skipped.value              = true;
234        tr.p_test_cases_skipped.value   = tcc.m_count;
235    }
236}
237
238//____________________________________________________________________________//
239
240void
241results_collector_t::assertion_result( bool passed )
242{
243    test_results& tr = s_rc_impl().m_results_store[framework::current_test_case().p_id];
244
245    if( passed )
246        tr.p_assertions_passed.value++;
247    else
248        tr.p_assertions_failed.value++;
249
250    if( tr.p_assertions_failed == 1 )
251        first_failed_assertion();
252}
253
254//____________________________________________________________________________//
255
256void
257results_collector_t::exception_caught( execution_exception const& )
258{
259    test_results& tr = s_rc_impl().m_results_store[framework::current_test_case().p_id];
260
261    tr.p_assertions_failed.value++;
262}
263
264//____________________________________________________________________________//
265
266void
267results_collector_t::test_unit_aborted( test_unit const& tu )
268{
269    s_rc_impl().m_results_store[tu.p_id].p_aborted.value = true;
270}
271
272//____________________________________________________________________________//
273
274test_results const&
275results_collector_t::results( test_unit_id id ) const
276{
277    return s_rc_impl().m_results_store[id];
278}
279
280//____________________________________________________________________________//
281
282} // namespace unit_test
283
284} // namespace boost
285
286//____________________________________________________________________________//
287
288#include <boost/test/detail/enable_warnings.hpp>
289
290// ***************************************************************************
291//  Revision History :
292//
293//  $Log: results_collector.ipp,v $
294//  Revision 1.5  2006/02/26 15:24:00  rogeeff
295//  vc65 workaround
296//
297//  Revision 1.4  2006/01/28 08:55:52  rogeeff
298//  results collection bug fixed
299//
300//  Revision 1.3  2005/12/14 05:53:22  rogeeff
301//  collect amount of aborted test cases
302//
303//  Revision 1.2  2005/03/24 04:02:33  rogeeff
304//  portability fixes
305//
306//  Revision 1.1  2005/02/20 08:27:07  rogeeff
307//  This a major update for Boost.Test framework. See release docs for complete list of fixes/updates
308//
309// ***************************************************************************
310
311#endif // BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
Note: See TracBrowser for help on using the repository browser.