windowing/windowserver/test/tauto/TAUTODLL.CPP
changeset 110 7f25ef56562d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/TAUTODLL.CPP	Wed Jun 23 19:41:15 2010 +0300
@@ -0,0 +1,2945 @@
+// 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:
+// Client side of AUTODLL test code
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "TAUTODLL.H"
+#include "TEVENT.H"
+
+//#define LOGGING
+
+//
+
+
+CGraphicsContext::TDrawMode CAnimWindow::iEllipseDrawMode;
+
+CTAnimDll::CTAnimDll(CTestStep* aStep) : CTWsGraphicsBase(aStep)
+	{
+	}
+
+RTestAnim::RTestAnim() : RAnim()
+	{
+	}
+
+RTestAnim::RTestAnim(RAnimDll &aDll) : RAnim(aDll)
+	{
+	}
+
+LOCAL_C TInt DoPanicTest(TInt aInt, TAny *aScreenNumber)
+	{
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+
+	// assign to the correct screen
+	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws);
+	User::LeaveIfError(screen->Construct((TInt)aScreenNumber));
+
+	RWindowGroup group(ws);
+	User::LeaveIfError(group.Construct(333));
+	group.EnableReceiptOfFocus(EFalse);	// Stop auto group switching on close
+	RAnimDll animDll=RAnimDll(ws);
+	User::LeaveIfError(animDll.Load(KAnimDLLName));
+	RTestAnim panic(animDll);
+	RWindow window(ws);
+	RBlankWindow blankwin(ws);
+	if (aInt==16 || aInt==17)	// Use a blank window for this one
+		{
+		User::LeaveIfError(blankwin.Construct(group,123));
+		blankwin.SetSize(TSize(10,10));
+		blankwin.Activate();
+		User::LeaveIfError(panic.Construct(blankwin,EAnimTypeTest1,TPtrC8()));
+		}
+	else
+		{
+		User::LeaveIfError(window.Construct(group,123));
+		window.SetSize(TSize(10,10));
+		window.Activate();
+		window.BeginRedraw();
+		window.EndRedraw();
+		if (aInt==0)
+			User::LeaveIfError(panic.Construct(window,EAnimTypeTest2,TPtrC8()));
+		User::LeaveIfError(panic.Construct(window,EAnimTypeTest1,TPtrC8()));
+		}
+	TPckgBuf<TPoint> dummyParam;
+	switch(aInt)
+		{
+		case 1:
+			panic.Command(EADllPanicCallPanic);
+			break;
+		case 2:
+			panic.Command(EADllPanicCallPanic,dummyParam);
+			break;
+		case 3:
+			panic.CommandReply(EADllPanicCallPanic);
+			break;
+		case 4:
+			panic.CommandReply(EADllPanicCallPanic,dummyParam);
+			break;
+		case 5:
+			panic.Command(EADllPanicSetInterval);
+			break;
+		case 6:
+			panic.Command(EADllPanicSetNextInterval);
+			break;
+		case 7:
+			panic.CommandReply(EADllPanicBadFont);
+			break;
+		case 8:
+			panic.CommandReply(EADllPanicBadBitmap);
+			break;
+		case 9:
+			panic.Command(EADllPanicLeave);
+			break;
+		case 10:
+			panic.Command(EADllPanicDoubleActivateGC);
+			break;
+		case 11:
+			panic.Command(EADllPanicDrawRectWithNoGc);
+			break;
+		case 12:
+			panic.Command(EADllPanicDrawTextWithNoFont);
+			break;
+		case 13:
+			panic.Command(EADllPanicLeaveInAnimate);
+			ws.Finish();
+			panic.CommandReply(EADllBlankOpCode);
+			break;
+		case 14:
+			panic.Command(EADllPanicLeaveInRedraw);
+			window.BeginRedraw();
+			window.EndRedraw();
+			ws.Finish();
+			panic.CommandReply(EADllBlankOpCode);
+			break;
+		case 15:
+			ws.TestWrite(animDll.WsHandle(),999,NULL,0);
+			break;
+		case 16:
+			panic.Command(EADllPanicSetVisWithGcActive);
+			break;
+		case 17:
+			panic.CommandReply(EADllPanicSetVisWithGcActiveReply);
+			break;
+		case 18:
+			panic.Command(EADllPanicLeaveInActiveCallback);
+			ws.Flush();
+			User::After(2000000);
+			panic.CommandReply(EADllBlankOpCode);
+			break;
+		case 19:
+			panic.Command(EADllPanicSetClippingRectWithNoGc);
+			break;
+		case 20:
+			panic.CommandReply(EADllPanicSetClippingRegionWithNoGc);
+			break;
+		case 21:
+			panic.Command(EADllPanicCancelClippingRegionWithNoGc);
+			break;
+		case 22:
+			panic.Command(EADllPanicCancelClippingRectWithNoGc);
+			break;
+		case 23:
+			panic.Command(EADllPanicSetDrawModeWithNoGc);
+			break;
+		case 24:
+			panic.Command(EADllPanicUseFontWithNoGc);
+			break;
+		case 25:
+			panic.Command(EADllPanicDiscardFontWithNoGc);
+			break;
+		case 26:
+			panic.Command(EADllPanicSetUnderlineStyleWithNoGc);
+			break;
+		case 27:
+			panic.Command(EADllPanicSetStrikeThoughStyleWithNoGc);
+			break;
+		case 28:
+			panic.Command(EADllPanicSetWordJustificationWithNoGc);
+			break;
+		case 29:
+			panic.Command(EADllPanicSetCharJustificationWithNoGc);
+			break;
+		case 30:
+			panic.Command(EADllPanicSetPenColorWithNoGc);
+			break;
+		case 31:
+			panic.Command(EADllPanicSetPenStyleWithNoGc);
+			break;
+		case 32:
+			panic.Command(EADllPanicSetPenSizeWithNoGc);
+			break;
+		case 33:
+			panic.Command(EADllPanicSetBrushColorWithNoGc);
+			break;
+		case 34:
+			panic.Command(EADllPanicSetBrushStyleWithNoGc);
+			break;
+		case 35:
+			panic.Command(EADllPanicSetBrushOriginWithNoGc);
+			break;
+		case 36:
+			panic.Command(EADllPanicUseBrushPatterWithNoGc);
+			break;
+		case 37:
+			panic.Command(EADllPanicDiscardBrushPatternWithNoGc);
+			break;
+		case 38:
+			panic.Command(EADllPanicSetFadedWithNoGc);
+			break;
+		case 39:
+			panic.Command(EADllPanicSetFadingParametersWithNoGc);
+			break;
+		case 40:
+			panic.Command(EADllPanicDrawArcWithNoGc);
+			break;
+		case 41:
+			panic.Command(EADllPanicDrawPieWithNoGc);
+			break;
+		case 42:
+			panic.Command(EADllPanicDrawLineWithNoGc);
+			break;
+		case 43:
+			panic.Command(EADllPanicDrawLineToWithNoGc);
+			break;
+		case 44:
+			panic.Command(EADllPanicDrawLineByWithNoGc);
+			break;
+		case 45:
+			panic.Command(EADllPanicDrawEllipseWithNoGc);
+			break;
+		case 46:
+			panic.Command(EADllPanicDrawRoundedRecWithNoGc);
+			break;
+		case 47:
+			panic.Command(EADllPanicClearWithRectWithNoGc);
+			break;
+		case 48:
+			panic.Command(EADllPanicClearWithNoGc);
+			break;
+		case 49:
+			panic.Command(EADllPanicBitBltWithNoGc);
+			break;
+		case 50:
+			panic.Command(EADllPanicBitBltWithRectWithNoGc);
+			break;
+		case 51:
+			panic.Command(EADllPanicBitBltMaskedWithNoGc);
+			break;
+		case 52:
+			panic.Command(EADllPanicDrawBitmapPointWithNoGc);
+			break;
+		case 53:
+			panic.Command(EADllPanicDrawBitmapWithNoGc);
+			break;
+		case 54:
+			panic.Command(EADllPanicDrawBitmapRectWithNoGc);
+			break;
+		case 55:
+			panic.Command(EADllPanicDrawBitmapMaskedFbsBitmapWithNoGc);
+			break;
+		case 56:
+			panic.Command(EADllPanicDrawBitmapMaskedWsBitmapWithNoGc);
+			break;
+		case 57:
+			panic.Command(EADllPanicDrawPolyLinePointsWithNoGc);
+			break;
+		case 58:
+			panic.Command(EADllPanicDrawPolyLineArrayWithNoGc);
+			break;
+		case 59:
+			panic.CommandReply(EADllPanicDrawPolygonPointsWithNoGc);
+			break;
+		case 60:
+			panic.CommandReply(EADllPanicDrawPolygonArrayWithNoGc);
+			break;
+		case 61:
+			panic.Command(EADllPanicMoveToWithNoGc);
+			break;
+		case 62:
+			panic.Command(EADllPanicMoveByWithNoGc);
+			break;
+		case 63:
+			panic.Command(EADllPanicPlotWithNoGc);
+			break;
+		case 64:
+			panic.Command(EADllPanicSetOriginWithNoGc);
+			break;
+		case 65:
+			panic.Command(EADllPanicCopyRectWithNoGc);
+			break;
+		case 66:
+			panic.Command(EADllPanicResetWithNoGc);
+			break;
+		case 67:
+			panic.CommandReply(EADllPanicAlphaBlendingBitmapsFbsBitmapWithNoGc);
+			break;
+		case 68:
+			panic.Command(EADllPanicMapColorsWithNoGc);
+			break;
+		case 69:
+			panic.Command(EADllPanicDrawTextWithRectWithNoFont);
+			break;
+		case 70:
+			panic.Command(EADllPanicDrawTextVerticalWithNoFont);
+			break;
+		case 71:
+			panic.Command(EADllPanicDrawTextVerticalWithRectWithNoFont);
+			break;
+		case 72:
+			panic.CommandReply(EADllPanicDevice);
+			break;
+		case 73:
+			panic.Command(EADllPanicInvalidFocusScreenTooBig);
+			break;
+		case 74:
+			panic.Command(EADllPanicInvalidFocusScreenNegative);
+			break;
+		default:
+			return(EWsExitReasonFinished);
+		}
+
+	ws.Flush();
+	return(EWsExitReasonBad);
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0125
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Panic tests
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     The test creates an animation and animation's client threads.
+					Each thread calls some
+					command of the animation which is expected to panic on certain reason.
+					The test checks that those client threads will panic returning
+					a proper panic code. Client threads are created and tested for
+					the following actions:
+					1. A Command() call to an animation which executes
+					iFunctions->Panic() method. Client thread must panic with
+					code EWservPanicAnimDll.
+					2. A Command() call with dummy parameter to an animation which
+					executes iFunctions->Panic() method. Client thread must panic
+					with code EWservPanicAnimDll.
+					3. A CommandReply() call to an animation which executes
+					iFunctions->Panic() method. Client thread must panic with code
+					EWservPanicAnimDll.
+					4. A CommandReply() call with dummy parameter to an animation
+					which executes iFunctions->Panic() method. Client thread must
+					panic with code EWservPanicAnimDll.
+					5. A command that calls MAnimGeneralFunctions::SetInterval() when
+					the synchronisation mode is not TAnimSync::ESyncNone. Client
+					thread must panic with code EWservPanicAnimDll.
+					6. A command that calls MAnimGeneralFunctions::SetNextInterval()
+					when the synchronisation mode is not TAnimSync::ESyncNone. Client
+					thread must panic with code EWservPanicAnimDll.
+					7. A command that calls MAnimGeneralFunctions::DuplicateFontL() to
+					duplicate undefined font. Client thread must panic with code
+					EWservPanicFont.
+					8. A command that calls MAnimGeneralFunctions::DuplicateBitmapL()
+					to duplicate undefined bitmap. Client thread must panic with code
+					EWservPanicBitmap.
+					9. A command that calls User::Leave(KErrGeneral). Client thread
+					must panic with code EWservPanicAnimLeave.
+					10. A command that activates window animation's graphical context
+					twice. Client thread must panic with code EWservPanicAnimDll.
+					11. A command that tries to draw a rectangle while graphical
+					context is not defined yet. Client thread must panic with code
+					EWservPanicAnimLeave.
+					12. A command that tries to draw a text whihout a font defined yet.
+					Client thread must panic with code EWservPanicNoFont.
+					13. A command that causes an animation to leave during execution
+					of CAnim::Animate() method; and a new command call 4 seconds after
+					that. Client thread must panic with code EWservPanicAnimLeave.
+					14. A command that causes an animation to leave during execution
+					of CAnim::Redraw() method. The client thread initiates it's window
+					redraw after that. Client thread must panic with code
+					EWservPanicAnimLeave.
+					15. The client thread calls RWsSession::TestWrite() on animation
+					DLL server-side handle with opcode 999. Client thread must panic with code
+					EWservPanicOpcode.
+					16. A command that activates graphical context and sets the
+					window to invisible and then to visible. Client thread must panic
+					with code EWservPanicAnimDll.
+
+
+@SYMTestExpectedResults See test actions.
+*/
+void CTAnimDll::TestPanicsL()
+	{
+	TInt index=0;
+	TBool finishTests=EFalse;
+	do
+		{
+
+
+		TClientPanic panicCode=EWservPanicAnimDll;
+		switch(index)
+			{
+			// panic the server with a KERN-4. When server fixed these this can be removed.
+			case 19:
+			case 20:
+			case 22:
+			case 24:
+				goto bypasstest;
+
+			case 0:
+			case 1:
+			case 2:
+			case 3:
+			case 4:
+			case 5:
+			case 6:
+			case 10:
+			case 16:
+			case 17:
+			case 18:
+			case 73:
+			case 74:
+				panicCode=EWservPanicAnimDll;
+				break;
+			case 7:
+				panicCode=EWservPanicFont;
+				break;
+			case 8:
+				panicCode=EWservPanicBitmap;
+				break;
+			case 12:
+			case 69:
+			case 70:
+			case 71:
+				panicCode=EWservPanicNoFont;
+				break;
+			case 15:
+				panicCode=EWservPanicOpcode;
+				break;
+			case 9:
+			case 11:
+			case 13:
+			case 14:
+			case 72:
+			default: // cases 19 - 68
+				panicCode=EWservPanicAnimLeave;
+				break;
+			}
+			
+		TEST(iTest->TestWsPanicL(&DoPanicTest,panicCode,index,(TAny*)iTest->iScreenNumber,&finishTests));
+bypasstest:
+		if (iTest->iScreenNumber == 0)
+			iTest->CloseAllPanicWindows();
+		index++;
+		} while(!finishTests);
+	}
+
+void CTAnimDll::TestSyncModes(MAnimGeneralFunctions::TAnimSync aSyncMode)
+	{
+	RTestAnim anim=RTestAnim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iTestWin->BaseWin(),EAnimTypeTest1,TPtrC8()));
+	CleanupClosePushL(anim);
+
+	TPckgBuf<TSyncTests> params;
+	TRequestStatus status(KRequestPending);
+	params().status=&status;
+	params().syncMode=aSyncMode;
+	anim.CommandReply(EADllSyncTests,params);
+	User::WaitForRequest(status);
+	TEST(status==KErrNone);
+
+	CleanupStack::PopAndDestroy(&anim);
+	}
+
+void CTAnimDll::TestTimeChange()
+	{
+	RTestAnim anim=RTestAnim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iTestWin->BaseWin(),EAnimTypeTest1,TPtrC8()));
+	CleanupClosePushL(anim);
+
+	TPckgBuf<TTimeChangeTest> params;
+	TRequestStatus status(KRequestPending);
+	TRequestStatus status2(KRequestPending);
+	params().status=&status;
+	params().status2=&status2;
+	anim.CommandReply(EADllTimeChangedTest,params);
+	User::WaitForRequest(status);
+	TTime time;
+	time.HomeTime();
+	time+=TTimeIntervalHours(1);
+	User::SetHomeTime(time);
+	User::WaitForRequest(status2);
+	time.HomeTime();
+	time-=TTimeIntervalHours(1);
+	User::SetHomeTime(time);
+	TEST(status2==KErrNone);
+
+	CleanupStack::PopAndDestroy(&anim);
+	}
+
+void CTAnimDll::ConstructL()
+	{
+	TheClient->iGroup->WinTreeNode()->SetOrdinalPosition(0);
+	iRedrawWin=new(ELeave) CAnimWindow(EFalse, CAnimWindow::ERedraw);
+	iBackedUpTestWin=new(ELeave) CAnimWindow(EFalse, CAnimWindow::EBackedUp);
+	iBlankTestWin=new(ELeave) CAnimWindow(EFalse, CAnimWindow::EBlank);
+	iBaseWin=new(ELeave) CAnimWindow(ETrue, CAnimWindow::ERedraw);
+
+//
+	TSize screenSize=TheClient->iGroup->Size();
+	TInt winWidth=(screenSize.iWidth/3)-10;
+	TInt winHeight=screenSize.iHeight-10;
+	iBaseWin->ConstructL(TPoint(screenSize.iWidth/3+5,5),TSize(winWidth,winHeight));
+	iBlankTestWin->ConstructL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight));
+	((RBlankWindow *)iBlankTestWin->BaseWin())->SetColor(TRgb::Gray4(2));
+	iBackedUpTestWin->ConstructL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight));
+	iRedrawWin->ConstructL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight));
+//
+	iTestWin=iRedrawWin;
+//
+	iAnimDll=RAnimDll(TheClient->iWs);
+	TInt retVal = iAnimDll.Load(KAnimDLLName);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("iAnimDll.Load(KAnimDLLName) return value - Expected: %d , Actual: %d"), KErrNone, retVal);
+	}
+
+CTAnimDll::~CTAnimDll()
+	{
+	iAnimDll.Close();
+	delete iBackedUpTestWin;
+	delete iBlankTestWin;
+	delete iRedrawWin;
+	delete iBaseWin;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0126
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Miscellaneous animation tests.
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Tests window animation's window funtions like WindowSize(),
+					IsHidden(), SetVisible().
+					Tests RAnimDll's constructor, Close(), Load() and copy-constructor.
+
+@SYMTestExpectedResults Expects window funtions and RAnimDll's methods work properly.
+*/
+void CTAnimDll::Misc()
+	{
+	RTestAnim anim=RTestAnim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iTestWin->BaseWin(),EAnimTypeTest1,TPtrC8()));
+	CleanupClosePushL(anim);
+
+	TPckgBuf<TSize> params;
+	params()=iTestWin->Size();
+	TBool retBool = anim.CommandReply(EADllTestWindowSize,params);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllTestWindowSize,params) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+	TheClient->iWs.Finish();
+	retBool = anim.CommandReply(EADllTestSetVisible);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllTestSetVisible) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+	CleanupStack::PopAndDestroy(&anim);
+
+	RAnimDll closeme(TheClient->iWs);
+	closeme.Close();
+	RAnimDll animdll(TheClient->iWs);
+	TInt retVal = animdll.Load(KAnimDLLName);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("animdll.Load(KAnimDLLName) return value - Expected: %d , Actual: %d"), KErrNone, retVal);
+
+	RTestAnim anim2(animdll);
+	anim2.Close();
+	animdll.Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0127
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Test animation's command call with reply
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Puts an array containing a sequnce of numbers into a command argument.
+					Performs command call to server, assuming that the server-side
+					should return a sum of the numbers in sequence.
+
+@SYMTestExpectedResults Checks that server returns the correct sum.
+*/
+void CTAnimDll::RemoteBuffer()
+	{
+	RTestAnim anim=RTestAnim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iTestWin->BaseWin(),EAnimTypeTest1,TPtrC8()));
+	CleanupClosePushL(anim);
+
+	TBuf<ERemoteBufSize> buf(ERemoteBufSize);
+	TInt total=0;
+	for (TInt8 index=0;index<ERemoteBufSize;index++)
+		{
+		total+=index;
+		buf[index]=index;
+		}
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(KIpcSlot,&buf);
+ 	TInt retVal = anim.CommandReply(EADllReadRemoteDescriptor,KNullDesC8,ipcArgs);
+	TEST(retVal==total);
+	if (retVal!=total)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllReadRemoteDescriptor,KNullDesC8,ipcArgs) return value - Expected: %d , Actual: %d"), total, retVal);
+
+	CleanupStack::PopAndDestroy(&anim);
+	}
+//
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0128
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    RAnimDll extracopy test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates another RAnimDll instance for a dll that already has a client-side interface.
+
+@SYMTestExpectedResults Expects that operation completes without errors.
+*/
+void CTAnimDll::ExtraCopyTest()
+	{
+	RAnimDll extraCopy(TheClient->iWs);
+	TInt retVal = extraCopy.Load(KAnimDLLName);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("extraCopy.Load(KAnimDLLName) return value - Expected: %d , Actual: %d"), KErrNone, retVal);
+
+	extraCopy.Close();
+	}
+//
+void CTAnimDll::SyncMode1()
+	{
+	TestSyncModes(MAnimGeneralFunctions::ESyncSecond);
+	}
+
+void CTAnimDll::CheckWindows()
+	{
+	CheckRect(iBaseWin->CtBaseWin(),iTestWin->CtBaseWin(),TRect(iBaseWin->Size()),_L("CTAnimDll::CheckWindows() failed"));
+	}
+
+void CTAnimDll::InvalidatePauseAndRedraw(const TRect &aRect,TTimeIntervalMicroSeconds32 aInterval)
+	{
+	iTestWin->Invalidate(aRect);
+	TheClient->iWs.Flush();
+	User::After(aInterval);
+	__ASSERT_DEBUG(iTestWin->iWinType==CAnimWindow::ERedraw,AutoPanic(EAutoPanicWindowType));
+	RWindow *win=(RWindow *)iTestWin->BaseWin();
+	win->BeginRedraw();
+	iTestWin->DoDraw();
+	win->EndRedraw();
+	TheClient->iWs.Flush();
+	}
+
+void CTAnimDll::RedrawAndCheckWindows(TBool aBlankIt)
+	{
+	if (iTestWin->iWinType==CAnimWindow::ERedraw)
+		{
+		RWindow *win=(RWindow *)iTestWin->BaseWin();
+		win->BeginRedraw();
+		iTestWin->DoDraw(aBlankIt);
+		win->EndRedraw();
+		}
+	RWindow *win=(RWindow *)iBaseWin->BaseWin();
+	win->BeginRedraw();
+	iBaseWin->DoDraw(aBlankIt);
+	win->EndRedraw();
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0129
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Animation drawing test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Performs animation drawing ontop of redrawable window, backed-up window and blank window.
+					Draws the same shapes using directly window graphics on an other window (base window).
+					The following shapes are drawn:
+					1. An animation with a small ellipse drawn in XOR mode on top of redrawable
+					black-lined gray window.
+					2. The same with a bigger ellipse but previously invalidating an
+					area which intersects the old ellipse and the new ellipse.
+					3. Runs an animation that continuously moves a rectangle and shrinks another on top of
+					redrawable black-lined gray window and then cancels an animation.
+					The test checks that the window will be identical with the gray base window
+					that contains only black lines.
+					4. An animation with a small ellipse drawn in XOR mode on top of backed-up
+					black-lined gray window. The test also calls Invalidate() method and performs
+					a check again to make sure that the test-window and base window are identical.
+					5. An animation with a small ellipse drawn in XOR mode on top of the blank
+					gray window. The test also sends commands to the animation that call windows
+					SetVisible(EFalse) and SetVisible(ETrue) and checks that the
+					test-window and base window are identical.
+
+
+@SYMTestExpectedResults Each time performs pixelwise comparisons of animated windows
+					and the base window expecting the windows to be identical.
+*/
+void CTAnimDll::DrawingTestL()
+	{
+	// draws a little circle on the base window using window graphics and using window animation on the test window.
+	RTestAnim drawAnim=RTestAnim(iAnimDll);
+//
+	TRect rect;
+	TPckgBuf<TRect> rectPckg;
+	TPckgBuf<TBool> boolPckg;
+
+//
+	_LIT(KLog1,"Draw Ellipse Test1");
+	LOG_MESSAGE(KLog1);
+	rect = TRect(10,10,50,50);
+	CAnimWindow::SetEllipseDrawMode(CGraphicsContext::EDrawModeXOR);
+	iTestWin->Invalidate();
+	iTestWin->SetRect(rect);
+	iBaseWin->Invalidate();
+	iBaseWin->SetRect(rect);
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
+	RedrawAndCheckWindows();
+//
+	_LIT(KLog2,"Draw Ellipse Test2");
+	LOG_MESSAGE(KLog2);
+	iTestWin->Invalidate(TRect(20,20,100,40));
+	iBaseWin->Invalidate(TRect(20,20,100,40));
+	iBaseWin->DoDrawEllipse();	// Should clear old Ellipse (except invalid bits)
+	rect=TRect(30,30,200,100);
+	rectPckg()=rect;
+	iBaseWin->SetRect(rect);
+	iBaseWin->DoDrawEllipse();	// Should draw new Ellipse (except invalid bits)
+	drawAnim.Command(EADllSetRect,rectPckg);
+	RedrawAndCheckWindows();
+	iBaseWin->DoDrawEllipse();	// Clear old ellipse
+//
+	_LIT(KLog3,"Window Overlap Anim Test");
+	LOG_MESSAGE(KLog3);
+
+	iBaseWin->SetRect(TRect());
+	iBaseWin->DoDraw();
+	TheClient->iWs.Finish();
+
+	// create another window on top and check that animation beneath is not visible	
+	TSize screenSize=TheClient->iGroup->Size();
+	TInt winWidth=(screenSize.iWidth/3)-10;
+	TInt winHeight=screenSize.iHeight-10;
+	TSize size=iTestWin->Size();
+	rectPckg()=TRect(size);
+	drawAnim.Command(EADllStartAnimate,rectPckg);
+
+	CAnimWindow *topWindow = new (ELeave) CAnimWindow(ETrue, CAnimWindow::ERedraw);
+	CleanupStack::PushL(topWindow);
+	topWindow->ConstructL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight));
+	
+	RWindow *win=(RWindow *)iTestWin->BaseWin();
+	win->BeginRedraw();
+	topWindow->DoDraw(EFalse);
+	win->EndRedraw();
+	
+	TheClient->iWs.Flush();
+	for(TInt i=0;i<size.iWidth/2;i+=5)
+		InvalidatePauseAndRedraw(TRect(i,size.iHeight-i-i,i+i,size.iHeight-i),TTimeIntervalMicroSeconds32(400000));
+
+	TheClient->WaitForRedrawsToFinish();
+	CheckRect(iBaseWin->CtBaseWin(),iTestWin->CtBaseWin(),TRect(iBaseWin->Size()));
+	
+	win->BeginRedraw(rect);
+	drawAnim.Command(EADllCancelAnimate,rectPckg);
+	win->EndRedraw();
+
+	CleanupStack::PopAndDestroy(topWindow);
+//
+	iTestWin->BaseWin()->SetVisible(EFalse);
+	drawAnim.Close();
+//
+	_LIT(KLog4,"Draw Ellipse Test4&5");
+	LOG_MESSAGE(KLog4);
+	rect=TRect(20,20,50,50);
+	iBackedUpTestWin->SetRect(rect);
+	iBackedUpTestWin->DoDraw();
+	iBaseWin->SetRect(rect);
+	win->BeginRedraw();
+	iBaseWin->DoDraw();
+	win->EndRedraw();
+	TheClient->iWs.Finish();
+
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iBackedUpTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+	iBackedUpTestWin->Invalidate();
+	TheClient->iWs.Flush();
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+	iBackedUpTestWin->BaseWin()->SetVisible(EFalse);
+//
+	_LIT(KLog5,"Draw Ellipse Test6&7");
+	LOG_MESSAGE(KLog5);
+	rect=TRect(20,20,50,50);
+	TheClient->iWs.Flush();
+	RWindow *winBase=(RWindow *)iBaseWin->BaseWin();
+	winBase->BeginRedraw();
+	iBaseWin->SetRect(rect);
+	iBaseWin->DoDraw(ETrue);
+	winBase->EndRedraw();
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iBlankTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
+	TheClient->iWs.Flush();
+	iBlankTestWin->Invalidate();
+	TheClient->iWs.Flush();
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+	boolPckg()=EFalse;
+	drawAnim.Command(EADllSetVisible,boolPckg);
+	TheClient->iWs.Flush();
+	boolPckg()=ETrue;
+	drawAnim.Command(EADllSetVisible,boolPckg);
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+
+//This test does functional coverage by calling code that executes each of the 
+//server's class (CWsAnimGc) members in turn.
+
+
+	_LIT(KLog6,"Draw Primitives (Coverage) Test");
+	LOG_MESSAGE(KLog6);
+	rect = TRect(10,10,150,150);
+	iBaseWin->BaseWin()->SetVisible(ETrue);
+	iBaseWin->SetRect(TRect(0,0,0,0));
+	winBase->BeginRedraw();
+	iBaseWin->DoDraw();
+	iBaseWin->SetRect(rect);
+	iBaseWin->DoDrawCoverage();
+	winBase->EndRedraw();
+
+	iTestWin->BaseWin()->SetVisible(ETrue);
+	iTestWin->SetRect(rect);
+	win->BeginRedraw();
+	iTestWin->DoDraw();
+	win->EndRedraw();
+
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iTestWin->BaseWin(),EAnimTypeCoverage,rectPckg));
+	
+	//set font
+	CFbsFont* font;
+	User::LeaveIfError(TheClient->iGc->Device()->GetNearestFontToDesignHeightInTwips((CFont*&)font, TFontSpec()));
+	TPckgBuf<TInt> fontHandle;
+	fontHandle() = font->Handle();
+	const TInt err = drawAnim.CommandReply(EADllSetFont, fontHandle);
+	TheClient->iGc->Device()->ReleaseFont(font);
+	User::LeaveIfError(err);
+	
+	//draw 
+	User::LeaveIfError(drawAnim.CommandReply(EADllDrawNow));
+
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+	CheckWindows();
+	drawAnim.Close();
+	}
+
+void CTAnimDll::ShadowDrawingTestL()
+	{
+// Create a blank window to cast a shadow over the animation
+	TSize scrSize(TheClient->iScreen->SizeInPixels());
+	CTBlankWindow *blank=new(ELeave) CTBlankWindow();
+	CleanupStack::PushL(blank);
+	blank->SetUpL(TPoint(0,10), TSize(scrSize.iWidth,scrSize.iHeight/3), TheClient->iGroup, *TheClient->iGc);
+	blank->BaseWin()->SetShadowHeight(2);
+	iBlankTestWin->BaseWin()->SetShadowHeight(0);
+//
+	RTestAnim drawAnim=RTestAnim(iAnimDll);
+	TRect rect(10,scrSize.iHeight/3-20,50,scrSize.iHeight/3+40);
+	TPckgBuf<TRect> rectPckg;
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iBlankTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
+	drawAnim.Command(EADllSetShadowDrawMode);
+	CAnimWindow::SetEllipseDrawMode(CGraphicsContext::EDrawModePEN);
+//
+	iBlankTestWin->Invalidate();
+	iBlankTestWin->SetRect(rect);
+	iBaseWin->Invalidate();
+	iBaseWin->SetRect(rect);
+	RedrawAndCheckWindows(ETrue);
+//
+	for(TInt ypos=10;ypos>0;ypos-=4)
+		{
+		blank->SetPos(TPoint(0,ypos));
+		TPckgBuf<TShadowDrawTest> params;
+		TRequestStatus status(KRequestPending);
+		params().status=&status;
+		drawAnim.CommandReply(EADllShadowAnimTest,params);
+		User::WaitForRequest(status);
+		RedrawAndCheckWindows(ETrue);
+		}
+//
+	CleanupStack::PopAndDestroy(blank);	// Destroy the shadow window
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0130
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Complicated drawing test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Performs complicated drawing both through the animation on
+					a blank window and through direct fbs drawing on the second
+					window.
+
+@SYMTestExpectedResults Expects the both windows to be are identical
+*/
+void CTAnimDll::GeneralDrawingTestL()
+	{
+	// This test has been removed as it is no longer relevant
+	// Anims are not allowed to draw immediately to the screen
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0131
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Animated window destruction test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates a window and a child window inside it, runs an animation
+					in the child window in ESyncFlash mode, destroys windows.
+
+@SYMTestExpectedResults Expects the operations not to fail.
+*/
+void CTAnimDll::DestroyWindowTestL()
+	{
+	RWindow window(TheClient->iWs);
+	User::LeaveIfError(window.Construct(*TheClient->iGroup->GroupWin(),123));
+	CleanupClosePushL(window);
+	window.SetSize(TSize(100,100));
+	window.Activate();
+	RWindow window2(TheClient->iWs);
+	CleanupClosePushL(window2);
+	User::LeaveIfError(window2.Construct(window,124));
+	window2.Activate();
+	window2.BeginRedraw();	// Validate it
+	window2.EndRedraw();
+//
+	RTestAnim drawAnim;
+	drawAnim=RTestAnim(iAnimDll);
+	TRect rect(10,10,50,50);
+	TPckgBuf<TRect> rectPckg;
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(window2,EAnimTypeTest3,rectPckg));
+	drawAnim.Command(EADllStartAnimate,rectPckg);
+	CleanupStack::Pop(&window2);
+	CleanupStack::PopAndDestroy(&window);
+	TheClient->iWs.Flush();
+	User::After(TTimeIntervalMicroSeconds32(2000000));
+	window2.Close();
+	drawAnim.Close();
+	}
+
+void CTAnimDll::SetUpMember(TSpriteMember &aMember,TInt aType)
+	{
+	switch (aType)
+		{
+	case 1:
+		iTest->SetUpMember(aMember);
+		aMember.iOffset=TPoint();
+		aMember.iInterval=TTimeIntervalMicroSeconds32(1);
+		break;
+	case 2:
+		aMember.iInvertMask=EFalse;
+		aMember.iDrawMode=CGraphicsContext::EDrawModeXOR;
+		aMember.iOffset=TPoint(1,2);
+		aMember.iInterval=TTimeIntervalMicroSeconds32(2);
+		break;
+	case 3:
+		aMember.iInvertMask=ETrue;
+		aMember.iDrawMode=CGraphicsContext::EDrawModeOR;
+		aMember.iOffset=TPoint(3,4);
+		aMember.iInterval=TTimeIntervalMicroSeconds32(3);
+		break;
+	default:
+		iTest->SetUpMember(aMember);
+		}
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0132
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Sprite animation test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates a sprite with three sprite members and a sprite animation
+					passing the sprite to it. The test updates sprite members'
+					properties in various ways verifying that the properties are changing
+					on the server-side as well.
+
+@SYMTestExpectedResults Expects that operations above do not fail and that client-side
+					changes to the sprite affect server-side properly.
+*/
+#define HALF_SEC 500000
+void CTAnimDll::SpriteAnimL()
+	{
+	// create a sprite, add 3 members to it
+	RWsSprite sprite(TheClient->iWs);
+	iRedrawWin->BaseWin()->SetVisible(ETrue);
+	sprite.Construct(*iRedrawWin->CtBaseWin()->BaseWin(),TPoint(),0);
+	CleanupClosePushL(sprite);
+	CFbsBitmap* bitmap1=new(ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap1);
+	CFbsBitmap* bitmap2=new(ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap2);
+	CFbsBitmap* bitmap3=new(ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap3);
+	User::LeaveIfError(bitmap1->Create(TSize(10,12),EGray4));
+	User::LeaveIfError(bitmap2->Create(TSize(15,17),EGray4));
+	User::LeaveIfError(bitmap3->Create(TSize(20,22),EGray4));
+	TSpriteMember member1;
+	TSpriteMember member2;
+	TSpriteMember member3;
+	SetUpMember(member1,1);
+	member1.iBitmap=bitmap1;
+	member1.iMaskBitmap=bitmap1;
+	SetUpMember(member2,2);
+	member2.iBitmap=bitmap2;
+	member2.iMaskBitmap=bitmap2;
+	SetUpMember(member3,3);
+	member3.iBitmap=bitmap3;
+	member3.iMaskBitmap=bitmap3;
+	sprite.AppendMember(member1);
+	sprite.AppendMember(member2);
+	sprite.AppendMember(member3);
+
+	// create a sprite animation for the sprite
+	RTestAnim spriteAnim(iAnimDll);
+	TPtrC8 des(NULL,0);
+	TPoint pos(1,2);
+	User::LeaveIfError(spriteAnim.Construct(sprite,EAnimTypeSprite,des));
+	CleanupClosePushL(spriteAnim);
+
+	// call EADllCheckMember-command to verify that sprite animation's members
+	// have the same properties as the sprite instance
+	TPckgBuf<TSpriteMemberInfo> spriteInfo;
+	spriteInfo()=TSpriteMemberInfo(TPoint(),0,member1);
+	TBool retBool = spriteAnim.CommandReply(EADllCheckMember,spriteInfo);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("spriteAnim.CommandReply(EADllCheckMember,spriteInfo) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+
+	sprite.SetPosition(pos);
+	spriteInfo()=TSpriteMemberInfo(pos,1,member2);
+	retBool = spriteAnim.CommandReply(EADllCheckMember,spriteInfo);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("spriteAnim.CommandReply(EADllCheckMember,spriteInfo) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+
+	pos.SetXY(3,4);
+	sprite.SetPosition(pos);
+	spriteInfo()=TSpriteMemberInfo(pos,2,member3);
+	retBool = spriteAnim.CommandReply(EADllCheckMember,spriteInfo);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("spriteAnim.CommandReply(EADllCheckMember,spriteInfo) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+
+	// call commands to change sprite members' bitmaps and update members
+	spriteAnim.Command(EADllDraw1);
+	spriteAnim.Command(EADllDraw2);
+	spriteAnim.Command(EADllDraw3);
+	TheClient->iWs.Flush();
+	User::After(HALF_SEC);
+
+	// call commands to change sprite's position
+	TPckgBuf<TPoint> position;
+	position().SetXY(60,50);
+	spriteAnim.Command(EADllSetPos,position);
+	TheClient->iWs.Flush();
+	User::After(HALF_SEC);
+
+	// change 1st member's bitmap size and interval, update it and call command to check
+	// that the new properties are applied
+	User::LeaveIfError(bitmap1->Resize(TSize(30,32)));
+	member1.iMaskBitmap=NULL;
+	member1.iInterval=TTimeIntervalMicroSeconds32(25);
+	User::LeaveIfError(sprite.UpdateMember(0,member1));
+	spriteInfo()=TSpriteMemberInfo(TPoint(),0,member1);
+	retBool = spriteAnim.CommandReply(EADllCheckMember,spriteInfo);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("spriteAnim.CommandReply(EADllCheckMember,spriteInfo) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+
+	User::After(HALF_SEC);
+
+	// change 1st member's bitmap size and calls command that invokes
+	// MAnimSpriteFunctions::SizeChangedL(). Check that new property is applied
+	spriteAnim.CommandReply(EADllDeactivate);
+	User::LeaveIfError(bitmap1->Resize(TSize(35,37)));
+	spriteAnim.Command(EADllSizeChanged);
+	spriteAnim.CommandReply(EADllActivate);
+	spriteInfo()=TSpriteMemberInfo(TPoint(),0,member1);
+	retBool = spriteAnim.CommandReply(EADllCheckMember,spriteInfo);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("spriteAnim.CommandReply(EADllCheckMember,spriteInfo) return value - Expected: %d , Actual: %d"), ETrue, retBool);
+
+	User::After(HALF_SEC);
+
+	// call command that changes 1st member's bitmap image
+	spriteAnim.Command(EADllIncDraw);
+	TheClient->iWs.Flush();
+	User::After(HALF_SEC);
+
+
+	CleanupStack::PopAndDestroy(5,&sprite);
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0133
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Free timer animation test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     The test creates a free timer window animation that animates
+                    a shrinking filled rect which changes colour in a predefined way.
+
+@SYMTestExpectedResults The test verifies that the colour changes gets through to the the display.
+*/
+
+#define NOT_TIMED_OUT timeWaitingForFrame < frametime<<4
+void CTAnimDll::FreeTimerL()
+    {
+    RTestAnim freeTimerAnim(iAnimDll);
+    User::LeaveIfError(freeTimerAnim.Construct(*iRedrawWin->BaseWin(),EAnimTypeFreeTimer,KNullDesC8));
+    CleanupClosePushL(freeTimerAnim);
+    
+    const TInt frametime = 100000;  // 100 ms
+    const TInt samplingtime = frametime>>1; // 50 ms
+    
+    TPckgC<TInt> frametimeBuf(frametime);
+    freeTimerAnim.Command(ESetFrameTime, frametimeBuf);
+    freeTimerAnim.Command(EStartAnimation);
+    TheClient->iWs.Flush();
+    TheClient->iWs.Finish();
+
+    TInt x = iRedrawWin->BaseWin()->AbsPosition().iX + (iRedrawWin->BaseWin()->Size().iWidth >> 1);
+    TInt y = iRedrawWin->BaseWin()->AbsPosition().iY + (iRedrawWin->BaseWin()->Size().iHeight >> 1);
+    TPoint middle(x,y);
+    
+    TRgb color = KRgbMagenta;
+    TBool foundRedFrame = EFalse;
+    TBool foundGreenFrame = EFalse;
+    TBool foundBlueFrame = EFalse;
+    TBool foundBlackFrame = EFalse;
+    
+    //The free-timer animates the colour in this predefined way.
+    //Test that the screen gets updated.
+    TInt timeWaitingForFrame = 0;
+    while(NOT_TIMED_OUT && !(foundRedFrame && foundGreenFrame && foundBlueFrame && foundBlackFrame)) //wait max 16*frametime=1280ms
+        {
+        //wait for the colour frame
+        color = PixelColour(middle);
+
+        if(color == KRgbRed)
+            {
+            foundRedFrame = ETrue;
+            }
+        else if(color == KRgbGreen)
+            {
+            foundGreenFrame = ETrue;
+            }
+        else if(color == KRgbBlue)
+            {
+            foundBlueFrame = ETrue;
+            }
+        else if(color == KRgbBlack)
+            {
+            foundBlackFrame = ETrue;
+            }
+
+        timeWaitingForFrame += samplingtime;
+        User::After(samplingtime); 
+        }
+    
+    TEST(foundRedFrame);
+    TEST(foundGreenFrame);
+    TEST(foundBlueFrame);
+    TEST(foundBlackFrame);
+    
+    freeTimerAnim.Command(EStopAnimation);  
+    CleanupStack::PopAndDestroy(&freeTimerAnim);
+    }
+
+TRgb CTAnimDll::PixelColour(const TPoint& aPoint) const
+    {
+    TRgb pixel;
+    TheClient->iScreen->GetPixel(pixel, aPoint);
+    return pixel;
+    }
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0134
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Animation's ESyncSecond sync-mode test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates an animation in ESyncSecond sync-mode.
+					Checks that animation's Animate() method was called either 9, 10 or 11
+					times during a 10-seconds-wait.
+					The test also checks that if RWsSession::PrepareForSwitchOff()
+					is called then the Animate() method will not be called until
+					TRawEvent::EActive event is simulated.
+
+@SYMTestExpectedResults See actions.
+*/
+static const TInt K1Second =  1000000;
+static const TInt K3Seconds = 3000000;
+static const TInt K9Seconds = 9500000;
+void CTAnimDll::DisableTimerL()
+	{
+	//Defer start of timerAnim until the systen time are close to a full second
+	TTime now;
+	now.HomeTime();
+	TInt deferTime = K1Second - now.DateTime().MicroSecond();
+	User::After(deferTime);
+	
+	//Kick off timerAnim
+	RTestAnim timerAnim(iAnimDll);
+	User::LeaveIfError(timerAnim.Construct(*iRedrawWin->BaseWin(),EAnimTypeTimer,KNullDesC8));
+	
+	User::After(K9Seconds);
+	TInt count=timerAnim.CommandReply(EADllCurrentCount);
+	
+#if defined(LOGGING)
+	TLogMessageText buf;
+	_LIT(KLog,"Anim DisableTimer  Count=%d");
+	buf.Format(KLog,count);
+	TheClient->LogMessage(buf);
+#endif
+	
+	TEST(count>=9 && count<=11);
+	if (count != 10)
+		INFO_PRINTF2(_L("count>=9 && count<=11 - Expected: 9,10 or 11 , Actual: %d"), count);
+	
+#if defined(__WINS__)
+	TheClient->iWs.SimulateXyInputType(EXYInputNone);	//Turn off pen in case it turns on the timer
+#endif
+
+	// reset timer's counter and call RWsSession::PrepareForSwitchOff(),
+	// check that 3 seconds after the counter = 0
+	timerAnim.Command(EADllResetCount);
+	timerAnim.Command(EADllNoTimer);
+	TheClient->iWs.PrepareForSwitchOff();
+	TheClient->iWs.Flush();
+	User::After(K3Seconds);
+	count=timerAnim.CommandReply(EADllCurrentCount);
+#if defined(LOGGING)
+	buf.Format(KLog,count);
+	TheClient->LogMessage(buf);
+#endif
+	TEST(count==0);
+	if (count!=0)
+		INFO_PRINTF3(_L("count==0 - Expected: %d , Actual: %d"), 0,  count);
+
+
+	// simulates TRawEvent::EActive event,
+	// check that the timer didn't ticked until the event were simulated
+	timerAnim.Command(EADllTimerStarted);
+	TRawEvent event;
+	event.Set(TRawEvent::EActive);
+	TheClient->iWs.SimulateRawEvent(event);
+#if defined(__WINS__)
+	TheClient->iWs.SimulateXyInputType(EXYInputPointer);	//Turn pen on again
+#endif
+	TInt retVal = timerAnim.CommandReply(EADllFailed);
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("timerAnim.CommandReply(EADllFailed) return value - Expected: %d , Actual: %d"), 0,  retVal);
+
+	timerAnim.Close();
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0135
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Multiple animations test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates multiple animations for a window.
+
+@SYMTestExpectedResults The test doesn't perform any specific validations.
+*/
+void CTAnimDll::MultipleAnimsL()
+	{
+	RTestAnim anim1(iAnimDll);
+	RTestAnim anim2(iAnimDll);
+	RTestAnim anim3(iAnimDll);
+	RTestAnim anim4(iAnimDll);
+	RTestAnim anim5(iAnimDll);
+	RTestAnim anim6(iAnimDll);
+	TPtrC8 des(NULL,0);
+	User::LeaveIfError(anim1.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim1);
+	User::LeaveIfError(anim2.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim2);
+	User::LeaveIfError(anim3.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim3);
+	User::LeaveIfError(anim4.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim4);
+	User::LeaveIfError(anim5.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim5);
+	User::LeaveIfError(anim6.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	anim6.Close();
+	User::LeaveIfError(anim6.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	anim6.Close();
+	User::LeaveIfError(anim6.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupStack::PopAndDestroy(&anim5);
+	anim6.Close();
+	User::LeaveIfError(anim5.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupClosePushL(anim5);
+	User::LeaveIfError(anim6.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupStack::Pop(&anim5);
+	CleanupStack::PopAndDestroy(&anim4);
+	anim5.Close();
+	anim6.Close();
+	User::LeaveIfError(anim4.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupStack::PopAndDestroy(&anim3);
+	anim4.Close();
+	User::LeaveIfError(anim3.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupStack::PopAndDestroy(&anim2);
+	anim3.Close();
+	User::LeaveIfError(anim2.Construct(*iRedrawWin->BaseWin(),EAnimTypeTest3,des));
+	CleanupStack::PopAndDestroy(&anim1);
+	anim2.Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0136
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Click plugin DLL test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Created two handles for a click plugin dll (RSoundPlugIn instances).
+					Plays with Load(), Unload() methods to verify that they affect
+					IsLoaded() call result.
+					Checks that CommandReply() for different opcodes
+					returns RSoundPlugIn::ESoundWrongPlugIn value.
+					Plays with SetPenClick(), SetKeyClick() to verify that they affect
+					PenClickEnabled() and KeyClickEnabled() call result.
+
+
+@SYMTestExpectedResults The test checks that RSoundPlugIn's methods work properly
+					and that both handles behave identically.
+*/
+void CTAnimDll::ClickPlugInL()
+	{
+	_LIT(KDllName,"CLICK");
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+	CleanupClosePushL(ws);
+	TBool retBool;
+	TInt retVal;
+
+	// assign to the correct screen
+	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws);
+	CleanupStack::PushL(screen);
+	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));
+
+	RSoundPlugIn click1(ws);
+	RSoundPlugIn click2(TheClient->iWs);
+	User::LeaveIfError(click1.Construct());
+	CleanupClosePushL(click1);
+	User::LeaveIfError(click2.Construct());
+	CleanupClosePushL(click2);
+	TBool changeable1;
+	TBool changeable2;
+	TBool loaded=click1.IsLoaded(changeable1);
+	//test that either both are loaded or both are not loaded
+	TEST(!loaded==!click2.IsLoaded(changeable2));
+	if (!loaded!=!click2.IsLoaded(changeable2))
+		INFO_PRINTF3(_L("!loaded==!click2.IsLoaded(changeable2) - Expected: %d , Actual: %d"), !loaded,  !click2.IsLoaded(changeable2));
+
+	//test that either both are changeable or both are not changeable
+	TEST(!changeable1==!changeable2);
+	if (!changeable1!=!changeable2)
+		INFO_PRINTF3(_L("!changeable1==!changeable2) - Expected: %d , Actual: %d"), !changeable1,  !changeable2);
+
+	if (loaded && changeable1)
+		{
+		// unload the first one
+		User::LeaveIfError(click1.Unload());
+		// check that the second is not loaded and still changeable
+		retBool = !click2.IsLoaded(changeable2);
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click2.IsLoaded(changeable2) return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		TEST(changeable2);
+		if (!changeable2)
+			INFO_PRINTF3(_L("changeable2 - Expected: %d , Actual: %d"), ETrue,  changeable2);
+
+
+		// load the first one and check that the second became loaded and is changeable
+		User::LeaveIfError(click1.Load(KDllName));
+		retBool = click2.IsLoaded(changeable2);
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click2.IsLoaded(changeable2) return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		TEST(changeable2);
+		if (!changeable2)
+			INFO_PRINTF3(_L("changeable2 - Expected: %d , Actual: %d"), ETrue,  changeable2);
+
+		// unload the second one
+		User::LeaveIfError(click2.Unload());
+		// check that the first is not loaded and still changeable
+		retBool = !click1.IsLoaded(changeable1);
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click1.IsLoaded(changeable1) return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		TEST(changeable1);
+		if (!changeable1)
+			INFO_PRINTF3(_L("changeable1 - Expected: %d , Actual: %d"), ETrue,  changeable1);
+
+		// load the second one and check that the first one became loaded and is changeable
+		User::LeaveIfError(click2.Load(KDllName));
+		loaded=click1.IsLoaded(changeable1);
+		TEST(loaded);
+		if (!loaded)
+			INFO_PRINTF3(_L("loaded - Expected: %d , Actual: %d"), ETrue,  loaded);
+
+		TEST(changeable1);
+		if (!changeable1)
+			INFO_PRINTF3(_L("changeable1 - Expected: %d , Actual: %d"), ETrue,  changeable1);
+		}
+	if (loaded)
+		{
+		TPtrC8 des(NULL,0);
+		retVal = click1.CommandReply(0,des);
+		TEST(RSoundPlugIn::ESoundWrongPlugIn==retVal);
+		if (RSoundPlugIn::ESoundWrongPlugIn!=retVal)
+			INFO_PRINTF3(_L("click1.CommandReply(0,des) return value - Expected: %d , Actual: %d"), RSoundPlugIn::ESoundWrongPlugIn,  retVal);
+
+		retVal = click1.CommandReply(1,des);
+		TEST(RSoundPlugIn::ESoundWrongPlugIn==retVal);
+		if (RSoundPlugIn::ESoundWrongPlugIn!=retVal)
+			INFO_PRINTF3(_L("click1.CommandReply(1,des) return value - Expected: %d , Actual: %d"), RSoundPlugIn::ESoundWrongPlugIn,  retVal);
+
+		retVal = click1.CommandReply(2,des);
+		TEST(RSoundPlugIn::ESoundWrongPlugIn==retVal);
+		if (RSoundPlugIn::ESoundWrongPlugIn!=retVal)
+			INFO_PRINTF3(_L("click1.CommandReply(2,des) return value - Expected: %d , Actual: %d"), RSoundPlugIn::ESoundWrongPlugIn,  retVal);
+
+		retVal = click1.CommandReply(-1,des);
+		TEST(RSoundPlugIn::ESoundWrongPlugIn==retVal);
+		if (RSoundPlugIn::ESoundWrongPlugIn!=retVal)
+			INFO_PRINTF3(_L("click1.CommandReply(-1,des) return value - Expected: %d , Actual: %d"), RSoundPlugIn::ESoundWrongPlugIn,  retVal);
+
+		retBool = click1.KeyClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.KeyClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		retBool = click1.PenClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.PenClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		click1.SetPenClick(EFalse);
+		retBool = click1.KeyClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.KeyClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		retBool = !click1.PenClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click1.PenClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		click1.SetKeyClick(EFalse);
+
+		retBool = !click1.KeyClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click1.KeyClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		retBool = !click1.PenClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click1.PenClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		click1.SetPenClick(ETrue);
+		retBool = !click1.KeyClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("!click1.KeyClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		retBool = click1.PenClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.PenClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		click1.SetKeyClick(ETrue);
+		retBool = click1.KeyClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.KeyClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		retBool = click1.PenClickEnabled();
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("click1.PenClickEnabled() return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		/*RLibrary lib;
+		TInt err=lib.Load(KDllName);
+		if (err==KErrNone)
+			{
+			TPtrC8 des(NULL,0);
+			TEST(lib.Type()[2].iUid==click1.CommandReply(0,des));
+			lib.Close();
+			}*/
+		}
+	CleanupStack::PopAndDestroy(4,&ws);
+	}
+
+void CTAnimDll::TestWindowInfo(RTestAnim& aAnim,TInt aScreen,TInt aPos,TInt aId)
+	{
+	TPckgBuf<TWindowGroupInfoParms> params;
+	params().iScreen=aScreen;
+	params().iOrdinalPosition=aPos;
+	TPckgBuf<MAnimGeneralFunctionsWindowExtension::TWindowGroupInfo> winGpInfo;
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(KIpcSlot,&winGpInfo);
+	TBool retBool = aAnim.CommandReply(EADllWindowGroupInfo,params,ipcArgs);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("aAnim.CommandReply(EADllWindowGroupInfo,params,ipcArgs) return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+	MAnimGeneralFunctionsWindowExtension::TWindowGroupInfo& info=winGpInfo();
+	TEST(info.iId==aId);
+	if (info.iId!=aId)
+		INFO_PRINTF3(_L("winGpInfo() return value - Expected: %d , Actual: %d"), aId,  info.iId);
+
+	TInt retVal = TheClient->iWs.GetWindowGroupOrdinalPriority(aId);
+	TEST(info.iOrdinalPriority==retVal);
+	if (info.iOrdinalPriority!=retVal)
+		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupOrdinalPriority(aId) return value - Expected: %d , Actual: %d"), info.iOrdinalPriority, retVal);
+
+	TBuf<64> windowGroupNameS;
+	TBuf<64> windowGroupNameA;
+	TheClient->iWs.GetWindowGroupNameFromIdentifier(aId,windowGroupNameS);
+	retVal = windowGroupNameS.Length();
+	TEST(info.iNameLength==retVal);
+	if (info.iNameLength!=retVal)
+		INFO_PRINTF3(_L("windowGroupNameS.Length() return value - Expected: %d , Actual: %d"), info.iNameLength, retVal);
+
+	if (info.iNameLength<64)
+		{
+		ipcArgs.Set(KIpcSlot,&windowGroupNameA);
+		retBool = aAnim.CommandReply(EADllWindowGroupName,params,ipcArgs);
+		TEST(retBool);
+		if (!retBool)
+			INFO_PRINTF3(_L("aAnim.CommandReply(EADllWindowGroupName,params,ipcArgs) return value - Expected: %d , Actual: %d"), ETrue,  retBool);
+
+		if (info.iNameLength>0)
+			{
+			TEST(windowGroupNameA==windowGroupNameS);
+			}
+		else
+			{
+			TEST(windowGroupNameA.Length()==0);
+			if (windowGroupNameA.Length()!=0)
+				INFO_PRINTF3(_L("iwindowGroupNameA.Length()==0 - Expected: %d, Actual: %d"), 0, windowGroupNameA.Length());
+			}
+
+		}
+	TEST(info.iParentId>=-1);
+	if (info.iParentId<-1)
+		INFO_PRINTF3(_L("info.iParentId>=-1 - Expected: %d or greater, Actual: %d"), -1, info.iParentId);
+
+	}
+
+void CTAnimDll::TestEventHandlerRemovalL()
+	{
+	RTestAnim anim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iRedrawWin->BaseWin(),EAnimTypeEventHandler,KNullDesC8));
+	anim.Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0137
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Animation's extended window functions test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     The test creates a window animation that has a couple of
+					commands that work with extended window functions encapsulated
+					into MAnimGeneralFunctionsWindowExtension class instance.
+					The test calls those commands to compare MAnimGeneralFunctionsWindowExtension's
+					methods' results with the results retuned by WSERV client classes.
+					MAnimGeneralFunctionsWindowExtension methods tested here:
+					Screens(), FocusScreens(), WindowGroups(), WindowGroupInfo(),
+					WindowGroupName()
+
+@SYMTestExpectedResults MAnimGeneralFunctionsWindowExtension methods must give the same results as
+					the corresponding WSERV client methods would.
+*/
+void CTAnimDll::WinFunctionsL()
+	{
+	RTestAnim anim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iRedrawWin->BaseWin(),EAnimTypeWindowFunctions,KNullDesC8));
+	CleanupClosePushL(anim);
+	TInt screens=anim.CommandReply(EADllScreen);
+	TEST(screens>0);
+	if (screens<=0)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllScreen) return value - Expected: %d or greater, Actual: %d"), 1, screens);
+
+	TInt focusScreen=anim.CommandReply(EADllFocusScreen);
+	TInt retVal = TheClient->iWs.GetFocusScreen();
+	TEST(focusScreen==retVal && focusScreen<=screens);
+	if (focusScreen!=retVal || focusScreen>screens)
+		INFO_PRINTF4(_L("anim.CommandReply(EADllFocusScreen) return value - Expected: %d and less than or equal to  %d, Actual: %d"), retVal, screens, focusScreen);
+
+	TInt ii;
+	TPckgBuf<TInt> screen;
+	CArrayPtrFlat<CMinWin>* wins=new(ELeave) CArrayPtrFlat<CMinWin>(screens);
+	CleanupStack::PushL(wins);
+	// create one window on each screen
+	for(ii=0;ii<screens;++ii)
+		{
+		CMinWin* win=new(ELeave) CMinWin(ii);
+		CleanupStack::PushL(win);
+		win->ConstructL();
+		wins->AppendL(win);
+		}
+	if (screens>1)
+		{
+		for (ii=screens-1;ii>=0;--ii)
+			{
+			TheClient->iWs.SetFocusScreen(ii);
+			retVal = anim.CommandReply(EADllFocusScreen);
+			TEST(retVal==ii);
+			if (retVal!=ii)
+				INFO_PRINTF3(_L("anim.CommandReply(EADllFocusScreen) return value - Expected: %d, Actual: %d"), ii, retVal);
+			}
+		for (ii=screens-1;ii>=0;--ii)
+			{
+			screen()=ii;
+			anim.CommandReply(EADllSetFocusScreen,screen);
+			retVal = anim.CommandReply(EADllFocusScreen);
+			TEST(retVal==ii);
+			if (retVal!=ii)
+				INFO_PRINTF3(_L("anim.CommandReply(EADllFocusScreen) return value - Expected: %d, Actual: %d"), ii, retVal);
+			}
+		}
+	TheClient->iWs.SetFocusScreen(focusScreen);
+	retVal = anim.CommandReply(EADllFocusScreen);
+	TEST(retVal==focusScreen);
+	if (retVal!=focusScreen)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllFocusScreen) return value - Expected: %d, Actual: %d"), focusScreen, retVal);
+
+	TInt winGroupsAll=0;
+	for(ii=0;ii<screens;++ii)
+		{
+		screen()=ii;
+		winGroupsAll+=anim.CommandReply(EADllWindowGroups,screen);
+		}
+	TInt winGroupsS=TheClient->iWs.NumWindowGroups();
+	TEST(winGroupsAll==winGroupsS);
+	if (winGroupsAll!=winGroupsS)
+		INFO_PRINTF3(_L("TheClient->iWs.NumWindowGroups() return value - Expected: %d, Actual: %d"), winGroupsS, winGroupsAll);
+
+	// the remaining test will use winGroupsA and performed on current focus screen only
+	screen()=iTest->iScreenNumber;
+	TInt winGroupsA=anim.CommandReply(EADllWindowGroups,screen);
+	CArrayFixFlat<TInt>* windowList=new(ELeave) CArrayFixFlat<TInt>(3);
+	CleanupStack::PushL(windowList);
+	// wserv implementation returns window groups from current focus screen, followed by the rest
+	TheClient->iWs.WindowGroupList(windowList);
+	// only interested in window group from current focus screen
+	for (ii=0;ii<winGroupsA;++ii)
+		TestWindowInfo(anim,iTest->iScreenNumber,ii,(*windowList)[ii]);
+	TPckgBuf<MAnimGeneralFunctionsWindowExtension::TWindowGroupInfo> winGpInfo;
+	TIpcArgs ipcArgs;
+	TPckgBuf<TWindowGroupInfoParms> params;
+	params().iScreen=iTest->iScreenNumber;
+	params().iOrdinalPosition=winGroupsA;
+	ipcArgs.Set(KIpcSlot,&winGpInfo);
+	TBuf<64> windowGroupName;
+	TBool retBool = !anim.CommandReply(EADllWindowGroupInfo,params,ipcArgs);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("!anim.CommandReply(EADllWindowGroupInfo,params,ipcArgs) return value - Expected: %d, Actual: %d"), ETrue, retBool);
+
+	ipcArgs.Set(KIpcSlot,&windowGroupName);
+	retBool = !anim.CommandReply(EADllWindowGroupName,params,ipcArgs);
+	TEST(retBool);
+	if (!retBool)
+		INFO_PRINTF3(_L("!anim.CommandReply(EADllWindowGroupName,params,ipcArgs) return value - Expected: %d, Actual: %d"), ETrue, retBool);
+
+	/*params().iOrdinalPosition=-1;		//Behaviour for negative positions not defined - but as writtin this code will pass
+	ipcArgs.Set(KIpcSlot,&winGpInfo);
+	TEST(anim.CommandReply(EADllWindowGroupInfo,params,ipcArgs));
+	ipcArgs.Set(KIpcSlot,&windowGroupNameA);
+	TEST(anim.CommandReply(EADllWindowGroupName,params,ipcArgs));*/
+	RWindowGroup group(TheClient->iWs);
+	User::LeaveIfError(group.Construct(ENullWsHandle));
+	CleanupClosePushL(group);
+	_LIT(KGroupName,"Testxyz1234");
+	group.SetName(KGroupName);
+	group.SetOrdinalPosition(0,TheClient->iWs.GetWindowGroupOrdinalPriority((*windowList)[0])+1);
+	TInt groupId=group.Identifier();
+	TestWindowInfo(anim,iTest->iScreenNumber,0,groupId);
+	group.SetOrdinalPosition(0,TheClient->iWs.GetWindowGroupOrdinalPriority((*windowList)[winGroupsA-1])-1);
+	TestWindowInfo(anim,iTest->iScreenNumber,winGroupsA,groupId);
+	CleanupStack::PopAndDestroy(screens+4,&anim);
+// Restore us back to the front
+	TheClient->iGroup->GroupWin()->SetOrdinalPosition(0);
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0138
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Animation's extended window functions test 2
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     The test creates a window animation that has a command
+					for setting window's ordinal position and priority.
+					The test creates 4 window groups with the same priority and
+					checks that they have correct ordinal positions after the creation.
+					After that the test plays with updating ordinal positions and
+					priorities of the window groups using the animation's command.
+
+@SYMTestExpectedResults The test checks that the command was executed with no errors
+					and affected ordinal positions of the window groups properly.
+*/
+void CTAnimDll::WinFunctions2L()
+	{
+	RTestAnim anim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iRedrawWin->BaseWin(),EAnimTypeWindowFunctions,KNullDesC8));
+	CleanupClosePushL(anim);
+	CArrayFixFlat<TInt>* windowList=new(ELeave) CArrayFixFlat<TInt>(3);
+	TheClient->iWs.WindowGroupList(windowList);
+	TInt priority=TheClient->iWs.GetWindowGroupOrdinalPriority((*windowList)[0])+2;
+	delete windowList;
+	RWindowGroup group1(TheClient->iWs);
+	User::LeaveIfError(group1.Construct(ENullWsHandle));
+	CleanupClosePushL(group1);
+	group1.SetOrdinalPosition(0,priority);
+	RWindowGroup group2(TheClient->iWs);
+	User::LeaveIfError(group2.Construct(ENullWsHandle));
+	CleanupClosePushL(group2);
+	group2.SetOrdinalPosition(0,priority);
+	RWindowGroup group3(TheClient->iWs);
+	User::LeaveIfError(group3.Construct(ENullWsHandle));
+	CleanupClosePushL(group3);
+	group3.SetOrdinalPosition(0,priority);
+	RWindowGroup group4(TheClient->iWs);
+	User::LeaveIfError(group4.Construct(ENullWsHandle));
+	CleanupClosePushL(group4);
+	group4.SetOrdinalPosition(0,priority);
+
+	TInt retVal = group1.OrdinalPosition();
+	TEST(retVal==3);
+	if (retVal!=3)
+		INFO_PRINTF3(_L("group1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 3, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	TPckgBuf<TSetOrdinalParms> params;
+	params().iIdentifier=group4.Identifier();
+	params().iOrdinalPriority=priority;
+	params().iOrdinalPosition=1;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	params().iOrdinalPosition=2;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	params().iOrdinalPosition=3;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group1.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==3);
+	if (retVal!=3)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 3, retVal);
+
+	params().iOrdinalPriority=priority+1;
+	params().iOrdinalPosition=3;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	params().iOrdinalPriority=priority;
+	params().iOrdinalPosition=-2;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==3);
+	if (retVal!=3)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 3, retVal);
+
+	params().iOrdinalPosition=0;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group1.OrdinalPosition();
+	TEST(retVal==3);
+	if (retVal!=3)
+		INFO_PRINTF3(_L("group1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 3, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	params().iOrdinalPriority=priority-1;
+	params().iOrdinalPosition=2;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group1.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+
+	params().iOrdinalPriority=priority;
+	params().iOrdinalPosition=0;
+	retVal = anim.CommandReply(EADllSetOrdinalPosition,params);
+	TEST(retVal==KErrNone);
+	if (retVal!=KErrNone)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllSetOrdinalPosition,params) return value - Expected: %d, Actual: %d"), KErrNone, retVal);
+
+	retVal = group1.OrdinalPosition();
+	TEST(retVal==3);
+	if (retVal!=3)
+		INFO_PRINTF3(_L("group1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 3, retVal);
+
+	retVal = group2.OrdinalPosition();
+	TEST(retVal==2);
+	if (retVal!=2)
+		INFO_PRINTF3(_L("group2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 2, retVal);
+
+	retVal = group3.OrdinalPosition();
+	TEST(retVal==1);
+	if (retVal!=1)
+		INFO_PRINTF3(_L("group3.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
+
+	retVal = group4.OrdinalPosition();
+	TEST(retVal==0);
+	if (retVal!=0)
+		INFO_PRINTF3(_L("group4.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);
+
+	CleanupStack::PopAndDestroy(5,&anim);
+	/*TInt pos1=group1.OrdinalPosition();
+	TInt pos2=group2.OrdinalPosition();
+	TInt pos3=group3.OrdinalPosition();
+	TInt pos4=group4.OrdinalPosition();*/
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0139
+
+@SYMDEF             DEF081259, DEF122220
+
+@SYMTestCaseDesc    Animation's notifications test
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     The test works with two screens. An animation is created that keeps
+					track on all notifications about EDirectScreenAccess, EHeartbeatTimer,
+					EScreenDeviceChange events.
+					The test generates those events by performing operations on direct
+					screen access and simulating TRawEvent::EInactive and TRawEvent::EAactive
+					events.
+
+@SYMTestExpectedResults  The test checks that the animation didn't miss any of EDirectScreenAccess
+					or EHeartbeatTimer notifications. (The test doesn't check EScreenDeviceChange
+					notifications however).
+					The test also makes sure that the animation didn't animate
+					during inactive state.
+					For DEF12220, the test will crash when a untidied notifier from a previous RTestAnim object
+					is accessed if the fix is not present. If the fix is present, the test should not crash.
+*/
+void CTAnimDll::TestNotificationsL()
+	{
+	RTestAnim anim(iAnimDll);
+	User::LeaveIfError(anim.Construct(*iRedrawWin->BaseWin(),EAnimTypeNotificationTest,KNullDesC8));
+	CleanupClosePushL(anim);
+
+	TPckgBuf<TInt> screenNum;
+
+	// initial state - test that we have no DSA on either screen
+	screenNum() = 0;
+	TInt dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	// create first DSA, but don't start it - test that we have no DSA on either screen
+	CScrollText* dsa1 = CScrollText::NewL(iTest->iScreenNumber,1,*TheClient->iGroup,5,EFalse);
+	CleanupStack::PushL(dsa1);
+	screenNum() = 0;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	// start first DSA - test that we have DSA on this screen but not other screen
+	dsa1->StartL();
+	screenNum() = 0;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TInt retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	// start second DSA
+	CScrollText* dsa2 = CScrollText::NewL(iTest->iScreenNumber,2,*TheClient->iGroup,5,EFalse);
+	CleanupStack::PushL(dsa2);
+	dsa2->StartL();
+	screenNum() = 0;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	// stop second DSA
+	dsa2->Stop();
+	CleanupStack::PopAndDestroy(dsa2);
+	screenNum() = 0;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	retVal = (screenNum() == iTest->iScreenNumber);
+	TEST(dsa == retVal);
+	if (dsa != retVal)
+		INFO_PRINTF3(_L("dsa == (screenNum() == iTest->iScreenNumber) - Expected: %d, Actual: %d"), retVal, dsa);
+
+	// stop first DSA
+	dsa1->Stop();
+	CleanupStack::PopAndDestroy(dsa1);
+	screenNum() = 0;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	screenNum() = 1;
+	dsa=anim.CommandReply(EADllQueryDSA, screenNum);
+	TEST(!dsa);
+	if (dsa)
+		INFO_PRINTF3(_L("anim.CommandReply(EADllQueryDSA, screenNum) return value - Expected: %d, Actual: %d"), 0, dsa);
+
+	// TEST heartbeat timer start\stop notifications - no longer relevant - has been removed 
+
+	CleanupStack::PopAndDestroy(&anim);
+	
+	// Create second RTestAnim for DEF12220 test
+	RTestAnim anim2(iAnimDll);
+	User::LeaveIfError(anim2.Construct(*iRedrawWin->BaseWin(),EAnimTypeNotificationTest,KNullDesC8));
+	CleanupClosePushL(anim2);
+	
+	// Create third dsa
+	CScrollText* dsa3 = CScrollText::NewL(iTest->iScreenNumber,1,*TheClient->iGroup,5,EFalse);
+	CleanupStack::PushL(dsa3);
+	// If the fix for DEF12220 is not present, starting dsa3 will cause a crash.
+	dsa3->StartL();
+	dsa3->Stop();
+	CleanupStack::PopAndDestroy(dsa3);
+	CleanupStack::PopAndDestroy(&anim2);
+	}
+
+/**
+ A minimal dsa call to a window with a child window, for running coverage on
+ ClipWindows member funcion.
+ 
+@SYMTestCaseID GRAPHICS-WSERV-0410
+
+@SYMPREQ PREQ1841
+
+@SYMTestExpectedResults Nothing visible, the CWsClientWindow::ClipWindows 
+should be partially covered.
+ */
+void CTAnimDll::TestCoverageL()
+	{
+	// create first DSA, but don't start it - test that we have no DSA on either screen
+	CWindowWithChild* dsa1 = CWindowWithChild::NewL(iTest->iScreenNumber, *TheClient->iGroup, EFalse);
+	CleanupStack::PushL(dsa1);
+
+	// start first DSA - test that we have DSA on this screen but not other screen
+	dsa1->StartL();
+	dsa1->PerformCoverageCalls();
+	dsa1->Stop();
+
+	// cover another trivial case for a non-visible window
+	RWindow* cwin = dsa1->ChildWindow();
+	
+	cwin->SetTransparencyAlphaChannel();
+	dsa1->ContinueL();
+
+	//ClipWindows with visible and invisible branches
+	cwin->SetVisible(EFalse);
+
+	//cover CWsWindow::StatusDump (visible and invisible branch)
+	TheClient->iWs.LogCommand(RWsSession::ELoggingStatusDump);
+	
+	dsa1->Stop();
+	dsa1->StartL();
+	cwin->SetVisible(ETrue);
+	dsa1->Stop();
+
+	CleanupStack::PopAndDestroy(dsa1);
+	}
+
+/**
+ Executes a Panic coverage test for a given test-number.
+ Most of the first lines copied from DoPanicTest.
+ CWsWindow is tested through CommandL (case 0-3) and other API funcs
+ */
+LOCAL_C TInt DoPanicTestCoverage(TInt aTestNum, TAny *aScreenNumber)
+	{
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+
+	// assign to the correct screen
+	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws);
+	User::LeaveIfError(screen->Construct(reinterpret_cast<TInt>(aScreenNumber)));
+
+	RWindowGroup group(ws);
+	User::LeaveIfError(group.Construct(333));
+	group.EnableReceiptOfFocus(EFalse);	// Stop auto group switching on close
+	RAnimDll animDll=RAnimDll(ws);
+	User::LeaveIfError(animDll.Load(KAnimDLLName));
+	
+	RWindow window(ws);
+	User::LeaveIfError(window.Construct(group,123));
+	window.SetSize(TSize(10,10));
+	window.Activate();
+	window.BeginRedraw();
+	window.EndRedraw();
+
+	switch (aTestNum)
+	{
+	case 0: //non translucent window
+		//EWsWinOpSetTransparentRegion -> EWservPanicTransparencyObjNotCreated
+		{
+		RRegion r;
+		window.SetTransparentRegion(r);
+		break;
+		}
+	case 1:
+		//EWsWinOpSetTransparencyPolicy -> EWservPanicTransparencyObjNotCreated
+		window.SetTransparencyPolicy(ETransparencyDefault);
+		break;
+	case 2:
+		// -> EWservPanicWindowActive
+		window.Activate();
+		break;
+	case 3:
+		// -> EWservPanicCornerParams
+		window.SetCornerType(EWindowCornerSquare, ECornerTypeMask);
+		break;
+	case 4:
+		// -> EWservPanicCornerParams
+		window.SetCornerType(ECornerTypeMask, 0);
+		break;
+	default:
+		return EWsExitReasonFinished;
+	}
+	ws.Flush();
+	
+	return(EWsExitReasonBad);	// Should never get here, but it's baaddd if it does
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0411
+
+@SYMPREQ PREQ1841
+
+@SYMTestCaseDesc Does functional coverage for code that Panics
+
+*/
+void CTAnimDll::TestPanicCoverageL()
+	{
+	TClientPanic expectedPanicCode[] = 
+		{
+		EWservPanicTransparencyObjNotCreated,	//0
+		EWservPanicTransparencyObjNotCreated,	//1
+		EWservPanicWindowActive,				//2
+		EWservPanicCornerParams,				//3
+		EWservPanicCornerParams,				//4
+		};
+	for (TInt i=0; i<sizeof(expectedPanicCode)/sizeof(TClientPanic); i++)
+		{
+		TEST(iTest->TestWsPanicL(
+				DoPanicTestCoverage,			//aFunction
+				expectedPanicCode[i],			//aExitReason
+				i,								//aInt
+				(TAny*)iTest->iScreenNumber,	//aPtr
+				NULL)); //&finishTests			//aTestFinished
+		iTest->CloseAllPanicWindows();
+		}
+	}
+
+
+/**
+@SYMTestCaseID GRAPHICS-CODEBASE-WSERV-0056-0001
+
+@SYMPREQ PGM027
+
+@SYMTestCaseDesc Tests RAnimDll::Load (by passing invalid file name)
+
+@SYMTestPriority 1 
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Call RAnimDll::Load() by passing invalid file name\n
+
+@SYMTestExpectedResults Should return with appropiate error message. KErrNotFound
+ */
+void CTAnimDll::TestLoadApiL()	
+	{
+	RAnimDll* animDll=new(ELeave) RAnimDll(TheClient->iWs);
+	CleanupStack::PushL(animDll);
+	TInt ret=0;
+	_LIT(KAnimFile,"Nothing.dll");
+	_LIT(KEmpty,"");
+	ret=animDll->Load(KAnimFile);
+	TEST(ret==KErrNotFound);
+	ret=animDll->Load(KEmpty);
+	TEST(ret==KErrNotFound);
+	CleanupStack::PopAndDestroy(animDll);
+	}
+
+TInt CTAnimDll::CheckError(TInt aError,TInt aExpected)
+	{
+	if (aError!=0)
+		{
+		if (aError>0)
+			{
+			_LIT(KLog,"The event at position %d did not match, total number of events=%d");
+			LOG_MESSAGE3(KLog,aError,aExpected);
+			}
+		else
+			{
+			_LIT(KLog,"Only recieved %d events, expecting %d events");
+			LOG_MESSAGE3(KLog,-aError,aExpected);
+			}
+		return EFalse;
+		}
+	return ETrue;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0448
+
+@SYMCR				CR1164
+
+@SYMTestCaseDesc	Test events get to Anims at a higher priorty than commands
+
+@SYMTestPriority	High
+
+@SYMTestStatus		Implemented
+
+@SYMTestActions		Create a 2nd thread that sends events via kernal, send also commands from client to an Anim
+
+@SYMTestExpectedResults	Check that events intersperse commands from client
+*/
+void CTAnimDll::KeyClickPriorityL()
+	{
+	_LIT(KFailedAdd,"Device Driver Failed to Add an Event, error=%d");
+	REventAnim* anim=REventAnim::NewL(iTestWin->BaseWin(),&iAnimDll);
+	TPckgBuf<TInt> events;
+	TInt err=anim->CommandReply(EADllLoadDeviceDriver);
+	if (err!=KErrNone)
+		{
+		_LIT(KLog,"Failed to load Device Driver for sending Events");
+		TEST(EFalse);
+		LOG_MESSAGE(KLog);
+		}
+	TInt error;
+	TInt ii;
+	for (ii=1;ii<5;++ii)
+		{
+		events()=ii;
+		error=anim->CommandReply(EADllSendEvent,events);
+		if (error!=KErrNone)
+			LOG_MESSAGE2(KFailedAdd,error);
+		anim->Command(EADllAfterEvent);
+		TheClient->Flush();
+		error=anim->TestFail(ii);
+		TEST(CheckError(error,ii));
+		}
+	const TInt iterations=15;
+	const TInt eventsPerIteration=2;
+	const TInt totalEvents=iterations*eventsPerIteration;
+	events()=eventsPerIteration;
+	for (ii=iterations;ii>0;--ii)
+		{
+		error=anim->CommandReply(EADllSendEvent,events);
+		if (error!=KErrNone)
+			LOG_MESSAGE2(KFailedAdd,error);
+		anim->Command(EADllAfterEvent);
+		}
+	TheClient->Flush();
+	error=anim->TestFail(totalEvents);
+	TEST(CheckError(error,totalEvents));
+	anim->CommandReply(EADllUnloadDeviceDriver);
+	delete anim;
+	}
+
+/**
+@SYMDEF             INC117828
+
+@SYMTestCaseDesc    Tests Window Rect returned by CWsAnim::Parameters
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     This test creates a new window which overlaps the screen edge
+					and creates an animation on this window. An additional
+					CommandReplyL() option has been added to the AnimDLL to compare
+					the expected value of this rect with the actual value.
+					
+
+@SYMTestExpectedResults The result of the EADllTestParameterRect CommandReplyL call will equal ETrue
+						if the passed Rect matches, EFalse otherwise.
+*/
+void CTAnimDll::ParameterValueTestL()
+	{
+	//Window Location & Dimension
+	TPoint winOrigin(-1,15);
+	TSize winSize(250,65);
+	
+	//Create a new window to perform the test; window needs to overlap the left edge of the screen.
+	CAnimWindow* paramTestWin = new(ELeave) CAnimWindow(EFalse, CAnimWindow::ERedraw);
+	CleanupStack::PushL(paramTestWin);
+	paramTestWin->ConstructL(winOrigin, winSize);
+
+	RTestAnim anim = RTestAnim(iAnimDll);
+
+	TPckgBuf<TRect> rectPckg;
+	TRect winRect(winOrigin, winSize);
+	rectPckg() = winRect;
+
+	anim.Construct(*(paramTestWin->BaseWin()), EAnimTypeTest3, rectPckg);
+	anim.Command(EADllStartAnimate, rectPckg);
+
+	TPckgBuf<TBool> boolPckg;
+	boolPckg() = ETrue;
+	anim.Command(EADllSetVisible, boolPckg);
+
+	TEST(anim.CommandReply(EADllParameterRectValueTest, rectPckg));
+
+	boolPckg() = EFalse;
+	anim.Command(EADllSetVisible, boolPckg);
+	anim.Command(EADllCancelAnimate);	
+	anim.Close();
+	CleanupStack::PopAndDestroy(paramTestWin);
+	}
+
+/**
+@SYMDEF             DEF122176
+
+@SYMTestCaseDesc    Test the operation of SetInterval with both negative and positive intervals
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     This test uses the test anim CAutoAnim3 in mode 3 which alternates
+					between drawing a large and a small ellipse at each interval.
+					The large ellipse is drawn first.
+					Note that the anims are redrawn at the rate of 2 intervals per second, so
+					setting an interval of 2 will mean that the anim is redrawn every second.
+						Step 1: The interval is set to be -2 and the test then waits for 0.9
+								seconds (to make sure one interval has passed) then checks that 
+								only the large ellipse has been drawn.							
+						Step 2: The interval is set to be 2 (redraw every second) and the test then 
+								waits for 1.2 seconds (to make sure two intervals have passed) and 
+								checks that the small ellipse has been drawn.
+					
+@SYMTestExpectedResults 
+					After Step 1 a large ellipse will be drawn on both windows.
+					After Step 1 a small ellipse will be drawn on both windows. 
+
+*/
+void CTAnimDll::TestSetIntervalL()
+	{
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+	
+	// draws a little circle on the base window using window graphics and using window animation on the test window.
+	RTestAnim drawAnim=RTestAnim(iAnimDll);
+
+	_LIT(KLog1,"SetInterval Test");
+	LOG_MESSAGE(KLog1);
+	TRect rect(10,10,110,110);
+	CAnimWindow::SetEllipseDrawMode(CGraphicsContext::EDrawModePEN);
+	iTestWin->Invalidate();
+	iTestWin->SetRect(rect);
+	iBaseWin->Invalidate();
+	iBaseWin->SetRect(rect);
+	TPckgBuf<TRect> rectPckg;
+	rectPckg()=rect;
+	User::LeaveIfError(drawAnim.Construct(*iTestWin->BaseWin(),EAnimTypeTest3,rectPckg));	
+	
+	TPckgBuf<TInt> intPckg;
+	intPckg() = 3; // mode 3 for this anim flips between drawing a large and a small ellipse
+	drawAnim.Command(EADllSetMode, intPckg);
+	
+	intPckg() = MAnimGeneralFunctions::ESyncNone;
+	drawAnim.CommandReply(EADllDoSetSync, intPckg);	
+	
+	// Set an interval of -2 then wait 0.9 seconds, after which only the large ellipse should be visible 
+	intPckg() = -2;
+	drawAnim.CommandReply(EADllSetInterval, intPckg);
+	// Draw the large ellipse on the base window to match what the anim should be drawing
+	iBaseWin->SetRect(rect);	
+	iBaseWin->DoDraw();
+	ws.Finish();	
+	// Check Step 1 completed successfully
+	RedrawAndCheckWindows();	
+	
+	// Set an interval of 2 and wait 0.9 seconds, after which the small ellipse should be visible	
+	intPckg() = 2;
+	drawAnim.CommandReply(EADllSetInterval, intPckg);
+	// Draw the small ellipse on the base window to match what the anim should be drawing
+	iBaseWin->SetRect(TRect(40,40,80,80));	
+	iBaseWin->DoDraw();	
+	ws.Finish();
+	// Check Step 2 completed successfully
+	RedrawAndCheckWindows();		
+
+	// clean up
+	drawAnim.Close();
+	ws.Close();
+	}
+
+void CTAnimDll::RunTestCaseL(TInt /*aCurTestCase*/)
+	{
+	_LIT(KTest0,"RemoteBuffer");
+	_LIT(KTest1,"ExtraCopyTest");
+	_LIT(KTest2,"Misc");
+	_LIT(KTest3,"SyncMode1");
+	_LIT(KTest4,"Anim Dll Panics");
+	_LIT(KTest5,"Drawing test");
+	_LIT(KTest6,"Shadow drawing test");
+	_LIT(KTest7,"General drawing test");
+	_LIT(KTest8,"Destroy window test");
+	_LIT(KTest9,"Sprite Anim test");
+	_LIT(KTest10,"Free Timer test");
+	_LIT(KTest11,"Disable Timer test");
+	_LIT(KTest12,"Multiple Anims");
+	_LIT(KTest13,"ReLoad Click PlugIn");
+	_LIT(KTest14,"Window Functions");
+	_LIT(KTest15,"Window Functions 2");
+	_LIT(KTest16,"Notifications");
+	_LIT(KTest17,"Event Handler removal");
+	_LIT(KTest18,"Anim dll - Load Api Negative Test");
+	_LIT(KTest19,"Key Click Priority Test");
+	_LIT(KTest20,"CWsAnim::Parameters() WindowRect Value Test");
+	_LIT(KTest21,"SetInterval test");
+	_LIT(KTest22,"Client Window Coverage");
+	_LIT(KTest23,"Client Window Panic Coverage");
+	((CTAnimDllStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+
+//	if (iTest->iState==0) iTest->iState=22;	//Use this line to start running tests from a particular test
+	switch(++iTest->iState)
+		{
+		case 1:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0127"));
+			iTest->LogSubTest(KTest0);
+			RemoteBuffer();
+			break;
+		case 2:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0128"));
+			iTest->LogSubTest(KTest1);
+			ExtraCopyTest();
+			break;
+		case 3:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0126"));
+			iTest->LogSubTest(KTest2);
+			Misc();
+			break;
+		case 4:
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0503
+*/
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0503"));
+			iTest->LogSubTest(KTest3);
+// Disabled temporarily (process isolation/ RThread::RequestComplete issue) to allow WSERV test to continue
+			break;
+		case 5:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0125"));
+			iTest->LogSubTest(KTest4);
+			TestPanicsL();
+			if (iTest->iScreenNumber == 1)
+				iTest->CloseAllPanicWindows();
+			break;
+		case 6:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0129"));
+			iTest->LogSubTest(KTest5);
+			DrawingTestL();
+			break;
+		case 7:
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0504
+*/
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0504"));
+			iTest->LogSubTest(KTest6);
+// Disabled temporarily (process isolation/ RThread::RequestComplete issue) to allow WSERV test to continue
+			break;
+		case 8:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0130"));
+			iTest->LogSubTest(KTest7);
+			GeneralDrawingTestL();
+			break;
+		case 9:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0131"));
+			iTest->LogSubTest(KTest8);
+			DestroyWindowTestL();
+			break;
+		case 10:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0132"));
+			iTest->LogSubTest(KTest9);
+			SpriteAnimL();
+			break;
+		case 11:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0133"));
+			iTest->LogSubTest(KTest10);
+			FreeTimerL();
+			break;
+		case 12:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0134"));
+			iTest->LogSubTest(KTest11);
+			DisableTimerL();
+			break;
+		case 13:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0135"));
+			iTest->LogSubTest(KTest12);
+			MultipleAnimsL();
+			break;
+		case 14:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0136"));
+			iTest->LogSubTest(KTest13);
+			ClickPlugInL();
+			break;
+		case 15:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0137"));
+			iTest->LogSubTest(KTest14);
+			WinFunctionsL();
+			break;
+		case 16:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0138"));
+			iTest->LogSubTest(KTest15);
+			WinFunctions2L();
+			break;
+		case 17:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0139"));
+			iTest->LogSubTest(KTest16);
+			TestNotificationsL();
+			break;
+		case 18:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0137"));
+			iTest->LogSubTest(KTest17);
+			TestEventHandlerRemovalL();
+			break;
+		case 19:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-CODEBASE-WSERV-0056-0001"));
+			iTest->LogSubTest(KTest18);			
+			TestLoadApiL();
+			break;
+		case 20:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0448"));
+			iTest->LogSubTest(KTest19);
+			KeyClickPriorityL();
+			break;
+		case 21:
+ /**
+@SYMTestCaseID		GRAPHICS-WSERV-0505
+*/
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0505"));
+			iTest->LogSubTest(KTest20);
+			ParameterValueTestL();
+			break;
+		case 22:
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0506
+*/
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0506"));
+			iTest->LogSubTest(KTest21);
+			TestSetIntervalL();
+		case 23:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0410"));
+			iTest->LogSubTest(KTest22);			
+			TestCoverageL();
+			break;
+		case 24:
+			((CTAnimDllStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0411"));
+			iTest->LogSubTest(KTest23);
+			TestPanicCoverageL();
+		default:
+			((CTAnimDllStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			((CTAnimDllStep*)iStep)->CloseTMSGraphicsStep();
+			TestComplete();
+		}
+	User::Check();
+	((CTAnimDllStep*)iStep)->RecordTestResultL();
+	}
+
+//
+
+CAnimRedrawWindow::CAnimRedrawWindow(CAnimWindow *aAnimWindow, TBool aIsBase) : CTWin(),
+	iAnimWindow(aAnimWindow),
+	iIsBase(aIsBase)
+	{
+	}
+
+CAnimRedrawWindow::~CAnimRedrawWindow()
+	{
+	}
+
+void CAnimRedrawWindow::Draw()
+	{
+	CAnimWindow::Draw(Gc(),Size(),iIsBase,iAnimWindow->iRect,EFalse);
+	}
+
+//
+
+CAnimWindow::CAnimWindow(TBool aIsBase, TWinType aWinType) : iWinType(aWinType), iIsBase(aIsBase)
+	{
+	}
+
+
+CAnimWindow::~CAnimWindow()
+	{
+	delete iCtWin;
+	}
+
+void CAnimWindow::ConstructL(const TPoint &aPos, const TSize &aSize)
+	{
+	switch(iWinType)
+		{
+		case ERedraw:
+			iCtWin=new(ELeave) CAnimRedrawWindow(this, iIsBase);
+			break;
+		case EBlank:
+			iCtWin=new(ELeave) CTBlankWindow();
+			break;
+		case EBackedUp:
+			iCtWin=new(ELeave) CTBackedUpWin(EGray4);
+			break;
+		}
+	iCtWin->SetUpL(aPos, aSize, TheClient->iGroup, *TheClient->iGc);
+	if (iWinType==ERedraw)
+		{
+		static_cast<CTWin*>(iCtWin)->Win()->EnableRedrawStore(EFalse);
+		}
+	}
+
+void CAnimWindow::SetEllipseDrawMode(CGraphicsContext::TDrawMode aEllipseDrawMode)
+	{
+	iEllipseDrawMode=aEllipseDrawMode;
+	}
+
+void CAnimWindow::SetRect(const TRect &aRect)
+	{
+	iRect=aRect;
+	}
+
+void CAnimWindow::DrawEllipse(CBitmapContext *aGc, const TRect &aRect)
+	{
+	aGc->SetDrawMode(iEllipseDrawMode);
+	aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	aGc->SetBrushColor(TRgb(85,85,85));
+	aGc->SetPenColor(TRgb(170,170,170));
+	aGc->DrawEllipse(aRect);
+	}
+
+void CAnimWindow::Draw(CBitmapContext *aGc, const TSize &aSize, TBool aIsBase, const TRect &aRect, TBool aBlankIt)
+	{
+	aGc->SetBrushColor(TRgb::Gray4(2));
+	aGc->Clear();
+	if (!aBlankIt)
+		for(TInt i=0;i<aSize.iWidth;i+=10)
+			aGc->DrawLine(TPoint(i,0),TPoint(i+10,aSize.iHeight));
+	if (aIsBase)
+		DrawEllipse(aGc, aRect);
+	}
+
+void CAnimWindow::DoDraw(TBool aBlankIt)
+	{
+	__ASSERT_ALWAYS(iWinType!=EBlank,AutoPanic(EAutoPanicWindowType));
+	iCtWin->Gc()->Activate(*(RDrawableWindow *)BaseWin());
+	Draw(iCtWin->Gc(),Size(),iIsBase,iRect,aBlankIt);
+	iCtWin->Gc()->Deactivate();
+	}
+
+void CAnimWindow::DoDrawEllipse()
+	{
+	__ASSERT_ALWAYS(iWinType!=EBlank,AutoPanic(EAutoPanicWindowType));
+	iCtWin->Gc()->Activate(*(RDrawableWindow *)BaseWin());
+	DrawEllipse(iCtWin->Gc(),iRect);
+	iCtWin->Gc()->Deactivate();
+	}
+
+void CAnimWindow::DoDrawCoverage()
+	{
+	__ASSERT_ALWAYS(iWinType!=EBlank,AutoPanic(EAutoPanicWindowType));
+	CWindowGc *gc = iCtWin->Gc();
+	gc->Activate(*(RDrawableWindow *)BaseWin());
+
+	gc->SetClippingRect(iRect);
+	gc->Clear();
+	gc->Clear(iRect);
+
+	gc->SetDrawMode(CGraphicsContext::EDrawModeAND);
+	gc->SetBrushStyle(CGraphicsContext::ENullBrush);
+	gc->SetBrushColor(TRgb::Gray256(85));
+	gc->SetBrushOrigin(TPoint(0,0));
+	gc->SetPenColor(TRgb::Gray256(170));
+
+	//primitive method calls
+	gc->SetFaded(ETrue);
+	gc->SetFadingParameters(1, 1);
+
+	gc->SetPenStyle(CGraphicsContext::ESolidPen);
+	gc->SetStrikethroughStyle(EStrikethroughOff);
+	gc->SetUnderlineStyle(EUnderlineOff);
+	gc->SetWordJustification(2, 1);
+
+	CFbsFont* font;
+	gc->Device()->GetNearestFontInTwips((CFont*&)font, TFontSpec());
+
+	gc->UseFont(font);
+	
+	gc->DrawArc(iRect,
+			TPoint(iRect.Center().iX, iRect.iTl.iY),
+			TPoint(iRect.iBr.iX, iRect.Center().iY));
+	gc->DrawLine(iRect.iTl,iRect.Center());
+	gc->DrawLineTo(TPoint(iRect.iBr.iX, iRect.iTl.iY));
+
+	gc->DrawLineBy(TPoint(iRect.iTl.iX, iRect.iBr.iY));
+	gc->MoveBy(iRect.iTl + TPoint(1,1));
+	gc->MoveTo(iRect.iTl + TPoint(0,0)); 
+	gc->SetPenSize(TSize(10,10));
+	gc->Plot(iRect.iTl + TPoint(2,2));
+	gc->SetPenSize(TSize(1,1));
+
+	CArrayFixFlat<TPoint>* polyPoints = new(ELeave) CArrayFixFlat<TPoint>(3); //CArrayFixFlat
+	CleanupStack::PushL(polyPoints);
+	polyPoints->AppendL(iRect.iTl);
+	polyPoints->AppendL(iRect.Center());
+	polyPoints->AppendL(TPoint(iRect.iBr.iX, iRect.iTl.iY));
+	
+	gc->DrawPolyLine(polyPoints);
+	gc->DrawPolyLine(&polyPoints->At(0), 3);
+	gc->DrawPolygon(polyPoints, CGraphicsContext::EWinding);
+	gc->DrawPolygon(&polyPoints->At(0), 3, CGraphicsContext::EAlternate);
+
+	gc->DrawPie(iRect, TPoint(iRect.Center().iX, iRect.iTl.iY), TPoint(iRect.iBr.iX, iRect.Center().iY));
+	gc->DrawEllipse(iRect);
+	gc->DrawRect(iRect);
+	gc->DrawRoundRect(iRect, TSize(iRect.Width()/8, iRect.Height()/8));
+
+	CleanupStack::PopAndDestroy(polyPoints);
+
+	gc->CopyRect(TPoint(10, 10), iRect);
+
+	CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4));
+
+	gc->UseBrushPattern(bitmap);
+	gc->DrawBitmap(iRect.iTl, bitmap);
+	gc->DrawBitmap(iRect, bitmap);
+	gc->DrawBitmap(iRect, bitmap, TRect(0, 0, 16, 16));
+	gc->DrawBitmapMasked(iRect, bitmap, TRect(0, 0, 16, 16), bitmap, ETrue);
+
+	gc->BitBlt(TPoint(0, 0), bitmap);
+	gc->BitBlt(TPoint(0, 0), bitmap, iRect);
+	gc->BitBltMasked(TPoint(0, 0), bitmap, iRect, bitmap, ETrue);
+	gc->AlphaBlendBitmaps(TPoint(0, 0), bitmap, iRect, bitmap, TPoint(0,0));
+	
+	CleanupStack::PopAndDestroy(bitmap);
+
+	_LIT(KHelloWorld,"Hello World");
+	gc->SetCharJustification(1,1);
+	gc->SetClippingRect(iRect);
+	gc->DrawText(*&KHelloWorld, iRect.iTl);
+	gc->DrawText(*&KHelloWorld, iRect, 0, CGraphicsContext::ELeft, 0);
+	gc->DrawTextVertical(*&KHelloWorld, iRect.iBr, ETrue);
+	gc->DrawTextVertical(*&KHelloWorld, iRect, 0, ETrue, CGraphicsContext::ELeft, 0);
+
+	TRgb rgbs[2];
+	gc->MapColors(iRect, rgbs, 1, ETrue);
+	gc->DiscardBrushPattern();
+
+	gc->DiscardFont();
+	gc->Device()->ReleaseFont(font);
+
+	gc->Deactivate();
+	}
+
+TSize CAnimWindow::Size()
+	{
+	return(iCtWin->Size());
+	}
+
+RWindowBase *CAnimWindow::BaseWin() const
+	{
+	return(iCtWin->BaseWin());
+	}
+
+CTBaseWin *CAnimWindow::CtBaseWin()
+	{
+	return(iCtWin);
+	}
+
+void CAnimWindow::Invalidate()
+	{
+	CTUser::Splat(TheClient,TRect(iCtWin->Position(),iCtWin->Size()),TRgb::Gray256(0));
+	}
+
+void CAnimWindow::Invalidate(const TRect &aRect)
+	{
+	TRect rect(aRect);
+	rect.Move(iCtWin->Position());
+	CTUser::Splat(TheClient,rect,TRgb::Gray256(0));
+	}
+
+void CAnimWindow::DrawTestScreen(CFbsBitmap *aBitmap, CFbsBitmap *aMaskBitmap, CFbsFont *aFont)
+	{
+	iCtWin->Gc()->Activate(*(RDrawableWindow *)BaseWin());
+	CBitmapContext *gc=iCtWin->Gc();
+	TSize size(Size());
+	TBool aExtraDrawBitMap=ETrue;
+//
+#include "DLLDRAW.H"
+//
+	iCtWin->Gc()->Deactivate();
+	}
+
+
+__WS_CONSTRUCT_STEP__(AnimDll)