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 XML Log formatter
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_XML_LOG_FORMATTER_IPP_020105GER
|
Chris@16
|
16 #define BOOST_TEST_XML_LOG_FORMATTER_IPP_020105GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost.Test
|
Chris@16
|
19 #include <boost/test/output/xml_log_formatter.hpp>
|
Chris@16
|
20 #include <boost/test/unit_test_suite_impl.hpp>
|
Chris@16
|
21 #include <boost/test/framework.hpp>
|
Chris@16
|
22 #include <boost/test/utils/basic_cstring/io.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/test/utils/xml_printer.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 // Boost
|
Chris@16
|
27 #include <boost/version.hpp>
|
Chris@16
|
28
|
Chris@16
|
29 // STL
|
Chris@16
|
30 #include <iostream>
|
Chris@16
|
31
|
Chris@16
|
32 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
33
|
Chris@16
|
34 //____________________________________________________________________________//
|
Chris@16
|
35
|
Chris@16
|
36 namespace boost {
|
Chris@16
|
37
|
Chris@16
|
38 namespace unit_test {
|
Chris@16
|
39
|
Chris@16
|
40 namespace output {
|
Chris@16
|
41
|
Chris@16
|
42 static const_string tu_type_name( test_unit const& tu )
|
Chris@16
|
43 {
|
Chris@16
|
44 return tu.p_type == tut_case ? "TestCase" : "TestSuite";
|
Chris@16
|
45 }
|
Chris@16
|
46
|
Chris@16
|
47 // ************************************************************************** //
|
Chris@16
|
48 // ************** xml_log_formatter ************** //
|
Chris@16
|
49 // ************************************************************************** //
|
Chris@16
|
50
|
Chris@16
|
51 void
|
Chris@16
|
52 xml_log_formatter::log_start( std::ostream& ostr, counter_t )
|
Chris@16
|
53 {
|
Chris@16
|
54 ostr << "<TestLog>";
|
Chris@16
|
55 }
|
Chris@16
|
56
|
Chris@16
|
57 //____________________________________________________________________________//
|
Chris@16
|
58
|
Chris@16
|
59 void
|
Chris@16
|
60 xml_log_formatter::log_finish( std::ostream& ostr )
|
Chris@16
|
61 {
|
Chris@16
|
62 ostr << "</TestLog>";
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 //____________________________________________________________________________//
|
Chris@16
|
66
|
Chris@16
|
67 void
|
Chris@16
|
68 xml_log_formatter::log_build_info( std::ostream& ostr )
|
Chris@16
|
69 {
|
Chris@16
|
70 ostr << "<BuildInfo"
|
Chris@16
|
71 << " platform" << attr_value() << BOOST_PLATFORM
|
Chris@16
|
72 << " compiler" << attr_value() << BOOST_COMPILER
|
Chris@16
|
73 << " stl" << attr_value() << BOOST_STDLIB
|
Chris@16
|
74 << " boost=\"" << BOOST_VERSION/100000 << "."
|
Chris@16
|
75 << BOOST_VERSION/100 % 1000 << "."
|
Chris@16
|
76 << BOOST_VERSION % 100 << '\"'
|
Chris@16
|
77 << "/>";
|
Chris@16
|
78 }
|
Chris@16
|
79
|
Chris@16
|
80 //____________________________________________________________________________//
|
Chris@16
|
81
|
Chris@16
|
82 void
|
Chris@16
|
83 xml_log_formatter::test_unit_start( std::ostream& ostr, test_unit const& tu )
|
Chris@16
|
84 {
|
Chris@16
|
85 ostr << "<" << tu_type_name( tu ) << " name" << attr_value() << tu.p_name.get() << ">";
|
Chris@16
|
86 }
|
Chris@16
|
87
|
Chris@16
|
88 //____________________________________________________________________________//
|
Chris@16
|
89
|
Chris@16
|
90 void
|
Chris@16
|
91 xml_log_formatter::test_unit_finish( std::ostream& ostr, test_unit const& tu, unsigned long elapsed )
|
Chris@16
|
92 {
|
Chris@16
|
93 if( tu.p_type == tut_case )
|
Chris@16
|
94 ostr << "<TestingTime>" << elapsed << "</TestingTime>";
|
Chris@16
|
95
|
Chris@16
|
96 ostr << "</" << tu_type_name( tu ) << ">";
|
Chris@16
|
97 }
|
Chris@16
|
98
|
Chris@16
|
99 //____________________________________________________________________________//
|
Chris@16
|
100
|
Chris@16
|
101 void
|
Chris@16
|
102 xml_log_formatter::test_unit_skipped( std::ostream& ostr, test_unit const& tu )
|
Chris@16
|
103 {
|
Chris@16
|
104 ostr << "<" << tu_type_name( tu )
|
Chris@16
|
105 << " name" << attr_value() << tu.p_name.get()
|
Chris@16
|
106 << " skipped" << attr_value() << "yes"
|
Chris@16
|
107 << "/>";
|
Chris@16
|
108 }
|
Chris@16
|
109
|
Chris@16
|
110 //____________________________________________________________________________//
|
Chris@16
|
111
|
Chris@16
|
112 void
|
Chris@16
|
113 xml_log_formatter::log_exception( std::ostream& ostr, log_checkpoint_data const& checkpoint_data, execution_exception const& ex )
|
Chris@16
|
114 {
|
Chris@16
|
115 execution_exception::location const& loc = ex.where();
|
Chris@16
|
116
|
Chris@16
|
117 ostr << "<Exception file" << attr_value() << loc.m_file_name
|
Chris@16
|
118 << " line" << attr_value() << loc.m_line_num;
|
Chris@16
|
119
|
Chris@16
|
120 if( !loc.m_function.is_empty() )
|
Chris@16
|
121 ostr << " function" << attr_value() << loc.m_function;
|
Chris@16
|
122
|
Chris@16
|
123 ostr << ">" << cdata() << ex.what();
|
Chris@16
|
124
|
Chris@16
|
125 if( !checkpoint_data.m_file_name.is_empty() ) {
|
Chris@16
|
126 ostr << "<LastCheckpoint file" << attr_value() << checkpoint_data.m_file_name
|
Chris@16
|
127 << " line" << attr_value() << checkpoint_data.m_line_num
|
Chris@16
|
128 << ">"
|
Chris@16
|
129 << cdata() << checkpoint_data.m_message
|
Chris@16
|
130 << "</LastCheckpoint>";
|
Chris@16
|
131 }
|
Chris@16
|
132
|
Chris@16
|
133 ostr << "</Exception>";
|
Chris@16
|
134 }
|
Chris@16
|
135
|
Chris@16
|
136 //____________________________________________________________________________//
|
Chris@16
|
137
|
Chris@16
|
138 void
|
Chris@16
|
139 xml_log_formatter::log_entry_start( std::ostream& ostr, log_entry_data const& entry_data, log_entry_types let )
|
Chris@16
|
140 {
|
Chris@16
|
141 static literal_string xml_tags[] = { "Info", "Message", "Warning", "Error", "FatalError" };
|
Chris@16
|
142
|
Chris@16
|
143 m_curr_tag = xml_tags[let];
|
Chris@16
|
144 ostr << '<' << m_curr_tag
|
Chris@16
|
145 << BOOST_TEST_L( " file" ) << attr_value() << entry_data.m_file_name
|
Chris@16
|
146 << BOOST_TEST_L( " line" ) << attr_value() << entry_data.m_line_num
|
Chris@16
|
147 << BOOST_TEST_L( "><![CDATA[" );
|
Chris@16
|
148 }
|
Chris@16
|
149
|
Chris@16
|
150 //____________________________________________________________________________//
|
Chris@16
|
151
|
Chris@16
|
152 void
|
Chris@16
|
153 xml_log_formatter::log_entry_value( std::ostream& ostr, const_string value )
|
Chris@16
|
154 {
|
Chris@16
|
155 ostr << value;
|
Chris@16
|
156 }
|
Chris@16
|
157
|
Chris@16
|
158 //____________________________________________________________________________//
|
Chris@16
|
159
|
Chris@16
|
160 void
|
Chris@16
|
161 xml_log_formatter::log_entry_finish( std::ostream& ostr )
|
Chris@16
|
162 {
|
Chris@16
|
163 ostr << BOOST_TEST_L( "]]></" ) << m_curr_tag << BOOST_TEST_L( ">" );
|
Chris@16
|
164
|
Chris@16
|
165 m_curr_tag.clear();
|
Chris@16
|
166 }
|
Chris@16
|
167
|
Chris@16
|
168 //____________________________________________________________________________//
|
Chris@16
|
169
|
Chris@16
|
170 } // namespace output
|
Chris@16
|
171
|
Chris@16
|
172 } // namespace unit_test
|
Chris@16
|
173
|
Chris@16
|
174 } // namespace boost
|
Chris@16
|
175
|
Chris@16
|
176 //____________________________________________________________________________//
|
Chris@16
|
177
|
Chris@16
|
178 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
179
|
Chris@16
|
180 #endif // BOOST_TEST_XML_LOG_FORMATTER_IPP_020105GER
|