diff -r 000000000000 -r eb1f2e154e89 fep/frontendprocessor/test/src/KEYBOARDLOGGER.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/frontendprocessor/test/src/KEYBOARDLOGGER.CPP Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,448 @@ +// Copyright (c) 2006-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: +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "KEYBOARDLOGGER.H" + + +//Timer dealy after which event is requested.\n +const TInt KClearerDelay(1000000); + +enum + { + EGapLeftOfEachLine =10, + EGapAboveTopLine =1, + EGapBetweenEachLine =3, + EGapBelowBottomLine =3 + }; + +//String literal to represent the name of the typeface used.\n +_LIT(KLitFontTypefaceName, "publicDomainUnicode"); + + +#if defined(_DEBUG) + +_LIT(KLitKEYBOARDLOGGER, "KEYBOARDLOGGER"); + +enum TPanic + { + EPanicBadHeight=1 + }; + +LOCAL_C void Panic(TPanic aPanic) + { + User::Panic(KLitKEYBOARDLOGGER, aPanic); + } + +#endif + + +/************************************************************* + ** + ** TTstOverflowIgnorer + ** + *************************************************************/ + +void TTstOverflowIgnorer::Overflow(TDes16&) + { + } + + +/************************************************************* + ** + ** CTstControl + ** + *************************************************************/ + +CTstControl* CTstControl::NewL() + { + CTstControl* const control=new(ELeave) CTstControl; + CleanupStack::PushL(control); + control->ConstructL(); + CleanupStack::Pop(control); + return control; + } + +CTstControl::~CTstControl() + { + iCoeEnv->ReleaseScreenFont(iFont); + iArrayOfKeyDownEvents.Close(); + iArrayOfKeyEvents.Close(); + iArrayOfKeyUpEvents.Close(); + delete iClearer; + } + +CTstControl::CTstControl() + :iFont(NULL), + iArrayOfKeyDownEvents(2), + iArrayOfKeyEvents(2), + iArrayOfKeyUpEvents(2), + iClearer(NULL) + { + } + +/** + Create a control window \n Enable to receive pointer drag and move events.\n + Ensures that all subsequent pointer events are delivered \n + Gets the control's associated drawable window and set its shadow height\n + Create a font for the device.\n Set the screen size and font height \n + Set controls extent with size and position and set the control readt to be drawn \n +*/ +void CTstControl::ConstructL() + { + CreateWindowL(); + EnableDragEvents(); + ClaimPointerGrab(); + DrawableWindow()->SetShadowHeight(3); + iFont=iCoeEnv->CreateScreenFontL(TFontSpec(KLitFontTypefaceName, 200)); + iClearer=CClearer::NewL(*this); + const TSize screenSize(iCoeEnv->ScreenDevice()->SizeInPixels()); + const TInt fontHeightInPixels=iFont->HeightInPixels(); + SetExtent(TPoint(10, 10), TSize(screenSize.iWidth-(10*2), 1+EGapAboveTopLine+(2*(fontHeightInPixels+EGapBetweenEachLine))+fontHeightInPixels+EGapBelowBottomLine+1)); + ActivateL(); + } + +/** + @return - Event handling flag.(EKeyWasConsumed)\n + The control handles the key events\n + Draw the control\n + When a key event occurs, the control framework calls this function for each control on the control stack,\n + until one of them can process the key event.\n +*/ +TKeyResponse CTstControl::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode) + { + iClearer->Cancel(); + iClearer->After(TTimeIntervalMicroSeconds32(KClearerDelay)); + + switch (aEventCode) + { + case EEventKeyDown: + User::LeaveIfError(iArrayOfKeyDownEvents.Append(aKeyEvent)); + break; + case EEventKey: + if (aKeyEvent.iCode==EKeyEscape) + { + CBaActiveScheduler::Exit(); + return EKeyWasConsumed; + } + User::LeaveIfError(iArrayOfKeyEvents.Append(aKeyEvent)); + break; + case EEventKeyUp: + User::LeaveIfError(iArrayOfKeyUpEvents.Append(aKeyEvent)); + break; + default: + __DEBUGGER(); + break; + } + + DrawNow(); + return EKeyWasConsumed; + } + +/** + Auxiliary Function for Test Case ID TestKeyBoardLoggerUi-RunTestStepL.\n + Return the capability that indicated support for all types of text.\n +*/ +TCoeInputCapabilities CTstControl::InputCapabilities() const + { + return TCoeInputCapabilities(TCoeInputCapabilities::EAllText); + } + +/** + The screen appearance of control is changed by overriding the method Draw().\n + By default, this draws a border of the appropriate type around the control. +*/ +void CTstControl::Draw(const TRect&) const + { + CWindowGc& graphicsContext=SystemGc(); + graphicsContext.SetPenStyle(CGraphicsContext::ESolidPen); + graphicsContext.SetPenColor(KRgbBlack); + graphicsContext.SetBrushStyle(CGraphicsContext::ENullBrush); + TRect rectangle(Rect()); + graphicsContext.DrawRect(rectangle); + rectangle.Shrink(1, 1); + graphicsContext.SetBrushStyle(CGraphicsContext::ESolidBrush); + TRect temp(rectangle); + temp.iBr.iY=temp.iTl.iY; + const TInt fontHeightInPixels=iFont->HeightInPixels(); + const TInt fontAscentInPixels=iFont->AscentInPixels(); + graphicsContext.SetBrushColor(KRgbGray); + graphicsContext.UseFont(iFont); + TBuf<200> textToDisplay; + TTstOverflowIgnorer overflowIgnorer; + TInt i; + TInt n; + n=iArrayOfKeyDownEvents.Count(); + textToDisplay.Format(_L("Key-down events (%d): "), n); + for (i=0; iConstructL(); + CleanupStack::Pop(clearer); + return clearer; + } + +CTstControl::CClearer::CClearer(CTstControl& aControl) + :CTimer(EActivePriorityDefault), + iControl(aControl) + { + CActiveScheduler::Add(this); + } + +/** + The function is called by the active scheduler when a request completion event occurs. \n + Reset the events to default and call the DrawNow()\n +*/ +void CTstControl::CClearer::RunL() + { + iControl.iArrayOfKeyDownEvents.Reset(); + iControl.iArrayOfKeyEvents.Reset(); + iControl.iArrayOfKeyUpEvents.Reset(); + iControl.DrawNow(); + } + + +/************************************************************* + ** + ** CTestKeyBoardLoggerUi + ** + *************************************************************/ + +CTestKeyBoardLoggerUi::~CTestKeyBoardLoggerUi() + { + if(iControl) + { + RemoveFromStack(iControl); + } + delete iControl; + } + +/** + Call ConstructL() of CTestAppUi \n + Initialize the CTstControl object \nCall ConstructL of CTstControl \n + Install the FEP\n +*/ +void CTestKeyBoardLoggerUi::ConstructL() + { + CTestAppUi::ConstructL(); + iControl= new (ELeave) CTstControl; + AddToStackL(iControl,ECoeStackPriorityDialog); + iControl->ConstructL(); + + const TUid KUidTFep1 = { 0x102024D0 }; + iCoeEnv->InstallFepL(KUidTFep1); + + AutoTestManager().StartAutoTest(); + } + + + +/** + @SYMTestCaseID UIF-FEPTEST-0002 + @SYMPREQ 0000 + @SYMTestCaseDesc Launch the application and offer events. + @SYMTestPriority High + @SYMTestStatus Implemented + @SYMTestActions Launch an application and load the FEP. + Create character codes that represent the Key events, Key up and down events. + Offer these Key events to the application. + The FEP intercepts these events and gets displayed on the application view. + @SYMTestExpectedResults Failure in FEP will cause crashing of the application + */ +void CTestKeyBoardLoggerUi::RunTestStepL(TInt aNumStep) + { + TWsEvent theEvent; + TKeyEvent *theKey = theEvent.Key(); + + switch(aNumStep) + { + case 1: + SetTestStepID(_L("UIF-FEPTEST-0002")); + case 2: case 4: case 5: + { + theKey->iScanCode = 0; + theKey->iModifiers= 0; + theKey->iRepeats=0; + theKey->iCode = 'A' + aNumStep - 1; + + SendEventToWindowGroups(theEvent); + INFO_PRINTF2(_L("Simulate Key Event with code %d"), theKey->iCode); + } + break; + + case 3: case 6: + { + + theKey->iScanCode = 0; + theKey->iModifiers= 0; + theKey->iRepeats=0; + theKey->iCode = EKeyEnter; + + INFO_PRINTF1(_L("Simulate Key Enter Event")); + SendEventToWindowGroups(theEvent); + } + break; + + case 7: case 8: + { + + theKey->iScanCode = EKeyTab; + theKey->iModifiers= 0; + theKey->iRepeats=0; + theKey->iCode = EKeyTab; + + INFO_PRINTF1(_L("Move to next editor")); + SendEventToWindowGroups(theEvent); + } + break; + + case 9: + iCoeEnv->InstallFepL(KNullUid); + AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass); + RecordTestResultL(); + CloseTMSGraphicsStep(); + break; + } + } + +/** + Handle the window events.\n + Create a window server session and connect the client\n + Set the event type and call the SendEventToWindowGroup().\n + Close the session on completion \n +*/ +void CTestKeyBoardLoggerUi::SendEventToWindowGroups(TWsEvent& aEvent) + { + RWsSession ws; + TInt theRes = ws.Connect(); + TEST(theRes == KErrNone); + + RWindowGroup& winGroup = iCoeEnv->RootWin(); + TInt theId = winGroup.Identifier(); + + aEvent.SetType(EEventKeyDown); + aEvent.SetTimeNow(); + ws.SendEventToWindowGroup(theId, aEvent); + + aEvent.SetType(EEventKey); + aEvent.SetTimeNow(); + ws.SendEventToWindowGroup(theId, aEvent); + + aEvent.SetType(EEventKeyUp); + aEvent.SetTimeNow(); + ws.SendEventToWindowGroup(theId, aEvent); + + ws.Close(); + } + + +/************************************************************* + ** + ** CTestKeyboardLoggerStep + ** + *************************************************************/ + +CTestKeyboardLoggerStep::CTestKeyboardLoggerStep() + { + SetTestStepName(KKeyboardLoggerStep); + } + +CTestKeyboardLoggerStep::~CTestKeyboardLoggerStep() + { + } + +void CTestKeyboardLoggerStep::ConstructAppL(CEikonEnv* aCoe) + { // runs inside a TRAP harness + aCoe->ConstructL(); + + CTestAppUi* appUi= new (ELeave) CTestKeyBoardLoggerUi(this); + aCoe->SetAppUi(appUi); + appUi->ConstructL(); + } + +TVerdict CTestKeyboardLoggerStep::doTestStepL() + { + PreallocateHALBuffer(); + + INFO_PRINTF1(_L("TestKeyboardLoggerStep started...")); + + __UHEAP_MARK; + + CEikonEnv* coe=new(ELeave) CEikonEnv; + TRAPD(err,ConstructAppL(coe)); + + if (!err) + coe->ExecuteD(); + else + { + delete coe; + SetTestStepResult(EFail); + } + + __UHEAP_MARKEND; + + INFO_PRINTF1(_L("...TestKeyboardLoggerStep finished!")); + + return TestStepResult(); + }