From b8390aeffb3947cdf4279387b19404d3c2e003ed Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 17 Jun 2017 21:24:07 +0300 Subject: [PATCH] Add more tests --- test/local_sp_test.cpp | 157 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 1 deletion(-) diff --git a/test/local_sp_test.cpp b/test/local_sp_test.cpp index 35a9af2..b31d498 100644 --- a/test/local_sp_test.cpp +++ b/test/local_sp_test.cpp @@ -1524,6 +1524,161 @@ static void shared_ptr_copy_assignment() BOOST_TEST( X::instances == 0 ); } +// shared_ptr_move assignment + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + +template static void empty_shared_ptr_move_assign_test() +{ + boost::local_shared_ptr p2; + + p2 = boost::shared_ptr(); + + BOOST_TEST_EQ( p2.get(), static_cast(0) ); + BOOST_TEST_EQ( p2.local_use_count(), 0 ); + + boost::local_shared_ptr p3; + + p3 = boost::shared_ptr(); + + BOOST_TEST_EQ( p3.get(), static_cast(0) ); + BOOST_TEST_EQ( p3.local_use_count(), 0 ); + + boost::local_shared_ptr p4; + + p4 = boost::shared_ptr(); + + BOOST_TEST_EQ( p4.get(), static_cast(0) ); + BOOST_TEST_EQ( p4.local_use_count(), 0 ); + + boost::local_shared_ptr p5; + + p5 = boost::shared_ptr(); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); +} + +template static void empty_shared_ptr_move_assign_test_() +{ + boost::local_shared_ptr p2( static_cast(0) ); + + p2 = boost::shared_ptr(); + + 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::shared_ptr(); + + 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::shared_ptr(); + + 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 = boost::shared_ptr(); + + BOOST_TEST_EQ( p5.get(), static_cast(0) ); + BOOST_TEST_EQ( p5.local_use_count(), 0 ); +} + +template static void test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr p2, boost::shared_ptr && p1 ) +{ + U* q = p1.get(); + long k = p1.use_count(); + + p2 = std::move( p1 ); + + BOOST_TEST_EQ( p2.get(), q ); + BOOST_TEST_EQ( p2.local_use_count(), 1 ); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.use_count() == 0 ); + + boost::shared_ptr p3( p2 ); + + BOOST_TEST_EQ( p3.get(), q ); + BOOST_TEST_EQ( p3.use_count(), k + 1 ); +} + +template static void null_shared_ptr_move_assign_test() +{ + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( static_cast(0) ) ); + + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( static_cast(0) ) ); +} + +template static void new_shared_ptr_move_assign_test() +{ + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::shared_ptr( new T() ) ); + + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( new T() ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( new T const() ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( new T volatile() ), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr( new T const volatile() ), boost::shared_ptr( new T() ) ); + + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move_assign( boost::local_shared_ptr(), boost::shared_ptr( new T() ) ); +} + +static void shared_ptr_move_assignment() +{ + empty_shared_ptr_move_assign_test(); + empty_shared_ptr_move_assign_test(); + empty_shared_ptr_move_assign_test_(); + empty_shared_ptr_move_assign_test(); + empty_shared_ptr_move_assign_test_(); + + BOOST_TEST( X::instances == 0 ); + + null_shared_ptr_move_assign_test(); + null_shared_ptr_move_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + new_shared_ptr_move_assign_test(); + new_shared_ptr_move_assign_test(); + + BOOST_TEST( X::instances == 0 ); +} + +#else + +static void shared_ptr_move_assignment() +{ +} + +#endif + // main int main() @@ -1546,7 +1701,7 @@ int main() move_assignment(); nullptr_assignment(); shared_ptr_copy_assignment(); - // shared_ptr_move_assignment(); + shared_ptr_move_assignment(); // unique_ptr_assignment(); default_reset();