annotate DEPENDENCIES/generic/include/boost/test/impl/logged_expectations.ipp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
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