author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// 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 <e32std.h> #include <e32svr.h> #include <e32keys.h> #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 <Alt>q"),2,'q',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press <Alt>w"),2,'w',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press a"),0,'a',0}, //{(TText *)_S("Press <Ctrl><Alt>a"),1,1,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, {(TText *)_S("Press <Ctrl><Alt>s"),1,19,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, //{(TText *)_S("Press <Alt>b"),2,'b',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press <Alt>n"),2,'n',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press <Ctrl><Alt>b"),0,2,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, //{(TText *)_S("Press <Alt>c"),0,'c',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press <Alt>d"),0,'d',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc}, {(TText *)_S("Press <Ctrl><Alt>c"),0,3,EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl}, // // Capture ups and downs // {(TText *)_S("Press <Space>"),2,EStdKeySpace,EModifierFunc|EModifierCtrl|EModifierShift,0}, {(TText *)_S("Press <Enter>"),0,EStdKeyEnter,EModifierShift,0}, {(TText *)_S("Press <Shift><Space>"),0,EStdKeySpace,EModifierFunc|EModifierCtrl|EModifierShift,EModifierShift}, {(TText *)_S("Press <Shift><Enter>"),2,EStdKeyEnter,EModifierShift,EModifierShift}, // // Priority keys // {(TText *)_S("Press <Ctrl>c"),0,0,0,0}, {(TText *)_S("Press <Ctrl>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;index<numCapKeys;index++) if (capKeys[index].connIndex==iConnIndex) iGroup->GroupWin()->CancelCaptureKey(capKeyHandle[index]); for(TInt index2=0;index2<numUpDownKeys;index2++) if (capUpAndDownKeys[index2].connIndex==iConnIndex) iGroup->GroupWin()->CancelCaptureKeyUpAndDowns(capUpDownKeyHandle[index2]); CTWin::Delete(iWin); } void CCKConnection::SubStateChanged() { iWin->Invalidate(); iWs.Flush(); } void CCKConnection::ConstructL() { CCKConnectionBase::ConstructL(); for(TInt index=0;index<numCapKeys;index++) if (capKeys[index].connIndex==iConnIndex) capKeyHandle[index]=User::LeaveIfError(iGroup->GroupWin()->CaptureKey(capKeys[index].keyCode,capKeys[index].modifier_mask,capKeys[index].modifiers)); for(TInt index2=0;index2<numUpDownKeys;index2++) if (capUpAndDownKeys[index2].connIndex==iConnIndex) capUpDownKeyHandle[index2]=User::LeaveIfError(iGroup->GroupWin()->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;index<numErrorKeys;index++) TestL(Client()->iGroup->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); }