mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
111 lines
2.8 KiB
C++
111 lines
2.8 KiB
C++
// http://turtle.sourceforge.net
|
|
//
|
|
// Copyright Mathieu Champlon 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)
|
|
|
|
#ifndef MOCK_TEST_MOCK_ERROR_HPP_INCLUDED
|
|
#define MOCK_TEST_MOCK_ERROR_HPP_INCLUDED
|
|
|
|
#define MOCK_ERROR_POLICY mock_error
|
|
#include <turtle/detail/singleton.hpp>
|
|
#include <boost/lexical_cast.hpp>
|
|
#include <boost/test/unit_test.hpp>
|
|
#include <stdexcept>
|
|
|
|
struct mock_error_data : mock::detail::singleton< mock_error_data >
|
|
{
|
|
void reset()
|
|
{
|
|
call_count = 0;
|
|
error_count = 0;
|
|
last_message.clear();
|
|
last_context.clear();
|
|
}
|
|
bool verify()
|
|
{
|
|
return error_count == 0;
|
|
}
|
|
|
|
void call()
|
|
{
|
|
last_context.clear();
|
|
last_message.clear();
|
|
++call_count;
|
|
}
|
|
void fail( const std::string& message,
|
|
const std::string& context,
|
|
const char* file, int line )
|
|
{
|
|
last_context = context;
|
|
last_message = message;
|
|
last_file = file;
|
|
last_line = line;
|
|
++error_count;
|
|
}
|
|
|
|
int error_count;
|
|
int call_count;
|
|
std::string last_message;
|
|
std::string last_context;
|
|
std::string last_file;
|
|
int last_line;
|
|
|
|
MOCK_SINGLETON_CONS( mock_error_data );
|
|
};
|
|
|
|
template< typename Result >
|
|
struct mock_error
|
|
{
|
|
static Result abort()
|
|
{
|
|
throw std::runtime_error( "aborted" );
|
|
}
|
|
|
|
static void pass( const char* /*file*/, int /*line*/ )
|
|
{}
|
|
|
|
template< typename Context >
|
|
static void call( const Context& /*context*/,
|
|
const char* /*file*/, int /*line*/ )
|
|
{
|
|
mock_error_data::inst().call();
|
|
}
|
|
|
|
template< typename Context >
|
|
static void fail( const std::string& message, const Context& context,
|
|
const char* file = "", int line = 0 )
|
|
{
|
|
mock_error_data::inst().fail( message,
|
|
boost::lexical_cast< std::string >( context ), file, line );
|
|
}
|
|
};
|
|
|
|
struct mock_error_fixture
|
|
{
|
|
mock_error_fixture()
|
|
{
|
|
mock_error_data::inst().reset();
|
|
}
|
|
~mock_error_fixture()
|
|
{
|
|
BOOST_CHECK( mock_error_data::inst().verify() );
|
|
BOOST_CHECK_EQUAL( 0, mock_error_data::inst().call_count );
|
|
}
|
|
};
|
|
|
|
#define CHECK_CALLS( calls ) \
|
|
BOOST_CHECK_EQUAL( calls, mock_error_data::inst().call_count ); \
|
|
mock_error_data::inst().call_count = 0;
|
|
#define CHECK_ERROR( expr, error, calls, context ) \
|
|
BOOST_CHECK( mock_error_data::inst().verify() ); \
|
|
try { expr; } catch( ... ) {} \
|
|
BOOST_CHECK_EQUAL( 1, mock_error_data::inst().error_count ); \
|
|
BOOST_CHECK_EQUAL( error, mock_error_data::inst().last_message ); \
|
|
BOOST_CHECK_EQUAL( context, mock_error_data::inst().last_context ); \
|
|
CHECK_CALLS( calls ); \
|
|
mock_error_data::inst().reset();
|
|
|
|
#endif // MOCK_TEST_MOCK_ERROR_HPP_INCLUDED
|