📄 test_tools_test.cpp
字号:
// (C) Copyright Gennadiy Rozental 2001-2005.
// 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: test_tools_test.cpp,v $
//
// Version : $Revision: 1.43 $
//
// Description : tests all Test Tools but output_test_stream
// ***************************************************************************
// Boost.Test
#define BOOST_AUTO_TEST_MAIN
#include <boost/test/auto_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>
// 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(
auto_unit_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( auto_unit_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 )
{
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_result
test_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?" );
}
//____________________________________________________________________________//
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 );
}
//____________________________________________________________________________//
TEST_CASE( test_BOOST_CHECK_EXCEPTION )
{
BOOST_CHECK_EXCEPTION( throw my_exception( 1 ), my_exception, is_critical );
unit_test_log.set_threshold_level( log_successful_tests );
BOOST_CHECK_EXCEPTION( throw my_exception( -1 ), my_exception, is_critical );
}
//____________________________________________________________________________//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -