diff options
| author | Apollon Oikonomopoulos <apoikos@debian.org> | 2016-01-14 00:10:06 +0200 |
|---|---|---|
| committer | Apollon Oikonomopoulos <apollon@skroutz.gr> | 2016-01-14 00:10:06 +0200 |
| commit | 374e1947abcd3e127a2a613aff73ecffdb9199ea (patch) | |
| tree | d83973c3c9802450acd5b5e86fe0d4e8e60a3a1b /src/mongo/base/owned_pointer_vector_test.cpp | |
| parent | 65585c90b12d6523bea75a2aebaae2a2fdf9e641 (diff) | |
Imported Upstream version 2.6.11upstream/2.6.11
Diffstat (limited to 'src/mongo/base/owned_pointer_vector_test.cpp')
| -rw-r--r-- | src/mongo/base/owned_pointer_vector_test.cpp | 268 |
1 files changed, 265 insertions, 3 deletions
diff --git a/src/mongo/base/owned_pointer_vector_test.cpp b/src/mongo/base/owned_pointer_vector_test.cpp index 95ec5b5e379..ac8683a96ad 100644 --- a/src/mongo/base/owned_pointer_vector_test.cpp +++ b/src/mongo/base/owned_pointer_vector_test.cpp @@ -57,7 +57,7 @@ namespace { DestructionLogger::destroyedNames().clear(); { OwnedPointerVector<const DestructionLogger> owned; - owned.mutableVector().push_back( new DestructionLogger( "foo" ) ); + owned.push_back( new DestructionLogger( "foo" ) ); // owned destroyed } ASSERT_EQUALS( 1U, DestructionLogger::destroyedNames().size() ); @@ -68,14 +68,276 @@ namespace { DestructionLogger::destroyedNames().clear(); { OwnedPointerVector<DestructionLogger> owned; - owned.mutableVector().push_back( new DestructionLogger( "first" ) ); - owned.mutableVector().push_back( new DestructionLogger( "second" ) ); + owned.push_back( new DestructionLogger( "first" ) ); + owned.push_back( new DestructionLogger( "second" ) ); + // owned destroyed + } + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); + } + + TEST(OwnedPointerVectorTest, ClearDestroyedInOrder) { + DestructionLogger::destroyedNames().clear(); + { + OwnedPointerVector<DestructionLogger> owned; + owned.push_back( new DestructionLogger( "first" ) ); + owned.push_back( new DestructionLogger( "second" ) ); + + owned.clear(); + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); + ASSERT_EQUALS( 0U, owned.size() ); + // owned destroyed + } + // no additional deletion should have occured when owned was destroyed + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + } + + TEST(OwnedPointerVectorTest, EraseDestroysAsCalled) { + DestructionLogger::destroyedNames().clear(); + { + // names are order of erasure + OwnedPointerVector<DestructionLogger> owned; + owned.push_back( new DestructionLogger( "third" ) ); + owned.push_back( new DestructionLogger( "first" ) ); + owned.push_back( new DestructionLogger( "second" ) ); + owned.push_back( new DestructionLogger( "fourth" ) ); + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + + // erase "first", sliding "second" down to index 1 + owned.erase(owned.begin() + 1); + ASSERT_EQUALS( 1U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames().back() ); + ASSERT_EQUALS( 3U, owned.size() ); + + // erase "second" + owned.erase(owned.begin() + 1); + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames().back() ); + ASSERT_EQUALS( 2U, owned.size() ); + + // erase "third" + owned.erase(owned.begin() + 0); + ASSERT_EQUALS( 3U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "third", DestructionLogger::destroyedNames().back() ); + ASSERT_EQUALS( 1U, owned.size() ); + // owned destroyed } + + // only "four" should have been deleted when owned was destroyed + ASSERT_EQUALS( 4U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "fourth", DestructionLogger::destroyedNames().back() ); + } + + TEST(OwnedPointerVectorTest, Accessors) { + OwnedPointerVector<int> owned; + ASSERT_TRUE( owned.empty() ); + ASSERT_EQUALS( 0U, owned.size() ); + + owned.push_back( new int(0) ); + owned.push_back( new int(1) ); + owned.push_back( new int(2) ); + + ASSERT_FALSE( owned.empty() ); + ASSERT_EQUALS( 3U, owned.size() ); + + ASSERT_EQUALS( 0, *owned[0] ); + ASSERT_EQUALS( 1, *owned[1] ); + ASSERT_EQUALS( 2, *owned[2] ); + + ASSERT_EQUALS( 0, *owned.front() ); + ASSERT_EQUALS( 2, *owned.back() ); + } + + TEST(OwnedPointerVectorTest, TransferConstructor) { + DestructionLogger::destroyedNames().clear(); + { + OwnedPointerVector<DestructionLogger> source; + source.push_back( new DestructionLogger( "first" ) ); + source.push_back( new DestructionLogger( "second" ) ); + + { + OwnedPointerVector<DestructionLogger> dest(source.release()); + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 0U, source.size() ); + ASSERT_EQUALS( 2U, dest.size() ); + // dest destroyed + } + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); + + // source destroyed + } + // no additional deletions + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + } + + TEST(OwnedPointerVectorTest, TransferConstructorDoesntModifyArgument) { + DestructionLogger::destroyedNames().clear(); + { + std::vector<DestructionLogger*> source; + source.push_back( new DestructionLogger( "first" ) ); + source.push_back( new DestructionLogger( "second" ) ); + + { + OwnedPointerVector<DestructionLogger> dest(source); + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 2U, source.size() ); + ASSERT_EQUALS( 2U, dest.size() ); + ASSERT( source == dest.vector() ); // can't use ASSERT_EQUALS + // dest destroyed + } + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); + + ASSERT_EQUALS( 2U, source.size() ); + // source destroyed + } + // no additional deletions + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + } + + TEST(OwnedPointerVectorTest, TransferAssignment) { + DestructionLogger::destroyedNames().clear(); + { + OwnedPointerVector<DestructionLogger> dest; + { + OwnedPointerVector<DestructionLogger> source; + source.push_back( new DestructionLogger( "first" ) ); + source.push_back( new DestructionLogger( "second" ) ); + + dest = source.release(); + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 0U, source.size() ); + ASSERT_EQUALS( 2U, dest.size() ); + // source destroyed + } + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 2U, dest.size() ); + // dest destroyed + } ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); } + + TEST(OwnedPointerVectorTest, TransferAssignmentDoesntModifyArgument) { + DestructionLogger::destroyedNames().clear(); + { + OwnedPointerVector<DestructionLogger> dest; + { + std::vector<DestructionLogger*> source; + source.push_back( new DestructionLogger( "first" ) ); + source.push_back( new DestructionLogger( "second" ) ); + + dest = source; + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 2U, source.size() ); + ASSERT_EQUALS( 2U, dest.size() ); + ASSERT( source == dest.vector() ); // can't use ASSERT_EQUALS + // source destroyed + } + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 2U, dest.size() ); + // dest destroyed + } + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[ 0 ] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[ 1 ] ); + } + + TEST(OwnedPointerVectorTest, ReleaseAt) { + DestructionLogger::destroyedNames().clear(); + + boost::scoped_ptr<DestructionLogger> holder; + { + // names are order of deletion + OwnedPointerVector<DestructionLogger> owned; + owned.push_back( new DestructionLogger( "first" ) ); + owned.push_back( new DestructionLogger( "third" ) ); + owned.push_back( new DestructionLogger( "second" ) ); + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + + // transfer ownership of "third" to holder + holder.reset(owned.releaseAt(1)); + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 3U, owned.size() ); + ASSERT_EQUALS( static_cast<DestructionLogger*>(NULL), owned[1] ); + + // owned destroyed + } + // owned deleted "first" and "second", but not "third" + ASSERT_EQUALS( 2U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames()[0] ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[1] ); + + // delete "third" + holder.reset(); + ASSERT_EQUALS( 3U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "third", DestructionLogger::destroyedNames().back() ); + } + + TEST(OwnedPointerVectorTest, PopAndReleaseBack) { + DestructionLogger::destroyedNames().clear(); + + { + // names are order of deletion + OwnedPointerVector<DestructionLogger> owned; + owned.push_back( new DestructionLogger( "second" ) ); + owned.push_back( new DestructionLogger( "third" ) ); + owned.push_back( new DestructionLogger( "first" ) ); + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + + { + // transfer ownership of "third" to holder + boost::scoped_ptr<DestructionLogger> holder(owned.popAndReleaseBack()); + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( 2U, owned.size() ); + // holder destroyed + } + ASSERT_EQUALS( 1U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames().back() ); + // owned destroyed + } + // owned destructor deleted "second" and "third", but not "first" + ASSERT_EQUALS( 3U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[1] ); + ASSERT_EQUALS( "third", DestructionLogger::destroyedNames()[2] ); + } + + TEST(OwnedPointerVectorTest, PopAndDeleteBack) { + DestructionLogger::destroyedNames().clear(); + + { + // names are order of deletion + OwnedPointerVector<DestructionLogger> owned; + owned.push_back( new DestructionLogger( "second" ) ); + owned.push_back( new DestructionLogger( "third" ) ); + owned.push_back( new DestructionLogger( "first" ) ); + + ASSERT_EQUALS( 0U, DestructionLogger::destroyedNames().size() ); + + owned.popAndDeleteBack(); + ASSERT_EQUALS( 2U, owned.size() ); + ASSERT_EQUALS( 1U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "first", DestructionLogger::destroyedNames().back() ); + // owned destroyed + } + // owned destructor deleted "second" and "third", but not "first" + ASSERT_EQUALS( 3U, DestructionLogger::destroyedNames().size() ); + ASSERT_EQUALS( "second", DestructionLogger::destroyedNames()[1] ); + ASSERT_EQUALS( "third", DestructionLogger::destroyedNames()[2] ); + } } // namespace } // namespace mongo |
