summaryrefslogtreecommitdiff
path: root/src/mongo/base/owned_pointer_vector_test.cpp
diff options
context:
space:
mode:
authorApollon Oikonomopoulos <apoikos@debian.org>2016-01-14 00:10:06 +0200
committerApollon Oikonomopoulos <apollon@skroutz.gr>2016-01-14 00:10:06 +0200
commit374e1947abcd3e127a2a613aff73ecffdb9199ea (patch)
treed83973c3c9802450acd5b5e86fe0d4e8e60a3a1b /src/mongo/base/owned_pointer_vector_test.cpp
parent65585c90b12d6523bea75a2aebaae2a2fdf9e641 (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.cpp268
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