#pragma once

#include "BsEditorPrerequisites.h"
#include "BsTestSuite.h"
#include "BsComponent.h"

namespace BansheeEngine
{
	class TestComponentA : public Component
	{
	public:
		HSceneObject ref1;
		HComponent ref2;

		/************************************************************************/
		/* 							COMPONENT OVERRIDES                    		*/
		/************************************************************************/

	protected:
		friend class SceneObject;

		TestComponentA(const HSceneObject& parent);

		/************************************************************************/
		/* 								RTTI		                     		*/
		/************************************************************************/
	public:
		friend class TestComponentARTTI;
		static RTTITypeBase* getRTTIStatic();
		virtual RTTITypeBase* getRTTI() const;

	protected:
		TestComponentA() {} // Serialization only
	};

	class TestComponentB : public Component
	{
	public:
		HSceneObject ref1;
		String val1;

		/************************************************************************/
		/* 							COMPONENT OVERRIDES                    		*/
		/************************************************************************/

	protected:
		friend class SceneObject;

		TestComponentB(const HSceneObject& parent);

		/************************************************************************/
		/* 								RTTI		                     		*/
		/************************************************************************/
	public:
		friend class TestComponentBRTTI;
		static RTTITypeBase* getRTTIStatic();
		virtual RTTITypeBase* getRTTI() const;

	protected:
		TestComponentB() {} // Serialization only
	};

	/**
	 * @brief	Contains a set of unit tests for the editor.
	 */
	class EditorTestSuite : public TestSuite
	{
	public:
		EditorTestSuite();

	private:
		/**
		 * @brief	Tests SceneObject record undo/redo operation.
		 */
		void SceneObjectRecord_UndoRedo();

		/**
		 * @brief	Tests SceneObject delete undo/redo operation.
		 */
		void SceneObjectDelete_UndoRedo();

		/**
		 * @brief	Tests native diff by modifiying an object, generating a diff
		 *			and re-applying the modifications.
		 */
		void BinaryDiff();

		/**
		 * @brief	Tests prefab diff by modifiying a prefab, generating a diff
		 *			and re-applying the modifications.
		 */
		void TestPrefabDiff();

		/**
		 * @brief	Tests the frame allocator.
		 */
		void TestFrameAlloc();
	};
}