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