windowing/windowserver/tauto/TSCRMODE.CPP
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
child 97 0e9202c0340c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// 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:
// Test screen mode switching
// 
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include "TSCRMODE.H"

const TInt KBlankWinPosX=10;
const TInt KBlankWinPosY=20;
const TInt KBlankWinSizeX=30;
const TInt KBlankWinSizeY=25;

const TInt KScreenMode0=0;
const TInt KScreenMode1=1;
_LIT(KScreenModeDisplayMode,"GetScreenModeDisplayMode");


CTScrMode::CTScrMode(CTestStep* aStep) : CTWsGraphicsBase(aStep)
	{
	}

//
// Static func to check windows
//

LOCAL_C TInt DoPanicTest(TInt aInt, TAny *aScreenNumber)
	{
	RWsSession ws;
	CWsScreenDevice *screen=NULL;
	if (ws.Connect()==KErrNone)
		{
		screen = new (ELeave) CWsScreenDevice(ws);
		if (screen && screen->Construct((TInt)aScreenNumber)==KErrNone)
			{
			TPixelsTwipsAndRotation sar;
			CFbsBitGc::TGraphicsOrientation rot=CFbsBitGc::EGraphicsOrientationNormal;
			TInt mode=0;
			switch(aInt)
				{
				case 0:
				case 1:
					screen->SetScreenMode(aInt==0?1000:-1);
					break;
				case 2:
				case 3:
					screen->GetScreenModeSizeAndRotation(aInt==2?screen->NumScreenModes():-100000, sar);
					break;
				case 4:
				case 5:
					screen->GetScreenModeSizeAndRotation(aInt==4?screen->NumScreenModes()+100:-10, sar);
					break;
				case 6:
					mode=screen->NumScreenModes();
					goto SetRot;
				case 7:
					mode=-55;
					goto SetRot;
				case 8:
					mode=234;
					goto SetRot;
				case 9:
					mode=screen->NumScreenModes()+2;
					rot=CFbsBitGc::EGraphicsOrientationRotated270;
				SetRot:
					screen->SetCurrentRotations(mode,rot);
					break;
				case 10:
				case 11:
					ws.SetPointerCursorArea(aInt==10?1000:-1,TRect());
					break;
				case 12:
				case 13:
					ws.PointerCursorArea(aInt==12?1003:-2);
					break;
				case 14:
				case 15:
					{
					CArrayFixFlat<TInt> *rotations=new(ELeave) CArrayFixFlat<TInt>(1);
					screen->GetRotationsList(aInt==12?1003:-2,rotations);
					}
					break;
				case 100:
					rot=CFbsBitGc::EGraphicsOrientationRotated90;
					goto SetRot;
				case 101:
					rot=CFbsBitGc::EGraphicsOrientationRotated270;
					goto SetRot;
				case 102:
					mode=1;
					rot=CFbsBitGc::EGraphicsOrientationRotated270;
					goto SetRot;
				case 103:
					mode=1;
				#if defined(__EPOC32__)
					rot=CFbsBitGc::EGraphicsOrientationRotated180;
				#else
					rot=CFbsBitGc::EGraphicsOrientationNormal;
				#endif
					goto SetRot;
				}
			ws.Flush();
			}
		}

	return(EWsExitReasonBad);
	}

void SetupTestRWindowLC(RWindow& aWindow, const TPoint& aPos, const TSize& aSize, TDisplayMode aDisplayMode)
	{
	CleanupClosePushL(aWindow);
	User::LeaveIfError(aWindow.Construct(*TheClient->iGroup->GroupWin(), (TUint)&aWindow));
	aWindow.SetExtent(aPos, aSize);
	User::LeaveIfError(aWindow.SetRequiredDisplayMode(aDisplayMode));
	aWindow.Activate();
	}

void CTScrMode::TestPanicsL()
	{
	TInt ii;
	for (ii=0;ii<16;++ii)
		TEST(iTest->TestWsPanicL(DoPanicTest,EWservPanicScreenModeNumber,ii,(TAny*)iTest->iScreenNumber));
	for (ii=100;ii<104;++ii)
		TEST(iTest->TestWsPanicL(DoPanicTest,EWservPanicRotation,ii,(TAny*)iTest->iScreenNumber));
	iTest->CloseAllPanicWindows();
	}

CTScrMode::~CTScrMode()
	{
	((CTScrModeStep*)iStep)->CloseTMSGraphicsStep();
	delete iSecondConnection;
	TheClient->iGroup->GroupWin()->DisableScreenChangeEvents();
	SetScreenModeEnforcement(iOldEnfMode);
	}

void CTScrMode::ConstructL()
	{
	//Remove next line when bitmaps are stored correctly
	TestWin->Win()->EnableRedrawStore(EFalse);
	BaseWin->Win()->EnableRedrawStore(EFalse);
//
	TheClient->iGroup->GroupWin()->EnableScreenChangeEvents();
//
	//TheClient->iWs.SetAutoFlush(ETrue);
	ValidateWin(BaseWin,TRgb::Gray256(204));
	ValidateWin(TestWin,TRgb::Gray256(204));
//
	iWinState=0;
	iWinPos=TPoint(2*TheClient->iGroup->Size().iWidth/3,0);
//
	iSecondConnection=new(ELeave) CSecondConnection;
	iSecondConnection->ConstructL(iTest->iScreenNumber, TRect(KBlankWinPosX,KBlankWinPosY,KBlankWinPosX+KBlankWinSizeX,KBlankWinPosY+KBlankWinSizeY),iTest,iStep);
//
	iOldEnfMode=TheClient->iScreen->ScreenModeEnforcement();
	if (TheClient->iScreenModes.Count()<2)
		{
		iTest->iState=1000;	// Miss all tests
		_LIT(KLog,"Skipping all tests as less that 2 screen size modes");
		LOG_MESSAGE(KLog);
		}
	else
		{
		SetScreenModeEnforcement(ESizeEnforcementNone);
		TheClient->iScreen->SetScreenMode(TheClient->iScreenModes[0]);
		}
	}

void CTScrMode::SetScreenModeEnforcement(TScreenModeEnforcement aMode)
	{
	iCurEnforcement=aMode;
	TheClient->iScreen->SetScreenModeEnforcement(iCurEnforcement);
	}

void CTScrMode::ScaledDrawingL()
	{
	const TInt KLineXPos=10;
	const TInt KLineYPos=30;
	const TInt KLineLength=10;
	const TInt KXScaleFactor=4;
	const TInt KYScaleFactor=3;
//
	// Draw rectangle onto TestWin
 	CWindowGc *gc=TheClient->iGc;
	gc->Activate(*(TestWin->Win()));
	gc->SetBrushColor(KRgbBlack);
	gc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	gc->DrawRect(TRect(TPoint(KLineXPos,KLineYPos),TSize(KLineLength*KXScaleFactor,KYScaleFactor)));
	gc->Deactivate();
//
	// Draw scaled bitmap onto BaseWin
	TSize bitSize(KLineLength,1);
	TSize bitTwipSize(TheClient->iScreen->HorizontalPixelsToTwips(bitSize.iWidth*KXScaleFactor),
					  TheClient->iScreen->VerticalPixelsToTwips(bitSize.iHeight*KYScaleFactor));
	CFbsBitGc *bitGc=NULL;
	CFbsBitmapDevice *device=NULL;
	CFbsBitmap *bitmap=NULL;
	bitmap=new(ELeave) CFbsBitmap();
	CleanupStack::PushL(bitmap);
	User::LeaveIfError(bitmap->Create(bitSize,EGray16));
	bitmap->SetSizeInTwips(bitTwipSize);
	device=CFbsBitmapDevice::NewL(bitmap);
	CleanupStack::PushL(device);
	User::LeaveIfError(device->CreateContext(bitGc));
	bitGc->SetBrushColor(KRgbBlack);
	bitGc->Clear();
	delete bitGc;
//
 	gc->Activate(*(BaseWin->Win()));
	gc->DrawBitmap(TPoint(KLineXPos,KLineYPos),bitmap);
	gc->Deactivate();
//
	TheClient->iWs.Flush();

	CleanupStack::PopAndDestroy(2);	// bitmap,device

	CompareWindows(_L("CTScrMode::ScaledDrawingL() CompareWindows() failed"));
	}

void CTScrMode::ValidateWin(TestWindow *aWin, TRgb aColor)
	{
	aWin->Win()->Invalidate();
	RedrawWin(*aWin->Win(),aColor);
	}

void CTScrMode::RedrawWin(RWindow &aWin, TRgb aColor)
	{
	aWin.BeginRedraw();
	TheClient->iGc->Activate(aWin);
	TheClient->iGc->SetBrushColor(aColor);
	TheClient->iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	TheClient->iGc->SetPenStyle(CGraphicsContext::ENullPen);
	TheClient->iGc->Clear();
	TheClient->iGc->Deactivate();
	aWin.EndRedraw();
	}

void CTScrMode::CheckWindows(TBool aWinIsVis)
	{
	iSecondConnection->SetWindow2Visibility(aWinIsVis);
	TheClient->WaitForRedrawsToFinish();
	TheClient->iWs.Finish();
	CompareWindows(_L("CTScrMode::CheckWindows() CompareWindows() failed"));
	}

void CTScrMode::ScreenRotationsL()
	{
	CWsScreenDevice *screen=TheClient->iScreen;
	CArrayFixFlat<TInt> *rotations=new(ELeave) CArrayFixFlat<TInt>(1);
	CFbsBitGc::TGraphicsOrientation currentRotation;
	TPixelsAndRotation sizeAndRotation;
	TPixelsTwipsAndRotation sizeAndRotation2;
	TBool found;
	TInt numModes=TheClient->iScreenModes.Count();
	TInt count;
	TInt ii,jj;
	CleanupStack::PushL(rotations);
	for (ii=0;ii<numModes;++ii)
		{
		TInt mode=TheClient->iScreenModes[ii];
		User::LeaveIfError(screen->GetRotationsList(mode,rotations));
		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation2);
		TEST(sizeAndRotation.iPixelSize.iWidth==sizeAndRotation2.iPixelSize.iWidth);
		if (sizeAndRotation.iPixelSize.iWidth!=sizeAndRotation2.iPixelSize.iWidth)
			INFO_PRINTF3(_L("sizeAndRotation.iPixelSize.iWidth==sizeAndRotation2.iPixelSize.iWidth  - Expected: %d, Actual: %d"), sizeAndRotation.iPixelSize.iWidth, sizeAndRotation2.iPixelSize.iWidth);

		TEST(sizeAndRotation.iPixelSize.iHeight==sizeAndRotation2.iPixelSize.iHeight);
		if (sizeAndRotation.iPixelSize.iHeight!=sizeAndRotation2.iPixelSize.iHeight)
			INFO_PRINTF3(_L("sizeAndRotation.iPixelSize.iHeight==sizeAndRotation2.iPixelSize.iHeight  - Expected: %d, Actual: %d"), sizeAndRotation.iPixelSize.iHeight, sizeAndRotation2.iPixelSize.iHeight);

		count=rotations->Count();
		TEST(count>=1);
		if (count<1)
			INFO_PRINTF3(_L("rotations->Count() return value  - Expected: %d or more, Actual: %d"), 1, count);

		TBool retVal;

		if (sizeAndRotation.iPixelSize.iWidth!=sizeAndRotation.iPixelSize.iHeight)
			{
			TEST(count<=2);
			if (count>2)
				INFO_PRINTF3(_L("rotations->Count() return value  - Expected: %d or less, Actual: %d"), 2, count);

			if (count==2)
				{
				retVal = (*rotations)[0]+2==(*rotations)[1];
				TEST(retVal);		//Must only have rotations 180 degrees apart
				if (!retVal)
					INFO_PRINTF3(_L("(*rotations)[0]+2==(*rotations)[1]  - Expected: %d, Actual: %d"), ETrue, retVal);
				}
			}
		found=EFalse;
		for (jj=0;jj<count;++jj)
			{
			if ((*rotations)[jj]==sizeAndRotation.iRotation)
				{
				retVal = (*rotations)[jj]==sizeAndRotation2.iRotation;
				TEST(retVal);
				if (!retVal)
					INFO_PRINTF3(_L("(*rotations)[jj]==sizeAndRotation2.iRotation  - Expected: %d, Actual: %d"), ETrue, retVal);

				found=ETrue;
				break;
				}
			}
		TEST(found);
		if (!found)
				INFO_PRINTF3(_L("found  - Expected: %d, Actual: %d"), ETrue, found);

		if (count>1)
			{
			currentRotation=sizeAndRotation.iRotation;
			for (jj=0;jj<count;++jj)
				{
				screen->SetCurrentRotations(mode,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,(*rotations)[jj]));
				screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
				screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation2);
				retVal = (*rotations)[jj]==sizeAndRotation.iRotation;
				TEST(retVal);
				if (!retVal)
					INFO_PRINTF3(_L("(*rotations)[jj]==sizeAndRotation.iRotation  - Expected: %d, Actual: %d"), ETrue, retVal);

				retVal = (*rotations)[jj]==sizeAndRotation2.iRotation;
				TEST(retVal);
				if (!retVal)
					INFO_PRINTF3(_L("(*rotations)[jj]==sizeAndRotation2.iRotation  - Expected: %d, Actual: %d"), ETrue, retVal);

				}
			screen->SetCurrentRotations(mode,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,currentRotation));
			screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
			screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation2);

			retVal = currentRotation==sizeAndRotation.iRotation;
			TEST(retVal);
			if (!retVal)
				INFO_PRINTF3(_L("currentRotation==sizeAndRotation.iRotation  - Expected: %d, Actual: %d"), ETrue, retVal);

			retVal = currentRotation==sizeAndRotation2.iRotation;
			TEST(retVal);
			if (!retVal)
				INFO_PRINTF3(_L("currentRotation==sizeAndRotation2.iRotation  - Expected: %d, Actual: %d"), ETrue, retVal);
			}
		}
	CleanupStack::PopAndDestroy();
	}

void CTScrMode::MoreScreenRotationsL()
	{
	RWindow shield4Gray(TheClient->iWs);
	// The default display mode needs to be updated to EColor64K for Oghma integ
	SetupTestRWindowLC(shield4Gray,TPoint(),TSize(100000,100000),EColor64K);
//
	CWsScreenDevice *screen=TheClient->iScreen;
	//CFbsBitGc::TGraphicsOrientation currentRotation;
	TPixelsAndRotation sizeAndRotation;
	TInt currentRotation;
	TInt currentMode=FindCurrentMode();
	TInt numModes=TheClient->iScreenModes.Count();
	TInt currentScreenMode;
	TInt count;
	TInt ii,jj;
	CArrayFixFlat<TInt> *currentRotations=new(ELeave) CArrayFixFlat<TInt>(1);
	CleanupStack::PushL(currentRotations);
	currentRotations->ResizeL(numModes);
	CArrayFixFlat<TInt> *originalRotation=new(ELeave) CArrayFixFlat<TInt>(1);
	CleanupStack::PushL(originalRotation);
	originalRotation->ResizeL(numModes);
	CArrayFixFlat<TInt> *rotations=new(ELeave) CArrayFixFlat<TInt>(1);
	CleanupStack::PushL(rotations);
	for (ii=0;ii<numModes;++ii)
		{
		TInt mode=TheClient->iScreenModes[ii];
		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
		(*currentRotations)[ii]=sizeAndRotation.iRotation;
		(*originalRotation)[ii]=sizeAndRotation.iRotation;
		}
	for (ii=0;ii<numModes;++ii)
		{
		TInt mode=TheClient->iScreenModes[ii];
		screen->SetScreenMode(mode);
		currentScreenMode = screen->CurrentScreenMode();
		TEST(currentScreenMode == mode);
		if (currentScreenMode != mode)
			INFO_PRINTF3(_L("screen->CurrentScreenMode() return value - Expected: %d, Actual: %d"), mode, currentScreenMode);

		screen->GetDefaultScreenSizeAndRotation(sizeAndRotation);
		currentRotation=(*currentRotations)[ii];
		TEST(sizeAndRotation.iRotation==currentRotation);

		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
		TEST(sizeAndRotation.iRotation==currentRotation);

		User::LeaveIfError(screen->GetRotationsList(mode,rotations));
		count=rotations->Count();
		if (count>1)
			{
			for (jj=0;jj<count;)
				{
				if ((*rotations)[jj++]==currentRotation)
					break;
				}
			if (jj==count)
				jj=0;
			currentRotation=(*rotations)[jj];
			screen->SetCurrentRotations(mode,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,currentRotation));
			(*currentRotations)[ii]=currentRotation;
			}
		}
	for (ii=0;ii<numModes;++ii)
		{
		TInt mode=TheClient->iScreenModes[ii];
		screen->SetScreenMode(mode);
		currentScreenMode = screen->CurrentScreenMode();
		TEST(currentScreenMode == mode);
		if (currentScreenMode != mode)
			INFO_PRINTF3(_L("(screen->CurrentScreenMode() return value - Expected: %d, Actual: %d"), mode, currentScreenMode);

		screen->GetDefaultScreenSizeAndRotation(sizeAndRotation);
		currentRotation=(*currentRotations)[ii];
		TEST(sizeAndRotation.iRotation==currentRotation);
		if (sizeAndRotation.iRotation != currentRotation)
			INFO_PRINTF3(_L("(screen->GetDefaultScreenSizeAndRotation() return value - Expected: %d, Actual: %d"), currentRotation, sizeAndRotation.iRotation);

		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation);
		TEST(sizeAndRotation.iRotation==currentRotation);
		if (sizeAndRotation.iRotation != currentRotation)
			INFO_PRINTF3(_L("(screen->GetDefaultScreenSizeAndRotation() return value - Expected: %d, Actual: %d"), currentRotation, sizeAndRotation.iRotation);

		if (currentRotation!=(*originalRotation)[ii])
			screen->SetCurrentRotations(mode,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,(*originalRotation)[ii]));
		}
	screen->SetScreenMode(currentMode);
	currentScreenMode = screen->CurrentScreenMode();
	TEST(currentScreenMode == currentMode);
	if (currentScreenMode != currentMode)
		INFO_PRINTF3(_L("(screen->CurrentScreenMode() return value - Expected: %d, Actual: %d"), currentMode, currentScreenMode);

	CleanupStack::PopAndDestroy(4,&shield4Gray);
	}

TInt CTScrMode::FindCurrentMode()
	{
	CWsScreenDevice *screen=TheClient->iScreen;
	TPixelsTwipsAndRotation sizeAndRotation;
	TPixelsTwipsAndRotation sizeAndRotation2;
	TInt numModes=TheClient->iScreenModes.Count();
	TInt ii;
	screen->GetDefaultScreenSizeAndRotation(sizeAndRotation);
	for (ii=0;ii<numModes;++ii)
		{
		TInt mode=TheClient->iScreenModes[ii];
		screen->GetScreenModeSizeAndRotation(mode,sizeAndRotation2);
		if (Equal(sizeAndRotation,sizeAndRotation2))
			return mode;
		}
	TEST(EFalse);
	return -1;
	}

TBool CTScrMode::Equal(const TPixelsTwipsAndRotation& aLeft,const TPixelsTwipsAndRotation& aRight)
	{
	if (aLeft.iPixelSize!=aRight.iPixelSize)
		return EFalse;
	if (aLeft.iRotation!=aRight.iRotation)
		return EFalse;
	if (aLeft.iTwipsSize!=aRight.iTwipsSize)
		return EFalse;
	return ETrue;
	}

TBool CTScrMode::RectClearBugL()
	{
	CWsScreenDevice *screen=TheClient->iScreen;
	TPixelsTwipsAndRotation sizeAndRotation1;
	TPixelsTwipsAndRotation sizeAndRotation2;
	TInt screenMode=FindCurrentMode();
	TInt largeMode=0;
	TInt smallMode=1;
	INFO_PRINTF1(_L("Rotation 1"));
	screen->GetScreenModeSizeAndRotation(0,sizeAndRotation1);
	INFO_PRINTF1(_L("Rotation 2"));
	screen->GetScreenModeSizeAndRotation(1,sizeAndRotation2);
	TSize winSize=TSize(Max(sizeAndRotation1.iPixelSize.iWidth,sizeAndRotation2.iPixelSize.iWidth)
						,Max(sizeAndRotation1.iPixelSize.iHeight,sizeAndRotation2.iPixelSize.iHeight));
	if (sizeAndRotation1.iPixelSize.iWidth<=sizeAndRotation2.iPixelSize.iWidth
									&& sizeAndRotation1.iPixelSize.iHeight<=sizeAndRotation2.iPixelSize.iHeight)
		{
		largeMode=1;
		smallMode=0;
		}
	if (screenMode!=largeMode)
	{
		INFO_PRINTF2(_L("Large Mode %d\r\n"),largeMode);
		screen->SetScreenMode(largeMode);
	}
	CBlankWindow *blankWin=new(ELeave) CBlankWindow(TRgb::Gray256(204));
	CleanupStack::PushL(blankWin);
	blankWin->SetUpL(TPoint(),winSize,TheClient->iGroup,*TheClient->iGc);
	TheClient->iGc->Activate(*blankWin->Win());		//blankWin->Win()->Invalidate();
	blankWin->Draw();
	TheClient->iWs.Flush();
	blankWin->Win()->SetRequiredDisplayMode(EGray4);
	INFO_PRINTF2(_L("Small Mode %d\r\n"),smallMode);
	screen->SetScreenMode(smallMode);
	TheClient->iWs.Flush();
	TheClient->iGc->Deactivate();
	CleanupStack::PopAndDestroy();
	if (screenMode!=smallMode)
	{
		INFO_PRINTF2(_L("Screen Mode %d\r\n"),screenMode);
		screen->SetScreenMode(screenMode);
	}

	return ETrue;
	}

void CTScrMode::ScreenModeChange1L()
	{
	CTWin* color64win;
	color64win=new(ELeave) CTWin();
	CleanupStack::PushL(color64win);
	color64win->ConstructL(*TheClient->iGroup);
	color64win->BaseWin()->SetRequiredDisplayMode(EColor64K);
	//color64win->SetBackgroundColor(TRgb(0,0,255));
	color64win->Win()->SetBackgroundColor();
	color64win->Activate();
	TheClient->Flush();
	CTWin* color4win;
	color4win=new(ELeave) CTWin();
	CleanupStack::PushL(color4win);
	color4win->ConstructL(*TheClient->iGroup);
	color4win->BaseWin()->SetRequiredDisplayMode(EColor4K);
	//color4win->SetBackgroundColor(TRgb(255,0,0));
	color4win->Win()->SetBackgroundColor();
	color4win->SetSize(TSize(600,200));
	color4win->Activate();
	TheClient->Flush();
	color4win->SetSize(TSize(640,240));
	TheClient->Flush();
	color64win->SetSize(TSize(20,20));
	color64win->WinTreeNode()->SetOrdinalPosition(0);
	TheClient->Flush();
	CleanupStack::Pop(2,color64win);
	delete color64win;
	TheClient->Flush();
	delete color4win;
	//CleanupStack::PopAndDestroy(2,color64win);
	}

void CTScrMode::ScreenModeChange2L()
	{
	CTBlankWindow* color64win;
	color64win=new(ELeave) CTBlankWindow();
	CleanupStack::PushL(color64win);
	color64win->ConstructL(*TheClient->iGroup);
	color64win->BaseWin()->SetRequiredDisplayMode(EColor64K);
	color64win->SetColor(TRgb(0,0,255));
	//color64win->SetColor();
	color64win->Activate();
	TheClient->Flush();
	CTBlankWindow* color4win;
	color4win=new(ELeave) CTBlankWindow();
	CleanupStack::PushL(color4win);
	color4win->ConstructL(*TheClient->iGroup);
	color4win->BaseWin()->SetRequiredDisplayMode(EColor4K);
	color4win->SetColor(TRgb(255,0,0));
	//color4win->SetColor();
	color4win->SetSize(TSize(600,200));
	color4win->Activate();
	TheClient->Flush();
	color4win->SetSize(TSize(640,240));
	TheClient->Flush();
	color64win->SetSize(TSize(20,20));
	color64win->WinTreeNode()->SetOrdinalPosition(0);
	TheClient->Flush();
	CleanupStack::Pop(2,color64win);
	delete color64win;
	TheClient->Flush();
	delete color4win;
	//CleanupStack::PopAndDestroy(2,color64win);
	}

LOCAL_C void ResetAndDestroyWindows(TAny* aPointerArray)
	{
	static_cast<RPointerArray<CBlankWindow>*>(aPointerArray)->ResetAndDestroy();
	}

LOCAL_C TBool WalkThroughTree(RPointerArray<CBlankWindow> aListOfWindows)
	{
	TBool ret=ETrue;
	TInt count = aListOfWindows.Count();
	while (--count>=0 && ret)
		{
		RRegion region;
		((aListOfWindows)[count])->Win()->GetInvalidRegion(region);
		ret=region.IsEmpty();
		}
	return ret;
	}

void CTScrMode::InvisibleWndAndInfiniteRedrawBugL()
	{
	// Current Test client state
	CTClient* clientA=TheClient;
	CWsScreenDevice* screenClientA=clientA->iScreen;
	const TScreenModeEnforcement screenModeEnforcement = screenClientA->ScreenModeEnforcement();
	const TInt currentScreenMode=FindCurrentMode();
	TPixelsTwipsAndRotation sizeAndRotation;
	screenClientA->GetScreenModeSizeAndRotation(currentScreenMode,sizeAndRotation);


	SecondClientConnection* clientB = new(ELeave) SecondClientConnection();
	CleanupStack::PushL(clientB);
	clientB->SetScreenNumber(iTest->iScreenNumber);
	clientB->ConstructL(currentScreenMode, sizeAndRotation);

// Start test
	CWindowGc& gc=*clientB->iGc;
	RWsSession ws=clientB->iWs;
	CTWindowGroup* group=clientB->iGroup;

	const TInt shrinkFactor = 5;
	TRect parentRect(0,0, sizeAndRotation.iPixelSize.iWidth, sizeAndRotation.iPixelSize.iHeight);
	RPointerArray<CBlankWindow> windows;
	CleanupStack::PushL(TCleanupItem(ResetAndDestroyWindows, &windows));
	// create several children
	const TInt count = (iTest->iTestLevel==iTest->ELevelQuick ? 5 : 7);
	CBlankWindow* blankWin=NULL;
	CTWinBase* parent=group;
	for (TInt childNum=0; childNum<count; ++childNum)
		{
		blankWin=new(ELeave) CBlankWindow();
		CleanupStack::PushL(blankWin);
		User::LeaveIfError(windows.Append(blankWin));
		CleanupStack::Pop(blankWin);
		blankWin->SetUpL(parentRect.iTl, parentRect.Size(), parent, gc);
		// make it visible and draw it
		blankWin->Win()->Invalidate();
		gc.Activate(*blankWin->Win());
		blankWin->Draw();
		ws.Flush();
		gc.Deactivate();
		// prepare for next window
		parent=blankWin;
		parentRect.Shrink(shrinkFactor, shrinkFactor);
		}

	// change screen mode and check visibility of all windows

	const TInt newScreenMode = (currentScreenMode==KScreenMode0?KScreenMode1:KScreenMode0);
	TPixelsTwipsAndRotation sizeAndRotationForDifferentScreenMode;
	screenClientA->GetScreenModeSizeAndRotation(newScreenMode, sizeAndRotationForDifferentScreenMode);
	screenClientA->SetScreenSizeAndRotation(sizeAndRotationForDifferentScreenMode);
	screenClientA->SetScreenMode(newScreenMode);

	TheClient->WaitForRedrawsToFinish();
	TBool retVal = WalkThroughTree(windows);
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("WalkThroughTree(windows) return value - Expected: %d, Actual: %d"), ETrue, retVal);


	screenClientA->SetScreenModeEnforcement(screenModeEnforcement);
	screenClientA->SetScreenMode(currentScreenMode);
	screenClientA->SetScreenSizeAndRotation(sizeAndRotation);

	// destroy all windows
	CleanupStack::PopAndDestroy(2, clientB); // ResetAndDestroyWindows and client
	// Needed to get system back into a good state as this test can leave the shell in front of the test app
	TheClient->iGroup->GroupWin()->SetOrdinalPosition(0);
	}

//To test the APIs GetScreenModeDisplayMode() & GetDefModeMaxNumColors()
void CTScrMode::GetScreenDisplayMode()
	{
	TInt color,gray;
	CWsScreenDevice *screen=TheClient->iScreen;
	TInt currentScreenMode=screen->CurrentScreenMode(); //finding the current screen mode
	screen->SetScreenMode(KScreenMode1); //changing the current screen mode to 1

	//testing the display mode of Screen Mode using the API GetScreenModeDisplayMode()
	TDisplayMode displayMode=screen->GetScreenModeDisplayMode(KScreenMode1);

	TEST(displayMode!=ENone);
	TEST(displayMode!=ERgb);
	//testing the default mode of Screen Mode using the API GetDefModeMaxNumColors()
	TDisplayMode defaultMode=TheClient->iWs.GetDefModeMaxNumColors(color,gray);
	TDisplayMode defaultModeForScreen=TheClient->iWs.GetDefModeMaxNumColors(screen->GetScreenNumber(),color,gray);
	TEST(defaultMode==defaultModeForScreen);
	TEST(defaultMode!=ENone);
	TEST(defaultMode!=ERgb);
	TEST(color == 16777216 || color == 0 || color == 16 || color == 256  || color == 4096 || color == 65536);
	TEST(gray == 0 || gray == 2 || gray == 4  || gray == 16  || gray == 256);
  	screen->SetScreenMode(currentScreenMode);
  	
	CArrayFixFlat<TInt>* modeList=new CArrayFixFlat<TInt>(15);
	TEST(modeList != NULL);
	if(!modeList)
		{
		return;
		}
	TInt res = TheClient->iWs.GetColorModeList(modeList);
	TEST(res == KErrNone);
	TDisplayMode modeMax = ENone;
	for(TInt index = 0; index < modeList->Count(); index++)
		{
		TDisplayMode mode = (TDisplayMode) ((*modeList)[index]);
		if(mode > modeMax)
			{
			modeMax = mode;
			}
		}
	modeList->Reset();
	delete modeList;
	TInt realColor = 0;
	TInt realGray = 0;
	switch(modeMax)
		{
	case EGray2:
		realColor = 2;
		realGray = 2;
		break;
	case EGray4:
		realColor = 4;
		realGray = 4;
		break;
	case EGray16:
		realColor = 16;
		realGray = 16;
		break;
	case EGray256:
		realColor = 256;
		realGray = 256;
		break;
	case EColor16:
		realColor = 16;
		break;
	case EColor256:
		realColor = 256;
		break;
	case EColor4K:
		realColor = 4096;
		break;
	case EColor64K:
		realColor = 65536;
		break;
	case EColor16M:
	case EColor16MU:
	case EColor16MA:
	case EColor16MAP:
		realColor = 16777216;
		break;
	default:
		break;
		}
 
 	if (realColor > 0)
 	 	TEST(realColor == color);
 	if (realGray > 0)
 	 	TEST(gray == realGray);	
	}

void CTScrMode::SetScreenModeAfterScreenDeviceDeletedL()
	{
	// A separate session is needed, because this test will delete the primary screen device
	RWsSession ws; 
	User::LeaveIfError(ws.Connect());

	// Push the secondary screen device first onto the cleanup stack
	// so that we can pop and destroy the primary screen device first
	CWsScreenDevice* secondaryScreenDevice = new (ELeave) CWsScreenDevice(ws);
	CleanupStack::PushL(secondaryScreenDevice);

	CWsScreenDevice* primaryScreenDevice = new (ELeave) CWsScreenDevice(ws);
	CleanupStack::PushL(primaryScreenDevice);

	// Construct the primary screen device first to ensure that it is
	// used by the group window
	User::LeaveIfError(primaryScreenDevice->Construct(iTest->iScreenNumber));
	User::LeaveIfError(secondaryScreenDevice->Construct(iTest->iScreenNumber));

	RWindowGroup group(ws);
	User::LeaveIfError(group.Construct(888));
	group.EnableReceiptOfFocus(EFalse);	// Stop auto group switching on close

	RArray<TInt> screenModes;
	primaryScreenDevice->GetScreenSizeModeList(&screenModes);
	primaryScreenDevice->SetScreenMode(screenModes[0]);

	// Prematurely destroy the primary screen device used by the group window
	CleanupStack::PopAndDestroy(primaryScreenDevice);

	// Simulate screen rotation - call SetScreenMode()
	// This would trigger the defective behaviour and wserv would panic if broken
	secondaryScreenDevice->SetScreenMode(screenModes[0]);

	// Tidy up
	screenModes.Close();
	group.Close();
	CleanupStack::PopAndDestroy(secondaryScreenDevice);
	ws.Flush();
	ws.Close();
	}
	
void CTScrMode::DrawTestBmpL(CFbsBitmap* aTestBitmap)
	{
	CFbsBitmapDevice* device=CFbsBitmapDevice::NewL(aTestBitmap);
	CleanupStack::PushL(device);
	CGraphicsContext* bmpgc;
	User::LeaveIfError(device->CreateContext(bmpgc));
	CleanupStack::PushL(bmpgc);
	bmpgc->SetPenColor(KRgbDarkRed);
	bmpgc->SetBrushColor(KRgbYellow);
	bmpgc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	bmpgc->SetPenStyle(CGraphicsContext::ESolidPen);
	bmpgc->DrawRect(TRect(aTestBitmap->SizeInPixels()));
	CleanupStack::PopAndDestroy(2,device);
	}

void CTScrMode::TestDrawingToWindows(CWindowGc* aWinGc1, CWindowGc* aWinGc2, RWindow& aWindow1,RWindow& aWindow2,CFbsBitmap* aBitmap64K,CFbsBitmap* aBitmap16M,CFbsFont* aFont, TBool aAllInRedraw, TBool aUseSystemGc, TBool aUseBmp16M)
	{
	CFbsBitmap* bitmap=aUseBmp16M?aBitmap16M:aBitmap64K;
	TInt ascent=aFont->AscentInPixels();
	for(TInt win=0;win<2;win++)
		{
		RWindow* winPtr=(win==0)?&aWindow1:&aWindow2;
		winPtr->Invalidate();
		winPtr->BeginRedraw();
		CWindowGc* winGc;
		if (aUseSystemGc)
			{
			winGc=TheClient->iGc;
			winGc->Activate(*winPtr);
			}
		else
			{
			winGc=(win==0)?aWinGc1:aWinGc2;
			winGc->Reset();
			}
		winGc->SetBrushColor(KRgbBlue);
		winGc->Clear();
		if (!aAllInRedraw)
			winPtr->EndRedraw();
//
		winGc->BitBlt(TPoint(0,0),bitmap);
		winGc->UseFont(aFont);
		_LIT(KTestText123,"Test text 123");
		winGc->DrawText(KTestText123,TPoint(0,ascent));
		if (aAllInRedraw)
			winPtr->EndRedraw();
		if (aUseSystemGc)
			winGc->Deactivate();
		}
	TBool winCheck=DoCheckRectRWin(aWindow1,aWindow2,TRect(aWindow1.Size()));
	if (!winCheck)
		{
		TBuf<256> errBuf(_L("Rot-mode test failed"));
		if (aAllInRedraw)
			errBuf.Append(_L(", All in Redraw"));
		if (aUseSystemGc)
			errBuf.Append(_L(", System Gc"));
		if (aUseBmp16M)
			errBuf.Append(_L(", 16M bmp"));
		else
			errBuf.Append(_L(", 64K bmp"));
		INFO_PRINTF1(errBuf);
		}
	TEST(winCheck);
	}

void SetWsAndAppScreenModes(TInt aMode)
	{
	TheClient->iScreen->SetScreenMode(aMode);
	TheClient->iScreen->SetAppScreenMode(aMode);
	}
	
TDisplayMode HighestMatch(CArrayFixFlat<TInt>* aModeList,TInt &aMaxBpp)
	{
	TDisplayMode highMode=ENone;
	TInt highBpp=0;
	for(TInt loop=aModeList->Count()-1;loop>=0;loop--)
		{
		TDisplayMode mode=(TDisplayMode)(*aModeList)[loop];
		TInt bpp;
		switch(mode)
			{
			case EGray2:
				bpp=1;
				break;
			case EGray4:
				bpp=2;
				break;
			case EGray16:
			case EColor16:
				bpp=4;
				break;
			case EColor256:
			case EGray256:
				bpp=8;
				break;
			case EColor64K:
				bpp=16;
				break;
			case EColor4K:
				bpp=12;
				break;
			case EColor16M:
			case EColor16MU:
			case EColor16MA:
			case EColor16MAP:
				bpp=32;
				break;
			default:
				bpp=0;
				break;
			}
		if (bpp>highBpp && bpp<aMaxBpp)
			{
			highBpp=bpp;
			highMode=mode;
			}
		}
	aMaxBpp=highBpp;
	return(highMode);
	}

void CTScrMode::TestRotateAndScreenModeL()
	{
	TheClient->iGroup->GroupWin()->SetOrdinalPosition(0);
// When switching colour modes Wserv takes into account the full device size, not the clipped size
// associated with any specific screen mode. Therefore any windows designed to influence the screen
// mode must use the appropriately rotated device base screen size, not any cutdown screen mode sizes.
	TSize baseScreenSize=TheClient->iScreen->SizeInPixels();
	TSize rotatedBaseSize(baseScreenSize.iHeight,baseScreenSize.iWidth);
	TInt maxScreenDimension=Max(baseScreenSize.iHeight,baseScreenSize.iWidth);
//
	CArrayFixFlat<TInt>* modeList=new(ELeave) CArrayFixFlat<TInt>(15);
	CleanupStack::PushL(modeList);
	User::LeaveIfError(TheClient->iWs.GetColorModeList(modeList));
	TInt maxBpp=KMaxTInt;
	TDisplayMode testDispModeHigh=HighestMatch(modeList,maxBpp);
	TDisplayMode testDispModeLow=HighestMatch(modeList,maxBpp);
	CleanupStack::PopAndDestroy(modeList);
// If only one available display mode skip tests
	if (testDispModeLow==ENone)
		return;
//
	CFbsFont* font;
	TFontSpec fspec;
	fspec.iHeight=240;
	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont*&)font,fspec));
// Create a massive 16M window to make sure 16M is the fallback mode when any area of the screen is exposed
	RWindow shield16M(TheClient->iWs);
	SetupTestRWindowLC(shield16M,TPoint(),TSize(100000,100000),testDispModeHigh);
	RedrawWin(shield16M,KRgbBlack);
//
	TInt numModes=TheClient->iScreenModes.Count();
	for(TInt modeIndex=0;modeIndex<numModes;modeIndex++)
		{
		TInt screenMode=TheClient->iScreenModes[modeIndex];
		TPoint origin=TheClient->iScreen->GetScreenModeScaledOrigin(screenMode);
		if (origin.iX!=0 || origin.iY!=0)
			continue;
		TPixelsTwipsAndRotation sar;
		TheClient->iScreen->GetScreenModeSizeAndRotation(screenMode,sar);
		TSize screenSize=sar.iPixelSize;
		if (screenSize.iWidth>baseScreenSize.iWidth || screenSize.iHeight>baseScreenSize.iHeight)
			continue;
		TSize rotatedScreenDeviceSize(sar.iRotation==CFbsBitGc::EGraphicsOrientationRotated90 || sar.iRotation==CFbsBitGc::EGraphicsOrientationRotated270?
				rotatedBaseSize:baseScreenSize);
//
		TheClient->iScreen->SetScreenMode(screenMode);
//
		TSize screenSize1 = screenSize;
		screenSize1.iWidth = Min(screenSize1.iWidth, rotatedScreenDeviceSize.iWidth); //this is to guarantee we won't compare beyond screen size
		TSize testSize(screenSize1.iWidth/2,screenSize1.iHeight);
		TSize testBmpSize(testSize.iWidth,testSize.iHeight/4);
//
		CFbsBitmap* testBitmap64=new(ELeave) CFbsBitmap;
		CleanupStack::PushL(testBitmap64);
		User::LeaveIfError(testBitmap64->Create(testBmpSize,testDispModeLow));
		DrawTestBmpL(testBitmap64);
//
		CFbsBitmap* testBitmap16M=new(ELeave) CFbsBitmap;
		CleanupStack::PushL(testBitmap16M);
		User::LeaveIfError(testBitmap16M->Create(testBmpSize,testDispModeHigh));
		DrawTestBmpL(testBitmap16M);
//
		RWindow window(TheClient->iWs);
		SetupTestRWindowLC(window,TPoint(0,0), testSize,testDispModeHigh);
		RWindow window2(TheClient->iWs);
		SetupTestRWindowLC(window2,TPoint(testSize.iWidth,0),testSize,testDispModeHigh);
//
		CWindowGc* winGc1=new(ELeave) CWindowGc(TheClient->iScreen);
		CleanupStack::PushL(winGc1);
		User::LeaveIfError(winGc1->Construct());
		winGc1->Activate(window);
		CWindowGc* winGc2=new(ELeave) CWindowGc(TheClient->iScreen);
		CleanupStack::PushL(winGc2);
		User::LeaveIfError(winGc2->Construct());
		winGc2->Activate(window2);
//
		for(TInt modeIndex2=0;modeIndex2<numModes;modeIndex2++)
			{
			if (modeIndex==modeIndex2)
				continue;
			TInt screenMode2=TheClient->iScreenModes[modeIndex2];
			TPoint origin2=TheClient->iScreen->GetScreenModeScaledOrigin(screenMode2);
			if (origin2.iX!=0 || origin2.iY!=0)
				continue;
			TDisplayMode baseDisplayMode=TheClient->iScreen->DisplayMode();
			INFO_PRINTF5(_L("Testing with screen modes %d/%d, display modes %d/%d"),modeIndex,modeIndex2,testDispModeLow,testDispModeHigh);
			SetWsAndAppScreenModes(screenMode2);
			TDisplayMode dispMode11 = TheClient->iScreen->DisplayMode();
			TPixelsTwipsAndRotation sar1;
			TheClient->iScreen->GetScreenModeSizeAndRotation(screenMode2, sar1);
			if(sar1.iRotation == sar.iRotation)
				{
				continue;
				}
//
			RWindow window64K(TheClient->iWs);
			SetupTestRWindowLC(window64K,TPoint(),TSize(maxScreenDimension,maxScreenDimension),testDispModeLow);
			RedrawWin(window64K,KRgbGreen);
			// Should now have switched Wserv to 64K mode
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
//
			RWindow window16M(TheClient->iWs);
			SetupTestRWindowLC(window16M,TPoint(),TSize(maxScreenDimension/2,maxScreenDimension/2),testDispModeHigh);
			RedrawWin(window16M,KRgbCyan);
			// Should switch Wserv back to 16M mode
			TEST(TheClient->iScreen->DisplayMode()==testDispModeHigh);
//
			window64K.SetOrdinalPosition(-1);
			window16M.SetOrdinalPosition(-1);
			SetWsAndAppScreenModes(screenMode);
			TEST(TheClient->iScreen->DisplayMode()==baseDisplayMode);
//
			const TInt KNumTestFlags=3;
			const TInt KMaxTestFlags=1<<KNumTestFlags;
			for(TUint testFlags=0;testFlags<KMaxTestFlags;testFlags++)
				{
				TestDrawingToWindows(winGc1,winGc2,window,window2,testBitmap64,testBitmap16M,font,testFlags&0x1,testFlags&0x2,testFlags&0x4);
				}
// Test various functions change the display mode appropriately
			window64K.SetOrdinalPosition(0);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
			window64K.SetVisible(EFalse);
			TEST(TheClient->iScreen->DisplayMode()==baseDisplayMode);
			window64K.SetVisible(ETrue);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
			window64K.SetSize(rotatedScreenDeviceSize);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
			// Changing screen mode now should expose the 16M window
			SetWsAndAppScreenModes(screenMode2);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeHigh);
			SetWsAndAppScreenModes(screenMode);
			// And back to the 64K win covering the screen
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
// Create a new group with a 16M window and switching ordinal pos to back and back to front
			RWindowGroup testGroup(TheClient->iWs);
			CleanupClosePushL(testGroup);
			User::LeaveIfError(testGroup.Construct(111,EFalse));
			RWindow testGroupWin(TheClient->iWs);
			CleanupClosePushL(testGroupWin);
			User::LeaveIfError(testGroupWin.Construct(testGroup, 112));
			testGroupWin.SetExtent(TPoint(), TSize(1,1));	// Just enough to change mode
			testGroupWin.SetRequiredDisplayMode(testDispModeHigh);
			testGroupWin.Activate();
			TEST(TheClient->iScreen->DisplayMode()==testDispModeHigh);
			TInt oldPos=testGroup.OrdinalPosition();
			testGroup.SetOrdinalPosition(oldPos+1);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
			testGroup.SetOrdinalPosition(oldPos);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeHigh);
			CleanupStack::PopAndDestroy(2,&testGroup);
			TEST(TheClient->iScreen->DisplayMode()==testDispModeLow);
//
			CleanupStack::PopAndDestroy(2,&window64K);
			}
		CleanupStack::PopAndDestroy(2,winGc1);
		CleanupStack::PopAndDestroy(2,&window);
		CleanupStack::PopAndDestroy(2,testBitmap64);
		}
	CleanupStack::PopAndDestroy(&shield16M);
	TheClient->iScreen->ReleaseFont(font);
	SetWsAndAppScreenModes(TheClient->iScreenModes[0]);
	}

void CTScrMode::RunTestCaseL(TInt /*aCurTestCase*/)
	{
	TBuf<32> buf;
	TBool checkWindowParam=EFalse;
	TInt count=0;
	TInt mode=0;
	TBool enable=EFalse;
	TBool disable=EFalse;
	TInt retVal;
	
	((CTScrModeStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(++iTest->iState)
		{
/**

  @SYMTestCaseID GRAPHICS-WSERV-0296

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test screen modes can be set while the screen is rotated
  					through 180 degrees.

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Rotate the screen through 180 degrees while setting each
  					of the screen modes available

  @SYMTestExpectedResults The screen is rotated and screen modes set correctly

*/
		case 1:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0296"));
			iTest->LogSubTest(_L("Orientation1"));
			ScreenRotationsL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0297

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Change the screen orientation then test screen modes can
  					be set while the screen is rotated through 180 degrees.

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Rotate the screen through 180 degrees while setting each
  					of the screen modes available

  @SYMTestExpectedResults The screen is rotated and screen modes set correctly

*/
		case 2:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0297"));
			iTest->LogSubTest(_L("Orientation2"));
			MoreScreenRotationsL();
			iSubState=0;
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0298

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test for the rect clear defect while setting screen mode

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Change the screen mode and check the rect clear defect is
  					not present

  @SYMTestExpectedResults The defect is not present

*/
		case 3:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0298"));
			iTest->LogSubTest(_L("Rect Clear Defect"));
			RectClearBugL();
			break;
		case 4:
/**

  @SYMTestCaseID GRAPHICS-WSERV-0299

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test display mode can be set for test windows and
  					that the windows then function correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set the display mode in two test windows and then call
  					methods on the windows

  @SYMTestExpectedResults The windows function correctly

*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0299"));

			iTest->LogSubTest(_L("ScreenModeChange"));
			ScreenModeChange1L();
			ScreenModeChange2L();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0300

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test display mode can be set and retrieved

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set the display mode in a window and the retrieve it

  @SYMTestExpectedResults The display mode retrieved is the same as the
  							one set.

*/
		case 5:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0300"));
			iTest->LogSubTest(KScreenModeDisplayMode);
			GetScreenDisplayMode();
			break;

	
#if defined(SCREEN_MODE_TESTING)
/**

  @SYMTestCaseID GRAPHICS-WSERV-0301

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Case 101 to 105 tests that the screen is drawn correctly
  					as different screen modes and screen orientation are
  					set for the screen

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set different screen modes and orientations for the screen and
  					redraw the screen

  @SYMTestExpectedResults The screen is drawn correctly for each setting

*/
		case 101:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0301"));
			iSubState = 0;
			buf.Format(TRefByValue<const TDesC>(_L("Screen mode %d:%d")),101,iSubState);
			INFO_PRINTF1(buf);
			checkWindowParam=ETrue;
			mode=1;
			if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				count+=3;
			else if (iCurEnforcement==ESizeEnforcementPixelsTwipsAndRotation)
				count+=6;
			if (iSecondConnection->DeviceMessageCount()!=count)
				{
				TLogMessageText buf;
				_LIT(KFailCount,"Event Mismatch, Exp=%d, Act=%d");
				buf.Format(KFailCount,count,iSecondConnection->DeviceMessageCount());
				TheClient->iWs.LogMessage(buf);
				TheClient->iWs.Flush();
				}
			retVal = iSecondConnection->DeviceMessageCount();
			TEST(retVal==count);
			if (retVal!=count)
				INFO_PRINTF3(_L("(iSecondConnection->DeviceMessageCount() return value - Expected: %d, Actual: %d"),count ,retVal);
			
			CheckWindows(iCurEnforcement==ESizeEnforcementNone?ETrue:checkWindowParam);
			if (enable)
				iSecondConnection->EnableMessages();
			if (disable)
				iSecondConnection->DisableMessages();
			TheClient->iScreen->SetScreenMode(mode);
			TheClient->iWs.Flush();
			iSubState++;
			break;
		case 102:
/**
  @SYMTestCaseID GRAPHICS-WSERV-0521
*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0521"));
			buf.Format(TRefByValue<const TDesC>(_L("Screen mode %d:%d")),101,iSubState);
			INFO_PRINTF1(buf);
			checkWindowParam=EFalse;
			enable=ETrue;
			if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				count+=3;
			else if (iCurEnforcement==ESizeEnforcementPixelsTwipsAndRotation)
				count+=6;
			if (iSecondConnection->DeviceMessageCount()!=count)
				{
				TLogMessageText buf;
				_LIT(KFailCount,"Event Mismatch, Exp=%d, Act=%d");
				buf.Format(KFailCount,count,iSecondConnection->DeviceMessageCount());
				TheClient->iWs.LogMessage(buf);
				TheClient->iWs.Flush();
				}
			retVal = iSecondConnection->DeviceMessageCount();
			TEST(retVal==count);
			if (retVal!=count)
				INFO_PRINTF3(_L("(iSecondConnection->DeviceMessageCount() return value - Expected: %d, Actual: %d"),count ,retVal);

			if (enable)
				iSecondConnection->EnableMessages();
			if (disable)
				iSecondConnection->DisableMessages();
			TheClient->iScreen->SetScreenMode(mode);
			TheClient->iWs.Flush();
			iSubState++;
			break;
		case 103:
/**
  @SYMTestCaseID GRAPHICS-WSERV-0522
*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0522"));
			buf.Format(TRefByValue<const TDesC>(_L("Screen mode %d:%d")),101,iSubState);
			INFO_PRINTF1(buf);
			count=1;
			mode=1;
			checkWindowParam=ETrue;
			if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				count+=3;
			else if (iCurEnforcement==ESizeEnforcementPixelsTwipsAndRotation)
				count+=6;
			if (iSecondConnection->DeviceMessageCount()!=count)
				{
				TLogMessageText buf;
				_LIT(KFailCount,"Event Mismatch, Exp=%d, Act=%d");
				buf.Format(KFailCount,count,iSecondConnection->DeviceMessageCount());
				TheClient->iWs.LogMessage(buf);
				TheClient->iWs.Flush();
				}
			retVal = iSecondConnection->DeviceMessageCount();
			TEST(retVal==count);
			if (retVal!=count)
				INFO_PRINTF3(_L("(iSecondConnection->DeviceMessageCount() return value - Expected: %d, Actual: %d"),count ,retVal);

			CheckWindows(iCurEnforcement==ESizeEnforcementNone?ETrue:checkWindowParam);
			if (enable)
				iSecondConnection->EnableMessages();
			if (disable)
				iSecondConnection->DisableMessages();
			TheClient->iScreen->SetScreenMode(mode);
			TheClient->iWs.Flush();
			iSubState++;
			break;
		case 104:
/**
  @SYMTestCaseID GRAPHICS-WSERV-0523
*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0523"));
			buf.Format(TRefByValue<const TDesC>(_L("Screen mode %d:%d")),101,iSubState);
			INFO_PRINTF1(buf);
			checkWindowParam=ETrue;
			count=2;
			disable=ETrue;
			if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				count+=3;
			else if (iCurEnforcement==ESizeEnforcementPixelsTwipsAndRotation)
				count+=6;
			if (iSecondConnection->DeviceMessageCount()!=count)
				{
				TLogMessageText buf;
				_LIT(KFailCount,"Event Mismatch, Exp=%d, Act=%d");
				buf.Format(KFailCount,count,iSecondConnection->DeviceMessageCount());
				TheClient->iWs.LogMessage(buf);
				TheClient->iWs.Flush();
				}
			retVal = iSecondConnection->DeviceMessageCount();
			TEST(retVal==count);
			if (retVal!=count)
				INFO_PRINTF3(_L("(iSecondConnection->DeviceMessageCount() return value - Expected: %d, Actual: %d"),count ,retVal);

			if (enable)
				iSecondConnection->EnableMessages();
			if (disable)
				iSecondConnection->DisableMessages();
			TheClient->iScreen->SetScreenMode(mode);
			TheClient->iWs.Flush();
			iSubState++;
			break;
		case 105:
/**
  @SYMTestCaseID GRAPHICS-WSERV-0524
*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0524"));
			buf.Format(TRefByValue<const TDesC>(_L("Screen mode %d:%d")),101,iSubState);
			INFO_PRINTF1(buf);
			checkWindowParam=EFalse;
			count=2;
			enable=ETrue;
			if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				count+=3;
			else if (iCurEnforcement==ESizeEnforcementPixelsTwipsAndRotation)
				count+=6;
			if (iSecondConnection->DeviceMessageCount()!=count)
				{
				TLogMessageText buf;
				_LIT(KFailCount,"Event Mismatch, Exp=%d, Act=%d");
				buf.Format(KFailCount,count,iSecondConnection->DeviceMessageCount());
				TheClient->iWs.LogMessage(buf);
				TheClient->iWs.Flush();
				}
			retVal = iSecondConnection->DeviceMessageCount();
			TEST(retVal==count);
			if (retVal!=count)
				INFO_PRINTF3(_L("(iSecondConnection->DeviceMessageCount() return value - Expected: %d, Actual: %d"),count ,retVal);

			CheckWindows(iCurEnforcement==ESizeEnforcementNone?ETrue:checkWindowParam);
			if (enable)
				iSecondConnection->EnableMessages();
			if (disable)
				iSecondConnection->DisableMessages();
			TheClient->iScreen->SetScreenMode(mode);
			TheClient->iWs.Flush();


			iSecondConnection->DisableMessages();
			if (iCurEnforcement==ESizeEnforcementNone)
				{	// Do it again with different enforcement mode
				SetScreenModeEnforcement(ESizeEnforcementPixelsAndRotation);
				ResetCounter(100);
				}
			else if (iCurEnforcement==ESizeEnforcementPixelsAndRotation)
				{	// Do it again with different enforcement mode
				SetScreenModeEnforcement(ESizeEnforcementPixelsTwipsAndRotation);
				ResetCounter(100);
				}
			else
				{
				SetScreenModeEnforcement(ESizeEnforcementNone);
				delete iSecondConnection;
				iSecondConnection=NULL;
				}
			TheClient->iWs.Flush();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0302

  @SYMDEF  			DEF099638

  @SYMTestCaseDesc Test that a drawing can be scaled while different screen
  					modes are set

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set different screen modes and scale a drawing

  @SYMTestExpectedResults The drawing is redrawn to scale

*/
		case 110:
			{
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0302"));
			// Ensure that the TestWin and BaseWin will be drawn properly in all screen modes
			SetScreenModeEnforcement(ESizeEnforcementPixelsAndRotation);
			TheClient->SetTestClientScreenMode(0);
			INFO_PRINTF1(_L("Scaled drawing - screen mode 0"));
			ScaledDrawingL();
			TheClient->SetTestClientScreenMode(1);
			INFO_PRINTF1(_L("Scaled drawing - screen mode 1"));
			ScaledDrawingL();
			// Restore screen mode and enforcement mode				
			TheClient->SetTestClientScreenMode(0);
			SetScreenModeEnforcement(iOldEnfMode);
			break;
			}

/**

  @SYMTestCaseID GRAPHICS-WSERV-0303

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test screen mode and rotation panic messages

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Test the panics fro screen mode and rotation respond as
  					expected

  @SYMTestExpectedResults Panics respond as expected

*/
		case 111:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0303"));
			INFO_PRINTF1(_L("Panic"));
			TestPanicsL();
			break;
#endif
/**

  @SYMTestCaseID GRAPHICS-WSERV-0304

  @SYMDEF  			DEF081259

  @SYMTestCaseDesc Test that if there are invisible windows and then the
  					screen mode is changed, the windows are redrawn correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create some windows, make some invisible, change the screen
  					mode and redraw the windows

  @SYMTestExpectedResults The windows are redrawn without error

*/
		case 112:
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0304"));
			INFO_PRINTF1(_L("Invisible Wnds And Infinite Redraw Bugs")); // two defects one problem
			InvisibleWndAndInfiniteRedrawBugL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0358

  @SYMDEF  			PDEF096151

  @SYMTestCaseDesc Ensure that wserv does not panic when calling CWsScreenDevice::SetScreenMode()
                   after a client has deleted a screen device used by an active group window

  @SYMTestPriority Critical

  @SYMTestStatus Implemented

  @SYMTestActions Creates a RWsSession
                  Creates a primary screen device
                  Creates another screen device
                  Creates a group window
                  Gets all the valid screen modes
                  Deletes the primary screen device 
                  Calls SetScreenMode on the second screen device
                    (this step triggered the defect - panicking wserv)
                  Cleans up the above

  @SYMTestExpectedResults The call to SetScreenMode should not cause wserv to panic

*/
 		case 113:
 			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0358"));
			INFO_PRINTF1(_L("Set screen mode after a client has deleted the screen device"));
			SetScreenModeAfterScreenDeviceDeletedL();
			break;
		case 114:
			INFO_PRINTF1(_L("Rotate/screen mode test"));
/**
  @SYMTestCaseID GRAPHICS-WSERV-0525
*/
			((CTScrModeStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0525"));
			TestRotateAndScreenModeL();
			break;
		default:
            ((CTScrModeStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			if (iTest->iState==115 || iTest->iState>1000)
				TestComplete();
			break;
		}
	((CTScrModeStep*)iStep)->RecordTestResultL();
	}

//
// CSecondConnection
//

CSecondConnection::~CSecondConnection()
	{
	delete iWindow;
	delete iWindow2;
	iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);	// Stop auto group switching on close
	delete iGroup;
	delete iClient;
	}

void CSecondConnection::ConstructL(TInt aScreenNumber,const TRect &aWinRect, CTestBase *aTest, CTestStep* aTestStep)
	{
	iClient=new(ELeave) CTClient;
	iClient->SetScreenNumber(aScreenNumber);
	iClient->ConstructL();
	iGroup=new(ELeave) CSecondConnectionGroup(iClient,this,aTest,aTestStep);
	iGroup->ConstructL();
//
	iWindow=new(ELeave) CTBlankWindow;
	iWindow->ConstructL(*iGroup);
	iWindow->BaseWin()->SetShadowDisabled(ETrue);
	iWindow->SetColor(TRgb::Gray4(1));
	TPoint offset=BaseWin->BaseWin()->InquireOffset((*iGroup->GroupWin()));
	iWindow->SetExtL(offset+aWinRect.iTl,aWinRect.Size());
	iWindow->Activate();
//
	iWindow2=new(ELeave) CTBlankWindow;
	iWindow2->ConstructL(*iGroup);
	iWindow2->BaseWin()->SetShadowDisabled(ETrue);
	iWindow2->SetColor(TRgb::Gray4(1));
	TPoint offset2=TestWin->BaseWin()->InquireOffset((*iGroup->GroupWin()));
	iWindow2->SetExtL(offset2+aWinRect.iTl,aWinRect.Size());
	iWindow2->BaseWin()->SetVisible(EFalse);
	iWindow2->Activate();
	}

void CSecondConnection::SetWindow2Visibility(TBool aVisible)
	{
	iWindow2->BaseWin()->SetVisible(aVisible);
	iClient->iWs.Flush();
	iClient->iWs.Finish();
	}

void CSecondConnection::EnableMessages()
	{
	iGroup->GroupWin()->EnableScreenChangeEvents();
	iClient->iWs.Flush();
	}

void CSecondConnection::DisableMessages()
	{
	iGroup->GroupWin()->DisableScreenChangeEvents();
	iClient->iWs.Flush();
	}

TInt CSecondConnection::DeviceMessageCount() const
	{
	return(iMessageCount);
	}

void CSecondConnection::ScreenDeviceChanged()
	{
	iMessageCount++;
	}

//
// CSecondConnectionGroup
//

CSecondConnectionGroup::CSecondConnectionGroup(CTClient *aClient, CSecondConnection *aSecondConnection, CTestBase *aTest, CTestStep* aTestStep) : CTWindowGroup(aClient), iTest(aTest), iSecondConnection(aSecondConnection), iTestStep(aTestStep)
	{}

void CSecondConnectionGroup::ScreenDeviceChanged()
	{
	iSecondConnection->ScreenDeviceChanged();
	TPixelsTwipsAndRotation sar;
	Client()->iScreen->GetDefaultScreenSizeAndRotation(sar);
	Client()->iScreen->SetScreenSizeAndRotation(sar);
//
	iTestStep->TEST(Client()->iScreen->SizeInPixels()==sar.iPixelSize);
	iTestStep->TEST(Client()->iScreen->SizeInTwips()==sar.iTwipsSize);
	TSize pixelConv;
	pixelConv.iWidth=Client()->iScreen->HorizontalTwipsToPixels(sar.iTwipsSize.iWidth);
	pixelConv.iHeight=Client()->iScreen->VerticalTwipsToPixels(sar.iTwipsSize.iHeight);
	iTestStep->TEST(pixelConv==sar.iPixelSize);
	}


//
// SecondClientConnection
//

SecondClientConnection::SecondClientConnection()
	{
	}

SecondClientConnection::~SecondClientConnection()
	{
	}

void SecondClientConnection::ConstructL(TInt aScreenMode, const TPixelsTwipsAndRotation& aSizeAndRotation)
	{
	CTClient::ConstructL();
	iGroup=new(ELeave) TestWindowGroup(this);
	iGroup->ConstructL();
	iScreen->SetScreenModeEnforcement(ESizeEnforcementPixelsAndRotation);
	iScreen->SetScreenSizeAndRotation(aSizeAndRotation);
	iScreen->SetScreenMode(aScreenMode);
	}

__WS_CONSTRUCT_STEP__(ScrMode)