Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2005-2008.
|
Chris@16
|
2 // Use, modification, and distribution are subject to the
|
Chris@16
|
3 // Boost Software License, ELOG_VER 1.0. (See accompanying file
|
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 : Facilities to perform interaction based testng of logged expectations
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_LOGGED_EXPECTATIONS_IPP_120905GER
|
Chris@16
|
16 #define BOOST_TEST_LOGGED_EXPECTATIONS_IPP_120905GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost.Test
|
Chris@16
|
19 #include <boost/test/detail/config.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 #if BOOST_TEST_SUPPORT_INTERACTION_TESTING
|
Chris@16
|
22
|
Chris@16
|
23 #include <boost/test/detail/global_typedef.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/test/utils/callback.hpp>
|
Chris@16
|
26 #include <boost/test/utils/iterator/token_iterator.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 #include <boost/test/interaction_based.hpp>
|
Chris@16
|
29 #include <boost/test/test_tools.hpp>
|
Chris@16
|
30
|
Chris@16
|
31 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
32
|
Chris@16
|
33 // Boost
|
Chris@16
|
34 #include <boost/lexical_cast.hpp>
|
Chris@16
|
35
|
Chris@16
|
36 // STL
|
Chris@16
|
37 #include <fstream>
|
Chris@16
|
38
|
Chris@16
|
39 //____________________________________________________________________________//
|
Chris@16
|
40
|
Chris@16
|
41 namespace boost {
|
Chris@16
|
42
|
Chris@16
|
43 using namespace ::boost::unit_test;
|
Chris@16
|
44
|
Chris@16
|
45 namespace itest {
|
Chris@16
|
46
|
Chris@16
|
47 // ************************************************************************** //
|
Chris@16
|
48 // ************** logged expectation test implementation ************** //
|
Chris@16
|
49 // ************************************************************************** //
|
Chris@16
|
50
|
Chris@16
|
51 struct expectations_logger : itest::manager {
|
Chris@16
|
52 // Constructor
|
Chris@16
|
53 expectations_logger( const_string log_file_name, bool test_or_log );
|
Chris@16
|
54
|
Chris@16
|
55 virtual bool decision_point( const_string, std::size_t );
|
Chris@16
|
56 virtual unsigned enter_scope( const_string, std::size_t, const_string scope_name );
|
Chris@16
|
57 virtual void allocated( const_string, std::size_t, void*, std::size_t s );
|
Chris@16
|
58 virtual void data_flow( const_string d );
|
Chris@16
|
59 virtual std::string return_value( const_string default_value );
|
Chris@16
|
60
|
Chris@16
|
61 private:
|
Chris@16
|
62 // Data members
|
Chris@16
|
63 bool m_test_or_log;
|
Chris@16
|
64 std::fstream m_log_file;
|
Chris@16
|
65 };
|
Chris@16
|
66
|
Chris@16
|
67 literal_string ELOG_VER = "1.0";
|
Chris@16
|
68 literal_string CLMN_SEP = "|";
|
Chris@16
|
69 static const char LINE_SEP = '\n';
|
Chris@16
|
70
|
Chris@16
|
71 literal_string FILE_SIG = "ELOG";
|
Chris@16
|
72 literal_string SCOPE_SIG = "SCOPE";
|
Chris@16
|
73 literal_string ALLOC_SIG = "ALLOC";
|
Chris@16
|
74 literal_string DP_SIG = "SWITCH";
|
Chris@16
|
75 literal_string DATA_SIG = "DATA";
|
Chris@16
|
76 literal_string RETURN_SIG = "RETURN";
|
Chris@16
|
77
|
Chris@16
|
78 //____________________________________________________________________________//
|
Chris@16
|
79
|
Chris@16
|
80 expectations_logger::expectations_logger( const_string log_file_name, bool test_or_log )
|
Chris@16
|
81 : m_test_or_log( test_or_log )
|
Chris@16
|
82 {
|
Chris@16
|
83 BOOST_REQUIRE_MESSAGE( !log_file_name.is_empty(), "Empty expectations log file name" );
|
Chris@16
|
84
|
Chris@16
|
85 m_log_file.open( log_file_name.begin(), test_or_log ? std::ios::in : std::ios::out );
|
Chris@16
|
86
|
Chris@16
|
87 BOOST_REQUIRE_MESSAGE( m_log_file.is_open(),
|
Chris@16
|
88 "Can't open expectations log file " << log_file_name
|
Chris@16
|
89 << " for " << ( m_test_or_log ? "reading" : "writing") );
|
Chris@16
|
90
|
Chris@16
|
91 if( m_test_or_log ) {
|
Chris@16
|
92 std::string line;
|
Chris@16
|
93
|
Chris@16
|
94 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
95
|
Chris@16
|
96 const_string cline( line );
|
Chris@16
|
97 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
98
|
Chris@16
|
99 BOOST_CHECK_EQUAL( *tit, FILE_SIG );
|
Chris@16
|
100 ++tit;
|
Chris@16
|
101 BOOST_CHECK_EQUAL( *tit, ELOG_VER );
|
Chris@16
|
102 }
|
Chris@16
|
103 else {
|
Chris@16
|
104 m_log_file << FILE_SIG << CLMN_SEP << ELOG_VER << LINE_SEP;
|
Chris@16
|
105 }
|
Chris@16
|
106 }
|
Chris@16
|
107
|
Chris@16
|
108 //____________________________________________________________________________//
|
Chris@16
|
109
|
Chris@16
|
110 bool
|
Chris@16
|
111 expectations_logger::decision_point( const_string, std::size_t )
|
Chris@16
|
112 {
|
Chris@16
|
113 if( m_test_or_log ) {
|
Chris@16
|
114 std::string line;
|
Chris@16
|
115
|
Chris@16
|
116 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
117
|
Chris@16
|
118 const_string cline( line );
|
Chris@16
|
119 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
120
|
Chris@16
|
121 BOOST_CHECK_EQUAL( *tit, DP_SIG ); ++tit;
|
Chris@16
|
122 return lexical_cast<bool>( *tit );
|
Chris@16
|
123 }
|
Chris@16
|
124 else {
|
Chris@16
|
125 m_log_file << DP_SIG << CLMN_SEP << std::boolalpha << true << LINE_SEP;
|
Chris@16
|
126
|
Chris@16
|
127 return true;
|
Chris@16
|
128 }
|
Chris@16
|
129 }
|
Chris@16
|
130
|
Chris@16
|
131 //____________________________________________________________________________//
|
Chris@16
|
132
|
Chris@16
|
133 unsigned
|
Chris@16
|
134 expectations_logger::enter_scope( const_string, std::size_t, const_string scope_name )
|
Chris@16
|
135 {
|
Chris@16
|
136 if( m_test_or_log ) {
|
Chris@16
|
137 std::string line;
|
Chris@16
|
138
|
Chris@16
|
139 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
140
|
Chris@16
|
141 const_string cline( line );
|
Chris@16
|
142 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
143
|
Chris@16
|
144 BOOST_CHECK_EQUAL( *tit, SCOPE_SIG ); ++tit;
|
Chris@16
|
145 BOOST_CHECK_EQUAL( *tit, scope_name );
|
Chris@16
|
146 }
|
Chris@16
|
147 else {
|
Chris@16
|
148 m_log_file << SCOPE_SIG << CLMN_SEP << scope_name << LINE_SEP;
|
Chris@16
|
149 }
|
Chris@16
|
150
|
Chris@16
|
151 return 0;
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 //____________________________________________________________________________//
|
Chris@16
|
155
|
Chris@16
|
156 void
|
Chris@16
|
157 expectations_logger::allocated( const_string, std::size_t, void*, std::size_t s )
|
Chris@16
|
158 {
|
Chris@16
|
159 if( m_test_or_log ) {
|
Chris@16
|
160 std::string line;
|
Chris@16
|
161
|
Chris@16
|
162 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
163
|
Chris@16
|
164 const_string cline( line );
|
Chris@16
|
165 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
166
|
Chris@16
|
167 BOOST_CHECK_EQUAL( *tit, ALLOC_SIG ); ++tit;
|
Chris@16
|
168 BOOST_CHECK_EQUAL( lexical_cast<std::size_t>( *tit ), s );
|
Chris@16
|
169 }
|
Chris@16
|
170 else {
|
Chris@16
|
171 m_log_file << ALLOC_SIG << CLMN_SEP << s << LINE_SEP;
|
Chris@16
|
172 }
|
Chris@16
|
173 }
|
Chris@16
|
174
|
Chris@16
|
175 //____________________________________________________________________________//
|
Chris@16
|
176
|
Chris@16
|
177 void
|
Chris@16
|
178 expectations_logger::data_flow( const_string d )
|
Chris@16
|
179 {
|
Chris@16
|
180 if( m_test_or_log ) {
|
Chris@16
|
181 std::string line;
|
Chris@16
|
182
|
Chris@16
|
183 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
184
|
Chris@16
|
185 const_string cline( line );
|
Chris@16
|
186 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
187
|
Chris@16
|
188 BOOST_CHECK_EQUAL( *tit, DATA_SIG ); ++tit;
|
Chris@16
|
189 BOOST_CHECK_EQUAL( *tit, d );
|
Chris@16
|
190 }
|
Chris@16
|
191 else {
|
Chris@16
|
192 m_log_file << DATA_SIG << CLMN_SEP << d << LINE_SEP;
|
Chris@16
|
193 }
|
Chris@16
|
194 }
|
Chris@16
|
195
|
Chris@16
|
196 //____________________________________________________________________________//
|
Chris@16
|
197
|
Chris@16
|
198 std::string
|
Chris@16
|
199 expectations_logger::return_value( const_string default_value )
|
Chris@16
|
200 {
|
Chris@16
|
201 if( m_test_or_log ) {
|
Chris@16
|
202 std::string line;
|
Chris@16
|
203
|
Chris@16
|
204 std::getline( m_log_file, line, LINE_SEP );
|
Chris@16
|
205
|
Chris@16
|
206 const_string cline( line );
|
Chris@16
|
207 string_token_iterator tit( cline, (dropped_delimeters = CLMN_SEP, kept_delimeters = dt_none));
|
Chris@16
|
208
|
Chris@16
|
209 BOOST_CHECK_EQUAL( *tit, RETURN_SIG ); ++tit;
|
Chris@16
|
210
|
Chris@16
|
211 return std::string( tit->begin(), tit->size() );
|
Chris@16
|
212 }
|
Chris@16
|
213 else {
|
Chris@16
|
214 m_log_file << RETURN_SIG << CLMN_SEP << default_value << LINE_SEP;
|
Chris@16
|
215
|
Chris@16
|
216 return std::string();
|
Chris@16
|
217 }
|
Chris@16
|
218 }
|
Chris@16
|
219
|
Chris@16
|
220 //____________________________________________________________________________//
|
Chris@16
|
221
|
Chris@16
|
222 // ************************************************************************** //
|
Chris@16
|
223 // ************** logged expectations test ************** //
|
Chris@16
|
224 // ************************************************************************** //
|
Chris@16
|
225
|
Chris@16
|
226 void BOOST_TEST_DECL
|
Chris@16
|
227 logged_expectations( callback0<> const& F, const_string log_file_name, bool test_or_log )
|
Chris@16
|
228 {
|
Chris@16
|
229 expectations_logger el( log_file_name, test_or_log );
|
Chris@16
|
230
|
Chris@16
|
231 F();
|
Chris@16
|
232 }
|
Chris@16
|
233
|
Chris@16
|
234 //____________________________________________________________________________//
|
Chris@16
|
235
|
Chris@16
|
236 } // namespace itest
|
Chris@16
|
237
|
Chris@16
|
238 } // namespace boost
|
Chris@16
|
239
|
Chris@16
|
240 //____________________________________________________________________________//
|
Chris@16
|
241
|
Chris@16
|
242 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
243
|
Chris@16
|
244 #endif // not ancient compiler
|
Chris@16
|
245
|
Chris@16
|
246 #endif // BOOST_TEST_LOGGED_EXPECTATIONS_IPP_120905GER
|