Skip to content
Snippets Groups Projects
PtrVectorTest.cpp 3.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jan Trávníček's avatar
    Jan Trávníček committed
    #include "PtrVectorTest.h"
    #include <alib/ptr_vector>
    #include <alib/algorithm>
    
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( PtrVectorTest, "bits" );
    CPPUNIT_TEST_SUITE_REGISTRATION( PtrVectorTest );
    
    void PtrVectorTest::setUp() {
    }
    
    void PtrVectorTest::tearDown() {
    }
    
    void PtrVectorTest::testProperties() {
    	ext::ptr_vector < int > data = {1, 2, 3, 4};
    
    	std::cout << data [ 0 ] << std::endl;
    
    	CPPUNIT_ASSERT ( data [ 0 ] == 1 );
    	CPPUNIT_ASSERT ( data.size ( ) == 4 );
    	CPPUNIT_ASSERT ( data [ 3 ] == 4 );
    
    	data.push_back ( 1 );
    	CPPUNIT_ASSERT ( data.size ( ) == 5 );
    	CPPUNIT_ASSERT ( data [ 4 ] == 1 );
    
    	data.insert ( data.cbegin ( ) + 1, 2 );
    	CPPUNIT_ASSERT ( data.size ( ) == 6 );
    	CPPUNIT_ASSERT ( data [ 1 ] == 2 );
    	CPPUNIT_ASSERT ( data [ 2 ] == 2 );
    	CPPUNIT_ASSERT ( data [ 3 ] == 3 );
    }
    
    void PtrVectorTest::testPolymorph() {
    	ext::ptr_vector < Base > data = { Child2 ( ) };
    
    	CPPUNIT_ASSERT ( data [ 0 ].type ( ) == PtrVectorTest::Type::CHILD2 );
    	CPPUNIT_ASSERT ( data.size ( ) == 1 );
    
    	data.push_back ( Child1 ( ) );
    	CPPUNIT_ASSERT ( data.size ( ) == 2 );
    	CPPUNIT_ASSERT ( data [ 1 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    
    	ext::ptr_vector < Base >::const_iterator iter = data.cbegin ( );
    	CPPUNIT_ASSERT ( iter->type ( ) == PtrVectorTest::Type::CHILD2 );
    	++ iter;
    	CPPUNIT_ASSERT ( iter->type ( ) == PtrVectorTest::Type::CHILD1 );
    	++ iter;
    	CPPUNIT_ASSERT ( iter == data.cend ( ) );
    
    	data.insert ( data.cbegin ( ) + 1, Child1 ( ) );
    	CPPUNIT_ASSERT ( data.size ( ) == 3 );
    	CPPUNIT_ASSERT ( data [ 0 ].type ( ) == PtrVectorTest::Type::CHILD2 );
    	CPPUNIT_ASSERT ( data [ 1 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    	CPPUNIT_ASSERT ( data [ 2 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    
    
    	data.resize < Child2 > ( 4 );
    	CPPUNIT_ASSERT ( data.at ( 3 ) == Child2 ( ) );
    	data.shrink ( 3 );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	ext::ptr_vector < Base > data2 = data;
    
    	CPPUNIT_ASSERT ( data2 [ 0 ].type ( ) == PtrVectorTest::Type::CHILD2 );
    	CPPUNIT_ASSERT ( data2 [ 1 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    	CPPUNIT_ASSERT ( data2 [ 2 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    
    	auto iter2 = data2.insert ( data2.cbegin ( ) + 1, data.begin ( ), data.end ( ) );
    
    	CPPUNIT_ASSERT ( iter2 == data2.begin ( ) + 1 );
    
    	CPPUNIT_ASSERT ( data2 [ 0 ].type ( ) == PtrVectorTest::Type::CHILD2 );
    	CPPUNIT_ASSERT ( data2 [ 1 ].type ( ) == PtrVectorTest::Type::CHILD2 );
    	CPPUNIT_ASSERT ( data2 [ 2 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    	CPPUNIT_ASSERT ( data2 [ 3 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    	CPPUNIT_ASSERT ( data2 [ 4 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    	CPPUNIT_ASSERT ( data2 [ 5 ].type ( ) == PtrVectorTest::Type::CHILD1 );
    
    	data2.erase ( ext::dereferencer ( ext::unique ( data2.begin ( ).base ( ), data2.end ( ).base ( ), [ ] ( const Base * a, const Base * b ) { return * a == * b; } ) ), data2.end ( ) );
    }
    
    
    void PtrVectorTest::testRange ( ) {
    	ext::ptr_vector < int > data { 1, 2, 3, 4 };
    	ext::ptr_vector < int > data2 ( data.range ( ) );
    
    	CPPUNIT_ASSERT ( data == data2 );
    
    	int moves;
    	int copies;
    
    	ext::ptr_vector < Moveable > vec;
    	vec.push_back ( Moveable ( moves, copies ) );
    	vec.push_back ( Moveable ( moves, copies ) );
    	vec.push_back ( Moveable ( moves, copies ) );
    	vec.push_back ( Moveable ( moves, copies ) );
    
    	ext::ptr_vector < Moveable > vec2 ( ext::range ( std::move ( vec ) ) );
    
    	CPPUNIT_ASSERT ( copies == 0 );
    }