📄 test_tools_test.cpp
字号:
// (C) Copyright Gennadiy Rozental 2001-2008.// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// See http://www.boost.org/libs/test for the library home page.//// File : $RCSfile$//// Version : $Revision: 49313 $//// Description : tests all Test Tools but output_test_stream// ***************************************************************************// Boost.Test#define BOOST_TEST_MAIN#include <boost/test/unit_test.hpp>#include <boost/test/unit_test_log.hpp>#include <boost/test/output_test_stream.hpp>#include <boost/test/execution_monitor.hpp>#include <boost/test/detail/unit_test_parameters.hpp>#include <boost/test/output/compiler_log_formatter.hpp>#include <boost/test/framework.hpp>#include <boost/test/detail/suppress_warnings.hpp>// Boost#include <boost/bind.hpp>// STL#include <iostream>#include <iomanip>using namespace boost::unit_test;using namespace boost::test_tools;//____________________________________________________________________________//#define CHECK_CRITICAL_TOOL_USAGE( tool_usage ) \{ \ bool throw_ = false; \ try { \ tool_usage; \ } catch( boost::execution_aborted const& ) { \ throw_ = true; \ } \ \ BOOST_CHECK_MESSAGE( throw_, "not aborted" ); \} \/**///____________________________________________________________________________//class bool_convertible{ struct Tester {};public: operator Tester*() const { return static_cast<Tester*>( 0 ) + 1; }};//____________________________________________________________________________//struct shorten_lf : public boost::unit_test::output::compiler_log_formatter{ void print_prefix( std::ostream& output, boost::unit_test::const_string, std::size_t line ) { output << line << ": "; }};//____________________________________________________________________________//std::string match_file_name( "./test_files/test_tools_test.pattern" );std::string save_file_name( "test_tools_test.pattern" );output_test_stream& ots(){ static boost::shared_ptr<output_test_stream> inst; if( !inst ) { inst.reset( framework::master_test_suite().argc <= 1 ? new output_test_stream( runtime_config::save_pattern() ? save_file_name : match_file_name, !runtime_config::save_pattern() ) : new output_test_stream( framework::master_test_suite().argv[1], !runtime_config::save_pattern() ) ); } return *inst;}//____________________________________________________________________________//#define TEST_CASE( name ) \void name ## _impl(); \void name ## _impl_defer(); \ \BOOST_AUTO_TEST_CASE( name ) \{ \ test_case* impl = make_test_case( &name ## _impl, #name ); \ \ unit_test_log.set_stream( ots() ); \ unit_test_log.set_threshold_level( log_nothing ); \ unit_test_log.set_formatter( new shorten_lf ); \ framework::run( impl ); \ \ unit_test_log.set_threshold_level( \ runtime_config::log_level() != invalid_log_level \ ? runtime_config::log_level() \ : log_all_errors ); \ unit_test_log.set_format( runtime_config::log_format());\ unit_test_log.set_stream( std::cout ); \ BOOST_CHECK( ots().match_pattern() ); \} \ \void name ## _impl() \{ \ unit_test_log.set_threshold_level( log_all_errors ); \ \ name ## _impl_defer(); \ \ unit_test_log.set_threshold_level( log_nothing ); \} \ \void name ## _impl_defer() \/**///____________________________________________________________________________//TEST_CASE( test_BOOST_WARN ){ unit_test_log.set_threshold_level( log_warnings ); BOOST_WARN( sizeof(int) == sizeof(short) ); unit_test_log.set_threshold_level( log_successful_tests ); BOOST_WARN( sizeof(unsigned char) == sizeof(char) );}//____________________________________________________________________________//TEST_CASE( test_BOOST_CHECK ){ // check correct behavior in if clause if( true ) BOOST_CHECK( true ); // check correct behavior in else clause if( false ) {} else BOOST_CHECK( true ); bool_convertible bc; BOOST_CHECK( bc ); int i=2; BOOST_CHECK( false ); BOOST_CHECK( 1==2 ); BOOST_CHECK( i==1 ); unit_test_log.set_threshold_level( log_successful_tests ); BOOST_CHECK( i==2 );}//____________________________________________________________________________//TEST_CASE( test_BOOST_REQUIRE ){ CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE( true ) ); CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE( false ) ); int j = 3; CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE( j > 5 ) ); unit_test_log.set_threshold_level( log_successful_tests ); CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE( j < 5 ) );}//____________________________________________________________________________//TEST_CASE( test_BOOST_WARN_MESSAGE ){ BOOST_WARN_MESSAGE( sizeof(int) == sizeof(short), "memory won't be used efficiently" ); int obj_size = 33; BOOST_WARN_MESSAGE( obj_size <= 8, "object size " << obj_size << " is too big to be efficiently passed by value" ); unit_test_log.set_threshold_level( log_successful_tests ); BOOST_WARN_MESSAGE( obj_size > 8, "object size " << obj_size << " is too small" );}//____________________________________________________________________________//boost::test_tools::predicate_resulttest_pred1(){ boost::test_tools::predicate_result res( false ); res.message() << "Some explanation"; return res;}TEST_CASE( test_BOOST_CHECK_MESSAGE ){ BOOST_CHECK_MESSAGE( 2+2 == 5, "Well, may be that what I believe in" ); BOOST_CHECK_MESSAGE( test_pred1(), "Checking predicate failed" ); unit_test_log.set_threshold_level( log_successful_tests ); BOOST_CHECK_MESSAGE( 2+2 == 4, "Could it fail?" ); int i = 1; int j = 2; std::string msg = "some explanation"; BOOST_CHECK_MESSAGE( i > j, "Comparing " << i << " and " << j << ": " << msg );}//____________________________________________________________________________//TEST_CASE( test_BOOST_REQUIRE_MESSAGE ){ CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE_MESSAGE( false, "Here we should stop" ) ); unit_test_log.set_threshold_level( log_successful_tests ); CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE_MESSAGE( true, "That's OK" ) );}//____________________________________________________________________________//TEST_CASE( test_BOOST_ERROR ){ BOOST_ERROR( "Fail to miss an error" );}//____________________________________________________________________________//TEST_CASE( test_BOOST_FAIL ){ CHECK_CRITICAL_TOOL_USAGE( BOOST_FAIL( "No! No! Show must go on." ) );}//____________________________________________________________________________//struct my_exception { explicit my_exception( int ec = 0 ) : m_error_code( ec ) {} int m_error_code;};bool is_critical( my_exception const& ex ) { return ex.m_error_code < 0; }TEST_CASE( test_BOOST_CHECK_THROW ){ int i=0; BOOST_CHECK_THROW( i++, my_exception ); unit_test_log.set_threshold_level( log_warnings ); BOOST_WARN_THROW( i++, my_exception ); unit_test_log.set_threshold_level( log_all_errors ); CHECK_CRITICAL_TOOL_USAGE( BOOST_REQUIRE_THROW( i++, my_exception ) ); unit_test_log.set_threshold_level( log_successful_tests ); BOOST_CHECK_THROW( throw my_exception(), my_exception ); // unreachable code warning is expected}//____________________________________________________________________________//TEST_CASE( test_BOOST_CHECK_EXCEPTION ){ BOOST_CHECK_EXCEPTION( throw my_exception( 1 ), my_exception, is_critical ); // unreachable code warning is expected unit_test_log.set_threshold_level( log_successful_tests ); BOOST_CHECK_EXCEPTION( throw my_exception( -1 ), my_exception, is_critical ); // unreachable code warning is expected}//____________________________________________________________________________//TEST_CASE( test_BOOST_CHECK_NO_THROW ){ int i=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -