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