corelib/tests/arrays-basic.cc

507 lines
14 KiB
C++
Raw Normal View History

#include <ebcl/Arrays.hh>
#include <cppunit/extensions/HelperMacros.h>
using namespace ebcl;
class ArraysBasicTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( ArraysBasicTest );
CPPUNIT_TEST( testInitialValues );
CPPUNIT_TEST( testAppendOne );
CPPUNIT_TEST( testAppendTwo );
CPPUNIT_TEST( testAppendExpand );
CPPUNIT_TEST( testClear );
CPPUNIT_TEST( testFree );
CPPUNIT_TEST( testCopyCons );
CPPUNIT_TEST( testCopyAss );
CPPUNIT_TEST( testMoveCons );
CPPUNIT_TEST( testMoveAss );
CPPUNIT_TEST( testSwap );
CPPUNIT_TEST( testEnsureFactor );
CPPUNIT_TEST( testEnsureOther );
CPPUNIT_TEST( testEnsureKeepData );
CPPUNIT_TEST( testRemoveEnd );
CPPUNIT_TEST( testRemoveMiddle );
CPPUNIT_TEST( testRemoveSwapEnd );
CPPUNIT_TEST( testRemoveSwapMiddle );
CPPUNIT_TEST( testAddAllEmpty );
CPPUNIT_TEST( testAddAll );
CPPUNIT_TEST( testInsertEmpty );
CPPUNIT_TEST( testInsertAfter );
CPPUNIT_TEST( testInsertBefore );
CPPUNIT_TEST( testIndexOf );
CPPUNIT_TEST( testIndexOfMissing );
CPPUNIT_TEST( testContains );
CPPUNIT_TEST( testContainsMissing );
CPPUNIT_TEST( testSort );
CPPUNIT_TEST( testSortComparator );
CPPUNIT_TEST( testSortPartial );
CPPUNIT_TEST( testRangeOutside );
CPPUNIT_TEST( testRangeLarger );
CPPUNIT_TEST( testRangeSub );
CPPUNIT_TEST_SUITE_END( );
public:
void testInitialValues( );
void testAppendOne( );
void testAppendTwo( );
void testAppendExpand( );
void testClear( );
void testFree( );
void testCopyCons( );
void testCopyAss( );
void testMoveCons( );
void testMoveAss( );
void testSwap( );
void testEnsureFactor( );
void testEnsureOther( );
void testEnsureKeepData( );
void testRemoveEnd( );
void testRemoveMiddle( );
void testRemoveSwapEnd( );
void testRemoveSwapMiddle( );
void testAddAllEmpty( );
void testAddAll( );
void testInsertEmpty( );
void testInsertAfter( );
void testInsertBefore( );
void testIndexOf( );
void testIndexOfMissing( );
void testContains( );
void testContainsMissing( );
void testSort( );
void testSortComparator( );
void testSortPartial( );
void testRangeOutside( );
void testRangeLarger( );
void testRangeSub( );
};
CPPUNIT_TEST_SUITE_REGISTRATION( ArraysBasicTest );
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testInitialValues( )
{
T_Array< uint32_t > array;
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 4096 / sizeof( uint32_t ) ) , array.growth( ) );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testAppendOne( )
{
T_Array< uint32_t > array;
array.add( 123 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( array.growth( ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
}
void ArraysBasicTest::testAppendTwo( )
{
T_Array< uint32_t > array;
array << 123 << 456;
CPPUNIT_ASSERT_EQUAL( uint32_t( 2 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( array.growth( ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
}
void ArraysBasicTest::testAppendExpand( )
{
T_Array< uint32_t > array;
const uint32_t n = array.growth( ) * 3 / 2;
for ( uint32_t i = 0 ; i < n ; i ++ ) {
array.add( i );
}
CPPUNIT_ASSERT_EQUAL( n , array.size( ) );
CPPUNIT_ASSERT_EQUAL( 2 * array.growth( ) , array.capacity( ) );
for ( uint32_t i = 0 ; i < n ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( uint32_t( i ) , array[ i ] );
}
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testClear( )
{
T_Array< uint32_t > array;
const uint32_t n = array.growth( ) * 3 / 2;
for ( uint32_t i = 0 ; i < n ; i ++ ) {
array.add( i );
}
array.clear( );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( 2 * array.growth( ) , array.capacity( ) );
}
void ArraysBasicTest::testFree( )
{
T_Array< uint32_t > array;
const uint32_t n = array.growth( ) * 3 / 2;
for ( uint32_t i = 0 ; i < n ; i ++ ) {
array.add( i );
}
array.free( );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.capacity( ) );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testCopyCons( )
{
T_Array< uint32_t > array;
array.ensureCapacity( array.growth( ) * 2 );
array.add( 1 );
T_Array< uint32_t > copy( array );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , copy.size( ) );
CPPUNIT_ASSERT_EQUAL( array.growth( ) , copy.growth( ) );
CPPUNIT_ASSERT_EQUAL( array.capacity( ) , copy.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , copy[ 0 ] );
copy.add( 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
}
void ArraysBasicTest::testCopyAss( )
{
T_Array< uint32_t > array;
array.ensureCapacity( array.growth( ) * 2 );
array.add( 1 );
T_Array< uint32_t > copy;
copy = array;
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , copy.size( ) );
CPPUNIT_ASSERT_EQUAL( array.growth( ) , copy.growth( ) );
CPPUNIT_ASSERT_EQUAL( array.capacity( ) , copy.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , copy[ 0 ] );
copy.add( 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testMoveCons( )
{
T_Array< uint32_t > array( std::move(
T_Array< uint32_t >( 128 ).ensureCapacity( 256 )
<< 1 ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 128 ) , array.growth( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 256 ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array[ 0 ] );
}
void ArraysBasicTest::testMoveAss( )
{
T_Array< uint32_t > array;
array = std::move( T_Array< uint32_t > ( 128 ).ensureCapacity( 256 )
<< 1 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 128 ) , array.growth( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 256 ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array[ 0 ] );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testSwap( )
{
T_Array< uint32_t > a1;
T_Array< uint32_t > a2;
a1 << 1 << 2 << 3;
a2 << 2 << 4 << 6 << 8;
swap( a1 , a2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 4 ) , a1.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 3 ) , a2.size( ) );
for ( uint32_t i = 0 ; i < 3 ; i ++ ) {
CPPUNIT_ASSERT( a1[ i ] == a2[ i ] * 2 );
}
CPPUNIT_ASSERT( a1[ 3 ] == 8 );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testEnsureFactor( )
{
T_Array< uint32_t > array;
array.ensureCapacity( array.growth( ) * 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( 2 * array.growth( ) , array.capacity( ) );
}
void ArraysBasicTest::testEnsureOther( )
{
T_Array< uint32_t > array;
array.ensureCapacity( array.growth( ) * 3 / 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( 2 * array.growth( ) , array.capacity( ) );
}
void ArraysBasicTest::testEnsureKeepData( )
{
T_Array< uint32_t > array;
array.add( 123 );
array.ensureCapacity( array.growth( ) * 2 );
CPPUNIT_ASSERT_EQUAL( 2 * array.growth( ) , array.capacity( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testRemoveEnd( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
array.remove( 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 2 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
}
void ArraysBasicTest::testRemoveMiddle( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
array.remove( 0 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 2 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 1 ] );
}
void ArraysBasicTest::testRemoveSwapEnd( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
array.removeSwap( 2 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 2 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
}
void ArraysBasicTest::testRemoveSwapMiddle( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
array.removeSwap( 0 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 2 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testAddAllEmpty( )
{
T_Array< uint32_t > empty;
T_Array< uint32_t > array;
array << 123 << 456 << 789;
array.addAll( empty );
CPPUNIT_ASSERT_EQUAL( uint32_t( 3 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 2 ] );
}
void ArraysBasicTest::testAddAll( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
T_Array< uint32_t > other;
other << 627 << 951 << 843;
array.addAll( other );
CPPUNIT_ASSERT_EQUAL( uint32_t( 6 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 2 ] );
for ( uint32_t i = 0 ; i < 3 ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( other[ i ] , array[ i + 3 ] );
}
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testInsertEmpty( )
{
T_Array< uint32_t > array;
array.insert( 0 , 123 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
}
void ArraysBasicTest::testInsertAfter( )
{
T_Array< uint32_t > array;
array << 123 << 456;
array.insert( 2 , 789 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 3 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 2 ] );
}
void ArraysBasicTest::testInsertBefore( )
{
T_Array< uint32_t > array;
array << 456 << 789;
array.insert( 0 , 123 );
CPPUNIT_ASSERT_EQUAL( uint32_t( 3 ) , array.size( ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 123 ) , array[ 0 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 456 ) , array[ 1 ] );
CPPUNIT_ASSERT_EQUAL( uint32_t( 789 ) , array[ 2 ] );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testIndexOf( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
CPPUNIT_ASSERT_EQUAL( int32_t( 1 ) , array.indexOf( 456 ) );
}
void ArraysBasicTest::testIndexOfMissing( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
CPPUNIT_ASSERT_EQUAL( int32_t( -1 ) , array.indexOf( 101112 ) );
}
void ArraysBasicTest::testContains( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
CPPUNIT_ASSERT( array.contains( 456 ) );
}
void ArraysBasicTest::testContainsMissing( )
{
T_Array< uint32_t > array;
array << 123 << 456 << 789;
CPPUNIT_ASSERT( !array.contains( 101112 ) );
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testSort( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
array.sort( );
for ( uint32_t i = 1 ; i < 5000 ; i ++ ) {
CPPUNIT_ASSERT( array[ i ] >= array[ i - 1 ] );
}
}
void ArraysBasicTest::testSortComparator( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
array.sort( []( uint32_t const& a , uint32_t const& b ) {
return T_Comparator< uint32_t >::compare( b , a );
} );
for ( uint32_t i = 1 ; i < 5000 ; i ++ ) {
CPPUNIT_ASSERT( array[ i ] <= array[ i - 1 ] );
}
}
void ArraysBasicTest::testSortPartial( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
T_Array< uint32_t > copy( array );
array.sort( 1000 , 1000 );
for ( uint32_t i = 0 ; i < 1000 ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( copy[ i ] , array[ i ] );
}
for ( uint32_t i = 1001 ; i < 2000 ; i ++ ) {
CPPUNIT_ASSERT( array[ i ] >= array[ i - 1 ] );
}
for ( uint32_t i = 2000 ; i < 5000 ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( copy[ i ] , array[ i ] );
}
}
/*----------------------------------------------------------------------------*/
void ArraysBasicTest::testRangeOutside( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
T_Array< uint32_t > range( array.copyRange( 7000 , 1000 ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 0 ) , range.size( ) );
}
void ArraysBasicTest::testRangeLarger( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
T_Array< uint32_t > range( array.copyRange( 1000 ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 4000 ) , range.size( ) );
for ( uint32_t i = 0 ; i < 4000 ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( array[ i + 1000 ] , range[ i ] );
}
}
void ArraysBasicTest::testRangeSub( )
{
T_Array< uint32_t > array;
for ( uint32_t i = 0 ; i < 5000 ; i ++ ) {
array << std::rand( );
}
T_Array< uint32_t > range( array.copyRange( 1000 , 1999 ) );
CPPUNIT_ASSERT_EQUAL( uint32_t( 1000 ) , range.size( ) );
for ( uint32_t i = 0 ; i < 1000 ; i ++ ) {
CPPUNIT_ASSERT_EQUAL( array[ i + 1000 ] , range[ i ] );
}
}