allocator_test.cpp:

- Remove partial specialization-specific code

function_test.cpp:
  - Uses BOOST_FUNCTION_NO_DEPRECATED
  - Use only the new syntax
  - Test the allocator parameter

deprecated_syntax_test.cpp:
  - Test the deprecated syntax


[SVN r14684]
This commit is contained in:
Douglas Gregor
2002-08-05 06:13:32 +00:00
parent 694ebbb301
commit 232069aa00
3 changed files with 725 additions and 57 deletions

View File

@ -14,6 +14,7 @@
// For more information, see http://www.boost.org
#define BOOST_INCLUDE_MAIN
#define BOOST_FUNCTION_NO_DEPRECATED
#include <boost/test/test_tools.hpp>
#include <boost/function.hpp>
#include <functional>
@ -21,8 +22,7 @@
#include <string>
using namespace boost;
using std::string;
using std::negate;
using namespace std;
int global_int;
@ -56,7 +56,7 @@ struct add_to_obj
static void
test_zero_args()
{
typedef function<void> func_void_type;
typedef function<void ()> func_void_type;
write_five_obj five;
write_three_obj three;
@ -480,8 +480,8 @@ test_zero_args()
// Const vs. non-const
write_const_1_nonconst_2 one_or_two;
const function<void> v7(one_or_two);
function <void> v8(one_or_two);
const function<void ()> v7(one_or_two);
function<void ()> v8(one_or_two);
global_int = 0;
v7();
@ -492,7 +492,7 @@ test_zero_args()
BOOST_TEST(global_int == 2);
// Test return values
typedef function<int> func_int_type;
typedef function<int ()> func_int_type;
generate_five_obj gen_five;
generate_three_obj gen_three;
@ -510,7 +510,7 @@ test_zero_args()
BOOST_TEST(!i0);
// Test return values with compatible types
typedef function<long> func_long_type;
typedef function<long ()> func_long_type;
func_long_type i1(gen_five);
BOOST_TEST(i1() == 5);
@ -530,44 +530,44 @@ test_one_arg()
{
negate<int> neg;
function<int, int> f1(neg);
function<int (int)> f1(neg);
BOOST_TEST(f1(5) == -5);
function<string, string> id(&identity_str);
function<string (string)> id(&identity_str);
BOOST_TEST(id("str") == "str");
function<std::string, const char*> id2(&identity_str);
function<string (const char*)> id2(&identity_str);
BOOST_TEST(id2("foo") == "foo");
add_to_obj add_to(5);
function<int, int> f2(add_to);
function<int (int)> f2(add_to);
BOOST_TEST(f2(3) == 8);
const function<int, int> cf2(add_to);
const function<int (int)> cf2(add_to);
BOOST_TEST(cf2(3) == 8);
}
static void
test_two_args()
{
function<string, const string&, const string&> cat(&string_cat);
function<string (const string&, const string&)> cat(&string_cat);
BOOST_TEST(cat("str", "ing") == "string");
function<int, short, short> sum(&sum_ints);
function<int (short, short)> sum(&sum_ints);
BOOST_TEST(sum(2, 3) == 5);
}
static void
test_emptiness()
{
function<float> f1;
function<float ()> f1;
BOOST_TEST(f1.empty());
function<float> f2;
function<float ()> f2;
f2 = f1;
BOOST_TEST(f2.empty());
function<double> f3;
function<double ()> f3;
f3 = f2;
BOOST_TEST(f3.empty());
}
@ -584,7 +584,7 @@ struct X {
static void
test_member_functions()
{
boost::function<int, X*> f1(&X::twice);
boost::function<int (X*)> f1(&X::twice);
X one(1);
X five(5);
@ -592,13 +592,13 @@ test_member_functions()
BOOST_TEST(f1(&one) == 2);
BOOST_TEST(f1(&five) == 10);
boost::function<int, X*> f1_2;
boost::function<int (X*)> f1_2;
f1_2 = &X::twice;
BOOST_TEST(f1_2(&one) == 2);
BOOST_TEST(f1_2(&five) == 10);
boost::function<int, X&, int> f2(&X::plus);
boost::function<int (X&, int)> f2(&X::plus);
BOOST_TEST(f2(one, 3) == 4);
BOOST_TEST(f2(five, 4) == 9);
}
@ -610,12 +610,12 @@ struct add_with_throw_on_copy {
add_with_throw_on_copy(const add_with_throw_on_copy&)
{
throw std::runtime_error("But this CAN'T throw");
throw runtime_error("But this CAN'T throw");
}
add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
{
throw std::runtime_error("But this CAN'T throw");
throw runtime_error("But this CAN'T throw");
}
};
@ -624,39 +624,74 @@ test_ref()
{
add_with_throw_on_copy atc;
try {
boost::function<int, int, int> f(ref(atc));
boost::function<int (int, int)> f(ref(atc));
BOOST_TEST(f(1, 3) == 4);
}
catch(std::runtime_error e) {
catch(runtime_error e) {
BOOST_ERROR("Nonthrowing constructor threw an exception");
}
}
static void
test_new_syntax()
static int alloc_count = 0;
static int dealloc_count = 0;
template<typename T>
struct counting_allocator : public allocator<T>
{
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
write_five_obj five;
typedef void F2();
function<F2> v2;
template<typename U>
struct rebind
{
typedef counting_allocator<U> other;
};
// Assignment
v2 = five;
BOOST_TEST(!v2.empty());
T* allocate(size_t n)
{
alloc_count++;
return allocator<T>::allocate(n);
}
// Invocation
global_int = 0;
v2();
void deallocate(T* p, size_t n)
{
dealloc_count++;
allocator<T>::deallocate(p, n);
}
};
BOOST_TEST(global_int == 5);
typedef string Fcat(const string& x, const string& y);
function<Fcat> cat(&string_cat);
BOOST_TEST(cat("str", "ing") == "string");
static int do_minus(int x, int y) { return x-y; }
typedef int Fsum(short lhs, short rhs);
function<Fsum> sum(&sum_ints);
BOOST_TEST(sum(2, 3) == 5);
#endif
struct DoNothing
{
void operator()() const {}
};
static void do_nothing() {}
static void test_allocator()
{
boost::function<int (int, int), counting_allocator<int> > f;
f = plus<int>();
f.clear();
BOOST_TEST(alloc_count == 1);
BOOST_TEST(dealloc_count == 1);
alloc_count = 0;
dealloc_count = 0;
f = &do_minus;
f.clear();
boost::function<void (), counting_allocator<int> > fv;
alloc_count = 0;
dealloc_count = 0;
fv = DoNothing();
fv.clear();
BOOST_TEST(alloc_count == 1);
BOOST_TEST(dealloc_count == 1);
alloc_count = 0;
dealloc_count = 0;
fv = &do_nothing;
fv.clear();
}
int test_main(int, char* [])
@ -667,7 +702,7 @@ int test_main(int, char* [])
test_emptiness();
test_member_functions();
test_ref();
test_new_syntax();
test_allocator();
return 0;
}