/*
	Test-ZAlloc.cpp
	Author: James Russell <jcrussell@762studios.com>

	Purpose: Unit Test the TestZAlloc class.

	Changelog:
	12/18/2011 - Removed dependency on ZString (crertel)
	2011/09/18 - creation (jcrussell)
*/

#include "ZUnitTest.hpp"

#include <ZUtil/ZAlloc.hpp>

static const char* testNew();
static const char* testAlloc();

//List of unit tests
ZUnitTest ZAllocUnitTests[] =
{
	{ "Test New", testNew },
	{ "Test Alloc", testAlloc }
};

//Now declare the ZUnitTestBlock associated with this.
DECLARE_ZTESTBLOCK(ZAlloc);

/*************************************************************************/

struct AllocTestObject
{
	//Constructor
	AllocTestObject() { AllocTestObject::Instances++; }

	//Parameterized constructor
	AllocTestObject(int _val) { AllocTestObject::Instances++; Value = _val; }

	//Destructor
	~AllocTestObject() { AllocTestObject::Instances--; }

	//Value field
	int Value;

	//Static Instance Count
	static int Instances;

	//Virtual Function
	virtual bool Foo() const { return true; }
};

struct AllocTestObjectSubclass : public AllocTestObject
{
	//Constructor
	AllocTestObjectSubclass() : AllocTestObject() {}

	//Subclass Override
	bool Foo() const { return false; }

	//Subclass Method
	bool Bar() const { return true; }
};

//Defaults to zero
int AllocTestObject::Instances = 0;

static const char* testNew()
{
	AllocTestObject *testObj1 = znew AllocTestObject();

	TASSERT(AllocTestObject::Instances == 1, "Failed to call constructor with ZNew!");

	AllocTestObject *testObj2 = znew AllocTestObject(5);

	TASSERT(AllocTestObject::Instances == 2, "Failed to call constructor with ZNew!");
	TASSERT(testObj2->Value == 5, "Failed to call correct constructor with ZNew!");

	zdelete testObj1;

	TASSERT(AllocTestObject::Instances == 1, "Failed to deallocate with ZDel!");

	zdelete testObj2;

	TASSERT(AllocTestObject::Instances == 0, "Failed to deallocate with ZDel!");

	return ZTEST_SUCCESS;
}

static const char* testAlloc()
{
	AllocTestObject *testArray = zalloc(AllocTestObject, 12);

	TASSERT(AllocTestObject::Instances == 12, "Failed to call all constructors with ZAlloc!");

	zfree(testArray);

	TASSERT(AllocTestObject::Instances == 0, "Failed to call all destructors with ZFree!");
	
	return ZTEST_SUCCESS;
}
