forked from boostorg/unordered
109 lines
2.5 KiB
C++
109 lines
2.5 KiB
C++
|
|
// Copyright Daniel James 2005. Use, modification, and distribution are
|
|
// subject to 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)
|
|
|
|
#include "./exception_test.hpp"
|
|
#include <boost/test/test_tools.hpp>
|
|
#include <cassert>
|
|
#include <cstdlib>
|
|
|
|
namespace test
|
|
{
|
|
// TODO: (Writing this here instead of the headers to avoid recompiling
|
|
// the world)
|
|
//
|
|
// There are some major design flaws with the exception testing code,
|
|
// apart from global variables that is.
|
|
|
|
namespace
|
|
{
|
|
int num_iterations = 0;
|
|
int current_iteration = 0;
|
|
int trigger_count = 0;
|
|
int max_trigger_count = 0;
|
|
bool failed = false;
|
|
bool exception_testing = false;
|
|
bool exceptions_active = false;
|
|
}
|
|
|
|
void exception_start(int n)
|
|
{
|
|
num_iterations = n;
|
|
current_iteration = 0;
|
|
max_trigger_count = 0;
|
|
trigger_count = 0;
|
|
failed = false;
|
|
exception_testing = true;
|
|
exceptions_active = true;
|
|
}
|
|
|
|
void exception_loop()
|
|
{
|
|
BOOST_CHECK(exceptions_active);
|
|
|
|
++current_iteration;
|
|
max_trigger_count = trigger_count;
|
|
exception_testing = failed;
|
|
exceptions_active = failed;
|
|
trigger_count = 0;
|
|
failed = false;
|
|
}
|
|
|
|
bool exception_loop_test()
|
|
{
|
|
if(exception_testing && current_iteration == num_iterations) {
|
|
BOOST_ERROR("Too many iterations");
|
|
return false;
|
|
}
|
|
else {
|
|
return exception_testing;
|
|
}
|
|
}
|
|
|
|
void exception_failure()
|
|
{
|
|
failed = true;
|
|
}
|
|
|
|
bool true_once()
|
|
{
|
|
++trigger_count;
|
|
return !exception_testing || trigger_count > max_trigger_count;
|
|
}
|
|
|
|
bool exception_trigger_test()
|
|
{
|
|
++trigger_count;
|
|
return exception_testing && exceptions_active
|
|
&& trigger_count > max_trigger_count;
|
|
}
|
|
|
|
void exception_trigger()
|
|
{
|
|
if(exception_trigger_test()) throw exception();
|
|
}
|
|
|
|
void exception_trigger(char const* message)
|
|
{
|
|
if(exception_trigger_test()) throw exception(message);
|
|
}
|
|
|
|
bool exceptions_activate(bool value)
|
|
{
|
|
bool old = exceptions_active;
|
|
exceptions_active = value;
|
|
return old;
|
|
}
|
|
|
|
exception_control::exception_control(bool value)
|
|
: old_value(exceptions_activate(value))
|
|
{
|
|
}
|
|
|
|
exception_control::~exception_control()
|
|
{
|
|
exceptions_activate(old_value);
|
|
}
|
|
}
|