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$
11//
12//  Description : plain report formatter definition
13// ***************************************************************************
14
15#ifndef BOOST_TEST_PLAIN_REPORT_FORMATTER_IPP_020105GER
16#define BOOST_TEST_PLAIN_REPORT_FORMATTER_IPP_020105GER
17
18// Boost.Test
19#include <boost/test/output/plain_report_formatter.hpp>
20#include <boost/test/utils/custom_manip.hpp>
21#include <boost/test/results_collector.hpp>
22#include <boost/test/unit_test_parameters.hpp>
23
24#include <boost/test/tree/test_unit.hpp>
25
26#include <boost/test/utils/basic_cstring/io.hpp>
27#include <boost/test/utils/setcolor.hpp>
28
29// STL
30#include <iomanip>
31#include <boost/config/no_tr1/cmath.hpp>
32#include <iostream>
33
34#include <boost/test/detail/suppress_warnings.hpp>
35
36# ifdef BOOST_NO_STDC_NAMESPACE
37namespace std { using ::log10; }
38# endif
39
40//____________________________________________________________________________//
41
42namespace boost {
43namespace unit_test {
44namespace output {
45
46namespace {
47
48typedef utils::custom_manip<struct quote_t> quote;
49
50template<typename T>
51inline std::ostream&
52operator<<( utils::custom_printer<quote> const& p, T const& value )
53{
54    *p << '"' << value << '"';
55
56    return *p;
57}
58
59//____________________________________________________________________________//
60
61void
62print_stat_value( std::ostream& ostr, counter_t v, counter_t indent, counter_t total, const_string name, const_string res )
63{
64    if( v == 0 )
65        return;
66
67    if( total > 0 )
68        ostr << std::setw( static_cast<int>(indent) ) << "" << v << ' ' << name << ( v != 1 ? "s" : "" )
69             << " out of " << total << ' ' << res << '\n';
70    else
71        ostr << std::setw( static_cast<int>(indent) ) << "" << v << ' ' << res << ' ' << name << ( v != 1 ? "s" : "" ) << '\n';
72}
73
74//____________________________________________________________________________//
75
76} // local namespace
77
78// ************************************************************************** //
79// **************             plain_report_formatter           ************** //
80// ************************************************************************** //
81
82void
83plain_report_formatter::results_report_start( std::ostream& ostr )
84{
85    m_indent = 0;
86    m_color_output = runtime_config::get<bool>( runtime_config::btrt_color_output );
87    ostr << '\n';
88}
89
90//____________________________________________________________________________//
91
92void
93plain_report_formatter::results_report_finish( std::ostream& ostr )
94{
95    ostr.flush();
96}
97
98//____________________________________________________________________________//
99
100void
101plain_report_formatter::test_unit_report_start( test_unit const& tu, std::ostream& ostr )
102{
103    test_results const& tr = results_collector.results( tu.p_id );
104
105    const_string descr;
106
107    if( tr.passed() )
108        descr = "has passed";
109    else if( tr.p_skipped )
110        descr = "was skipped";
111    else if( tr.p_aborted )
112        descr = "was aborted";
113    else
114        descr = "has failed";
115
116    ostr << std::setw( static_cast<int>(m_indent) ) << ""
117         << "Test " << tu.p_type_name << ' ' << quote() << tu.full_name() << ' ' << descr;
118
119    if( tr.p_skipped ) {
120        ostr  << "\n";
121        m_indent += 2;
122        return;
123    }
124
125    counter_t total_assertions  = tr.p_assertions_passed + tr.p_assertions_failed;
126    counter_t total_tc          = tr.p_test_cases_passed + tr.p_test_cases_warned + tr.p_test_cases_failed + tr.p_test_cases_skipped;
127
128    if( total_assertions > 0 || total_tc > 0 || tr.p_warnings_failed > 0)
129        ostr << " with:";
130
131    ostr << '\n';
132    m_indent += 2;
133
134    print_stat_value( ostr, tr.p_test_cases_passed , m_indent, total_tc        , "test case", "passed" );
135    print_stat_value( ostr, tr.p_test_cases_warned , m_indent, total_tc        , "test case", "passed with warnings" );
136    print_stat_value( ostr, tr.p_test_cases_failed , m_indent, total_tc        , "test case", "failed" );
137    print_stat_value( ostr, tr.p_test_cases_skipped, m_indent, total_tc        , "test case", "skipped" );
138    print_stat_value( ostr, tr.p_test_cases_aborted, m_indent, total_tc        , "test case", "aborted" );
139    print_stat_value( ostr, tr.p_assertions_passed , m_indent, total_assertions, "assertion", "passed" );
140    print_stat_value( ostr, tr.p_assertions_failed , m_indent, total_assertions, "assertion", "failed" );
141    print_stat_value( ostr, tr.p_warnings_failed   , m_indent, 0               , "warning"  , "failed" );
142    print_stat_value( ostr, tr.p_expected_failures , m_indent, 0               , "failure"  , "expected" );
143
144    ostr << '\n';
145}
146
147//____________________________________________________________________________//
148
149void
150plain_report_formatter::test_unit_report_finish( test_unit const&, std::ostream& )
151{
152    m_indent -= 2;
153}
154
155//____________________________________________________________________________//
156
157void
158plain_report_formatter::do_confirmation_report( test_unit const& tu, std::ostream& ostr )
159{
160    test_results const& tr = results_collector.results( tu.p_id );
161
162    if( tr.passed() ) {
163        BOOST_TEST_SCOPE_SETCOLOR( m_color_output, ostr, term_attr::BRIGHT, term_color::GREEN );
164
165        ostr << "*** No errors detected\n";
166        return;
167    }
168
169    BOOST_TEST_SCOPE_SETCOLOR( m_color_output, ostr, term_attr::BRIGHT, term_color::RED );
170
171    if( tr.p_skipped ) {
172        ostr << "*** The test " << tu.p_type_name << ' ' << quote() << tu.full_name() << " was skipped"
173             << "; see standard output for details\n";
174        return;
175    }
176
177    if( tr.p_aborted ) {
178        ostr << "*** The test " << tu.p_type_name << ' ' << quote() << tu.full_name() << " was aborted"
179             << "; see standard output for details\n";
180    }
181
182    if( tr.p_assertions_failed == 0 ) {
183        if( !tr.p_aborted )
184            ostr << "*** Errors were detected in the test " << tu.p_type_name << ' ' << quote() << tu.full_name()
185                 << "; see standard output for details\n";
186        return;
187    }
188
189    counter_t num_failures = tr.p_assertions_failed;
190
191    ostr << "*** " << num_failures << " failure" << ( num_failures != 1 ? "s are" : " is" ) << " detected";
192
193    if( tr.p_expected_failures > 0 )
194        ostr << " (" << tr.p_expected_failures << " failure" << ( tr.p_expected_failures != 1 ? "s are" : " is" ) << " expected)";
195
196    ostr << " in the test " << tu.p_type_name << " " << quote() << tu.full_name() << "\n";
197}
198
199//____________________________________________________________________________//
200
201} // namespace output
202} // namespace unit_test
203} // namespace boost
204
205#include <boost/test/detail/enable_warnings.hpp>
206
207#endif // BOOST_TEST_PLAIN_REPORT_FORMATTER_IPP_020105GER
208