#include "CollisionTest.hpp"

#include "../UTest/UTest.hpp"

/*** TrooperEngine DLL Header Files ***/
#include "TrooperEngine.hpp"

using MathEngine::cCollision;

void CollisionTest()
{
	/// cCollision
	printf("\nTesting cCollision -----\n\n");

	UTest u("cCollision");
	SDL_Rect a = { 50, 50, 50, 50 };
	SDL_Rect bLeftTouch = { 0, 50, 50, 50 };
	SDL_Rect bRightTouch = { 100, 50, 50, 50 };
	SDL_Rect bTopTouch = { 50, 0, 50, 50 };
	SDL_Rect bBottomTouch = { 50, 100, 50, 50 };

	SDL_Rect bxywhTouch = { 1, 1, 49, 49 };
	SDL_Rect bxnotTouch = { 101, 101, 50, 50 };

	cString boundingbox = "BoundingBox(SDL_Rect a, SDL_Rect b) Check two SDL_Rect ";

	u.test(boundingbox + "that overlap, should return true.", cCollision::BoundingBox(a, a));

	u.test(boundingbox + "that overlap on the left side only, should return true.", cCollision::BoundingBox(a, bLeftTouch));

	u.test(boundingbox + "that overlap on the right side only, should return true.", cCollision::BoundingBox(a, bRightTouch));

	u.test(boundingbox + "that overlap on the Top side only, should return true.", cCollision::BoundingBox(a, bTopTouch));

	u.test(boundingbox + "that overlap on the Bottom side only, should return true.", cCollision::BoundingBox(a, bBottomTouch));

	u.test(boundingbox + "one is inside the other, should return true.", cCollision::BoundingBox(a, bxywhTouch));

	u.test(boundingbox + "that don't overlap, should return false.", !(cCollision::BoundingBox(a, bxnotTouch)));

	//////////////////////////////////////////////////////////////////////////
	/// Vector4
	//////////////////////////////////////////////////////////////////////////
	MathEngine::Vector4 Va = { 50.0, 50.0, 50.0, 50.0 };
	MathEngine::Vector4 VbLeftTouch = { 0.0, 50.0, 50.0, 50.0 };
	MathEngine::Vector4 VbRightTouch = { 100.0, 50.0, 50.0, 50.0 };
	MathEngine::Vector4 VbTopTouch = { 50.0, 0.0, 50.0, 50.0 };
	MathEngine::Vector4 VbBottomTouch = { 50.0, 100.0, 50.0, 50.0 };

	MathEngine::Vector4 VbxywhTouch = { 1.0, 1.0, 49.0, 49.0 };
	MathEngine::Vector4 VbxnotTouch = { 101.0, 101.0, 50.0, 50.0 };

	boundingbox = "BoundingBox( const Vector4& a, const Vector4& b ) Check two Vector4 ";

	u.test(boundingbox + "that overlap, should return true.", cCollision::BoundingBox(Va, Va));

	u.test(boundingbox + "that overlap on the left side only, should return true.", cCollision::BoundingBox(Va, VbLeftTouch));

	u.test(boundingbox + "that overlap on the right side only, should return true.", cCollision::BoundingBox(Va, VbRightTouch));

	u.test(boundingbox + "that overlap on the Top side only, should return true.", cCollision::BoundingBox(Va, VbTopTouch));

	u.test(boundingbox + "that overlap on the Bottom side only, should return true.", cCollision::BoundingBox(Va, VbBottomTouch));

	u.test(boundingbox + "one is inside the other, should return true.", cCollision::BoundingBox(Va, VbxywhTouch));

	u.test(boundingbox + "that don't overlap, should return false.", !(cCollision::BoundingBox(Va, VbxnotTouch)));

	//////////////////////////////////////////////////////////////////////////
	/// iVector4
	//////////////////////////////////////////////////////////////////////////
	MathEngine::iVector4 iVa = { 50, 50, 50, 50 };
	MathEngine::iVector4 iVbLeftTouch = { 0, 50, 50, 50 };
	MathEngine::iVector4 iVbRightTouch = { 100, 50, 50, 50 };
	MathEngine::iVector4 iVbTopTouch = { 50, 0, 50, 50 };
	MathEngine::iVector4 iVbBottomTouch = { 50, 100, 50, 50 };

	MathEngine::iVector4 iVbxywhTouch = { 1, 1, 49, 49 };
	MathEngine::iVector4 iVbxnotTouch = { 101, 101, 50, 50 };

	boundingbox = "BoundingBox( const iVector4& a, const iVector4& b ) Check two iVector4 ";

	u.test(boundingbox + "that overlap, should return true.", cCollision::BoundingBox(iVa, iVa));

	u.test(boundingbox + "that overlap on the left side only, should return true.", cCollision::BoundingBox(iVa, iVbLeftTouch));

	u.test(boundingbox + "that overlap on the right side only, should return true.", cCollision::BoundingBox(iVa, iVbRightTouch));

	u.test(boundingbox + "that overlap on the Top side only, should return true.", cCollision::BoundingBox(iVa, iVbTopTouch));

	u.test(boundingbox + "that overlap on the Bottom side only, should return true.", cCollision::BoundingBox(iVa, iVbBottomTouch));

	u.test(boundingbox + "one is inside the other, should return true.", cCollision::BoundingBox(iVa, iVbxywhTouch));

	u.test(boundingbox + "that don't overlap, should return false.", !(cCollision::BoundingBox(iVa, iVbxnotTouch)));

	u.report();
}