diff --git a/test/local_sp_test.cpp b/test/local_sp_test.cpp index 69cbb30..35a9af2 100644 --- a/test/local_sp_test.cpp +++ b/test/local_sp_test.cpp @@ -35,31 +35,29 @@ long X::instances = 0; class incomplete; -template static void test_empty( boost::local_shared_ptr const & p ) -{ - BOOST_TEST( p? false: true ); - BOOST_TEST( !p ); - BOOST_TEST( p.get() == 0 ); - BOOST_TEST( p.local_use_count() == 0 ); -} - // default constructor static void default_constructor() { { boost::local_shared_ptr p; - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } { boost::local_shared_ptr p; - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } { boost::local_shared_ptr p; - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } BOOST_TEST( X::instances == 0 ); @@ -69,7 +67,8 @@ static void default_constructor() BOOST_TEST( X::instances == 0 ); - test_empty( p ); + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } } @@ -81,17 +80,23 @@ static void nullptr_constructor() { boost::local_shared_ptr p( nullptr ); - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } { boost::local_shared_ptr p( nullptr ); - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } { boost::local_shared_ptr p( nullptr ); - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } BOOST_TEST( X::instances == 0 ); @@ -101,7 +106,9 @@ static void nullptr_constructor() BOOST_TEST( X::instances == 0 ); - test_empty( p ); + + BOOST_TEST_EQ( p.get(), static_cast(0) ); + BOOST_TEST_EQ( p.local_use_count(), 0 ); } #endif @@ -333,19 +340,29 @@ static void nullptr_allocator_constructor() template static void empty_copy_test() { boost::local_shared_ptr p1; - test_empty( p1 ); + + BOOST_TEST_EQ( p1.get(), static_cast(0) ); + BOOST_TEST_EQ( p1.local_use_count(), 0 ); boost::local_shared_ptr p2( p1 ); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3( p1 ); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4( p1 ); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( p3 ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_copy( boost::local_shared_ptr const & p1 ) @@ -417,16 +434,24 @@ static void copy_constructor() template static void empty_move_test() { boost::local_shared_ptr p2(( boost::local_shared_ptr() )); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3(( boost::local_shared_ptr() )); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4(( boost::local_shared_ptr() )); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( std::move(p3) ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_move( boost::local_shared_ptr && p1 ) @@ -632,16 +657,24 @@ template static void empty_shared_ptr_copy_test() boost::shared_ptr p1; boost::local_shared_ptr p2( p1 ); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3( p1 ); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4( p1 ); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( p3 ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_shared_ptr_copy( boost::shared_ptr const & p1 ) @@ -714,16 +747,24 @@ static void shared_ptr_copy_constructor() template static void empty_shared_ptr_move_test() { boost::local_shared_ptr p2(( boost::shared_ptr() )); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3(( boost::shared_ptr() )); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4(( boost::shared_ptr() )); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( std::move(p3) ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_shared_ptr_move( boost::shared_ptr && p1 ) @@ -908,53 +949,73 @@ static void unique_ptr_constructor() template static void empty_copy_assign_test() { boost::local_shared_ptr p1; - test_empty( p1 ); + + BOOST_TEST_EQ( p1.get(), static_cast(0) ); + BOOST_TEST_EQ( p1.local_use_count(), 0 ); boost::local_shared_ptr p2; p2 = p1; - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3; p3 = p1; - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4; p4 = p1; - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5; p5 = p3; - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void empty_copy_assign_test_() { boost::local_shared_ptr p1; - test_empty( p1 ); + + BOOST_TEST_EQ( p1.get(), static_cast(0) ); + BOOST_TEST_EQ( p1.local_use_count(), 0 ); boost::local_shared_ptr p2( static_cast(0) ); p2 = p1; - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3( static_cast(0) ); p3 = p1; - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4( static_cast(0) ); p4 = p1; - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( static_cast(0) ); p5 = p3; - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_copy_assign( boost::local_shared_ptr p2, boost::local_shared_ptr const & p1 ) @@ -1047,22 +1108,30 @@ template static void empty_move_assign_test() boost::local_shared_ptr p2; p2 = boost::local_shared_ptr(); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3; p3 = boost::local_shared_ptr(); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4; p4 = boost::local_shared_ptr(); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5; p5 = std::move( p3 ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void empty_move_assign_test_() @@ -1070,22 +1139,30 @@ template static void empty_move_assign_test_() boost::local_shared_ptr p2( static_cast(0) ); p2 = boost::local_shared_ptr(); - test_empty( p2 ); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); boost::local_shared_ptr p3( static_cast(0) ); p3 = boost::local_shared_ptr(); - test_empty( p3 ); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); boost::local_shared_ptr p4( static_cast(0) ); p4 = boost::local_shared_ptr(); - test_empty( p4 ); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); boost::local_shared_ptr p5( static_cast(0) ); p5 = std::move( p3 ); - test_empty( p5 ); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); } template static void test_nonempty_move_assign( boost::local_shared_ptr p2, boost::local_shared_ptr && p1 ) @@ -1236,6 +1313,217 @@ static void nullptr_assignment() #endif +// default_reset + +template static void test_default_reset( boost::local_shared_ptr p1 ) +{ + p1.reset(); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.local_use_count() == 0 ); +} + +template static void empty_default_reset_test() +{ + test_default_reset( boost::local_shared_ptr() ); + test_default_reset( boost::local_shared_ptr() ); + test_default_reset( boost::local_shared_ptr() ); + test_default_reset( boost::local_shared_ptr() ); +} + +template static void null_default_reset_test() +{ + test_default_reset( boost::local_shared_ptr( static_cast(0) ) ); + test_default_reset( boost::local_shared_ptr( static_cast(0) ) ); + test_default_reset( boost::local_shared_ptr( static_cast(0) ) ); + test_default_reset( boost::local_shared_ptr( static_cast(0) ) ); +} + +template static void new_default_reset_test() +{ + test_default_reset( boost::local_shared_ptr( new T() ) ); + test_default_reset( boost::local_shared_ptr( new T const() ) ); + test_default_reset( boost::local_shared_ptr( new T volatile() ) ); + test_default_reset( boost::local_shared_ptr( new T const volatile() ) ); +} + +static void default_reset() +{ + empty_default_reset_test(); + empty_default_reset_test(); + empty_default_reset_test(); + empty_default_reset_test(); + + BOOST_TEST( X::instances == 0 ); + + null_default_reset_test(); + null_default_reset_test(); + + BOOST_TEST( X::instances == 0 ); + + new_default_reset_test(); + new_default_reset_test(); + + BOOST_TEST( X::instances == 0 ); +} + +// shared_ptr copy assignment + +template static void empty_shared_ptr_copy_assign_test() +{ + boost::shared_ptr sp1; + + BOOST_TEST_EQ( sp1.get(), static_cast(0) ); + BOOST_TEST_EQ( sp1.use_count(), 0 ); + + boost::local_shared_ptr p2; + + p2 = sp1; + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); + + boost::local_shared_ptr p3; + + p3 = sp1; + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); + + boost::local_shared_ptr p4; + + p4 = sp1; + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); + + boost::shared_ptr sp2( sp1 ); + boost::local_shared_ptr p5; + + p5 = sp2; + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); +} + +template static void empty_shared_ptr_copy_assign_test_() +{ + boost::shared_ptr sp1; + + BOOST_TEST_EQ( sp1.get(), static_cast(0) ); + BOOST_TEST_EQ( sp1.use_count(), 0 ); + + boost::local_shared_ptr p2( static_cast(0) ); + + p2 = sp1; + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); + + boost::local_shared_ptr p3( static_cast(0) ); + + p3 = sp1; + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); + + boost::local_shared_ptr p4( static_cast(0) ); + + p4 = sp1; + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); + + boost::shared_ptr sp2( sp1 ); + boost::local_shared_ptr p5( static_cast(0) ); + + p5 = sp2; + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); +} + +template static void test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr p2, boost::shared_ptr const & p1 ) +{ + long k = p1.use_count(); + + p2 = p1; + + BOOST_TEST( p2.get() == p1.get() ); + BOOST_TEST( p2.local_use_count() == 1 ); + BOOST_TEST( p1.use_count() == k + 1 ); + + p2.reset(); + + BOOST_TEST( p1.use_count() == k ); +} + +template static void null_shared_ptr_copy_assign_test() +{ + boost::shared_ptr p1( static_cast(0) ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); +} + +template static void new_shared_ptr_copy_assign_test() +{ + boost::shared_ptr p1( new T() ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( new T() ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( new T const() ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( new T volatile() ), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr( new T const volatile() ), p1 ); + + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_shared_ptr_copy_assign( boost::local_shared_ptr(), p1 ); +} + +static void shared_ptr_copy_assignment() +{ + empty_shared_ptr_copy_assign_test(); + empty_shared_ptr_copy_assign_test(); + empty_shared_ptr_copy_assign_test_(); + empty_shared_ptr_copy_assign_test(); + empty_shared_ptr_copy_assign_test_(); + + BOOST_TEST( X::instances == 0 ); + + null_shared_ptr_copy_assign_test(); + null_shared_ptr_copy_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + new_shared_ptr_copy_assign_test(); + new_shared_ptr_copy_assign_test(); + + BOOST_TEST( X::instances == 0 ); +} + // main int main() @@ -1257,10 +1545,11 @@ int main() copy_assignment(); move_assignment(); nullptr_assignment(); - // shared_ptr_copy_assignment(); + shared_ptr_copy_assignment(); // shared_ptr_move_assignment(); // unique_ptr_assignment(); + default_reset(); // pointer_reset(); // deleter_reset(); // allocator_reset();