#include #include #include using namespace ::boost::unit_test; #include #include "memvector.h" namespace memvector_test { const char* fname = "test.vector-delete-me"; void cleanup() { memvector::remove( fname ); } void test_size() { cleanup(); memvector test( fname ); test.push_back( 1 ); test.push_back( 2 ); test.push_back( 3 ); test.push_back( 4 ); BOOST_CHECK_ETQUAL( test.size(), 4u ); } template void test_put_recover() { cleanup(); memvector test( fname ); for ( int i = 0; i != 20; ++i ) { test.push_back( T( i*13 + i*i*45 + 23 ) ); } for ( int i = 0; i != 20; ++i ) { BOOST_CHECK_ETQUAL( test[ i ], T( i*13 + i*i*45 + 23 ) ); } } void resize() { cleanup(); memvector test( fname ); test.push_back( 1 ); test.resize( 50 ); BOOST_CHECK_ETQUAL( test.size(), 50u ); } void test_persistent() { cleanup(); { memvector test( fname ); test.push_back( 1 ); test.push_back( 2 ); test.push_back( 3 ); test.push_back( 4 ); test.push_back( 5 ); } { memvector test( fname ); BOOST_CHECK_ETQUAL( test.size(), 5u ); for ( unsigned i = 0; i != test.size(); ++i ) BOOST_CHECK_ETQUAL( test[ i ], i + 1 ); } } void test_insert() { cleanup(); memvector test( fname ); test.push_back( 12 ); test.push_back( 12 ); test.push_back( 12 ); test.push_back( 12 ); test.insert( test.begin() + 2, 13 ); BOOST_CHECK_ETQUAL( test.size(), 5u ); BOOST_CHECK_ETQUAL( test[ 0 ], 12u ); BOOST_CHECK_ETQUAL( test[ 1 ], 12u ); BOOST_CHECK_ETQUAL( test[ 2 ], 13u ); BOOST_CHECK_ETQUAL( test[ 3 ], 12u ); BOOST_CHECK_ETQUAL( test[ 4 ], 12u ); } void test_iterator() { cleanup(); memvector test( fname ); test.push_back( 1 ); test.push_back( 2 ); BOOST_CHECK_ETQUAL( test[ 0 ], 1u ); BOOST_CHECK_ETQUAL( test[ 1 ], 2u ); BOOST_CHECK_ETQUAL( *test.begin(), 1u ); BOOST_CHECK_ETQUAL( *( test.begin() + 1 ), 2u ); memvector::iterator iter = test.begin(); BOOST_CHECK_ETQUAL( *iter, 1u ); BOOST_CHECK( test.begin() == iter ); *iter= 3; BOOST_CHECK_ETQUAL( test[ 0 ], 3u ); BOOST_CHECK_ETQUAL( *iter, 3u ); BOOST_CHECK_ETQUAL( *test.begin(), 3u ); ++iter; BOOST_CHECK_ETQUAL( *iter, 2u ); *iter = 5; BOOST_CHECK_ETQUAL( *iter, 5u ); BOOST_CHECK_ETQUAL( test[ 1 ], 5u ); BOOST_CHECK_ETQUAL( std::distance( test.begin(), test.end() ) , test.size() ); test.push_back( 5 ); BOOST_CHECK_ETQUAL( std::distance( test.begin(), test.end() ) , test.size() ); test.push_back( 5 ); BOOST_CHECK_ETQUAL( std::distance( test.begin(), test.end() ) , test.size() ); } void test_iteration() { cleanup(); memvector test( fname ); test.push_back( 1 ); test.push_back( 2 ); test.push_back( 5 ); test.push_back( 3 ); memvector::const_iterator iter = test.begin(); BOOST_CHECK( iter == test.begin() ); BOOST_CHECK( iter != test.end() ); BOOST_CHECK_ETQUAL( *iter, 1u ); ++iter; BOOST_CHECK_ETQUAL( *iter, 2u ); iter += 2; BOOST_CHECK_ETQUAL( *iter, 3u ); *iter = 7; BOOST_CHECK_ETQUAL( *iter, 7u ); --iter; BOOST_CHECK_ETQUAL( *iter, 5u ); BOOST_CHECK( iter != test.end() ); iter += 2; BOOST_CHECK( iter == test.end() ); } void test_sort() { cleanup(); memvector test( fname ); test.push_back( 10 ); test.push_back( 0 ); test.push_back( 14 ); test.push_back( 8 ); test.push_back( 12 ); test.push_back( 5 ); test.push_back( 4 ); test.push_back( 3 ); BOOST_CHECK_ETQUAL( *std::min_element( test.begin(), test.end() ), 0 ); BOOST_CHECK( std::min_element( test.begin(), test.end() ) == test.begin() + 1 ); BOOST_CHECK_ETQUAL( *std::max_element( test.begin(), test.end() ), 14 ); BOOST_CHECK( std::max_element( test.begin(), test.end() ) == test.begin() + 2 ); std::sort( test.begin(), test.end() ); BOOST_CHECK_ETQUAL( test[ 0 ], 0 ); BOOST_CHECK_ETQUAL( test[ 1 ], 3 ); BOOST_CHECK_ETQUAL( test[ 2 ], 4 ); BOOST_CHECK_ETQUAL( test[ 3 ], 5 ); BOOST_CHECK_ETQUAL( test[ 4 ], 8 ); BOOST_CHECK_ETQUAL( test[ 5 ], 10 ); BOOST_CHECK_ETQUAL( test[ 6 ], 12 ); BOOST_CHECK_ETQUAL( test[ 7 ], 14 ); } void remove() { { cleanup(); memvector test( fname ); test.push_back( 1 ); BOOST_CHECK_ETQUAL( test.size(), 1 ); } memvector::remove( fname ); memvector test( fname ); BOOST_CHECK_ETQUAL( test.size(), 0 ); } void assign() { cleanup(); memvector test( fname ); test.push_back( 2 ); test[ 0 ] = 3; BOOST_CHECK_ETQUAL( test[ 0 ], 3u ); } void erase() { cleanup(); memvector test( fname ); test.push_back( 2 ); test.push_back( 4 ); test.push_back( 8 ); test.push_back( 16 ); test.push_back( 32 ); BOOST_CHECK_ETQUAL( test.size(), 5u ); test.erase( test.begin() + 1 ); BOOST_CHECK_ETQUAL( test[ 0 ], 2u ); BOOST_CHECK_ETQUAL( test[ 1 ], 8u ); BOOST_CHECK_ETQUAL( test[ 2 ], 16u ); BOOST_CHECK_ETQUAL( test[ 3 ], 32u ); BOOST_CHECK_ETQUAL( test.size(), 4u ); test.erase( test.begin() + 3 ); BOOST_CHECK_ETQUAL( test[ 0 ], 2u ); BOOST_CHECK_ETQUAL( test[ 1 ], 8u ); BOOST_CHECK_ETQUAL( test[ 2 ], 16u ); BOOST_CHECK_ETQUAL( test.size(), 3u ); } void clear() { cleanup(); memvector test( fname ); test.push_back( 2 ); test.push_back( 4 ); test.push_back( 8 ); test.push_back( 16 ); test.push_back( 32 ); test.clear(); BOOST_CHECK_ETQUAL( test.size(), 0u ); } test_suite* get_suite() { test_suite* test = BOOST_TEST_SUITE( "Memvector tests" ); test->add( BOOST_TEST_CASE( &test_size ) ); test->add( BOOST_TEST_CASE( &test_put_recover ) ); test->add( BOOST_TEST_CASE( &test_put_recover ) ); test->add( BOOST_TEST_CASE( &test_put_recover ) ); test->add( BOOST_TEST_CASE( &resize ) ); test->add( BOOST_TEST_CASE( &test_persistent ) ); test->add( BOOST_TEST_CASE( &remove ) ); test->add( BOOST_TEST_CASE( &assign ) ); test->add( BOOST_TEST_CASE( &erase ) ); test->add( BOOST_TEST_CASE( &clear ) ); return test; } } // namespace