//////////////////////////////////////////////////////////////////////////////
//
// Asura_UnitTest_DynamicArray.cpp
//
// Copyright (c) 2006 Rebellion. All rights reserved.
//
// Description:
//
//     Unit tests for Tools_DynamicArray class
//
//////////////////////////////////////////////////////////////////////////////

// I N C L U D E S ///////////////////////////////////////////////////////////

#ifdef ASURA_TOOLS

#include "Core/Asura.h"
#include "Core/Asura_Core.h"
#include "Core/Asura_Maths.h"
#include "Debugging/Asura_Assert.h"

#include "Misc/Tools_DynamicArray.h"

#include "UnitTest/Asura_UnitTest.h"

#ifdef ASURA_SUPPORT_UNITTEST

ASURA_UNITTEST(GeneralTests, DynamicArray)
{
	Tools_DynamicArray<int> xArray;
	xArray[3] = 64;
	xArray[0] = 10;
	xArray[2] = 32;
	xArray[1] = 16;
    ASURA_UNITTEST_CHECK_EQUAL( 4, xArray.GetSize() );
    ASURA_UNITTEST_CHECK_EQUAL( 64, xArray[3] );
    ASURA_UNITTEST_CHECK_EQUAL( 32, xArray[2] );
    ASURA_UNITTEST_CHECK_EQUAL( 16, xArray[1] );
    ASURA_UNITTEST_CHECK_EQUAL( 10, xArray[0] );
    ASURA_UNITTEST_CHECK_EQUAL( 64, xArray[3u] );
    ASURA_UNITTEST_CHECK_EQUAL( 32, xArray[2u] );
    ASURA_UNITTEST_CHECK_EQUAL( 16, xArray[1u] );
    ASURA_UNITTEST_CHECK_EQUAL( 10, xArray[0u] );
    ASURA_UNITTEST_CHECK_EQUAL( false, xArray.CanFit( 1 ) );

	xArray.Insert( 1, 10 );
    ASURA_UNITTEST_CHECK_EQUAL( 14, xArray.GetSize() );
	xArray.Remove( 1, 8 );
    ASURA_UNITTEST_CHECK_EQUAL( 6, xArray.GetSize() );
	xArray.Reset();
    ASURA_UNITTEST_CHECK_EQUAL( 0, xArray.GetSize() );
	xArray.Resize( 66 );
    ASURA_UNITTEST_CHECK_EQUAL( true, xArray.CanFit( 5 ) );
	xArray[2] = 32;
	const int iTest = xArray[2];
    ASURA_UNITTEST_CHECK_EQUAL( 32, iTest );

	xArray[65] = 0;
	xArray += 23;
	ASURA_UNITTEST_CHECK_EQUAL( 23, xArray[66] );

	ASURA_UNITTEST_CHECK( ( xArray == xArray ) );
	ASURA_UNITTEST_CHECK( !( xArray != xArray ) );

	Tools_DynamicArray<int> xArray2( 0 );
	xArray2 += xArray;
	ASURA_UNITTEST_CHECK( ( xArray2 == xArray ) );

	Tools_DynamicArray<int> xArray3( xArray );
	ASURA_UNITTEST_CHECK( ( xArray3 == xArray ) );

	Tools_DynamicArray<int> xArray4;
	xArray4 = xArray;
	ASURA_UNITTEST_CHECK( ( xArray4 == xArray ) );
}

ASURA_UNITTEST(Sorting, DynamicArray)
{
	// Test sorting for int's
	Tools_DynamicArray<int> xIntArray;
	for ( int i = 0; i < 20; i++ )
	{
		xIntArray[i] = Asura_Random::GetInt( -100, +100 );
	}
	xIntArray.Sort();

	int iMin = xIntArray[0];
	for ( int i = 0; i < 20; i++ )
	{
		ASURA_UNITTEST_CHECK( xIntArray[i] >= iMin );
		iMin = xIntArray[1];
	}

	// Test sorting for floats's
	Tools_DynamicArray<float> xFloatArray;
	for ( int i = 0; i < 20; i++ )
	{
		xFloatArray[i] = Asura_Random::GetFloat( -100.0f, +100.0f );
	}
	xFloatArray.Sort();

	float fMin = xFloatArray[0];
	for ( int i = 0; i < 20; i++ )
	{
		ASURA_UNITTEST_CHECK( xFloatArray[i] >= fMin );
		fMin = xFloatArray[1];
	}

	// a case that used to fail
	Tools_DynamicArray<unsigned int> test;
	test += 3092207;
	test += 3402479408;
	test += 3641801;
	test.Sort();

}

#endif // #ifdef ASURA_SUPPORT_UNITTEST

#endif // #ifdef ASURA_TOOLS
