windowing/windowserver/tauto/tdirecta.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/tdirecta.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,522 @@
+// Copyright (c) 1996-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#ifndef __TDIRECTA_H__
+#define __TDIRECTA_H__
+
+#include "AUTO.H"
+#include <e32msgqueue.h>
+#include <time.h>
+#include "TGraphicsHarness.h"
+
+//#define LOGGING
+
+class CColorAnimation;
+class CScrollText;
+class CScrollingTextDrawer;
+class CDirectScreenAccessOld;
+
+
+struct TDirectThreadParam
+	{
+	TRect iRect;
+	TInt iScreenNumber;
+	TBool iIsInFront;
+	};
+
+class MAnimCallBacks
+	{
+public:
+	virtual void LogLeave(TInt aErr)=0;
+	virtual void Fail()=0;
+	virtual void Finished(TInt aId)=0;
+	virtual TDisplayMode DisplayMode(TInt aId)=0;
+	virtual TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished)=0;
+	virtual TInt TimerInterval(TInt aId)=0;
+	virtual void FailedReStart(TInt aId,TInt aReason)=0;
+	virtual TInt SlowStopping(TInt aId,TInt aCount)=0;
+	virtual void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString)=0;
+public:
+	CTBlankWindow* iCallBackWin;
+	};
+
+class CTDirect : public CTWsGraphicsBase, public MAbortDirectScreenAccess, public MAnimCallBacks
+	{
+public:
+	enum
+		{
+		eDirectNumFrames=10
+		};
+	enum
+		{
+		eDirectControlSem=0x01,
+		eDirectWindowSem=0x02,
+		eFontSet=0x04,
+		eMultiAnim=0x08,
+		};
+public:
+	CTDirect(CTestStep* aStep);
+	~CTDirect();
+	void ConstructL();
+	TBool DrawFrame();
+	TBool Restart();
+	void ChangeToNextScreenModeL();
+	void ChangeScreenScale();
+	//The Tests
+	TestState AnimateWindowL();
+	TestState AnimationDiesL();
+	TestState PackagingClassL();
+	TestState MultipleL();
+	TestState FailCodesL();
+	TestState ScrolingText1L();
+	TestState RClassL();
+	TestState ScrolingText2L();
+	TestState ScrolingText3L();
+	TestState ScrolingText4L();
+	TestState DefectFix_KAA_5J3BLW_L();
+	TestState KillAnimationL();
+	TestState DSAWithScreenModeOffset1L();
+	TestState DSAWithScreenModeOffset2L();
+	TestState WindowPoistionRelativeToScreenL();
+	TestState ScreenModeScalingTestL();
+	TestState ScreenModeTestForScalingL();
+	TestState MultipleDSAsOnSameWindowL();
+	TestState TemporaryDeadlockL();
+	TestState RegionTrackingOnlyNotificationsL(TUint aId);
+	TestState MixDsaAndRegionTrackingOnlyL(TBool aWhoExitsLast);
+	TestState TryDifferentSupportedModesL();
+protected:
+//from 	CTGraphicsStep
+	virtual void RunTestCaseL(TInt aCurTestCase);
+private:
+	void ConstrucBlankWindowL();
+	void ScanTypeFacesL();
+	void InitialiseAnimationL();
+	void DestroyAnimation();
+	void ResetScreenSizeMode();
+	void StartDirect();
+	void SignalWindow();
+	void ModeSwitch();
+	void ScrolingTextL(TInt aId,TRect aWinRect,TBool aStartThread,TInt aScreenMode=0);
+	void AnimTestL(TInt aId,TRect aWinRect,CTWinBase& aParent);
+	//Pure virtual function from MAbortDirectScreenAccess
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	//Pure virtual functions from MAnimCallBacks
+	void LogLeave(TInt aErr);
+	void Fail();
+	void Finished(TInt aId);
+	void DeleteMoveWindow();
+	void DeleteScroll();
+	TDisplayMode DisplayMode(TInt aId);
+	TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished);
+	TInt TimerInterval(TInt aId);
+	void FailedReStart(TInt aId,TInt aReason);
+	TInt SlowStopping(TInt aId,TInt aCount);
+	void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString);
+	void SetScreenMode(TInt aMode,TPixelsAndRotation& aPixelsAndRotation);
+	void CreateAnimForScreenModeL(TInt aAnimIndex,CTWinBase& aParent,TRect aRect,TInt aId);
+	void BlankTopClientWindowL(CTBlankWindow& aBlankWindow,TRect aRect);
+	void TestDifferentOriginAndScaleL(TSizeMode &aMode,TPoint aOrigin);
+	void CheckForTemporaryDeadlock();
+private:
+	CProcess* iProcess;
+	CProcess* iMoveWin;
+	RSemaphore iControlSem;
+	RMsgQueueBase iControlQueue;
+	RSemaphore iWinSem;
+	TRequestStatus iThreadStatus;
+	TUint iFlags;
+	CTBlankWindow* iWin;
+	CTBlankWindow* iWin2;
+	CFbsScreenDevice* iScrDev;
+	CFbsBitGc* iGc;
+	CFont* iFont;
+	CPeriodic* iTimer;
+	CIdle* iRestart;
+	CDirectScreenAccessOld* iDirect;
+	RRegion* iDrawingRegion;
+	TSize iScrSize;
+	TRect iDrawRect;
+	TInt iDrawHeight;
+	TInt iFrameNo;
+	TInt iLastTextWidth;
+	TInt iLastMaxTextWidth;
+	TInt iFrameToSignalAfter;
+	TBool iDelay;
+	TBool iCancelNext;
+	TBool iWindowDead;
+	CColorAnimation* iAnim;
+	CColorAnimation* iAnims[13];
+	TInt iCount;
+	CScrollText* iScroll;
+	TInt iCycles;
+	TScreenModeEnforcement iModeBackup;
+	TThreadStartUp iFirstFunction;
+	TInt iNumThreadHandles;
+	CTBlankWindow* iBlankTopClientWin1;
+	CTBlankWindow* iBlankTopClientWin2;
+	CPeriodic* iChangeScreenModeTimer;
+	TInt iCurrentMode;
+	TInt iNumOfModes;
+	TPoint iCurrentScreenModeOrigin;
+	TSize iCurrentScreenModeScale;
+	TInt iNumAnimation;
+	TSizeMode iModeData;
+	CPeriodic* iScreenModeTimer;
+	TInt iIsScalingSupported;
+	TInt iNumOfCallBack;
+	TBool iTestJustFailed;
+	TBool iTestJustCompleted;
+	TInt iState;
+	TBool iNextFrameFinished;
+	TBool iPackagingFinished;
+	TBool iTimerRunning;
+	};
+
+class CDirectScreenAccessOld : public CActive
+	{
+public:
+	static CDirectScreenAccessOld* NewL(RWsSession& aWs,MAbortDirectScreenAccess& aAborter);
+	~CDirectScreenAccessOld();
+	TInt Request(RRegion*& aRegion, RWindowBase& aWindow);
+private:
+	inline CDirectScreenAccessOld(RWsSession& aWs,MAbortDirectScreenAccess& aAborter)
+		: CActive(RDirectScreenAccess::EPriorityVeryHigh), iDirectAccess(aWs), iAborter(aAborter) {}
+	void ConstructL();
+	//Pure virtual functions from CActive
+	void DoCancel();
+	void RunL();
+private:
+	RDirectScreenAccess iDirectAccess;
+	MAbortDirectScreenAccess& iAborter;
+	TBool iAborting;
+	};
+
+class CColorAnimation : public CBase, public MDirectScreenAccess
+	{
+public:
+	enum
+		{
+		eStopNow=EFalse,
+		eStopDelayed=ETrue,
+		eAbort=2,
+		eAbortAll,
+		};
+public:
+	static TInt DrawColorL(TAny* aAnimation);
+	static TInt IdlingL(TAny* aAnimation);
+	static CColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWinBase& aParent,TRect aExtent,TBool aStart,TBool aRegionTrackingOnly = EFalse);
+	inline CColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack) :iId(aId), iCallBack(aCallBack), iScreenNumber(aScreenNumber) {}
+	~CColorAnimation();
+	void ConstructL(CTWinBase& aParent,TRect aExtent,TBool aRegionTrackingOnly,TInt aTypeWindow=0,TInt aSingleWinForMultipleDSA=0);
+	void StartL(TBool aChildWindow=EFalse);
+	void StartOrPanic();
+	void Stop();
+	void BringWindowToFront();
+	void ChangeModeL(TDisplayMode aMode);
+	TBool inline IsTimerActive() {return iTimer->IsActive();}
+	inline MAnimCallBacks& CallBack() { return iCallBack; }
+	TPoint AbsoluteWindowPosition(TInt aWindowId=0);
+	inline CDirectScreenAccess* GetDrawer();
+	void FinishTest();
+	TBool TestGcAndScreenDeviceValues();
+	//inline TBool IsReadyToAbort(){return (iDrawer->iStatus!=KRequestPending);}
+protected:
+	void DrawColorL();
+	void IdlingL();
+	/*pure virtual function from MAbortDirectScreenAccess*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	/*pure virtual function from MDirectScreenAccess*/
+	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	TInt iId;
+	CTBlankWindow* iWindow;
+	CTBlankWindow* iWindow2;
+	TSize iWinSize;
+	CDirectScreenAccess* iDrawer;
+	CPeriodic* iTimer;
+	MAnimCallBacks& iCallBack;
+	TInt iColor;
+	TInt iCount;
+	TUint iIdling;
+	TInt iScreenNumber;
+	TInt iSingleWinForMultipleDSA;
+	TBool iRegionTrackingOnly;
+	};
+
+class CScrollingTextDrawer : public CBase
+	{
+public:
+	static CScrollingTextDrawer* NewL(TInt aScreenNumber,CFbsScreenDevice*& aDevice,CFbsBitGc& aGc);
+	~CScrollingTextDrawer();
+	inline void SetScrollJump(TInt aJump) {iJump=aJump;}
+	void SetBottomOfTest(TInt aBottom);
+	void Scroll();
+private:
+	inline CScrollingTextDrawer(CFbsScreenDevice*& aDevice,CFbsBitGc& aGc) : iDevice(aDevice), iGc(&aGc) {}
+	void ConstructL(TInt aScreenNumber);
+	void CreateFontL();
+private:
+	CFbsScreenDevice*& iDevice;
+	CFbsScreenDevice* iFontDevice;
+	CFbsBitGc* iGc;
+	CFont* iFont;
+	TBuf<32> iText;
+	TRect iDrawRect;
+	TInt iDrawHeight;
+	TInt iCharWidth;
+	TInt iFirstChar;
+	TInt iJump;
+#if defined(LOGGING)
+	RWsSession iWs;
+#endif
+	};
+
+class CScrollText : public CBase, public MDirectScreenAccess
+	{
+public:
+	static TInt DrawText(TAny* aAnimation);
+	static CScrollText* NewL(TInt aScreenNumber,TInt aId,CTWindowGroup& aParent,TInt aScrollJump,TBool aStart=EFalse);
+	inline CScrollText(TInt aId,TInt aScrollJump,TInt aScreenNumber) :iId(aId), iScrollJump(aScrollJump), iScreenNumber(aScreenNumber) {}
+	~CScrollText();
+	void ConstructL(CTWindowGroup& aParent);
+	void StartL();
+	void Stop();
+	void ContinueL();
+	inline TBool IsRunning() {return iTimer->IsActive();}
+	inline void SetCountDown(TInt aCountDown) {iAbortCountDown=aCountDown; iCounting=ETrue;}
+	inline void SetBottomOfTest(TInt aBottom) {iTextDraw->SetBottomOfTest(aBottom);}
+private:
+	void ScrollText();
+	void DoContinueL();
+	/*pure virtual function from MAbortDirectScreenAccess*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	/*pure virtual function from MDirectScreenAccess*/
+	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	TInt iId;
+	CTBlankWindow* iWindow;
+	TSize iWinSize;
+	CDirectScreenAccess* iDrawer;
+	CScrollingTextDrawer* iTextDraw;
+	CPeriodic* iTimer;
+	TInt iScrollJump;
+	TBool iCounting;
+	TInt iAbortCountDown;
+	TInt iScreenNumber;
+	};
+
+	
+/**
+ A simple class based on CScrollText constructs a blank window that has
+ a blank window child, used for functional coverage testing of CWsClientWindow
+ */
+class CWindowWithChild : public CBase, public MDirectScreenAccess
+	{
+public:
+	static CWindowWithChild* NewL(TInt aScreenNumber, CTWindowGroup& aParent,TBool aStart=EFalse);
+	inline CWindowWithChild(TInt aScreenNumber) : iScreenNumber(aScreenNumber) {}
+	~CWindowWithChild();
+	void ConstructL(CTWindowGroup& aParent);
+	void StartL();
+	void Stop();
+	void ContinueL();
+	inline TBool IsRunning() {return iRunning;}
+	void PerformCoverageCalls();
+	RWindow *ChildWindow()    {return iChildWindow->Win();}
+private:
+	void DoContinueL();
+	/*pure virtual function from MAbortDirectScreenAccess*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	/*pure virtual function from MDirectScreenAccess*/
+	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	CTBlankWindow* iWindow;
+	CTWin * iChildWindow;
+	TSize iWinSize;
+	CDirectScreenAccess* iDrawer;
+	TInt iScreenNumber;
+	TBool iRunning;
+	};
+	
+	
+class CWsBase : public CBase
+	{
+public:
+protected:
+	~CWsBase();
+	void ConstructL(TInt aScreenNumber,TInt aHandle);
+	void CreateBlankWindowL(RBlankWindow& iWin,TInt aHandle);
+protected:
+	RWsSession iWs;
+	CWsScreenDevice *iScrDev;
+	RWindowGroup iGroup;
+	};
+
+class CAnimating : public CWsBase, public MAbortDirectScreenAccess
+	{
+public:
+	static TInt StartLC(TAny* aScreenNumber);
+	//static CAnimating* NewLC();
+	void DrawFrame();
+	/*pure virtual function from MAbortDirectScreenAccess*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	void ConstructL(TInt aScreenNumber);
+	~CAnimating();
+	void StartAnimatingL();
+private:
+	RSemaphore iControlSem;
+	RMsgQueueBase iControlQueue;
+	TBool iSemCreated;
+	RBlankWindow iWindow;
+	CFbsScreenDevice* iScrDev;
+	CFbsBitGc* iGc;
+	TSize iScrSize;
+	CDirectScreenAccessOld* iDirect;
+	RRegion* iDrawingRegion;
+	CPeriodic* iTimer;
+	TInt iColor;
+	};
+
+class CMoveWindow : public CWsBase
+	{
+public:
+	static TInt StartLC(TAny* aScreenNumber);
+	static TInt StateChange(TAny* aMoveWin);
+	static TInt FlipChange(TAny*);
+	//Call Backs
+	void MoveWindow();
+private:
+	inline static CMoveWindow* Cast(TAny* aMoveWin) {return STATIC_CAST(CMoveWindow*,aMoveWin);}
+	~CMoveWindow();
+	void ConstructL(TInt aScreenNumber);
+	void CreateTimerL();
+	void StateChange();
+	void ToggleDisplayMode();
+	void FlipChange();
+private:
+	CPeriodic* iFlipTimer;
+	CPeriodic* iStateTimer;
+	CPeriodic* iTimer;
+	CWsScreenDevice* iDevice;
+	RBlankWindow iWindow;
+	TDisplayMode iDisplayMode;
+	RBackedUpWindow iBackUpWin;
+	CWindowGc* iGc;
+	TRect iBounceArea;
+	TSize iScrSize;
+	TPoint iTl;
+	TSize iSize;
+	TSize iDelta;
+	TInt iStateCountDown;
+	TInt iNumOfModes;
+	TInt iCurrentMode;
+	};
+
+class CBugFixColorAnimation : public CColorAnimation
+	{
+public:
+	static CBugFixColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart=EFalse);
+	~CBugFixColorAnimation();
+	inline void Started() { iSem.Signal(); }
+private:
+	CBugFixColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack);
+	void ConstructL(CTWindowGroup& aParent,TRect aExtent);
+private:
+	/*pure virtual function from MAbortDirectScreenAccess*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	/*pure virtual function from MDirectScreenAccess*/
+	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	CProcess* iThread;
+	CIdle* iTestFailed;
+	TRect iAnimRect;
+	TDirectThreadParam iThreadParam;
+	RSemaphore iSem;
+	};
+
+class CRegionTrackingOnly : public CColorAnimation
+	{
+public:
+	static CRegionTrackingOnly* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart,TBool aOpenWindowInFrontDsa);
+	void ConstructL(CTWindowGroup& aParent,TRect aExtent,TBool aOpenWindowInFrontDsa);
+	~CRegionTrackingOnly();
+	inline void Started() { iSem.Signal(); }
+private:
+	CRegionTrackingOnly(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack);
+	/*Overriding of bases class virtual functions*/
+	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
+	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
+private:
+	CProcess* iThread;
+	TRect iAnimRect;
+	TBool iExpectedToAbort;	
+	TDirectThreadParam iThreadParam;
+	RSemaphore iSem;
+	};
+
+/*CPanicDirect*/
+ class CPanicDirect : public CBase
+ 	{
+ public:
+	static TInt DoTestOnNewScheduler(TInt aInt, TAny* aPtr);
+	static TInt DoTestOnNewSchedulerL(TInt aInt, TAny* aPtr);
+ private:
+ 	inline CPanicDirect() {}
+ 	~CPanicDirect();
+ 	void ConstructL(TInt aScreenNumber, TInt aInt);
+	static void DoTestNowL(TInt aInt, TAny* aPtr);
+ 	void TestL();
+ 	void DoDrawingL();
+private:
+	TInt iTestNo;
+	RWsSession iWs;
+	CWsScreenDevice* iWsScrDev;
+	RWindowGroup iGroup;
+	RBlankWindow iBlankWin;
+	RDirectScreenAccess iDirect;
+	TRequestStatus iDirectStatus;
+	RRegion* iRegion;
+	RTimer iTimer;
+	TRequestStatus iTimerStatus;
+	TBool iDrawingAllowed;
+	CFbsScreenDevice* iScreenDevice;
+	CFbsBitGc* iGc;
+	TDisplayMode iDisplayMode;
+	CScrollingTextDrawer* iTextDraw;
+	TInt iCount;
+	TInt iScreenNumber;
+	};
+
+class CTDirectStep : public CTGraphicsStep
+	{
+public:
+	CTDirectStep();
+protected:
+	//from CTGraphicsStep
+	virtual CTGraphicsBase* CreateTestL();
+	};
+
+_LIT(KTDirectStep,"TDirect");
+
+
+#endif