Chris@16: // (C) Copyright Gennadiy Rozental 2002-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : simple minimal testing definitions and implementation Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_MINIMAL_HPP_071894GER Chris@16: #define BOOST_TEST_MINIMAL_HPP_071894GER Chris@16: Chris@16: #define BOOST_CHECK(exp) \ Chris@16: ( (exp) \ Chris@16: ? static_cast(0) \ Chris@16: : boost::minimal_test::report_error(#exp,__FILE__,__LINE__, BOOST_CURRENT_FUNCTION) ) Chris@16: Chris@16: #define BOOST_REQUIRE(exp) \ Chris@16: ( (exp) \ Chris@16: ? static_cast(0) \ Chris@16: : boost::minimal_test::report_critical_error(#exp,__FILE__,__LINE__,BOOST_CURRENT_FUNCTION)) Chris@16: Chris@16: #define BOOST_ERROR( msg_ ) \ Chris@16: boost::minimal_test::report_error( (msg_),__FILE__,__LINE__, BOOST_CURRENT_FUNCTION, true ) Chris@16: #define BOOST_FAIL( msg_ ) \ Chris@16: boost::minimal_test::report_critical_error( (msg_),__FILE__,__LINE__, BOOST_CURRENT_FUNCTION, true ) Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include // for exit codes#include // for exit codes Chris@16: #include // for BOOST_CURRENT_FUNCTION Chris@16: Chris@16: // STL Chris@16: #include // std::cerr, std::endl Chris@16: #include // std::string Chris@16: Chris@16: #include Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: int test_main( int argc, char* argv[] ); // prototype for users test_main() Chris@16: Chris@16: namespace boost { Chris@16: namespace minimal_test { Chris@16: Chris@16: typedef boost::unit_test::const_string const_string; Chris@16: Chris@16: inline unit_test::counter_t& errors_counter() { static unit_test::counter_t ec = 0; return ec; } Chris@16: Chris@16: inline void Chris@16: report_error( const char* msg, const char* file, int line, const_string func_name, bool is_msg = false ) Chris@16: { Chris@16: ++errors_counter(); Chris@16: std::cerr << file << "(" << line << "): "; Chris@16: Chris@16: if( is_msg ) Chris@16: std::cerr << msg; Chris@16: else Chris@16: std::cerr << "test " << msg << " failed"; Chris@16: Chris@16: if( func_name != "(unknown)" ) Chris@16: std::cerr << " in function: '" << func_name << "'"; Chris@16: Chris@16: std::cerr << std::endl; Chris@16: } Chris@16: Chris@16: inline void Chris@16: report_critical_error( const char* msg, const char* file, int line, const_string func_name, bool is_msg = false ) Chris@16: { Chris@16: report_error( msg, file, line, func_name, is_msg ); Chris@16: Chris@16: throw boost::execution_aborted(); Chris@16: } Chris@16: Chris@16: class caller { Chris@16: public: Chris@16: // constructor Chris@16: caller( int argc, char** argv ) Chris@16: : m_argc( argc ), m_argv( argv ) {} Chris@16: Chris@16: // execution monitor hook implementation Chris@16: int operator()() { return test_main( m_argc, m_argv ); } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: int m_argc; Chris@16: char** m_argv; Chris@16: }; // monitor Chris@16: Chris@16: } // namespace minimal_test Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: int BOOST_TEST_CALL_DECL main( int argc, char* argv[] ) Chris@16: { Chris@16: using namespace boost::minimal_test; Chris@16: Chris@16: try { Chris@16: ::boost::execution_monitor ex_mon; Chris@16: int run_result = ex_mon.execute( caller( argc, argv ) ); Chris@16: Chris@16: BOOST_CHECK( run_result == 0 || run_result == boost::exit_success ); Chris@16: } Chris@16: catch( boost::execution_exception const& exex ) { Chris@16: if( exex.code() != boost::execution_exception::no_error ) Chris@16: BOOST_ERROR( (std::string( "exception \"" ). Chris@16: append( exex.what().begin(), exex.what().end() ). Chris@16: append( "\" caught" ) ).c_str() ); Chris@16: std::cerr << "\n**** Testing aborted."; Chris@16: } Chris@16: Chris@16: if( boost::minimal_test::errors_counter() != 0 ) { Chris@16: std::cerr << "\n**** " << errors_counter() Chris@16: << " error" << (errors_counter() > 1 ? "s" : "" ) << " detected\n"; Chris@16: Chris@16: return boost::exit_test_failure; Chris@16: } Chris@16: Chris@16: std::cout << "\n**** no errors detected\n"; Chris@16: Chris@16: return boost::exit_success; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_MINIMAL_HPP_071894GER