sl@0: // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Test pointer event handling sl@0: // Coverted from TMan test code (TMPOINTR.CPP) October 2000 sl@0: // sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent - Internal Symbian test code sl@0: */ sl@0: sl@0: #include "TPointer.H" sl@0: sl@0: sl@0: //#define LOGGING sl@0: sl@0: #if defined(LOGGING) sl@0: LOCAL_D TLogMessageText LogMessageText; sl@0: #endif sl@0: sl@0: sl@0: CPointerWindow::CPointerWindow(CTPointer *aTest) : CTWin(), iTest(aTest) sl@0: {} sl@0: sl@0: void CPointerWindow::SetState(TInt aState) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KState,"CPointerWindow::SetState(%d) OldState=%d"); sl@0: LogMessageText.Format(KState,aState,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: iState=aState; sl@0: iWin.Invalidate(); sl@0: switch(aState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: case KStateWaitingForTest2: sl@0: case KStateWaitingForTest3: sl@0: case KStateWaitingForTest4: sl@0: case KStateWaitingForTest5: sl@0: case KStateWaitingForTest6: sl@0: case KStateWaitingForTest8: sl@0: case KStateWaitingForTest7: sl@0: iRepeatRect=TRect(); sl@0: break; sl@0: case KStateTesting8: sl@0: iWin.Close(); sl@0: Client()->iWs.Flush(); sl@0: User::After(500000); sl@0: FinishedTests(); sl@0: break; sl@0: } sl@0: TheClient->WaitForRedrawsToFinish(); sl@0: SendEvent(); sl@0: } sl@0: sl@0: void CPointerWindow::ResetTest(TInt aState) sl@0: { sl@0: TInt newState=KStateFinished; sl@0: switch(aState) sl@0: { sl@0: case KStateTesting1: sl@0: newState=KStateWaitingForTest1; sl@0: break; sl@0: case KStateTesting2: sl@0: newState=KStateWaitingForTest2; sl@0: break; sl@0: case KStateTesting3: sl@0: newState=KStateWaitingForTest3; sl@0: break; sl@0: case KStateTesting4: sl@0: newState=KStateWaitingForTest4; sl@0: break; sl@0: case KStateTesting5: sl@0: newState=KStateWaitingForTest5; sl@0: break; sl@0: case KStateTesting6: sl@0: newState=KStateWaitingForTest6; sl@0: break; sl@0: case KStateTesting8: sl@0: newState=KStateWaitingForTest8; sl@0: break; sl@0: case KStateTesting7: sl@0: newState=KStateWaitingForTest7; sl@0: break; sl@0: } sl@0: TheClient->iWs.PurgePointerEvents(); sl@0: SetState(newState); sl@0: } sl@0: sl@0: void CPointerWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) sl@0: { sl@0: ConstructExtLD(*parent,pos,size); sl@0: iTl=pos; sl@0: iSize=size; sl@0: Activate(); sl@0: AssignGC(aGc); sl@0: SetState(KStateWaitingForTest1); sl@0: BaseWin()->EnableOnEvents(); sl@0: } sl@0: sl@0: void CPointerWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: iGc->DrawRect(Size()); sl@0: iGc->DrawRect(iRepeatRect); sl@0: TBuf<0x80> buf; sl@0: TBuf<0x80> buf2; sl@0: switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: { sl@0: _LIT(Draw1,"Click anywhere in the window and hold the pointer steady"); sl@0: buf.Format(Draw1); sl@0: } sl@0: break; sl@0: case KStateTesting1: sl@0: { sl@0: _LIT(Draw2,"Hold pointer inside the box"); sl@0: buf.Format(Draw2); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest2: sl@0: { sl@0: _LIT(Draw3,"Release the pointer then click in the window and hold the pointer steady"); sl@0: buf.Format(Draw3); sl@0: } sl@0: break; sl@0: case KStateTesting2: sl@0: { sl@0: _LIT(Draw4,"Drag the pointer outside the box"); sl@0: buf.Format(Draw4); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest3: sl@0: { sl@0: _LIT(Draw5,"Release the pointer then click in the window and hold the pointer steady"); sl@0: buf.Format(Draw5); sl@0: } sl@0: break; sl@0: case KStateTesting3: sl@0: { sl@0: _LIT(Draw6,"Release the pointer"); sl@0: buf.Format(Draw6); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest4: sl@0: { sl@0: _LIT(Draw7,"Click anywhere in the window and move the pointer slightly"); sl@0: buf.Format(Draw7); sl@0: } sl@0: break; sl@0: case KStateTesting4: sl@0: { sl@0: _LIT(Draw8,"Release the pointer"); sl@0: buf.Format(Draw8); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: { sl@0: _LIT(Draw9,"Click anywhere in the window and move the pointer slightly"); sl@0: buf.Format(Draw9); sl@0: } sl@0: break; sl@0: case KStateTesting5: sl@0: { sl@0: _LIT(Draw10,"Release the pointer"); sl@0: buf.Format(Draw10); sl@0: break; sl@0: } sl@0: case KStateWaitingForTest6: sl@0: { sl@0: _LIT(Draw11,"Click anywhere in the window"); sl@0: buf.Format(Draw11); sl@0: } sl@0: break; sl@0: case KStateTesting6: sl@0: { sl@0: _LIT(Draw12,"Move the pointer"); sl@0: buf.Format(Draw12); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest8: sl@0: { sl@0: _LIT(Draw13,"Click anywhere in the window, and keep the pointer pressed"); sl@0: buf.Format(Draw13); sl@0: } sl@0: break; sl@0: case KStateTesting8: sl@0: buf.Format(KNullDesC); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: { sl@0: _LIT(Draw14,"Switch off and touch the center of the screen"); sl@0: buf.Format(Draw14); sl@0: } sl@0: break; sl@0: case KStateTesting7: sl@0: buf.Format(KNullDesC); sl@0: break; sl@0: } sl@0: switch(iState) sl@0: { sl@0: case KStateTesting1: sl@0: { sl@0: _LIT(Repeat2,"Repeat (%d/%d), interval=%d.%d"); sl@0: buf2.Format(Repeat2,iRepeatCount,KRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000); sl@0: } sl@0: break; sl@0: case KStateTesting2: sl@0: case KStateTesting3: sl@0: { sl@0: _LIT(Repeat1,"Repeat (%d), interval=%d.%d"); sl@0: buf2.Format(Repeat1,iRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000); sl@0: } sl@0: break; sl@0: } sl@0: iGc->DrawText(buf,TPoint(10,20)); sl@0: iGc->DrawText(buf2,TPoint(10,40)); sl@0: } sl@0: sl@0: void CPointerWindow::FinishedTests() sl@0: { sl@0: iState=KStateFinished; sl@0: } sl@0: sl@0: void CPointerWindow::StartNextRepeatTest() sl@0: { sl@0: iInterval=0; sl@0: iRepeatCount=0; sl@0: if (iState==KStateWaitingForTest4) sl@0: User::After(TTimeIntervalMicroSeconds32(1000000)); sl@0: else if (iState==KStateWaitingForTest5) sl@0: User::After(TTimeIntervalMicroSeconds32(1000000)); sl@0: QueueNextRepeat(); sl@0: switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: SetState(KStateTesting1); sl@0: break; sl@0: case KStateWaitingForTest2: sl@0: SetState(KStateTesting2); sl@0: break; sl@0: case KStateWaitingForTest3: sl@0: SetState(KStateTesting3); sl@0: break; sl@0: case KStateWaitingForTest4: sl@0: SetState(KStateTesting4); sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: SetState(KStateTesting5); sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: SetState(KStateTesting6); sl@0: break; sl@0: case KStateWaitingForTest8: sl@0: SetState(KStateTesting8); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: SetState(KStateTesting7); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::QueueNextRepeat() sl@0: { sl@0: iInterval=iInterval.Int()+KRepeatIntervalIncrements; sl@0: #if defined(LOGGING) sl@0: /*_LIT(KRequestRepeat,"Request Repeat, State=%d, Interval=%d"); sl@0: TLogMessageText buf; sl@0: buf.Format(KRequestRepeat,iState,iInterval.Int()); sl@0: TheClient->LogMessage(buf);*/ sl@0: #endif sl@0: iWin.RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(iInterval),TRect(iRepeatRect)); sl@0: iPrevTime.HomeTime(); sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: void CPointerWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KPointer,"CPointerWindow::PointerL(Type=%d, Pos=(%d,%d), ParPos=(%d,%d), Mod=0x%x) State=%d"); sl@0: LogMessageText.Format(KPointer,aPointer.iType,aPointer.iPosition.iX,aPointer.iPosition.iY,aPointer.iParentPosition.iX,aPointer.iParentPosition.iY,aPointer.iModifiers,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: if (aPointer.iType==TPointerEvent::EButtonRepeat) sl@0: { sl@0: if (iState!=KStateTesting1 && iState!=KStateTesting2 && iState!=KStateTesting3 && iState!=KStateTesting4) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: TTimeIntervalMicroSeconds32 interval(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64())); sl@0: TBool fail1=(interval.Int()<(iInterval.Int()-KRepeatMargin) || interval.Int()>(iInterval.Int()+KRepeatMargin)); sl@0: if (fail1) sl@0: { sl@0: _LIT(KPointerRepeat1,"Pointer Repeat Interval, Exp=%d, Act=%d, F1=%d, F2=%d"); sl@0: TLogMessageText buf; sl@0: TBool fail2=(interval.Int()<(iInterval.Int()-2*KRepeatMargin) || interval.Int()>(iInterval.Int()+3*KRepeatMargin)); sl@0: buf.Format(KPointerRepeat1,iInterval.Int(),interval.Int(),fail1,fail2); sl@0: TheClient->LogMessage(buf); sl@0: } sl@0: if (interval.Int()<(iInterval.Int()- sl@0: #if defined(__MARM_ARM4__) sl@0: 2* sl@0: #endif sl@0: KRepeatMargin) || interval.Int()>(iInterval.Int()+ sl@0: #if defined(__MARM_ARM4__) sl@0: 3* sl@0: #endif sl@0: KRepeatMargin)) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: if (!iRepeatRect.Contains(aPointer.iPosition) || sl@0: aPointer.iParentPosition!=(aPointer.iPosition+iWin.InquireOffset(*Parent()->WinTreeNode()))) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iRepeatCount++; sl@0: if (iState==KStateTesting1 && iRepeatCount==KRepeatCount) sl@0: { sl@0: QueueNextRepeat(); sl@0: Client()->iWs.Flush(); sl@0: User::After(TTimeIntervalMicroSeconds32(iRepeatCount*KRepeatIntervalIncrements)); sl@0: iWin.CancelPointerRepeatEventRequest(); sl@0: SetState(KStateWaitingForTest2); sl@0: } sl@0: else sl@0: QueueNextRepeat(); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: else switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: case KStateWaitingForTest2: sl@0: case KStateWaitingForTest3: sl@0: case KStateWaitingForTest4: sl@0: case KStateWaitingForTest8: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition-TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition; sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(1,1); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(2*KRepeatRectXExtra,2*KRepeatRectYExtra); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateTesting1: sl@0: { sl@0: TBool isDrag=(aPointer.iType==TPointerEvent::EDrag); sl@0: TestFailed(isDrag); sl@0: if (isDrag) sl@0: { sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,aPointer.iPosition.iX,aPointer.iPosition.iY); sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,aPointer.iPosition.iX,aPointer.iPosition.iY); sl@0: } sl@0: } sl@0: break; sl@0: case KStateTesting2: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: SetState(KStateWaitingForTest3); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting3: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest4); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting4: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest5); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest6); sl@0: else if (aPointer.iType!=TPointerEvent::EDrag) sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting6: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: { sl@0: //#if !defined(__WINS__) // Can't emulate touching dig when switched off under WINS sl@0: // if (iTest->Digitiser()) sl@0: SetState(KStateWaitingForTest7); sl@0: /* else sl@0: #endif sl@0: SetState(KStateWaitingForTest8);*/ sl@0: } sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down || aPointer.iType==TPointerEvent::ESwitchOn) sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting7: sl@0: if (aPointer.iType!=TPointerEvent::ESwitchOn) sl@0: TestFailed(); sl@0: else sl@0: SetState(KStateWaitingForTest8); sl@0: break; sl@0: case KStateTesting8: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::TestFailed(TBool aRetest/*=EFalse*/) sl@0: { sl@0: if (iState!=KStateFailed) sl@0: { sl@0: TInt oldState=iState; sl@0: iState=KStateFailed; sl@0: if (iTest->TestFailed(oldState,aRetest) || aRetest) sl@0: ResetTest(oldState); sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KKey,"CPointerWindow::WinKeyL(Code=%d, ScanCode=%d) State=%d"); sl@0: LogMessageText.Format(KKey,aKey.iCode,aKey.iScanCode,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: if (aKey.iCode==EKeyEscape) sl@0: FinishedTests(); // Simply skip this test if the Escape key is pressed sl@0: } sl@0: sl@0: void CPointerWindow::SwitchOn(const TTime &) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KOn,"CPointerWindow::SwitchOn() State=%d"); sl@0: LogMessageText.Format(KOn,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: if (iState==KStateWaitingForTest7) sl@0: SetState(KStateTesting7); sl@0: else sl@0: TestFailed(); sl@0: } sl@0: sl@0: void CPointerWindow::SendEvent() sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KSend,"CPointerWindow::SendEvent() State=%d"); sl@0: LogMessageText.Format(KSend,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: switch (iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/4,iTl.iY+iSize.iHeight/4); sl@0: break; sl@0: //case KStateTesting1: //Do Nothing sl@0: // break; sl@0: case KStateWaitingForTest2: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+iSize.iWidth/4,iTl.iY+iSize.iHeight/4); sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/2,iTl.iY+iSize.iHeight/4); sl@0: break; sl@0: case KStateTesting2: sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+5*iSize.iWidth/8,iTl.iY+iSize.iHeight/4+2); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+3*iSize.iWidth/4,iTl.iY+iSize.iHeight/4+4); sl@0: break; sl@0: case KStateWaitingForTest3: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+3*iSize.iWidth/4,iTl.iY+iSize.iHeight/4+4); sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/4,iTl.iY+iSize.iHeight/2); sl@0: break; sl@0: case KStateTesting3: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+iSize.iWidth/4,iTl.iY+iSize.iHeight/2); sl@0: break; sl@0: case KStateWaitingForTest4: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/2,iTl.iY+iSize.iHeight/2); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+3,iTl.iY+iSize.iHeight/2+1); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+6,iTl.iY+iSize.iHeight/2+2); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+9,iTl.iY+iSize.iHeight/2+3); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+12,iTl.iY+iSize.iHeight/2+4); sl@0: break; sl@0: case KStateTesting4: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+iSize.iWidth/2+12,iTl.iY+iSize.iHeight/2+4); sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/2,iTl.iY+3*iSize.iHeight/4); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+3,iTl.iY+3*iSize.iHeight/4+1); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+6,iTl.iY+3*iSize.iHeight/4+2); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+9,iTl.iY+3*iSize.iHeight/4+3); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/2+12,iTl.iY+3*iSize.iHeight/4+4); sl@0: break; sl@0: case KStateTesting5: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+iSize.iWidth/2+12,iTl.iY+3*iSize.iHeight/4+4); sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+3*iSize.iWidth/4,iTl.iY+3*iSize.iHeight/4); sl@0: break; sl@0: case KStateTesting6: sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+3*iSize.iWidth/4+4,iTl.iY+3*iSize.iHeight/4+2); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+3*iSize.iWidth/4+8,iTl.iY+3*iSize.iHeight/4+4); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+3*iSize.iWidth/4+12,iTl.iY+3*iSize.iHeight/4+6); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+3*iSize.iWidth/4+16,iTl.iY+3*iSize.iHeight/4+8); sl@0: break; sl@0: case KStateWaitingForTest8: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/2,iTl.iY+3*iSize.iHeight/4); sl@0: break; sl@0: case KStateTesting8: sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+3*iSize.iWidth/4+16,iTl.iY+3*iSize.iHeight/4+8); sl@0: iTest->SimulateEvent(TRawEvent::ESwitchOn); sl@0: iTest->SimulatePointer(TRawEvent::EPointerSwitchOn,iTl.iX+iSize.iWidth/2-1,iTl.iY+iSize.iHeight/2-1); sl@0: break; sl@0: //case KStateTesting7: //Do Nothing sl@0: // break; sl@0: /*case KStateFailed: sl@0: break; sl@0: case KStateFinished: sl@0: break;*/ sl@0: } sl@0: } sl@0: sl@0: // sl@0: // CGrabWindow // sl@0: // sl@0: sl@0: CGrabWindow::CGrabWindow(CTPointer *aTest) : iTest(aTest) sl@0: { sl@0: } sl@0: sl@0: void CGrabWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) sl@0: { sl@0: ConstructExtLD(*parent,pos,size); sl@0: iTl=pos; sl@0: iSize=size; sl@0: Activate(); sl@0: AssignGC(aGc); sl@0: SetState(KGrabStateWaitingForDown); sl@0: } sl@0: sl@0: void CGrabWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: iGc->DrawRect(Size()); sl@0: TBuf<0x80> buf; sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDown: sl@0: case KGrabStateWaitingForDown2: sl@0: case KGrabStateWaitingForDown5: sl@0: { sl@0: _LIT(Draw1,"Press the pointer inside the window"); sl@0: buf.Copy(Draw1); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForDown3: sl@0: case KGrabStateWaitingForUp3a: sl@0: { sl@0: _LIT(Draw2,"Press and release the pointer inside the window"); sl@0: buf.Copy(Draw2); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForDragOut: sl@0: { sl@0: _LIT(Draw3,"Drag the pointer outside into the outside window"); sl@0: buf.Copy(Draw3); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp: sl@0: case KGrabStateWaitingForUp2b: sl@0: case KGrabStateWaitingForUp5: sl@0: { sl@0: _LIT(Draw4,"Release the pointer"); sl@0: buf.Copy(Draw4); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForDown4: sl@0: { sl@0: _LIT(Draw5,"Press then release the pointer"); sl@0: buf.Copy(Draw5); sl@0: } sl@0: break; sl@0: default:; sl@0: } sl@0: iGc->DrawText(buf,TPoint(10,20)); sl@0: } sl@0: sl@0: void CGrabWindow::PointerL(const TPointerEvent &aPointer,const TTime&) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KPointer,"CGrabWindow::PointerL(Type=%d, Pos=(%d,%d), ParPos=(%d,%d), Mod=0x%x) State=%d"); sl@0: LogMessageText.Format(KPointer,aPointer.iType,aPointer.iPosition.iX,aPointer.iPosition.iY,aPointer.iParentPosition.iX,aPointer.iParentPosition.iY,aPointer.iModifiers,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDown: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: SetState(KGrabStateWaitingForDragOut); sl@0: break; sl@0: case KGrabStateWaitingForDragOut: sl@0: if (aPointer.iType!=TPointerEvent::EDrag) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: if (!TRect(Size()).Contains(aPointer.iPosition)) sl@0: SetState(KGrabStateWaitingForUp); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown2); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown2: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); // Call twice to check it's harmless sl@0: SetState(KGrabStateWaitingForUp2a); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp2a: sl@0: SetState(KGrabStateWaitingForDrag2); sl@0: break; sl@0: case KGrabStateWaitingForDrag2: sl@0: break; sl@0: case KGrabStateWaitingForUp2b: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown3: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: SetState(KGrabStateWaitingForUp3a); sl@0: break; sl@0: case KGrabStateWaitingForUp3a: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); sl@0: SetState(KGrabStateWaitingForUp3b); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp3b: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown5: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(EFalse); sl@0: SetState(KGrabStateWaitingForDrag5); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForDrag5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp5: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown4: sl@0: iWin.Close(); // Close the window with the grab captured in it sl@0: SetState(KGrabStateWaitingForUp4); sl@0: break; sl@0: case KGrabStateFinished: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::ResetTest() sl@0: { sl@0: TheClient->iWs.PurgePointerEvents(); sl@0: SetState(KGrabStateWaitingForDown); sl@0: } sl@0: sl@0: void CGrabWindow::Pointer2(const TPointerEvent &aPointer) sl@0: { sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDrag2: sl@0: { sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: { sl@0: SetState(KGrabStateWaitingForUp2b); sl@0: } sl@0: else sl@0: { sl@0: if (iTest->TestFailed(iState)) sl@0: ResetTest(); sl@0: } sl@0: break; sl@0: } sl@0: case KGrabStateWaitingForUp2b: sl@0: if (aPointer.iType==TPointerEvent::EDrag) // Harmless sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown3); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp3b: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown5); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp4: sl@0: FinishedTests(); sl@0: break; sl@0: case KGrabStateWaitingForDrag5: sl@0: { sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: SetState(KGrabStateWaitingForUp5); sl@0: else if (iTest->TestFailed(iState)) sl@0: ResetTest(); sl@0: break; sl@0: } sl@0: case KGrabStateWaitingForUp5: sl@0: if (aPointer.iType==TPointerEvent::EDrag) // Harmless sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown4); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::SetState(TInt aState) sl@0: { sl@0: iState=aState; sl@0: if (aState!=KGrabStateWaitingForUp4) sl@0: iWin.Invalidate(); sl@0: TheClient->WaitForRedrawsToFinish(); sl@0: SendEvent(); sl@0: } sl@0: sl@0: void CGrabWindow::TestFailed() sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KFail,"CGrabWindow::TestFailed() State=%d"); sl@0: LogMessageText.Format(KFail,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: if (iState!=KStateFailed) sl@0: { sl@0: TInt oldState=iState; sl@0: iState=KStateFailed; sl@0: if (iTest->TestFailed(oldState)) sl@0: ResetTest(); sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::FinishedTests() sl@0: { sl@0: iState=KGrabStateFinished; sl@0: } sl@0: sl@0: void CGrabWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KKey,"CGrabWindow::WinKeyL(Code=%d, ScanCode=%d) State=%d"); sl@0: LogMessageText.Format(KKey,aKey.iCode,aKey.iScanCode,iState); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: if (aKey.iCode==EKeyEscape) sl@0: FinishedTests(); // Simply skip this test if the Escape key is pressed sl@0: } sl@0: sl@0: void CGrabWindow::SendEvent() sl@0: { sl@0: switch (iState) sl@0: { sl@0: case KGrabStateWaitingForDown: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/3,iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForDragOut: sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+iSize.iWidth/6,iTl.iY+iSize.iHeight/6); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+1,iTl.iY+1); sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX-10,iTl.iY-10); sl@0: break; sl@0: case KGrabStateWaitingForUp: sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX-8,iTl.iY-8); sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX-5,iTl.iY-5); sl@0: break; sl@0: case KGrabStateWaitingForDown2: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+2*iSize.iWidth/3,iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: /*case KGrabStateWaitingForUp2a: //Don't need to do anything for these cases sl@0: break; sl@0: case KGrabStateWaitingForDrag2: sl@0: break;*/ sl@0: case KGrabStateWaitingForUp2b: sl@0: iTest->SimulatePointer(TRawEvent::EPointerMove,iTl.iX+2*iSize.iWidth/3-3,iTl.iY+iSize.iHeight/3+3); sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+2*iSize.iWidth/3,iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForDown3: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+2*iSize.iWidth/3,2*iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForUp3a: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+2*iSize.iWidth/3,2*iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForUp3b: sl@0: break; sl@0: case KGrabStateWaitingForDown4: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+2*iSize.iWidth/5,iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForUp4: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+2*iSize.iWidth/5,iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForDown5: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Down,iTl.iX+iSize.iWidth/3,2*iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: case KGrabStateWaitingForUp5: sl@0: iTest->SimulatePointer(TRawEvent::EButton1Up,iTl.iX+iSize.iWidth/3,2*iTl.iY+iSize.iHeight/3); sl@0: break; sl@0: //case KGrabStateWaitingForDrag5: //Don't need to do anything for these cases sl@0: // break; sl@0: /*case KStateFailed: sl@0: break; sl@0: case KGrabStateFinished: sl@0: break;*/ sl@0: default:; sl@0: } sl@0: TheClient->iWs.Flush(); sl@0: } sl@0: sl@0: sl@0: // sl@0: // CGrabWindow2, used as part of grab tests // sl@0: // sl@0: sl@0: CGrabWindow2::CGrabWindow2(CGrabWindow *aWindow) : iGrabWindow(aWindow) sl@0: { sl@0: } sl@0: sl@0: void CGrabWindow2::Draw() sl@0: { sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: iGc->SetBrushColor(TRgb::Gray4(2)); sl@0: iGc->DrawRect(Size()); sl@0: } sl@0: sl@0: void CGrabWindow2::PointerL(const TPointerEvent &aPointer,const TTime&) sl@0: { sl@0: #if defined(LOGGING) sl@0: _LIT(KPointer,"CGrabWindow2::PointerL(Type=%d, Pos=(%d,%d), ParPos=(%d,%d), Mod=0x%x)"); sl@0: LogMessageText.Format(KPointer,aPointer.iType,aPointer.iPosition.iX,aPointer.iPosition.iY,aPointer.iParentPosition.iX,aPointer.iParentPosition.iY,aPointer.iModifiers); sl@0: TheClient->LogMessage(LogMessageText); sl@0: #endif sl@0: iGrabWindow->Pointer2(aPointer); sl@0: } sl@0: sl@0: // sl@0: // CTPointTest // sl@0: // sl@0: sl@0: CTPointer::CTPointer(CTestStep* aStep) : CTWsGraphicsBase(aStep) sl@0: { sl@0: iState = 0; sl@0: } sl@0: sl@0: sl@0: CTPointer::~CTPointer() sl@0: { sl@0: HAL::Set(HALData::EPenDisplayOn,iOldPointerState); sl@0: delete iRepeatWin; sl@0: delete iGrabWin; sl@0: delete iGrabWin2; sl@0: Client()->ResetFocus(); sl@0: delete iTimeOut; sl@0: } sl@0: sl@0: void CTPointer::ConstructL() sl@0: { sl@0: iTimeOut=new(ELeave) CTimeOut(); sl@0: iTimeOut->ConstructL(); sl@0: iTimeOut->Start(KTimeOutAfter,TCallBack(CTPointer::TimeOut,this)); sl@0: sl@0: TheClient->iWs.SetPointerCursorArea(iTest->iNormalPointerCursorArea); sl@0: iRepeatWin=new(ELeave) CPointerWindow(this); sl@0: TSize screenSize(Client()->iScreen->SizeInPixels()); sl@0: if (TestBase()->ConfigurationSupportsPointerEventTesting()) sl@0: { sl@0: iRepeatWin->SetUpLD(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc); sl@0: } sl@0: Client()->iGroup->SetCurrentWindow(iRepeatWin); sl@0: iNoDigitiser=EFalse; sl@0: TInt err=HAL::Get(HALData::EPenDisplayOn,iOldPointerState); sl@0: if (err==KErrNotSupported) sl@0: iNoDigitiser=ETrue; sl@0: else if (err==KErrNone) sl@0: err=HAL::Set(HALData::EPenDisplayOn,ETrue); sl@0: if (err==KErrNotSupported) sl@0: iNoDigitiser=(!iOldPointerState); sl@0: else sl@0: { sl@0: TEST(err==KErrNone); sl@0: if (err!=KErrNone) sl@0: INFO_PRINTF3(_L("HAL::Set(HALData::EPenDisplayOn,ETrue) return value - Expected: %d, Actual: %d"), KErrNone, err); sl@0: } sl@0: sl@0: } sl@0: sl@0: TInt CTPointer::TimeOut(TAny* aTest) //static sl@0: { sl@0: static_cast(aTest)->TimeOut(); sl@0: return(KErrNone); sl@0: } sl@0: sl@0: void CTPointer::TimeOut() sl@0: { sl@0: TLogMessageText buf; sl@0: _LIT(KPointerTimeOut,"TIMEOUT: Pointer Test, %d, %S"); sl@0: buf.AppendFormat(KPointerTimeOut,iState,&(iTest->iSubTitle)); sl@0: TheClient->LogMessage(buf); sl@0: ++iTimeOutCount; sl@0: if (!TestFailed(-1) && iState<2) sl@0: { sl@0: iTimeOut->Start(KTimeOutAfter,TCallBack(CTPointer::TimeOut,this)); sl@0: } sl@0: } sl@0: sl@0: TBool CTPointer::TestFailed(TInt aCase,TBool aRetry/*=EFalse*/) sl@0: { sl@0: _LIT(KPointerTest,": Pointer Test, %d, %S, Case %d"); sl@0: _LIT(KRetry,"Retry"); sl@0: _LIT(KFail,"FAIL"); sl@0: TLogMessageText buf; sl@0: TInt ret=0; sl@0: if (aRetry) sl@0: buf.Append(KRetry); sl@0: else sl@0: { sl@0: ret=1; sl@0: buf.Append(KFail); sl@0: } sl@0: buf.AppendFormat(KPointerTest,iState,&(iTest->iSubTitle),aCase); sl@0: TheClient->LogMessage(buf); sl@0: #if !defined(DISABLE_FAIL_DIALOG) sl@0: if (!aRetry) sl@0: { sl@0: __DEBUGGER(); sl@0: TRAPD(err,ret=doTestFailedL()); sl@0: } sl@0: #endif sl@0: switch(ret) sl@0: { sl@0: case 0: sl@0: return(ETrue); // Re-try test sl@0: case 1: sl@0: break; sl@0: } sl@0: return(EFalse); sl@0: } sl@0: sl@0: TInt CTPointer::doTestFailedL() sl@0: { sl@0: //_LIT(Failed,"Pointer repeat test failed"); sl@0: _LIT(Retest,"Retest"); sl@0: _LIT(Fail,"Fail"); sl@0: CTDialog *dialog=new(ELeave) CTDialog(); sl@0: dialog->SetNumButtons(2); sl@0: dialog->SetButtonText(0,Retest); sl@0: dialog->SetButtonText(1,Fail); sl@0: dialog->ConstructLD(*Client()->iGroup,*Client()->iGc); sl@0: dialog->SetTitle(_L("Pointer repeat test failed")); sl@0: dialog->SetFlags(CTDialog::EDialogWaitForButtonUp); sl@0: return dialog->Display(); sl@0: } sl@0: sl@0: CGrabWindow2 *CTPointer::GrabWin2() const sl@0: { sl@0: return(iGrabWin2); sl@0: } sl@0: sl@0: void CTPointer::StartGrabTestL() sl@0: { sl@0: iGrabWin=new(ELeave) CGrabWindow(this); sl@0: iGrabWin2=new(ELeave) CGrabWindow2(iGrabWin); sl@0: // sl@0: TSize screenSize(Client()->iScreen->SizeInPixels()); sl@0: iGrabWin2->SetUpL(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc); sl@0: Client()->iGroup->SetCurrentWindow(iGrabWin2); sl@0: // sl@0: iGrabWin->SetUpLD(TPoint(screenSize.iWidth/4,screenSize.iHeight/4),TSize(screenSize.iWidth/2,screenSize.iHeight/2),Client()->iGroup,*Client()->iGc); sl@0: Client()->iGroup->SetCurrentWindow(iGrabWin); sl@0: // sl@0: } sl@0: sl@0: sl@0: void CTPointer::RunTestCaseL(TInt /*aCurTestCase*/) sl@0: { sl@0: _LIT(Repeat,"Repeat tests"); sl@0: _LIT(Grab,"Grab tests"); sl@0: sl@0: iTest->iState=iState; sl@0: sl@0: if (!TestBase()->ConfigurationSupportsPointerEventTesting()) sl@0: { sl@0: INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing")); sl@0: TestComplete(); sl@0: return; sl@0: } sl@0: sl@0: ((CTPointerStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); sl@0: switch(iState) sl@0: { sl@0: case 0: sl@0: ((CTPointerStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: iTest->LogSubTest(Repeat); sl@0: iState++; sl@0: break; sl@0: /** sl@0: sl@0: @SYMTestCaseID GRAPHICS-WSERV-0310 sl@0: sl@0: @SYMDEF DEF081259 sl@0: sl@0: @SYMTestCaseDesc Test pointer event handling sl@0: sl@0: @SYMTestPriority High sl@0: sl@0: @SYMTestStatus Implemented sl@0: sl@0: @SYMTestActions Simulate pointer events and check the events are then handled correctly sl@0: sl@0: @SYMTestExpectedResults Pointer events are handled correctly sl@0: sl@0: */ sl@0: case 1: sl@0: ((CTPointerStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0310")); sl@0: iTest->LogSubTest(Grab); sl@0: sl@0: StartGrabTestL(); sl@0: iState++; sl@0: break; sl@0: default: sl@0: ((CTPointerStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: ((CTPointerStep*)iStep)->CloseTMSGraphicsStep(); sl@0: iTimeOut->Cancel(); sl@0: if (iTimeOutCount>0) TEST(EFalse); sl@0: if (iTest->IsFullRomL()) User::After(5000000); sl@0: TestComplete(); sl@0: } sl@0: ((CTPointerStep*)iStep)->RecordTestResultL(); sl@0: } sl@0: sl@0: sl@0: __WS_CONSTRUCT_STEP__(Pointer)