📄 test_tools.ipp
字号:
// (C) Copyright Gennadiy Rozental 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.ipp,v $
//
// Version : $Revision: 1.9 $
//
// Description : supplies offline implementation for the Test Tools
// ***************************************************************************
#ifndef BOOST_TEST_TEST_TOOLS_IPP_012205GER
#define BOOST_TEST_TEST_TOOLS_IPP_012205GER
// Boost.Test
#include <boost/test/test_tools.hpp>
#include <boost/test/unit_test_log.hpp>
#include <boost/test/output_test_stream.hpp>
#include <boost/test/framework.hpp>
#include <boost/test/execution_monitor.hpp> // execution_aborted
// Boost
#include <boost/config.hpp>
// STL
#include <fstream>
#include <string>
#include <cstring>
#include <cctype>
#include <cwchar>
#ifdef BOOST_STANDARD_IOSTREAMS
#include <ios>
#endif
// !! should we use #include <cstdarg>
#include <stdarg.h>
#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
# ifdef BOOST_NO_STDC_NAMESPACE
namespace std { using ::strcmp; using ::strlen; using ::isprint; }
#if !defined( BOOST_NO_CWCHAR )
namespace std { using ::wcscmp; }
#endif
# endif
namespace boost {
namespace test_tools {
namespace tt_detail {
// ************************************************************************** //
// ************** TOOL BOX Implementation ************** //
// ************************************************************************** //
void
check_impl( predicate_result const& pr, wrap_stringstream& check_descr,
const_string file_name, std::size_t line_num,
tool_level tl, check_type ct,
std::size_t num_of_args, ... )
{
using namespace unit_test;
if( !!pr )
tl = PASS;
log_level ll;
char const* prefix;
char const* suffix;
if( tl == PASS )
framework::assertion_result( true );
else if( tl != WARN )
framework::assertion_result( false );
switch( tl ) {
case PASS:
ll = log_successful_tests;
prefix = "check ";
suffix = " passed";
break;
case WARN:
ll = log_warnings;
prefix = "condition ";
suffix = " is not satisfied";
break;
case CHECK:
ll = log_all_errors;
prefix = "check ";
suffix = " failed";
break;
case REQUIRE:
ll = log_fatal_errors;
prefix = "critical test ";
suffix = " failed";
break;
default:
return;
}
switch( ct ) {
case CHECK_PRED:
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< ll << prefix << check_descr.str() << suffix;
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
case CHECK_MSG:
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num ) << ll;
if( tl == PASS )
unit_test_log << prefix << "'" << check_descr.str() << "'" << suffix;
else
unit_test_log << check_descr.str();
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
case MSG_ONLY:
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< log_messages << check_descr.str() << unit_test::log::end();
break;
case SET_CHECKPOINT:
unit_test_log << unit_test::log::file( file_name ) << unit_test::log::line( line_num ) << unit_test::log::checkpoint( check_descr.str() );
break;
case CHECK_EQUAL: {
va_list args;
va_start( args, num_of_args );
char const* arg1_descr = va_arg( args, char const* );
char const* arg1_val = va_arg( args, char const* );
char const* arg2_descr = va_arg( args, char const* );
char const* arg2_val = va_arg( args, char const* );
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< ll << prefix << arg1_descr << " == " << arg2_descr << suffix;
if( tl != PASS )
unit_test_log << " [" << arg1_val << " != " << arg2_val << "]" ;
va_end( args );
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
case CHECK_CLOSE: {
va_list args;
va_start( args, num_of_args );
char const* arg1_descr = va_arg( args, char const* );
char const* arg1_val = va_arg( args, char const* );
char const* arg2_descr = va_arg( args, char const* );
char const* arg2_val = va_arg( args, char const* );
/* toler_descr = */ va_arg( args, char const* );
char const* toler_val = va_arg( args, char const* );
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num ) << ll;
unit_test_log << "difference between " << arg1_descr << "{" << arg1_val << "}"
<< " and " << arg2_descr << "{" << arg2_val << "}"
<< ( tl == PASS ? " doesn't exceed " : " exceeds " )
<< toler_val << "%",
va_end( args );
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
case CHECK_SMALL: {
va_list args;
va_start( args, num_of_args );
char const* arg1_descr = va_arg( args, char const* );
char const* arg1_val = va_arg( args, char const* );
/* toler_descr = */ va_arg( args, char const* );
char const* toler_val = va_arg( args, char const* );
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num ) << ll;
unit_test_log << "absolute value of " << arg1_descr << "{" << arg1_val << "}"
<< ( tl == PASS ? " doesn't exceed " : " exceeds " )
<< toler_val,
va_end( args );
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
case CHECK_PRED_WITH_ARGS: {
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< ll << prefix << check_descr.str();
// print predicate call description
{
va_list args;
va_start( args, num_of_args );
unit_test_log << "( ";
for( std::size_t i = 0; i < num_of_args; ++i ) {
unit_test_log << va_arg( args, char const* );
va_arg( args, char const* ); // skip argument value;
if( i != num_of_args-1 )
unit_test_log << ", ";
}
unit_test_log << " )" << suffix;
va_end( args );
}
if( tl != PASS ) {
va_list args;
va_start( args, num_of_args );
unit_test_log << " for ( ";
for( std::size_t i = 0; i < num_of_args; ++i ) {
va_arg( args, char const* ); // skip argument description;
unit_test_log << va_arg( args, char const* );
if( i != num_of_args-1 )
unit_test_log << ", ";
}
unit_test_log << " )";
va_end( args );
}
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
case CHECK_EQUAL_COLL: {
va_list args;
va_start( args, num_of_args );
char const* left_begin_descr = va_arg( args, char const* );
char const* left_end_descr = va_arg( args, char const* );
char const* right_begin_descr = va_arg( args, char const* );
char const* right_end_descr = va_arg( args, char const* );
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< ll << prefix
<< "{ " << left_begin_descr << ", " << left_end_descr << " } == { "
<< right_begin_descr << ", " << right_end_descr << " }"
<< suffix;
va_end( args );
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
case CHECK_BITWISE_EQUAL: {
va_list args;
va_start( args, num_of_args );
char const* left_descr = va_arg( args, char const* );
char const* right_descr = va_arg( args, char const* );
unit_test_log << unit_test::log::begin() << unit_test::log::file( file_name ) << unit_test::log::line( line_num )
<< ll << prefix << left_descr << " =.= " << right_descr << suffix;
va_end( args );
if( !pr.has_empty_message() )
unit_test_log << ". " << pr.message();
unit_test_log << unit_test::log::end();
break;
}
}
if( tl == REQUIRE ) {
framework::test_unit_aborted();
throw execution_aborted();
}
}
//____________________________________________________________________________//
predicate_result
equal_impl( char const* left, char const* right )
{
return (left && right) ? std::strcmp( left, right ) == 0 : (left == right);
}
//____________________________________________________________________________//
#if !defined( BOOST_NO_CWCHAR )
predicate_result
equal_impl( wchar_t const* left, wchar_t const* right )
{
return (left && right) ? std::wcscmp( left, right ) == 0 : (left == right);
}
#endif // !defined( BOOST_NO_CWCHAR )
//____________________________________________________________________________//
bool
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -