|
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) |