// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#ifndef __TGRAPHICSHARNESS_H__
#define __TGRAPHICSHARNESS_H__

#include <test/testexecutestepbase.h>
#include <w32std.h>
#include <test/ttmsgraphicsstep.h>


/**
  A main interface for implementation test cases
 */
class MTestCases
	{
public:
	virtual void RunTestCaseL(TInt aCurTestCase) = 0; // this function needs to be implemented by the derived class
	virtual TInt RunTestCaseLeft(TInt aError) = 0;
	};

class CTestManager;

/**
  The abstract class is base for test programs, encapsulates the MTestCases interface.
	
  All test cases must be implemented in derived classes.  
*/
class CTGraphicsBase : public CBase, public MTestCases
	{
friend class CTGraphicsStep;
public:
	IMPORT_C static const TDesC& ColorModeName(TDisplayMode aMode);
	inline static const TDesC& ColorModeName(TInt aMode);
	IMPORT_C static const TDesC& RotationName(CFbsBitGc::TGraphicsOrientation aOrientation);
	inline static const TDesC& RotationName(TInt aOrientation);
	IMPORT_C static void SaveScreenShotL(CFbsScreenDevice* aScdv);
	IMPORT_C CTGraphicsBase(CTestStep* aStep);
	IMPORT_C ~CTGraphicsBase();
	CTestExecuteLogger&	Logger() {return iStep->Logger();}
	// LEGACY methods
	inline void testBooleanTrue(TBool aCondition, const TText8* aFile, TInt aLine); 
	inline void testBooleanTrueWithErrorCode(TBool aCondition, TInt aErrorCode, const TText8* aFile, TInt aLine);
		
	inline void testSoftFailWinscw(TBool aCondition, const TText8* aFile, TInt aLine);
		
protected:
	IMPORT_C void TestComplete();	//test program has to call this function in order to
									//stop the consequence of test cases and quit the step
	IMPORT_C void SetSelfDrive(TBool aSelfDrive);
	IMPORT_C void CaseComplete();
	virtual void ConstructL(){}
	IMPORT_C void ResetCounter(TInt aNewCurrentTestCase = 0);
private:
	void Execute();
	void InitializeL();
	IMPORT_C TInt RunTestCaseLeft(TInt aError);
protected:	
	CTestStep* iStep;
private:
	CTestManager* iTestManager;
	};

/** Base class for test step */
class CTGraphicsStep : public CTTMSGraphicsStep 
	{
public:
	CTGraphicsStep(){}
	virtual ~CTGraphicsStep(){}
public:
	void SetLogHeapInfo(TBool aLogHeapInfo) {iLogHeapInfo = aLogHeapInfo;}
protected:
	virtual CTGraphicsBase* CreateTestL() = 0;
	//allocate all test rersources here
	virtual void TestSetupL(){}
	//delete all allocated resourses here
	virtual void TestClose(){}
//from CTestStep
	IMPORT_C virtual TVerdict doTestStepL();
private:
	void ExecuteL();
	TInt GetScreenSize(TSize& aSize) const;
	void SetupCleanup(CTrapCleanup*& tc);
	void CloseAllPanicWindows(TInt aId, RWsSession& ws) const;
	void LogHeapInfo(RWsSession &aWs, TBool aStart);
private:
	TBool iLogHeapInfo;	// Only perform wserv heap memory checks when this is true (commonly for wserv testing only)
	};

#define TEST2(a, b)  			testBooleanTrue((a == b), (TText8*)__FILE__, __LINE__)
#define TEST_SOFTFAIL_WINSCW(a)	testSoftFailWinscw((a), (TText8*)__FILE__, __LINE__)

inline const TDesC& CTGraphicsBase::ColorModeName(TInt aMode)
	{return ColorModeName(reinterpret_cast<TDisplayMode&>(aMode));}
inline const TDesC& CTGraphicsBase::RotationName(TInt aOrientation)
	{return RotationName(reinterpret_cast<CFbsBitGc::TGraphicsOrientation&>(aOrientation));}

// Macro for defining test step constructor and creating a test.
// Work for the following name convention:
// step class - CTXXStep
// test class - CTXX,
//  where XX any name

#define __CONSTRUCT_STEP__(a) \
	CT##a##Step::CT##a##Step() \
	{ \
	SetTestStepName(KT##a##Step); \
	} \
	 \
CTGraphicsBase* CT##a##Step::CreateTestL() \
	{ \
	return new (ELeave) CT##a (this); \
	} 
	
inline void CTGraphicsBase::testBooleanTrue(TBool aCondition, const TText8* aFile, TInt aLine) 
	{
	((CTGraphicsStep*)iStep)->MQCTest(aCondition, aFile, aLine);
	}

inline void CTGraphicsBase::testBooleanTrueWithErrorCode(TBool aCondition, TInt aErrorCode, const TText8* aFile, TInt aLine)
	{
	((CTGraphicsStep*)iStep)->MQCTestWithErrorCode(aCondition, aErrorCode, aFile, aLine);
	}

inline void CTGraphicsBase::testSoftFailWinscw(TBool aCondition, const TText8* aFile, TInt aLine)
		{
#ifdef __WINS__
		if (!aCondition)
			{
			_LIT(KMessage,"ERROR: Test Failed but is ignored on WINSCW");
			Logger().LogExtra(aFile, aLine, ESevrErr, KMessage);
			}
#else // __WINS__
		testBooleanTrue(aCondition, aFile, aLine);
#endif //__WINS__
		}
#endif
