windowing/windowserver/test/tauto/THeartBeat.CPP
changeset 110 7f25ef56562d
equal deleted inserted replaced
98:bf7481649c98 110:7f25ef56562d
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Test the Wserv heart beat switch on and off
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file
       
    20  @test
       
    21  @internalComponent - Internal Symbian test code
       
    22 */
       
    23 
       
    24 #include "THeartBeat.h"
       
    25 #include <w32debug.h>
       
    26 
       
    27 CTHeartBeatTest::CTHeartBeatTest(CTestStep* aStep) :
       
    28 	CTWsGraphicsBase(aStep)
       
    29 	{
       
    30 	}
       
    31 
       
    32 CTHeartBeatTest::~CTHeartBeatTest()
       
    33 	{
       
    34 	iAnimDll.Close();
       
    35 	delete iHbTestWin;
       
    36 	}
       
    37 
       
    38 void CTHeartBeatTest::ConstructL()
       
    39 	{
       
    40 	TSize screenSize=TheClient->iGroup->Size();
       
    41 	TInt winWidth=(screenSize.iWidth/3)-10;
       
    42 	TInt winHeight=screenSize.iHeight-10;
       
    43 	iHbTestWin=new(ELeave) CAnimWindow(EFalse, CAnimWindow::ERedraw);
       
    44 	iHbTestWin->ConstructL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight));
       
    45 	iAnimDll=RAnimDll(TheClient->iWs);
       
    46 	User::LeaveIfError(iAnimDll.Load(KAnimDLLName));
       
    47 	}
       
    48 
       
    49 void CTHeartBeatTest::SetCursor(const TPoint& aPos,const TSize& aSize, TUint aFlags/*=0*/)
       
    50 	{ // Default aFlags=0 gives a flashing cursor
       
    51 	TTextCursor tc;
       
    52 	tc.iType=TTextCursor::ETypeRectangle;
       
    53 	tc.iHeight=aSize.iHeight;
       
    54 	tc.iAscent=aSize.iHeight*4/5;
       
    55 	tc.iWidth=aSize.iWidth;
       
    56 	tc.iFlags=aFlags;	
       
    57 	tc.iColor=KRgbGreen;
       
    58 	TheClient->iGroup->GroupWin()->SetTextCursor(*iHbTestWin->BaseWin(),TPoint(aPos.iX,aPos.iY+tc.iAscent),tc);
       
    59 	}
       
    60 
       
    61 TBool CTHeartBeatTest::SetAutoHeartBeatPauseState(TBool aState) const
       
    62 	{
       
    63 	return(TheClient->iWs.DebugInfo(EWsDebugSetAutoHeartBeatPauseState,aState));
       
    64 	}
       
    65 
       
    66 TBool CTHeartBeatTest::GetHeartBeatTimerState() const
       
    67 	{
       
    68 	return(TheClient->iWs.DebugInfo(EWsDebugHeartBeatState));
       
    69 	}
       
    70 
       
    71 void CTHeartBeatTest::CancelTextCursor()
       
    72 	{
       
    73 	TheClient->iGroup->GroupWin()->CancelTextCursor();
       
    74 	}
       
    75 
       
    76 void CTHeartBeatTest::TestTextCursorTimerL()
       
    77 	{
       
    78 	TEST(!GetHeartBeatTimerState());
       
    79 	SetCursor(TPoint(0,0),TSize(10,10));
       
    80 	TEST(GetHeartBeatTimerState());
       
    81 	CancelTextCursor();
       
    82 	TEST(!GetHeartBeatTimerState());
       
    83 //
       
    84 	TPoint testCursorPos;
       
    85 	TSize testCursorSize(10,10);
       
    86 	SetCursor(testCursorPos,testCursorSize);
       
    87 	TEST(GetHeartBeatTimerState());
       
    88 	iHbTestWin->BaseWin()->SetVisible(EFalse);
       
    89 	TEST(!GetHeartBeatTimerState());
       
    90 	iHbTestWin->BaseWin()->SetVisible(ETrue);
       
    91 	TEST(GetHeartBeatTimerState());
       
    92 //
       
    93 // Cover the cursor and check heartbeat disabled
       
    94 	RWindow coverCursor(TheClient->iWs);
       
    95 	CleanupClosePushL(coverCursor);
       
    96 	User::LeaveIfError(coverCursor.Construct(*iHbTestWin->BaseWin(), 0xBADBAD));
       
    97 	coverCursor.SetExtent(testCursorPos,testCursorSize);
       
    98 	coverCursor.Activate();
       
    99 	TEST(!GetHeartBeatTimerState());
       
   100 // Now fractionally expose the cursor and check heartbeat re-enabled
       
   101 	coverCursor.SetExtent(testCursorPos+TPoint(1,1),testCursorSize);
       
   102 	TEST(GetHeartBeatTimerState());
       
   103 // Re-cover it
       
   104 	coverCursor.SetExtent(testCursorPos,testCursorSize);
       
   105 	TEST(!GetHeartBeatTimerState());
       
   106 // Enlarge cursor to expose itself then check heartbeat
       
   107 	SetCursor(testCursorPos,TSize(testCursorSize.iWidth+1,testCursorSize.iHeight));
       
   108 	TEST(GetHeartBeatTimerState());
       
   109 // Shrink cursor then check heartbeat
       
   110 	SetCursor(testCursorPos,testCursorSize);
       
   111 	TEST(!GetHeartBeatTimerState());
       
   112 // Turn off auto heart beat pausing, should turn timer back on
       
   113 	SetAutoHeartBeatPauseState(EFalse);
       
   114 	TEST(GetHeartBeatTimerState());
       
   115 // With auto pausing enabled covering/uncovering the cursor should have no effect,
       
   116 // timer will always be on
       
   117 	coverCursor.SetVisible(EFalse);
       
   118 	TEST(GetHeartBeatTimerState());
       
   119 	coverCursor.SetVisible(ETrue);
       
   120 	TEST(GetHeartBeatTimerState());
       
   121 // Re-enable auto-pause should turn timer back off
       
   122 	SetAutoHeartBeatPauseState(ETrue);
       
   123 	TEST(!GetHeartBeatTimerState());
       
   124 // Destroy covering window and check heartbeat re-enabled
       
   125 	CleanupStack::PopAndDestroy(&coverCursor);
       
   126 	TEST(GetHeartBeatTimerState());
       
   127 // Check using no flash flag turns timer off
       
   128 	SetCursor(testCursorPos,testCursorSize,TTextCursor::EFlagNoFlash);
       
   129 	TEST(!GetHeartBeatTimerState());
       
   130 // and turning no flash flag off turns timer back on
       
   131 	SetCursor(testCursorPos,testCursorSize);
       
   132 	TEST(GetHeartBeatTimerState());
       
   133 // Preparing for switch off should disable the heartbeat until another event is received
       
   134 	TheClient->iWs.PrepareForSwitchOff();
       
   135 	TEST(!GetHeartBeatTimerState());
       
   136 // Any event should wake the hearbeat back up again
       
   137 	TRawEvent rawEvent;
       
   138 	rawEvent.Set(TRawEvent::EPointerMove,0,0);
       
   139 	TheClient->iWs.SimulateRawEvent(rawEvent);
       
   140 	TEST(GetHeartBeatTimerState());
       
   141 //
       
   142 	CancelTextCursor();
       
   143 	TEST(!GetHeartBeatTimerState());
       
   144 // Check heartbeat still off as expected
       
   145 	TheClient->iWs.PrepareForSwitchOff();
       
   146 	TEST(!GetHeartBeatTimerState());
       
   147 // Check when hearbeat not required that it's not turned back when coming out of PrepareForSwitchOff() mode.
       
   148 	TheClient->iWs.SimulateRawEvent(rawEvent);
       
   149 	TheClient->Flush();
       
   150 	TEST(!GetHeartBeatTimerState());
       
   151 	}
       
   152 
       
   153 void CTHeartBeatTest::doTestActiveInactiveEvents(TBool aCursorOn, TBool aAutoPauseOn)
       
   154 	{
       
   155 	SetAutoHeartBeatPauseState(aAutoPauseOn);
       
   156 	if (aCursorOn)
       
   157 		SetCursor(TPoint(0,0),TSize(10,10));
       
   158 // Should disable timer, regardless of other states
       
   159 	TRawEvent event;
       
   160 	event.Set(TRawEvent::EInactive);
       
   161 	UserSvr::AddEvent(event);
       
   162 	TEST(!GetHeartBeatTimerState());
       
   163 // ...and switch it back on
       
   164 	event.Set(TRawEvent::EActive);
       
   165 	UserSvr::AddEvent(event);
       
   166 	TBool testResult1=EFalse;
       
   167 	if (aAutoPauseOn)
       
   168 		testResult1=aCursorOn; // Only on if cursor is on without auto pause enabled
       
   169 	else
       
   170 		testResult1=ETrue; // Always on if auto pause disabled
       
   171 	TBool hbState=GetHeartBeatTimerState();
       
   172 	if ((!hbState)!=(!testResult1))
       
   173 		{
       
   174 		_LIT(KLog,"Fail in TestActiveInactiveEvents(%d.%d)  HBState=%d result=%d");
       
   175 		LOG_MESSAGE5(KLog,aCursorOn,aAutoPauseOn,hbState,testResult1);
       
   176 		}
       
   177 	TEST((!GetHeartBeatTimerState())==(!testResult1));		//Works with any positive value for True
       
   178 //
       
   179 	if (aCursorOn)
       
   180 		CancelTextCursor();
       
   181 	}
       
   182 
       
   183 void CTHeartBeatTest::TestActiveInactiveEvents()
       
   184 	{
       
   185 	doTestActiveInactiveEvents(EFalse,EFalse);
       
   186 	doTestActiveInactiveEvents(ETrue,EFalse);
       
   187 	doTestActiveInactiveEvents(EFalse,ETrue);
       
   188 	doTestActiveInactiveEvents(ETrue,ETrue);
       
   189 	}
       
   190 
       
   191 void CTHeartBeatTest::FailCursorHbTest(const TDesC& aErrorBase, const TDesC* aExtraText, TBool aHbState, TBool aHbCheckState)
       
   192 	{
       
   193 	TBuf<256> error(aErrorBase);
       
   194 	if (aExtraText)
       
   195 		{
       
   196 		error.Append(*aExtraText);
       
   197 		}
       
   198 	_LIT(KHbErrorAppendFmt," HB=%d (Testing for %d)");
       
   199 	error.AppendFormat(KHbErrorAppendFmt,aHbState,aHbCheckState);
       
   200 	LOG_MESSAGE(error);
       
   201 	TEST(EFalse);
       
   202 	}
       
   203 
       
   204 TBool CTHeartBeatTest::ChangeTransAndCheckHeartBeat(TInt aTestMode, RWindow& aTransWin, const TRect& aGraphicRect, TInt aExtraWinTestMode, const TDesC* aErrorMsg, TBool aSetVisibleAfterTransUpdate)
       
   205 	{
       
   206 	TRect cursorRect(aGraphicRect);
       
   207 	cursorRect.Move(iHbTestWin->BaseWin()->InquireOffset(aTransWin));
       
   208 	TRect winRect(aTransWin.Size());
       
   209 	__ASSERT_ALWAYS(winRect.Contains(cursorRect.iTl) && winRect.Contains(cursorRect.iBr),AutoPanic(EAutoPanicHeartBeatCursorRect));
       
   210 //
       
   211 	TRegionFix<8> transRegion;
       
   212 	TBool heartBeatCheck=EFalse;
       
   213 	switch(aTestMode)
       
   214 		{
       
   215 		case ECursorTransWinTestModeFullTrans:
       
   216 			transRegion.AddRect(winRect);
       
   217 			heartBeatCheck=ETrue;
       
   218 			break;
       
   219 		case ECursorTransWinTestNoTrans:
       
   220 			break;
       
   221 		case ECursorTransWinTestPartialTransCoveringCursor:
       
   222 			transRegion.AddRect(winRect);
       
   223 			transRegion.SubRect(cursorRect);
       
   224 			break;
       
   225 		case ECursorTransWinTestPartialTransExposingCursor:
       
   226 			transRegion.AddRect(cursorRect);
       
   227 			heartBeatCheck=ETrue;
       
   228 			break;
       
   229 		default:
       
   230 			ASSERT(EFalse);
       
   231 		}
       
   232 	TBool invisHeartBeatCheck=ETrue;
       
   233 	switch(aExtraWinTestMode)
       
   234 		{
       
   235 		case ECursorTransWinTestNoTrans:
       
   236 		case ECursorTransWinTestPartialTransCoveringCursor:
       
   237 			heartBeatCheck=EFalse;
       
   238 			invisHeartBeatCheck=EFalse;
       
   239 			break;
       
   240 		default:
       
   241 			break;
       
   242 		}
       
   243 //
       
   244 	ASSERT(!transRegion.CheckError());
       
   245 	if (aSetVisibleAfterTransUpdate)
       
   246 		aTransWin.SetVisible(EFalse);
       
   247 	aTransWin.SetTransparentRegion(transRegion);
       
   248 	if (aSetVisibleAfterTransUpdate)
       
   249 		aTransWin.SetVisible(ETrue);
       
   250 //
       
   251 	TBool testSuccess=ETrue;
       
   252 	TBool heartBeatState=GetHeartBeatTimerState();
       
   253 	TBool failed1stTest=EFalse;
       
   254 	if ((!heartBeatState)!=(!heartBeatCheck))		//Works with any positive value for True
       
   255 		{
       
   256 		failed1stTest=ETrue;
       
   257 		_LIT(KFailedHbTest,"Failed ");
       
   258 		FailCursorHbTest(KFailedHbTest,aErrorMsg,heartBeatState,heartBeatCheck);
       
   259 		testSuccess=EFalse;
       
   260 		}
       
   261 //
       
   262 	aTransWin.SetVisible(EFalse);
       
   263 	heartBeatState=GetHeartBeatTimerState();
       
   264 	_LIT(KGoingInvisAfterTestAppend," after %S");
       
   265 	TBuf<256> errorExtra;
       
   266 	if (aErrorMsg)
       
   267 		{
       
   268 		errorExtra.Format(KGoingInvisAfterTestAppend,aErrorMsg);
       
   269 		}
       
   270 	if ((!heartBeatState)!=(!invisHeartBeatCheck))		//Works with any positive value for True
       
   271 		{
       
   272 		_LIT(KFailedGoingInvis,"Failed setting trans win invisible");
       
   273 		FailCursorHbTest(KFailedGoingInvis,&errorExtra,heartBeatState,invisHeartBeatCheck);
       
   274 		testSuccess=EFalse;
       
   275 		}
       
   276 //
       
   277 	aTransWin.SetVisible(ETrue);
       
   278 	heartBeatState=GetHeartBeatTimerState();
       
   279 	if (!failed1stTest && (!heartBeatState)!=(!heartBeatCheck))		//Works with any positive value for True
       
   280 		{
       
   281 		_LIT(KFailedResettingVis,"Failed re-setting trans win visible");
       
   282 		FailCursorHbTest(KFailedResettingVis,&errorExtra,heartBeatState,heartBeatCheck);
       
   283 		testSuccess=EFalse;
       
   284 		}
       
   285 	return(testSuccess);
       
   286 	}
       
   287 
       
   288 void CTHeartBeatTest::LoopThroughTransWinTestModes(RWindow& aTransWin, const TRect& aGraphicRect, TInt aExtraWinTestMode)
       
   289 	{
       
   290 	TBuf<256> error;
       
   291 	for(TInt setVisMode=0;setVisMode<2;setVisMode++)
       
   292 		{
       
   293 		if (setVisMode==0)
       
   294 			continue;	// zzz setinvis/makevis needed to flush out changes it seems
       
   295 		const TBool setVisibleAfterTransUpdate=setVisMode>0;
       
   296 		for(TInt startTestMode=0;startTestMode<ENumCursorTransWinTestModes;startTestMode++)
       
   297 			{
       
   298 			if (startTestMode==ECursorTransWinTestNoTrans)
       
   299 				continue;// zzz bugged trans win problem
       
   300 			_LIT(KTcHbModeSetFail,"setting test mode %d (vis mode %d)");
       
   301 			error.Format(KTcHbModeSetFail,startTestMode,setVisibleAfterTransUpdate);
       
   302 			for(TInt switchToTestMode=0;switchToTestMode<ENumCursorTransWinTestModes;switchToTestMode++)
       
   303 				{
       
   304 				if (switchToTestMode==ECursorTransWinTestNoTrans)
       
   305 					continue;// zzz bugged trans win problem
       
   306 				if (startTestMode==switchToTestMode)
       
   307 					continue;
       
   308 				if (ChangeTransAndCheckHeartBeat(startTestMode, aTransWin, aGraphicRect, aExtraWinTestMode, &error, setVisibleAfterTransUpdate))
       
   309 					{
       
   310 					_LIT(KTcHbModeSwitchFail,"switching from test mode %d to %d (vis mode %d)");
       
   311 					error.Format(KTcHbModeSwitchFail, startTestMode, switchToTestMode, setVisibleAfterTransUpdate);
       
   312 					ChangeTransAndCheckHeartBeat(switchToTestMode, aTransWin, aGraphicRect, aExtraWinTestMode, &error, setVisibleAfterTransUpdate);
       
   313 					}
       
   314 				}
       
   315 			}
       
   316 		ChangeTransAndCheckHeartBeat(0, aTransWin, aGraphicRect, aExtraWinTestMode, NULL, setVisibleAfterTransUpdate);
       
   317 		}
       
   318 	}
       
   319 
       
   320 void CTHeartBeatTest::RunTransWinTestsL(const TRect& aGraphicRect)
       
   321 	{
       
   322 // Test a variety of patterns of changing the layout of transparent windows over the cursor
       
   323 // cause the heartbeat state to be modified accordingly.
       
   324 //
       
   325 // Each transparent window has four specific states to test:
       
   326 // i) Transparency area is the whole window
       
   327 // ii) Partial transparency that exposes the cursor
       
   328 // iii) Partial transparency that covers the cursor
       
   329 // iv) Empty transparent region, i.e. totally opaque
       
   330 //
       
   331 // We need to test various transitions between these states, first on a single window, then
       
   332 // in a various layouts with transparent windows layered over each other.
       
   333 //
       
   334 	RWindow transWin1(TheClient->iWs);
       
   335 	User::LeaveIfError(transWin1.Construct(*TheClient->iGroup->GroupWin(),0xDEADBAD1));
       
   336 	CleanupClosePushL(transWin1);
       
   337 	if (transWin1.SetTransparencyFactor(TRgb::Gray256(128))!=KErrNone)
       
   338 		{	// Transparency not enabled, skip tests
       
   339 		CleanupStack::PopAndDestroy(&transWin1);
       
   340 		return;
       
   341 		}
       
   342 	transWin1.Activate();
       
   343 	TEST(GetHeartBeatTimerState());
       
   344 // First simply check activating default full screen transparent window doesn't disable the heartbeat
       
   345 	_LIT(KBasicTransCursorTests,"Running basic transparent window cursor heartbeat tests");
       
   346 	LOG_MESSAGE(KBasicTransCursorTests);
       
   347 	LoopThroughTransWinTestModes(transWin1, aGraphicRect, ECursorTransWinTestNA);
       
   348 //
       
   349 //  Lots of test code disabled due to bugs in handling of transparent window regions
       
   350 // See DEF110677, hopefully when the issues in there are addressed the rest of the
       
   351 // test code here can be enabled
       
   352 //  See sections marked with zzz for places where certain tests are disabled, once DEF110677
       
   353 // is marked as fixed these sections should be re-enabled and if problems still occur they
       
   354 // need to be investigated.
       
   355 //
       
   356 //
       
   357 // Now check more complex modes with two transparent windows over the test window
       
   358 	RWindow transWin2(TheClient->iWs);
       
   359 	User::LeaveIfError(transWin2.Construct(*TheClient->iGroup->GroupWin(),0xDEADBAD2));
       
   360 	CleanupClosePushL(transWin2);
       
   361 	User::LeaveIfError(transWin2.SetTransparencyFactor(TRgb::Gray256(128)));
       
   362 	TSize screenSize=TheClient->iGroup->Size();
       
   363 	screenSize.iWidth-=10;
       
   364 	transWin1.SetExtent(TPoint(0,0),screenSize);
       
   365 	transWin2.SetExtent(TPoint(10,0),screenSize);
       
   366 	transWin2.Activate();
       
   367 	for(TInt win1OrdPos=0;win1OrdPos<2;win1OrdPos++)
       
   368 		{
       
   369 		transWin1.SetOrdinalPosition(win1OrdPos);
       
   370 		_LIT(KOrdinalTransCursorTests,"Running tests with transwin1 ordinal pos=%d");
       
   371 		LOG_MESSAGE2(KOrdinalTransCursorTests,win1OrdPos);
       
   372 		for(TInt topWinTestMode=0;topWinTestMode<ENumCursorTransWinTestModes;topWinTestMode++)
       
   373 			{
       
   374 			if (topWinTestMode==ECursorTransWinTestNoTrans)
       
   375 				continue;// zzz bugged transparent window problem
       
   376 			if (topWinTestMode==ECursorTransWinTestPartialTransCoveringCursor)
       
   377 				continue;// zzz bugged transparent window problem
       
   378 			_LIT(KTopTransWinCursorTest,"Setting top trans win mode %d");
       
   379 			TBuf<256> msg;
       
   380 			msg.Format(KTopTransWinCursorTest,topWinTestMode);
       
   381 			LOG_MESSAGE(msg);
       
   382 			ChangeTransAndCheckHeartBeat(0, transWin2, aGraphicRect, topWinTestMode, NULL, ETrue);
       
   383 			LoopThroughTransWinTestModes(transWin1, aGraphicRect, topWinTestMode);
       
   384 			}
       
   385 		}
       
   386 	ChangeTransAndCheckHeartBeat(0, transWin2, aGraphicRect, 0, NULL, ETrue);
       
   387 	CleanupStack::PopAndDestroy(&transWin2);
       
   388 	TEST(GetHeartBeatTimerState());
       
   389 //
       
   390 	CleanupStack::PopAndDestroy(&transWin1);
       
   391 	TEST(GetHeartBeatTimerState());
       
   392 	}
       
   393 
       
   394 void CTHeartBeatTest::TestTextCursorTimerTransL()
       
   395 	{
       
   396 	TSize testWinSize(iHbTestWin->BaseWin()->Size());
       
   397 	TRect cursorRect(testWinSize.iWidth/4,testWinSize.iHeight/3,testWinSize.iWidth*3/4,testWinSize.iHeight*2/3);
       
   398 	TEST(!GetHeartBeatTimerState());
       
   399 	SetCursor(cursorRect.iTl,cursorRect.Size());
       
   400 	TEST(GetHeartBeatTimerState());
       
   401 	RunTransWinTestsL(cursorRect);
       
   402 	CancelTextCursor();
       
   403 	TEST(!GetHeartBeatTimerState());
       
   404 	}
       
   405 
       
   406 void CTHeartBeatTest::TestHeartBeatStopStart(TBool aHeartbeatStateOff,TBool aHeartbeatStateOn,const TDesC& aOffText,const TDesC& aOnText)
       
   407 	{
       
   408 	TEST(!aHeartbeatStateOff);
       
   409 	if (aHeartbeatStateOff)
       
   410 		LOG_MESSAGE2(_L("%S failed to disable heartbeat timer"),&aOffText);
       
   411 	TEST(aHeartbeatStateOn);
       
   412 	if (!aHeartbeatStateOn)
       
   413 		LOG_MESSAGE2(_L("%S failed to re-enable heartbeat timer"),&aOnText);
       
   414 	}
       
   415 
       
   416 void CTHeartBeatTest::TestAnimDllL(TBool aSpriteMode, TUint aSpriteFlags)
       
   417 	{
       
   418 	RTestAnim anim(iAnimDll);
       
   419 	TEST(!GetHeartBeatTimerState());
       
   420 	TSize testWinSize(iHbTestWin->BaseWin()->Size());
       
   421 	TRect animRect(1,1,testWinSize.iWidth/3,testWinSize.iWidth/5);
       
   422 	TPckgC<TRect> rectPckg(animRect);
       
   423 	RWsSprite sprite(TheClient->iWs);
       
   424 	CleanupClosePushL(sprite);
       
   425 	if (aSpriteMode)
       
   426 		{
       
   427 		sprite.Construct(*iHbTestWin->BaseWin(),TPoint(),aSpriteFlags);
       
   428 		CFbsBitmap* bitmap1=new(ELeave) CFbsBitmap();
       
   429 		CleanupStack::PushL(bitmap1);
       
   430 		CFbsBitmap* bitmap2=new(ELeave) CFbsBitmap();
       
   431 		CleanupStack::PushL(bitmap2);
       
   432 		CFbsBitmap* bitmap3=new(ELeave) CFbsBitmap();
       
   433 		CleanupStack::PushL(bitmap3);
       
   434 		TSize animSize(animRect.Size());
       
   435 		User::LeaveIfError(bitmap1->Create(TSize(animSize.iWidth/2,animSize.iHeight/2),EGray4));
       
   436 		User::LeaveIfError(bitmap2->Create(TSize(animSize.iWidth,animSize.iHeight/3),EGray4));
       
   437 		User::LeaveIfError(bitmap3->Create(TSize(animSize.iWidth/3,animSize.iHeight),EGray4));
       
   438 //
       
   439 		TSpriteMember member1;
       
   440 		member1.iMaskBitmap=NULL;
       
   441 		member1.iInvertMask=EFalse;
       
   442 		member1.iDrawMode=CGraphicsContext::EDrawModePEN;
       
   443 		member1.iOffset=TPoint();
       
   444 		member1.iInterval=TTimeIntervalMicroSeconds32(1);
       
   445 		member1.iBitmap=bitmap1;
       
   446 		member1.iMaskBitmap=bitmap1;
       
   447 		sprite.AppendMember(member1);
       
   448 //
       
   449 		TSpriteMember member2;
       
   450 		member2.iInvertMask=EFalse;
       
   451 		member2.iDrawMode=CGraphicsContext::EDrawModeXOR;
       
   452 		member2.iOffset=TPoint(1,2);
       
   453 		member2.iInterval=TTimeIntervalMicroSeconds32(2);
       
   454 		member2.iBitmap=bitmap2;
       
   455 		member2.iMaskBitmap=bitmap2;
       
   456 		sprite.AppendMember(member2);
       
   457 //
       
   458 		TSpriteMember member3;
       
   459 		member3.iInvertMask=ETrue;
       
   460 		member3.iDrawMode=CGraphicsContext::EDrawModeOR;
       
   461 		member3.iOffset=TPoint(3,4);
       
   462 		member3.iInterval=TTimeIntervalMicroSeconds32(3);
       
   463 		member3.iBitmap=bitmap3;
       
   464 		member3.iMaskBitmap=bitmap3;
       
   465 		sprite.AppendMember(member3);
       
   466 //
       
   467 		User::LeaveIfError(anim.Construct(sprite,EAnimTypeSprite,rectPckg));
       
   468 		CleanupStack::PopAndDestroy(3,bitmap1);
       
   469 		}
       
   470 	else
       
   471 		{
       
   472 		User::LeaveIfError(anim.Construct(*iHbTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
       
   473 		}
       
   474 	CleanupClosePushL(anim);
       
   475 	TEST(GetHeartBeatTimerState());
       
   476 
       
   477 	// Cover up the window with the animation and check this disables the heartbeat timer.
       
   478 	RBlankWindow blankwin1(TheClient->iWs);
       
   479 	User::LeaveIfError(blankwin1.Construct(*TheClient->iGroup->GroupWin(),123));
       
   480 	TPoint winOffset(iHbTestWin->BaseWin()->InquireOffset(*TheClient->iGroup->GroupWin()));
       
   481 	if (aSpriteMode)
       
   482 		blankwin1.SetExtent(winOffset,testWinSize);
       
   483 	else
       
   484 		blankwin1.SetExtent(winOffset+animRect.iTl,animRect.Size());
       
   485 	blankwin1.Activate();
       
   486 	TBool heartbeatStateOff=GetHeartBeatTimerState();
       
   487 	TEST(!heartbeatStateOff);
       
   488 	if (heartbeatStateOff)
       
   489 		{
       
   490 		LOG_MESSAGE(_L("Covering window failed to disable heartbeat timer"));
       
   491 		}
       
   492 	TBool heartbeatStateOn;
       
   493 	if (!aSpriteMode)
       
   494 		{
       
   495 		// Resize the anim so it becomes visible, then shrink back down again
       
   496 		animRect.iBr.iX++;
       
   497 		anim.Command(EADllSetRect,rectPckg);
       
   498 		heartbeatStateOn=GetHeartBeatTimerState();
       
   499 		animRect.iBr.iX--;
       
   500 		anim.Command(EADllSetRect,rectPckg);
       
   501 		heartbeatStateOff=GetHeartBeatTimerState();
       
   502 		TestHeartBeatStopStart(heartbeatStateOff,heartbeatStateOn,_L("Shrinking anim"),_L("Growing anim"));
       
   503 		}
       
   504 //
       
   505 	blankwin1.Close();
       
   506 	heartbeatStateOn=GetHeartBeatTimerState();
       
   507 	TEST(heartbeatStateOn);
       
   508 	if (!heartbeatStateOn)
       
   509 		{
       
   510 		LOG_MESSAGE(_L("Un-covering window failed to disable heartbeat timer"));
       
   511 		}
       
   512 
       
   513 	// Put a transparent window over the animation and check the heartbeat timer is not disabled
       
   514 	RWindow transWin(TheClient->iWs);
       
   515 	User::LeaveIfError(transWin.Construct(*TheClient->iGroup->GroupWin(),123));
       
   516 	if (transWin.SetTransparencyFactor(TRgb::Gray256(128))==KErrNone)
       
   517 		{
       
   518 		transWin.Activate();
       
   519 		heartbeatStateOn=GetHeartBeatTimerState();
       
   520 		TEST(heartbeatStateOn);
       
   521 		if (!heartbeatStateOn)
       
   522 			LOG_MESSAGE(_L("Transparent window caused heartbeat timer to be disabled"));
       
   523 		TRegionFix<1> emptyRegion;
       
   524 		transWin.SetTransparentRegion(emptyRegion);
       
   525 		heartbeatStateOff=GetHeartBeatTimerState();
       
   526 		TRegionFix<1> fullRegion(transWin.Size());
       
   527 		transWin.SetTransparentRegion(fullRegion);
       
   528 		heartbeatStateOn=GetHeartBeatTimerState();
       
   529 		TestHeartBeatStopStart(heartbeatStateOff,heartbeatStateOn,_L("Making covering window opaque"),_L("Making covering window transparent"));
       
   530 		if (aSpriteMode)
       
   531 			{
       
   532 			RBlankWindow blankwin2(TheClient->iWs);
       
   533 			User::LeaveIfError(blankwin2.Construct(*iHbTestWin->BaseWin(),1234));
       
   534 			blankwin2.Activate();
       
   535 			heartbeatStateOn=GetHeartBeatTimerState();
       
   536 			// With ESpriteNoChildClip the heartbeat should still be on as the sprite will still be visible
       
   537 			// Without it blankwin2 will cover up the sprite and cancel the heartbeat
       
   538 			TBool heartBeatCheck=aSpriteFlags&ESpriteNoChildClip;
       
   539 			TEST((!heartbeatStateOn)==(!heartBeatCheck));		//Works with any positive value for True
       
   540 			blankwin2.Close();
       
   541 			}
       
   542 		transWin.SetTransparentRegion(emptyRegion);
       
   543 		heartbeatStateOff=GetHeartBeatTimerState();
       
   544 		transWin.Close();
       
   545 		heartbeatStateOn=GetHeartBeatTimerState();
       
   546 		TestHeartBeatStopStart(heartbeatStateOff,heartbeatStateOn,_L("Making covering window opaque"),_L("Un-covering window"));
       
   547 		}
       
   548 	else
       
   549 		transWin.Close();
       
   550 
       
   551 	// Make the window with the animation invisible and check this disables the heartbeat timer.
       
   552 	iHbTestWin->BaseWin()->SetVisible(EFalse);
       
   553 	heartbeatStateOff=GetHeartBeatTimerState();
       
   554 	iHbTestWin->BaseWin()->SetVisible(ETrue);
       
   555 	heartbeatStateOn=GetHeartBeatTimerState();
       
   556 	TestHeartBeatStopStart(heartbeatStateOff,heartbeatStateOn,_L("Making window invisible"),_L("Making window visible"));
       
   557 
       
   558 	// Move the window with the animation off screen and check this disables the heartbeat timer.
       
   559 	TSize screenSize=TheClient->iGroup->Size();
       
   560 	TPoint oldPos(iHbTestWin->BaseWin()->Position());
       
   561 	iHbTestWin->BaseWin()->SetPosition(screenSize.AsPoint());
       
   562 	heartbeatStateOff=GetHeartBeatTimerState();
       
   563 	iHbTestWin->BaseWin()->SetPosition(oldPos);
       
   564 	heartbeatStateOn=GetHeartBeatTimerState();
       
   565 	TestHeartBeatStopStart(heartbeatStateOff,heartbeatStateOn,_L("Moving window offscreen"),_L("Moving window back onscreen"));
       
   566 	TEST(GetHeartBeatTimerState());
       
   567 	CleanupStack::PopAndDestroy(&anim);
       
   568 	TEST(!GetHeartBeatTimerState());
       
   569 	CleanupStack::PopAndDestroy(&sprite);
       
   570 	}
       
   571 
       
   572 void CTHeartBeatTest::TestAnimDllTransL()
       
   573 	{
       
   574 	RTestAnim anim(iAnimDll);
       
   575 	TSize testWinSize(iHbTestWin->BaseWin()->Size());
       
   576 	TRect animRect(testWinSize.iWidth/4,testWinSize.iHeight/3,testWinSize.iWidth*3/4,testWinSize.iHeight*2/3);
       
   577 	TPckgBuf<TRect> rectPckg;
       
   578 	rectPckg()=animRect;
       
   579 	TEST(!GetHeartBeatTimerState());
       
   580 	User::LeaveIfError(anim.Construct(*iHbTestWin->BaseWin(),EAnimTypeTest3,rectPckg));
       
   581 	CleanupClosePushL(anim);
       
   582 	TEST(GetHeartBeatTimerState());
       
   583 //
       
   584 	RunTransWinTestsL(animRect);
       
   585 //
       
   586 	CleanupStack::PopAndDestroy(&anim);
       
   587 	TEST(!GetHeartBeatTimerState());
       
   588 	}
       
   589 
       
   590 void CTHeartBeatTest::RunTestCaseL(TInt /*aCurTestCase*/)
       
   591 	{
       
   592 	
       
   593 	switch(++iTest->iState)
       
   594 		{
       
   595 		case 1:
       
   596 /**
       
   597 @SYMTestCaseID		GRAPHICS-WSERV-0568
       
   598 */
       
   599 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0568"));
       
   600 			_LIT(KTestTextCursorTimer,"Basic heartbeat timer test");
       
   601 			iTest->LogSubTest(KTestTextCursorTimer);
       
   602 			TestTextCursorTimerL();
       
   603 			break;
       
   604 		case 2:
       
   605 /**
       
   606 @SYMTestCaseID		GRAPHICS-WSERV-0569
       
   607 */
       
   608 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0569"));
       
   609 			_LIT(KTestTextCursorTimerTrans,"Heartbeat timer test with transparent windows");
       
   610 			iTest->LogSubTest(KTestTextCursorTimerTrans);
       
   611 			TestTextCursorTimerTransL();
       
   612 			break;
       
   613 		case 3:
       
   614 /**
       
   615 @SYMTestCaseID		GRAPHICS-WSERV-0570
       
   616 */
       
   617 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0570"));
       
   618 			_LIT(KTestAnimDll1,"Anim DLL Heartbeat check (Win)");
       
   619 			iTest->LogSubTest(KTestAnimDll1);
       
   620 			TestAnimDllL(EFalse,0);
       
   621 			break;
       
   622 		case 4:
       
   623 /**
       
   624 @SYMTestCaseID		GRAPHICS-WSERV-0571
       
   625 */
       
   626 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0571"));
       
   627 			_LIT(KTestAnimDll2,"Anim DLL Heartbeat check (Sprite)");
       
   628 			iTest->LogSubTest(KTestAnimDll2);
       
   629 			TestAnimDllL(ETrue,0);
       
   630 			TestAnimDllL(ETrue,ESpriteNoChildClip);
       
   631 			break;
       
   632 		case 5:
       
   633 /**
       
   634 @SYMTestCaseID		GRAPHICS-WSERV-0572
       
   635 */
       
   636 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0572"));
       
   637 			_LIT(KTestAnimDllTrans,"Anim DLL Heartbeat check with transparent windows");
       
   638 			iTest->LogSubTest(KTestAnimDllTrans);
       
   639 			TestAnimDllTransL();
       
   640 			break;
       
   641 		case 6:
       
   642 /**
       
   643 @SYMTestCaseID		GRAPHICS-WSERV-0573
       
   644 */
       
   645 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0573"));
       
   646 			_LIT(KTestActiveInactiveEvents,"Handling of TRawEvent::EInactive and EActive");
       
   647 			iTest->LogSubTest(KTestActiveInactiveEvents);
       
   648 			TestActiveInactiveEvents();
       
   649 			break;
       
   650 		default:
       
   651 			((CTHeartBeatTestStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
       
   652 			((CTHeartBeatTestStep*)iStep)->CloseTMSGraphicsStep();
       
   653 			TestComplete();
       
   654 			break;
       
   655 		}
       
   656 	((CTHeartBeatTestStep*)iStep)->RecordTestResultL();
       
   657 	}
       
   658 
       
   659 __WS_CONSTRUCT_STEP__(HeartBeatTest)