diff -r bf7481649c98 -r 2717213c588a windowing/windowserver/test/tman/TMCAPKEY.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/test/tman/TMCAPKEY.CPP Tue Jun 22 15:21:29 2010 +0300 @@ -0,0 +1,625 @@ +// Copyright (c) 1995-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 capture key +// +// + +#include +#include +#include +#include "W32STD.H" +#include "../tlib/testbase.h" +#include "TMAN.H" + +enum TTestMode + { + EModeNormalCapture, + EModeWaitingForFirstDown, + EModeKeyUpsAndDowns, + EModeAbortKeys, + }; +enum TCapKeyRetValues + { + ECapKeyOkay, + ECapKeyRetry, + ECapKeyFail, + }; + +struct SCapKeyParams + { + TInt connIndex; // Connection that should capture this key + TUint keyCode; + TUint modifier_mask; + TUint modifiers; + }; + +struct SCapKeyTestParams + { + TText *txt; // Text message telling user what to do + TInt connIndex; // Connection that receive the key press + TUint keyCode; // Expected key code + TUint modifier_mask;// Modifiers mask for expected modifiers + TUint modifiers; // Expected modifiers + }; + +struct SAbortKeyTests + { + TUint keyCode; // Expected key code + TUint modifier_mask;// Modifiers mask for expected modifiers + TUint modifiers; // Expected modifiers + }; + +LOCAL_D SCapKeyParams capKeys[]={ + {1,19,EModifierFunc|EModifierCtrl,EModifierFunc|EModifierCtrl}, + {2,'b',EModifierFunc|EModifierCtrl,EModifierFunc}, + {2,'n',EModifierFunc|EModifierCtrl,EModifierFunc}, + {0,3,EModifierFunc|EModifierCtrl,EModifierFunc|EModifierCtrl}, + {2,'q',0,0}, + {2,'w',0,0}, + }; + +LOCAL_D SCapKeyParams capUpAndDownKeys[]={ + {2,EStdKeySpace,EModifierFunc|EModifierCtrl|EModifierShift,0}, + {2,EStdKeyEnter,EModifierFunc|EModifierCtrl|EModifierShift,EModifierShift}, + }; + +LOCAL_D SCapKeyTestParams capKeyTests[]={ + {(TText *)_S("Press q"),2,'q',EModifierFunc|EModifierCtrl|EModifierShift,0}, + //{(TText *)_S("Press q"),2,'q',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press w"),2,'w',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press a"),0,'a',0}, + //{(TText *)_S("Press a"),1,1,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, + {(TText *)_S("Press s"),1,19,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, + //{(TText *)_S("Press b"),2,'b',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press n"),2,'n',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press b"),0,2,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, + //{(TText *)_S("Press c"),0,'c',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press d"),0,'d',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, + {(TText *)_S("Press c"),0,3,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, +// +// Capture ups and downs +// + {(TText *)_S("Press "),2,EStdKeySpace,EModifierFunc|EModifierCtrl|EModifierShift,0}, + {(TText *)_S("Press "),0,EStdKeyEnter,EModifierShift,0}, + {(TText *)_S("Press "),0,EStdKeySpace,EModifierFunc|EModifierCtrl|EModifierShift,EModifierShift}, + {(TText *)_S("Press "),2,EStdKeyEnter,EModifierShift,EModifierShift}, +// +// Priority keys +// + {(TText *)_S("Press c"),0,0,0,0}, + {(TText *)_S("Press d"),0,0,0,0}, + {(TText *)_S("Press z"),0,0,0,0}, + }; + +LOCAL_D SAbortKeyTests abortKeyTests[]={ + {3,EModifierCtrl,EModifierCtrl}, + {4,EModifierCtrl,EModifierCtrl}, + {'z',EModifierFunc|EModifierCtrl|EModifierShift,0} + }; + +struct SErrorCapKey + { + TInt keyCode; + TUint modifier_mask; + TUint modifiers; + }; + +LOCAL_D SErrorCapKey errorKeys[]={ + {'a',EModifierFunc|EModifierShift,EModifierFunc|EModifierCtrl}, + {'1',0,EModifierFunc}, + {3,EModifierCtrl,EModifierCtrl|EModifierShift}, + }; + +const TInt numCapKeys=sizeof(capKeys)/sizeof(capKeys[0]); +const TInt numTests=sizeof(capKeyTests)/sizeof(capKeyTests[0]); +const TInt numErrorKeys=sizeof(errorKeys)/sizeof(errorKeys[0]); +const TInt numAbortKeyTests=sizeof(abortKeyTests)/sizeof(abortKeyTests[0]); +const TInt numUpDownKeys=sizeof(capUpAndDownKeys)/sizeof(capUpAndDownKeys[0]); +const TInt numUpDownKeyTests=4; +const TInt numCapKeyTests=numTests-numAbortKeyTests-numUpDownKeyTests; + +LOCAL_D TInt capKeyHandle[numCapKeys]; +LOCAL_D TInt capUpDownKeyHandle[numUpDownKeys]; + +class CCKWindow; +class TCaptureKeyTest; +class CCKAbortConnection; + +class CCKConnectionBase : public CTClient + { +public: + CCKConnectionBase(TCaptureKeyTest *aTest); + void ConstructL(); +protected: + TCaptureKeyTest *iTest; + }; + +class CCKConnection : public CCKConnectionBase + { +public: + CCKConnection(TCaptureKeyTest *aTest, TInt aConnIndex); + ~CCKConnection(); + void ConstructL(); + void CheckKeyL(const SCapKeyTestParams &aKeyTest, const TKeyEvent &aKey); + void SubStateChanged(); + void KeyTestL(TInt aBool); + void KeyL(const TKeyEvent &aKey,const TTime &aTime); + void CheckUpDownL(const SCapKeyTestParams &aKeyTest, const TKeyEvent &aKey); + void CheckUpDownL(const TKeyEvent &aKey); + inline TInt Index() {return iConnIndex;} +protected: + TInt iConnIndex; + CCKWindow *iWin; + }; + +class CAbortHandler : public CTEventBase + { +public: + CAbortHandler(RWsSession *aWs, CCKAbortConnection *aConnection); + ~CAbortHandler(); + void Request(); +protected: + void DoCancel(); + void doRunL(); +protected: + CCKAbortConnection *iConnection; + }; + +class CCKAbortConnection : public CCKConnectionBase + { +public: + CCKAbortConnection(TCaptureKeyTest *aTest); + ~CCKAbortConnection(); + void ConstructL(); + void ReceivedAbortEventL(TInt aHandle, TKeyEvent *aKey); + void Foreground(); +protected: + CAbortHandler *iAbortHandler; + TInt iAbortKeyIndex; + }; + +class CCKWindow : public CTWin + { +public: + CCKWindow(TCaptureKeyTest *aTest, TInt aConnIndex); + void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); + void Draw(); +protected: + TInt iConnIndex; + TCaptureKeyTest *iTest; + TRgb iBack; + }; + +class CCKWindowGroup : public CTWindowGroup + { +public: + CCKWindowGroup(CTClient *aClient, TCaptureKeyTest *aTest); + void KeyL(const TKeyEvent &aKey,const TTime &aTime); + void KeyDownL(const TKeyEvent &aKey,const TTime &); + void KeyUpL(const TKeyEvent &aKey,const TTime &); + void CheckUpDown(const SCapKeyTestParams &aKeyTest, const TKeyEvent &aKey); +private: + TCaptureKeyTest *iTest; + }; + +class TCaptureKeyTest : public CTestBase + { +public: + TCaptureKeyTest(); + ~TCaptureKeyTest(); + TestState DoTestL(); + void ConstructL(); + void EndCaptureKeyTest(); + TInt SubState() const; + void IncSubState(); + void BadParamsL(); + void CapKeyPurgingL(); + void SetUpPriorityKeyTest(); + void TestComplete(); + void CaptureUpsAndDownsTest(); + TTestMode Mode(); + void SetMode(TTestMode aMode); +private: + CCKConnection *iConn1; + CCKConnection *iConn2; + CCKConnection *iConn3; + CCKAbortConnection *iAbortConn; + TSize iWinSize; + TInt iState; + TInt iSubState; + TTestMode iMode; + }; + +GLDEF_C CTestBase *CreateMultiCaptureKeyTest() + { + return(new(ELeave) TCaptureKeyTest()); + } + +// +// CAbortHandler + +CAbortHandler::CAbortHandler(RWsSession *aWs, CCKAbortConnection *aConnection) : CTEventBase(aWs, 10), iConnection(aConnection) + { + } + +CAbortHandler::~CAbortHandler() + { + Cancel(); + } + +void CAbortHandler::Request() + { + iWs->PriorityKeyReady(&iStatus); + SetActive(); + } + +void CAbortHandler::DoCancel() + { + iWs->PriorityKeyReadyCancel(); + } + +void CAbortHandler::doRunL() + { + TWsPriorityKeyEvent abortEvent; + iWs->GetPriorityKey(abortEvent); + iConnection->ReceivedAbortEventL(abortEvent.Handle(),abortEvent.Key()); + } + +// +// CCKConnection + +CCKConnectionBase::CCKConnectionBase(TCaptureKeyTest *aTest) : iTest(aTest) + { + } + +void CCKConnectionBase::ConstructL() + { + CTClient::ConstructL(); + iGroup=new(ELeave) CCKWindowGroup(this, iTest); + iGroup->ConstructL(); + } + +CCKConnection::CCKConnection(TCaptureKeyTest *aTest, TInt aConnIndex) : CCKConnectionBase(aTest), iConnIndex(aConnIndex) + { + } + +CCKConnection::~CCKConnection() + { + for(TInt index=0;indexGroupWin()->CancelCaptureKey(capKeyHandle[index]); + for(TInt index2=0;index2GroupWin()->CancelCaptureKeyUpAndDowns(capUpDownKeyHandle[index2]); + CTWin::Delete(iWin); + } + +void CCKConnection::SubStateChanged() + { + iWin->Invalidate(); + iWs.Flush(); + } + +void CCKConnection::ConstructL() + { + CCKConnectionBase::ConstructL(); + for(TInt index=0;indexGroupWin()->CaptureKey(capKeys[index].keyCode,capKeys[index].modifier_mask,capKeys[index].modifiers)); + for(TInt index2=0;index2GroupWin()->CaptureKeyUpAndDowns(capUpAndDownKeys[index2].keyCode, + capUpAndDownKeys[index2].modifier_mask,capUpAndDownKeys[index2].modifiers)); + TSize screenSize=iGroup->Size(); + TInt winWidth=screenSize.iWidth/2; + TInt winHeight=screenSize.iHeight-10; + iGroup->GroupWin()->AutoForeground(EFalse); // Don't allow clicking to cause foreground, might mess up test + CCKWindow *win=new(ELeave) CCKWindow(iTest, iConnIndex); + win->SetUpL(TPoint(5,5),TSize(winWidth,winHeight),iGroup,*iGc); + iWin=win; + } + +void CCKConnection::KeyTestL(TInt aBool) + { + if (!aBool) + { + CTDialog *dialog=new(ELeave) CTDialog(); + TInt ret=0; + dialog->ConstructLD(*iGroup,*iGc); + dialog->SetTitle(_L("Invalid key press")); + dialog->SetLine1(_L("Try again?")); + dialog->SetNumButtons(2); + dialog->SetButtonText(0,_L("Fail")); + dialog->SetButtonText(1,_L("Retry")); + ret=dialog->Display(); + User::Leave(ret==1 ? ECapKeyRetry : ECapKeyFail); + } + } + +void CCKConnection::CheckKeyL(const SCapKeyTestParams &aKeyTest, const TKeyEvent &aKey) + { + KeyTestL(aKeyTest.connIndex==iConnIndex); + KeyTestL(aKeyTest.keyCode==aKey.iCode); + KeyTestL(aKeyTest.modifiers==(aKey.iModifiers&aKeyTest.modifier_mask)); + } + +void CCKConnection::CheckUpDownL(const SCapKeyTestParams &aKeyTest, const TKeyEvent &aKey) + { + KeyTestL(aKeyTest.connIndex==iConnIndex); + KeyTestL(aKeyTest.keyCode==(TUint)aKey.iScanCode); + KeyTestL(aKeyTest.modifiers==(aKey.iModifiers&aKeyTest.modifier_mask)); + } + +void CCKConnection::KeyL(const TKeyEvent &aKey,const TTime &) + { + if (iTest->Mode()==EModeNormalCapture) + { + if (aKey.iCode==EKeyEscape) + iTest->AbortL(); + TRAPD(ret,CheckKeyL(capKeyTests[iTest->SubState()],aKey)); + if (ret==ECapKeyOkay) + iTest->IncSubState(); + else + iTest->TestL(ret==ECapKeyRetry); + } + } + +void CCKConnection::CheckUpDownL(const TKeyEvent &aKey) + { + CheckUpDownL(capKeyTests[iTest->SubState()],aKey); + } + +CCKAbortConnection::CCKAbortConnection(TCaptureKeyTest *aTest) : CCKConnectionBase(aTest) + { + } + +CCKAbortConnection::~CCKAbortConnection() + { + iGroup->GroupWin()->RemovePriorityKey(3,EModifierCtrl,EModifierCtrl); + delete iAbortHandler; + } + +void CCKAbortConnection::ConstructL() + { + CCKConnectionBase::ConstructL(); + User::LeaveIfError(iGroup->GroupWin()->AddPriorityKey(abortKeyTests[0].keyCode,abortKeyTests[0].modifier_mask,abortKeyTests[0].modifiers)); + User::LeaveIfError(iGroup->GroupWin()->AddPriorityKey(abortKeyTests[1].keyCode,abortKeyTests[1].modifier_mask,abortKeyTests[1].modifiers)); + User::LeaveIfError(iGroup->GroupWin()->AddPriorityKey(abortKeyTests[2].keyCode,abortKeyTests[2].modifier_mask,abortKeyTests[2].modifiers)); + iAbortHandler=new(ELeave) CAbortHandler(&iWs, this); + iAbortHandler->Construct(); + iWs.Flush(); + } + +void CCKAbortConnection::ReceivedAbortEventL(TInt aHandle, TKeyEvent *aKey) + { + iTest->TestL(aHandle==(TInt)iGroup); + iTest->TestL(aKey->iCode==abortKeyTests[iAbortKeyIndex].keyCode); + iTest->TestL((aKey->iModifiers&abortKeyTests[iAbortKeyIndex].modifier_mask)==abortKeyTests[iAbortKeyIndex].modifiers); + iAbortKeyIndex++; + iTest->IncSubState(); + } + +void CCKAbortConnection::Foreground() + { + iGroup->GroupWin()->SetOrdinalPosition(0); + iWs.Flush(); + } + +// +// CCKWindowGroup class // +// + +CCKWindowGroup::CCKWindowGroup(CTClient *aClient, TCaptureKeyTest *aTest) : CTWindowGroup(aClient), iTest(aTest) + {} + +void CCKWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &time) + { + /*TLogMessageText buf(_S("##Recieved Key: ")); + buf.Append(aKey.iScanCode); + buf.Append('('); + buf.AppendNum(aKey.iScanCode); + buf.Append(')'); + if (!iCurWin) + { + buf.Append('('); + buf.AppendNum(((CCKConnection *)iClient)->Index()); + buf.Append(')'); + } + iClient->iWs.LogMessage(buf);*/ + if (iCurWin) + iCurWin->WinKeyL(aKey,time); + else + ((CCKConnection *)iClient)->KeyL(aKey,time); + } + +void CCKWindowGroup::KeyDownL(const TKeyEvent &aKey,const TTime &) + { + if (aKey.iScanCode!=EStdKeyLeftShift && aKey.iScanCode!=EStdKeyRightShift) + { + if (iTest->Mode()==EModeWaitingForFirstDown) + iTest->SetMode(EModeKeyUpsAndDowns); + if (iTest->Mode()==EModeKeyUpsAndDowns) + ((CCKConnection *)iClient)->CheckUpDownL(aKey); + } + } + +void CCKWindowGroup::KeyUpL(const TKeyEvent &aKey,const TTime &) + { + if (aKey.iScanCode!=EStdKeyLeftShift && aKey.iScanCode!=EStdKeyRightShift) + { + if (iTest->Mode()==EModeKeyUpsAndDowns) + { + ((CCKConnection *)iClient)->CheckUpDownL(aKey); + iTest->IncSubState(); + } + } + } + +// +// CCKWindow, class // +// + +CCKWindow::CCKWindow(TCaptureKeyTest *aTest, TInt aConnIndex) : CTWin(), iConnIndex(aConnIndex), iTest(aTest) + { + iBack=TRgb::Gray256(230); + } + +void CCKWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) + { + ConstructExtLD(*parent,pos,size); + iWin.SetBackgroundColor(iBack); + Activate(); + AssignGC(aGc); + } + +void CCKWindow::Draw() + { + iGc->Clear(); + if (iConnIndex==0) + iGc->DrawText(TPtrC(capKeyTests[iTest->SubState()].txt), TPoint(10,20)); + } + +// + +TCaptureKeyTest::TCaptureKeyTest() : CTestBase(_L("Capture Key")) + {} + +TCaptureKeyTest::~TCaptureKeyTest() + { + delete iConn1; + delete iConn2; + delete iConn3; + delete iAbortConn; + } + +void TCaptureKeyTest::ConstructL() + { + iAbortConn=new(ELeave) CCKAbortConnection(this); + iAbortConn->ConstructL(); + iConn3=new(ELeave) CCKConnection(this,2); + iConn3->ConstructL(); + iConn2=new(ELeave) CCKConnection(this,1); + iConn2->ConstructL(); + iConn1=new(ELeave) CCKConnection(this,0); + iConn1->ConstructL(); + iMode=EModeNormalCapture; + } + +TInt TCaptureKeyTest::SubState() const + { + return(iSubState); + } + +void TCaptureKeyTest::IncSubState() + { + iSubState++; + iConn1->SubStateChanged(); + iConn2->SubStateChanged(); + iConn3->SubStateChanged(); + switch(iMode) + { + case EModeNormalCapture: + if (iSubState==numCapKeyTests) + TestComplete(); + break; + case EModeKeyUpsAndDowns: + if (iSubState==(numCapKeyTests+numUpDownKeyTests)) + TestComplete(); + break; + case EModeAbortKeys: + if (iSubState==(numCapKeyTests+numUpDownKeyTests+numAbortKeyTests)) + TestComplete(); + break; + default: + break; + } + } + +void TCaptureKeyTest::CapKeyPurgingL() + { + TInt base=Client()->iWs.ResourceCount(); + RWindowGroup groupWin(Client()->iWs); + User::LeaveIfError(groupWin.Construct(ENullWsHandle)); + TInt capHandle=User::LeaveIfError(groupWin.CaptureKey('a',EModifierFunc,EModifierFunc)); + User::LeaveIfError(groupWin.CaptureKey('b',EModifierFunc,EModifierFunc)); + TestL(Client()->iWs.ResourceCount()==(base+3)); + groupWin.CancelCaptureKey(capHandle); + TestL(Client()->iWs.ResourceCount()==(base+2)); + groupWin.Close(); + TestL(Client()->iWs.ResourceCount()==base); // Check it also freed the extra capture key + } + +void TCaptureKeyTest::BadParamsL() + { + TInt resCount=Client()->iWs.ResourceCount(); + for(TInt index=0;indexiGroup->GroupWin()->CaptureKey(errorKeys[index].keyCode,errorKeys[index].modifier_mask,errorKeys[index].modifiers)==KErrArgument); + TestL(Client()->iWs.ResourceCount()==resCount); + } + +void TCaptureKeyTest::TestComplete() + { + Request(); + } + +void TCaptureKeyTest::SetMode(TTestMode aMode) + { + iMode=aMode; + } + +TTestMode TCaptureKeyTest::Mode() + { + return(iMode); + } + +void TCaptureKeyTest::SetUpPriorityKeyTest() + { + iMode=EModeAbortKeys; + iAbortConn->Foreground(); + } + +void TCaptureKeyTest::CaptureUpsAndDownsTest() + { + iMode=EModeWaitingForFirstDown; + } + +TestState TCaptureKeyTest::DoTestL() + { + switch(iState) + { + case 0: // Dummy one to let capture key tests run + iState++; + return(EContinue); + case 1: + LogSubTest(_L("Capture ups and downs"),1); + CaptureUpsAndDownsTest(); + iState++; + return(EContinue); + case 2: + LogSubTest(_L("Abort key"),1); + SetUpPriorityKeyTest(); + iState++; + return(EContinue); + case 3: + LogSubTest(_L("Errors"),1); + BadParamsL(); + CapKeyPurgingL(); + LogSubTest(_L("CaptureKey"),1); + iState++; + return(ENext); + default: + return(EFinished); + } +// return(ENext); + }