windowing/windowserver/tauto/TPntKey.CPP
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// 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:
// Converted from TMan test code (TMPNTKEY.CPP) May 2001
// Test Pointer move/drag buffer
// 
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include "TPNTKEY.H"

#define LOGGING on	//Uncomment this line to get more logging

TInt CTPntKeyWindow::iTestScanCodes[ENumPntKeyTests]={'A','B',0,'C',EStdKeyEnter,'Y'};
TUint CTPntKeyWindow::iTestCodes[ENumPntKeyTests]={'a','B',0,'c',EKeyEnter,'y'};
TUint CTPntKeyWindow::iTestModifiers[ENumPntKeyTests]={0,EModifierShift,0,0,0,0};

CTPntKeyWindow::CTPntKeyWindow(CTPntKey *aTest) : iTest(aTest)
	{}

CTPntKeyWindow::~CTPntKeyWindow()
	{
	}

void CTPntKeyWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent)
	{
	ConstructExtLD(*parent,pos,size);
	iWin.SetPointerGrab(ETrue);
	iKey1=TRect(size.iWidth*1/16,size.iHeight/2,size.iWidth*5/16,size.iHeight);
	iKey2=TRect(size.iWidth*6/16,size.iHeight/2,size.iWidth*10/16,size.iHeight);
	iKey3=TRect(size.iWidth*11/16,size.iHeight/2,size.iWidth*15/16,size.iHeight);
	iWin.AddKeyRect(iKey1,'A',EFalse);
	iWin.AddKeyRect(iKey2,'B',EFalse);
	AssignGC(*Client()->iGc);
	BaseWin()->EnableOnEvents();
	Activate();
	}

void CTPntKeyWindow::Error(TInt aWhere)
	{
	iTest->Failed(aWhere);
	}

void CTPntKeyWindow::NextKey()
	{
	if (++iKeyCount!=ENumPntKeyTests)
		{
	#if defined(LOGGING)
		_LIT(KLog,"Next Key  KeyCount=%d");
		iTest->LOG_MESSAGE2(KLog,iKeyCount);
	#endif
		if (iKeyCount==2)
			iWin.RemoveAllKeyRects();
		else if (iKeyCount==3)
			iWin.AddKeyRect(iKey3,'C',EFalse);
		else if (iKeyCount==4)
			{
	#if !defined(__WINS__)
			if (iTest->NoDigitiser())
				{
				return;
				}
	#endif
			iWin.RemoveAllKeyRects();
			iWin.AddKeyRect(TRect(Client()->iScreen->SizeInPixels()),'Z',EFalse);
			}
		else if (iKeyCount==5)
			{
			iWin.RemoveAllKeyRects();
			Client()->iWs.Flush();
			User::After(500000);	// Wait half a second
			iWin.AddKeyRect(TRect(Client()->iScreen->SizeInPixels()),'Y',ETrue);
			}
		Invalidate();
		}
	SendEvent();
	}

void CTPntKeyWindow::SendEvent()
	{
	TheClient->WaitForRedrawsToFinish();
#if defined(LOGGING)
	_LIT(KLog,"SendEvent  KeyCount=%d");
	iTest->LOG_MESSAGE2(KLog,iKeyCount);
#endif
	switch(iKeyCount)
		{
		case 0:
			SimulatePointerDownUp(iKey1);
			break;
		case 1:
			iTest->TestBase()->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftShift);
			SimulatePointerDownUp(iKey2);
			iTest->TestBase()->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftShift);
			break;
		case 2:
		case 5:
			{
			TPoint pos=Position();
			TSize size=Size();
			iTest->TestBase()->SimulatePointerDownUp(pos.iX+size.iWidth/2,pos.iY+size.iHeight/4);
			}
			break;
		case 3:
			SimulatePointerDownUp(iKey3);
			break;
		case 4:
			iTest->TestBase()->SimulateKeyDownUp(EStdKeyEnter);
			break;
		}
	}

void CTPntKeyWindow::SimulatePointerDownUp(const TRect& aRect)
	{
	iTest->TestBase()->SimulatePointerDownUp((aRect.iTl.iX+aRect.iBr.iX)/2,(aRect.iTl.iY+aRect.iBr.iY)/2);
	}

void CTPntKeyWindow::Test(TInt aCheck)
	{
	if (!aCheck)
		Error(3);
	}

void CTPntKeyWindow::KeyUpL(const TKeyEvent &aKey,const TTime&)
	{
	if (aKey.iScanCode==iTestScanCodes[iKeyCount])
		NextKey();
	}

void CTPntKeyWindow::KeyDownL(const TKeyEvent &aKey,const TTime &)
	{
#if defined(LOGGING)
	_LIT(KLog,"KeyDownL  ScanCode=%d '%c' (%d)  KeyCount=%d");
	iTest->LOG_MESSAGE5(KLog,aKey.iScanCode,aKey.iScanCode,iTestScanCodes[iKeyCount],iKeyCount);
#endif
	if (aKey.iScanCode!=EStdKeyLeftFunc && aKey.iScanCode!=EStdKeyRightFunc && 
		 aKey.iScanCode!=EStdKeyLeftAlt && aKey.iScanCode!=EStdKeyRightAlt &&
		 aKey.iScanCode!=EStdKeyLeftCtrl && aKey.iScanCode!=EStdKeyRightCtrl &&
		 aKey.iScanCode!=EStdKeyLeftShift && aKey.iScanCode!=EStdKeyRightShift && 
		 aKey.iScanCode!=EStdKeyOff &&
		 aKey.iScanCode!=EStdKeyEscape)
		Test(aKey.iScanCode==iTestScanCodes[iKeyCount]);
	}

void CTPntKeyWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
	{
	if (aKey.iCode!=EKeyEscape)
		{
#if defined(LOGGING)
		_LIT(KLog1,"WinKeyL1  ScanCode=%d (%d)  Code=%d '%c' (%d)");
		_LIT(KLog2,"WinKeyL2  ScanCode=%d  Modifiers=0x%x (0x%x) KeyCount=%d");
		iTest->LOG_MESSAGE6(KLog1,aKey.iScanCode,iTestScanCodes[iKeyCount],aKey.iCode,aKey.iCode,iTestCodes[iKeyCount]);
		iTest->LOG_MESSAGE5(KLog2,aKey.iScanCode,aKey.iModifiers&EModifierMask,iTestModifiers[iKeyCount]&EModifierMask,iKeyCount);
#endif
		Test(aKey.iScanCode==iTestScanCodes[iKeyCount]);
		Test(aKey.iCode==iTestCodes[iKeyCount]);
		Test((aKey.iModifiers&EModifierMask)==(iTestModifiers[iKeyCount]&EModifierMask));
		}
	}

void CTPntKeyWindow::SwitchOn(const TTime &)
	{
#if defined(LOGGING)
	_LIT(KLog,"SwitchOn  KeyCount=%d");
	iTest->LOG_MESSAGE2(KLog,iKeyCount);
#endif
	if (iKeyCount==4)
		NextKey();
 	else if (iKeyCount!=5)
		Error(2);
	}

void CTPntKeyWindow::PointerL(const TPointerEvent &aPointer,const TTime &)
	{
#if defined(LOGGING)
	_LIT(KLog,"Pointer Event  Type=%d  Pos=(%d,%d)  PPos=(%d,%d)  KeyCount=%d");
	iTest->LOG_MESSAGE7(KLog,aPointer.iType,aPointer.iPosition.iX,aPointer.iPosition.iY
						,aPointer.iParentPosition.iX,aPointer.iParentPosition.iY,iKeyCount);
#endif
	if (aPointer.iType==TPointerEvent::EButton1Down)
		{
		if (iKeyCount!=2)
			Error(1);
		else
			NextKey();
		}
	}

void CTPntKeyWindow::DrawButton(const TRect &aRect, const TDesC &aText)
	{
	iGc->DrawRect(aRect);
	iGc->DrawText(aText, TPoint((aRect.iBr.iX+aRect.iTl.iX)/2,(aRect.iBr.iY+aRect.iTl.iY)/2));
	}

void CTPntKeyWindow::Draw()
	{
	iGc->SetBrushColor(TRgb::Gray4(0));
	iGc->SetPenColor(TRgb::Gray4(3));
	iGc->Clear();
	DrawButton(iKey1,_L("A"));
	DrawButton(iKey2,_L("B"));
	DrawButton(iKey3,_L("C"));
	switch(iKeyCount)
		{
		case 0:
			iGc->DrawText(_L("Click on 'A'"), TPoint(10,20));
			break;
		case 1:
			iGc->DrawText(_L("Shift-Click on 'B'"), TPoint(10,20));
			break;
		case 2:
			iGc->DrawText(_L("Click anywhere in this window"), TPoint(10,20));
			break;
		case 3:
			iGc->DrawText(_L("Click on 'C'"), TPoint(10,20));
			break;
		case 4:
#if defined(__WINS__)	// Can't emulate touching dig when switched off under WINS
			iGc->DrawText(_L("Switch off and on (or press Enter)"), TPoint(10,20));
#else
			iGc->DrawText(_L("Switch off, then touch the screen to switch on"), TPoint(10,20));
#endif
			break;
		case 5:
#if defined(__WINS__)	// Can't emulate touching dig when switched off under WINS
			iGc->DrawText(_L("Touch anywhere in the window"), TPoint(10,20));
#else
			iGc->DrawText(_L("Switch off and touch the screen to switch on again"), TPoint(10,20));
#endif
			break;
		}
	}

CTPntKey::CTPntKey(CTestStep* aStep):
	CTWsGraphicsBase(aStep)
	{
	}

CTPntKey::~CTPntKey()
	{
	HAL::Set(HALData::EPenDisplayOn,iOldPointerState);
	CTWin::Delete(iWin);
	Client()->ResetFocus();
	delete iTimeOut;
	}

TInt CTPntKey::TimeOut(TAny* aTest)		//static
	{
	static_cast<CTPntKey*>(aTest)->TimeOut();
	return(KErrNone);
	}

void CTPntKey::TimeOut()
	{
	TLogMessageText buf;
	_LIT(KPntKeyTimeOut,"TIMEOUT: Pointer Key, %d, %S");
	buf.AppendFormat(KPntKeyTimeOut,iState,&TestBase()->iSubTitle);
	TheClient->LogMessage(buf);
	Failed(4);
	}

void CTPntKey::Failed(TInt aWhere)
	{
	_LIT(KLog,"Failed at %d");
	LOG_MESSAGE2(KLog,aWhere);
	if (!iFailed)
		{
		iFailed=ETrue;
		Client()->iGroup->ClearCurrentWindow();
		}
	}

void CTPntKey::ConstructL()
	{
	TInt mods=TheClient->iWs.GetModifierState();
	if (mods&EModifierCapsLock)
		iTest->SimulateKeyDownUp(EStdKeyCapsLock);
	//Make sure all the keys we test are in the up state
	iTest->SimulateKeyDownUp(EStdKeyLeftShift);
	iTest->SimulateKeyDownUp(EStdKeyRightShift);
	iTest->SimulateKeyDownUp(EStdKeyLeftFunc);
	iTest->SimulateKeyDownUp(EStdKeyLeftCtrl);
	iTest->SimulateKeyDownUp(EStdKeyRightCtrl);
	mods=TheClient->iWs.GetModifierState();
	_LIT(KLog,"Initial Modifiers state 0x%x (ideally should be zero)");
	LOG_MESSAGE2(KLog,mods);
	TheClient->iScreen->SetScreenMode(0);		//May sure we are in the right screen size mode
	TheClient->iScreen->SetAppScreenMode(0);
	TheClient->iWs.SetPointerCursorArea(TestBase()->iNormalPointerCursorArea);
	CTPntKeyWindow *win=new(ELeave) CTPntKeyWindow(this);
	win->SetUpLD(TPoint(20,20),Client()->iScreen->SizeInPixels()-TSize(40,40),Client()->iGroup);
	iWin=win;
	Client()->iGroup->SetCurrentWindow(iWin);
	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(EFalse);
		}
	TheClient->WaitForRedrawsToFinish();	//Make sure all pending events have been delt with (redraw events are lowest priority)
	iTimeOut=new(ELeave) CTimeOut();
	iTimeOut->ConstructL();
	iTimeOut->Start(KTimeOutAfter,TCallBack(CTPntKey::TimeOut,this));
	}

void CTPntKey::RunTestCaseL(TInt /*aCurTestCase*/)
	{
	_LIT(KTestName,"Key set 1");
	TEST(!iFailed);
	if (iFailed)
		{
		_LIT(KLog,"Test Failed  Substate=%d  KeyCount=%d");
		LOG_MESSAGE3(KLog,iTest->iState,iWin->KeyCount());
		}
	((CTPntKeyStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(++iTest->iState)
		{
/**
@SYMTestCaseID		GRAPHICS-WSERV-0200

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test Pointer move/drag buffer

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Exercise the pointer move/drag buffer and check
					that it functions correctly

@SYMTestExpectedResults The buffer functions correctly
*/
		case 1:
			((CTPntKeyStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0200"));
			iTest->LogSubTest(KTestName);
			if (TestBase()->ConfigurationSupportsPointerEventTesting())
			    {
			    iWin->SendEvent();
			    TheClient->Flush();
			    }
			else
			    {
			    INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing"));
			    }
			break;
		case 2:
			((CTPntKeyStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			((CTPntKeyStep*)iStep)->CloseTMSGraphicsStep();
			if (TestBase()->ConfigurationSupportsPointerEventTesting())
			    {
                iTimeOut->Cancel();
			    }
			TestComplete();
			break;
		}
	((CTPntKeyStep*)iStep)->RecordTestResultL();
	}
	
__WS_CONSTRUCT_STEP__(PntKey)