os/graphics/windowing/windowserver/test/tauto/tmultiptrevent.cpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/graphics/windowing/windowserver/test/tauto/tmultiptrevent.cpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,4842 @@
     1.4 +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
     1.5 +// All rights reserved.
     1.6 +// This component and the accompanying materials are made available
     1.7 +// under the terms of "Eclipse Public License v1.0"
     1.8 +// which accompanies this distribution, and is available
     1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
    1.10 +//
    1.11 +// Initial Contributors:
    1.12 +// Nokia Corporation - initial contribution.
    1.13 +//
    1.14 +// Contributors:
    1.15 +//
    1.16 +// Description:
    1.17 +// Multi pointer and Z-coordinate test code
    1.18 +// 
    1.19 +//
    1.20 +
    1.21 +/**
    1.22 + @file
    1.23 + @test
    1.24 + @internalComponent - Internal Symbian test code 
    1.25 +*/
    1.26 +
    1.27 +#ifndef __INIPARSER_H__
    1.28 +#define __INIPARSER_H__
    1.29 +#endif // __INIPARSER_H__
    1.30 +
    1.31 +#include "PARSEINIDATA.H"
    1.32 +#include "tmultiptrevent.h"
    1.33 +#include <e32cmn.h>
    1.34 +#include <hal.h>
    1.35 +
    1.36 +//#define FAILLOG 1			// Uncomment this code to get detailed log
    1.37 +#define TESTMULTIPOINTER 1	// Comment this line to get detailed log without testing
    1.38 +
    1.39 +_LIT(KMultiPtrPluginDll, "multiptrclick.dll");
    1.40 +
    1.41 +const TInt KErrDescSize = 128;
    1.42 +const TInt KMaxQueueSize = 32;	// Queue size of wserv. In any test we cannot test more than MaxQueueSize events. 
    1.43 +
    1.44 +LOCAL_C void DestroyAnim(TAny* aAnim)
    1.45 +	{
    1.46 +	(static_cast<RMultiPointerAnim*>(aAnim))->Destroy();
    1.47 +	}
    1.48 +
    1.49 +
    1.50 +//CTMultiPtrEventBuffer
    1.51 +CTMultiPtrEventBuffer::CTMultiPtrEventBuffer(RWsSession *aWs, CTMultiPtrEventTest *aTest, CTMultiPtrEventClient* aClient) 
    1.52 +	: CTEvent(aWs), iTest(aTest), iClient(aClient)
    1.53 +	{
    1.54 +	}
    1.55 +
    1.56 +void CTMultiPtrEventBuffer::ConstructL()
    1.57 +	{
    1.58 +	CTEventBase::Construct();
    1.59 +	iEventBuffer.SetLengthL(EEventBufferSize);
    1.60 +	iMovePtsBuffer.SetLengthL(EMovePtsBuffer);
    1.61 +	}
    1.62 +
    1.63 +void CTMultiPtrEventBuffer::AddExpectedEvent(TWsEvent &aEvent)
    1.64 +	{
    1.65 +	iEventBuffer.Add(&aEvent);
    1.66 +	}
    1.67 +
    1.68 +void CTMultiPtrEventBuffer::AddExpectedMovePtEvent(TPoint &aMovePt)
    1.69 +	{
    1.70 +	iMovePtsBuffer.Add(&aMovePt);
    1.71 +	}
    1.72 +
    1.73 +TInt CTMultiPtrEventBuffer::EventsRemaining()
    1.74 +	{
    1.75 +	return iEventBuffer.Count();
    1.76 +	}
    1.77 +
    1.78 +void CTMultiPtrEventBuffer::GetMoveBufferAndCompareL()
    1.79 +	{
    1.80 +	TBuf8<EMovePtsBuffer*sizeof(TPoint)> buf;
    1.81 +	iClient->ParentWin()->BaseWin()->RetrievePointerMoveBuffer(buf);
    1.82 +	
    1.83 +	TUint bufferSize = buf.Length();
    1.84 +	TUint numLoop = bufferSize/sizeof(TPoint);
    1.85 +	
    1.86 +	if (iMovePtsBuffer.Count() != numLoop)
    1.87 +		{
    1.88 +#if defined(FAILLOG)
    1.89 +		TLogMessageText logText;
    1.90 +		_LIT(KPointerNumber, "Actual number of move/drag buffer points from Wserv = %d Expected number of move/drag buffer points = %d ");
    1.91 +		logText.Format(KPointerNumber, numLoop, iMovePtsBuffer.Count());
    1.92 +		iTest->LOG_MESSAGE(logText);
    1.93 +#endif
    1.94 +		TestL(EFalse);
    1.95 +		}
    1.96 +	
    1.97 +	TPoint wsPoint;
    1.98 +	TPoint expPoint;
    1.99 +	TUint8* BasePtr = const_cast<TUint8*>(buf.Ptr());
   1.100 +	for (TUint count = 0; count < numLoop; count++)
   1.101 +		{
   1.102 +		wsPoint = *(reinterpret_cast<TPoint*>(BasePtr));
   1.103 +		iMovePtsBuffer.Remove(&expPoint);
   1.104 +		if (wsPoint != expPoint)
   1.105 +			{
   1.106 +#if defined(FAILLOG)
   1.107 +			TLogMessageText logText;
   1.108 +			_LIT(KMoveBufferPoint, "Actual move/drag buffer point from Wserv = ([%d], [%d]) Expected move/drag buffer point = ([%d], [%d])");
   1.109 +			logText.Format(KMoveBufferPoint, wsPoint.iX, wsPoint.iY, expPoint.iX, expPoint.iY);
   1.110 +			iTest->LOG_MESSAGE(logText);
   1.111 +#endif
   1.112 +			TestL(EFalse);
   1.113 +			}
   1.114 +		BasePtr = BasePtr + sizeof(TPoint);
   1.115 +		}
   1.116 +	}
   1.117 +
   1.118 +
   1.119 +#define TESTXL(expr1, oper, expr2, event, expected) \
   1.120 +    TestL(expr1 oper expr2, expr1, expr2, #oper, #expr1 ## #oper ## #expr2, \
   1.121 +            event, expected, __FILE__, __LINE__);
   1.122 +
   1.123 +// Main function which gets the event, checks with the event in buffer
   1.124 +// Then calls function NextSetOfEventsL for running other tests of a particualar test case
   1.125 +void CTMultiPtrEventBuffer::doRunL()
   1.126 +	{
   1.127 +	// Get the event from wserv
   1.128 +	TWsEvent wsEvent;
   1.129 +	iWs->GetEvent(wsEvent);
   1.130 +
   1.131 +	TWsEvent expectedEvent;
   1.132 +	TInt wsType=wsEvent.Type();
   1.133 +	if (wsEvent.Type()==EEventNull)
   1.134 +		{
   1.135 +		TESTXL(wsEvent.Handle(), ==, 0, &wsEvent, NULL);
   1.136 +		goto End;
   1.137 +		}
   1.138 +	// This code is for running successive anim test code 
   1.139 +	if (wsEvent.Type()==EEventPointer && wsEvent.Pointer()->iType==TPointerEvent::ESwitchOn)
   1.140 +		goto End;
   1.141 +	// if this is called accidentally
   1.142 +	if (iEventBuffer.Count()==0 && wsType==EEventFocusGained)
   1.143 +		goto End;
   1.144 +
   1.145 +	iEventBuffer.Remove(&expectedEvent);
   1.146 +	iEventCount++;
   1.147 +
   1.148 +	if (wsEvent.Type() == EEventPointerBufferReady)
   1.149 +		{
   1.150 +		GetMoveBufferAndCompareL();
   1.151 +#if defined(FAILLOG)
   1.152 +		TLogMessageText logText;
   1.153 +		_LIT(KEventHandle, "Actual Window Handle from Wserv = %d Expected Window Handle = %d ");
   1.154 +		logText.Format(KEventHandle, wsEvent.Handle(), expectedEvent.Handle());
   1.155 +		iTest->LOG_MESSAGE(logText);
   1.156 +#endif
   1.157 +#if defined(TESTMULTIPOINTER)
   1.158 +		TESTXL(wsEvent.Handle(), ==, expectedEvent.Handle(), &wsEvent, &expectedEvent);
   1.159 +#endif
   1.160 +		goto End;
   1.161 +		}
   1.162 +
   1.163 +	// Test wsEvent and expected event have same handle, position and type.
   1.164 +#if defined(FAILLOG)
   1.165 +	{
   1.166 +	TLogMessageText logText;
   1.167 +	_LIT(KEventCountCheck, "Checking event number = %d");
   1.168 +	logText.Format(KEventCountCheck, iEventCount);
   1.169 +	iTest->LOG_MESSAGE(logText);
   1.170 +	_LIT(KEventType, "Actual Event type from Wserv = %d Expected Event Type = %d ");
   1.171 +	logText.Format(KEventType, wsEvent.Type(), expectedEvent.Type());
   1.172 +	iTest->LOG_MESSAGE(logText);
   1.173 +	}
   1.174 +#endif
   1.175 +
   1.176 +#if defined(TESTMULTIPOINTER)
   1.177 +	TESTXL(wsEvent.Type(), ==, expectedEvent.Type(), &wsEvent, &expectedEvent);
   1.178 +#endif
   1.179 +	// Test pointer number for Enter/Exit events
   1.180 +	if (wsType == EEventPointerEnter || wsType == EEventPointerExit)
   1.181 +		{
   1.182 +#if defined(FAILLOG)
   1.183 +		TLogMessageText logText;
   1.184 +		_LIT(KPointerNumber, "Actual PointerNumber for Enter/Exit event from Wserv = %d Expected PointerNumber for Enter/Exit event = %d ");
   1.185 +		logText.Format(KPointerNumber, *wsEvent.Int(), *expectedEvent.Int());
   1.186 +		iTest->LOG_MESSAGE(logText);
   1.187 +#endif
   1.188 +#if defined(TESTMULTIPOINTER)
   1.189 +		TESTXL(*wsEvent.Int(), ==, *expectedEvent.Int(), &wsEvent, &expectedEvent);
   1.190 +#endif
   1.191 +		}
   1.192 +
   1.193 +	// Test only if it is a Pointer event
   1.194 +	if (wsType==EEventPointer)
   1.195 +		{
   1.196 +		TAdvancedPointerEvent* expectedPointerEvent=expectedEvent.Pointer();
   1.197 +		TAdvancedPointerEvent* actualPointerEvent=wsEvent.Pointer();
   1.198 +#if defined(FAILLOG)
   1.199 +		TLogMessageText logText;
   1.200 +		_LIT(KEventHandle, "Actual Window Handle from Wserv = %d Expected Window Handle = %d ");
   1.201 +		logText.Format(KEventHandle, wsEvent.Handle(), expectedEvent.Handle());
   1.202 +		iTest->LOG_MESSAGE(logText);
   1.203 +#endif
   1.204 +#if defined(TESTMULTIPOINTER)
   1.205 +		TESTXL(wsEvent.Handle(), ==, expectedEvent.Handle(), &wsEvent, &expectedEvent);
   1.206 +#endif
   1.207 +#if defined(FAILLOG)
   1.208 +		_LIT(KPointerType, "Actual PointerType from Wserv = %d Expected PointerType = %d ");
   1.209 +		logText.Format(KPointerType, actualPointerEvent->iType, expectedPointerEvent->iType);
   1.210 +		iTest->LOG_MESSAGE(logText);
   1.211 +#endif
   1.212 +#if defined(TESTMULTIPOINTER)
   1.213 +		TESTXL(actualPointerEvent->iType, ==, expectedPointerEvent->iType, &wsEvent, &expectedEvent);
   1.214 +#endif
   1.215 +#if defined(FAILLOG)
   1.216 +		_LIT(KPointerPosition, "Actual PointerPosition from Wserv = (%d, %d) Expected PointerPosition = (%d, %d) ");
   1.217 +		logText.Format(KPointerPosition, actualPointerEvent->iPosition.iX, actualPointerEvent->iPosition.iY, expectedPointerEvent->iPosition.iX, expectedPointerEvent->iPosition.iY);
   1.218 +		iTest->LOG_MESSAGE(logText);
   1.219 +#endif
   1.220 +#if defined(TESTMULTIPOINTER)		
   1.221 +		TESTXL(actualPointerEvent->iPosition, ==, expectedPointerEvent->iPosition, &wsEvent, &expectedEvent);
   1.222 +#endif		
   1.223 +#if defined(FAILLOG)
   1.224 +		_LIT(KPointerNumber, "Actual PointerNumber from Wserv = %d Expected PointerNumber = %d ");
   1.225 +		logText.Format(KPointerNumber, actualPointerEvent->PointerNumber(), expectedPointerEvent->PointerNumber());
   1.226 +		iTest->LOG_MESSAGE(logText);
   1.227 +#endif
   1.228 +#if defined(TESTMULTIPOINTER)		
   1.229 +		TESTXL(actualPointerEvent->PointerNumber(), ==, expectedPointerEvent->PointerNumber(), &wsEvent, &expectedEvent);
   1.230 +#endif
   1.231 +#if defined(FAILLOG)
   1.232 +		_LIT(KPointerProximity, "Actual PointerProximity from Wserv = %d Expected PointerProximity = %d ");
   1.233 +		logText.Format(KPointerProximity, actualPointerEvent->Proximity(), expectedPointerEvent->Proximity());
   1.234 +		iTest->LOG_MESSAGE(logText);
   1.235 +#endif
   1.236 +#if defined(TESTMULTIPOINTER)		
   1.237 +		TESTXL(actualPointerEvent->Proximity(), ==, expectedPointerEvent->Proximity(), &wsEvent, &expectedEvent);
   1.238 +#endif		
   1.239 +#if defined(FAILLOG)
   1.240 +		_LIT(KPointerPressure, "Actual PointerPressure from Wserv = %d Expected PointerPressure = %d ");
   1.241 +		logText.Format(KPointerPressure, actualPointerEvent->Pressure(), expectedPointerEvent->Pressure());
   1.242 +		iTest->LOG_MESSAGE(logText);
   1.243 +#endif
   1.244 +#if defined(TESTMULTIPOINTER)		
   1.245 +		TESTXL(actualPointerEvent->Pressure(), ==, expectedPointerEvent->Pressure(), &wsEvent, &expectedEvent);
   1.246 +#endif
   1.247 +#if defined(FAILLOG)
   1.248 +		_LIT(KPointerModifier, "Actual Modifier value from Wserv = 0x%08x Expected Modfier value = 0x%08x ");
   1.249 +		logText.Format(KPointerModifier, actualPointerEvent->iModifiers, expectedPointerEvent->iModifiers);
   1.250 +		iTest->LOG_MESSAGE(logText);
   1.251 +#endif
   1.252 +#if defined(TESTMULTIPOINTER)		
   1.253 +		TESTXL((actualPointerEvent->iModifiers&expectedPointerEvent->iModifiers), ==, expectedPointerEvent->iModifiers, &wsEvent, &expectedEvent);
   1.254 +#endif		
   1.255 +		}
   1.256 +End:
   1.257 +	// Call NextSetOfEvents() only for primary client
   1.258 +	if (iEventBuffer.Count()==0 && !iClient->IsSecondaryClient())	
   1.259 +		{
   1.260 +		iTest->NextSetOfEventsL();		// Cannot Leave
   1.261 +		}
   1.262 +	
   1.263 +	// If this is for secondary client and active scheduler(nested loop) has started, this code stops that scheduler
   1.264 +	if (iEventBuffer.Count()==0 && iClient->IsSecondaryClient() && iNestedLoopStarted)
   1.265 +		{
   1.266 +		iNestedLoopStarted = EFalse;
   1.267 +		CActiveScheduler::Stop();
   1.268 +		}
   1.269 +	}
   1.270 +
   1.271 +void CTMultiPtrEventBuffer::TestL(TInt aTest)
   1.272 +	{
   1.273 +	if (!aTest)
   1.274 +		{
   1.275 +		iTest->Failed();
   1.276 +		User::Leave(ETestFailed);
   1.277 +		}
   1.278 +	}
   1.279 +
   1.280 +static void DumpEvent(const char *aName, const TWsEvent *aEvent)
   1.281 +    {
   1.282 +    // aEvent may be NULL - if it isn't NULL, we print it's data.
   1.283 +    if (aEvent)
   1.284 +        {
   1.285 +        RDebug::Printf("%s:", aName);
   1.286 +        RDebug::Printf("handle = %u", aEvent->Handle());
   1.287 +        RDebug::Printf("type() = %d", aEvent->Type());
   1.288 +        if (aEvent->Type() == EEventPointer)
   1.289 +            {
   1.290 +            TAdvancedPointerEvent *pointer = aEvent->Pointer();
   1.291 +            RDebug::Printf("pointer type = %d, position = (%d, %d)", 
   1.292 +                    pointer->iType, pointer->iPosition.iX, pointer->iPosition.iY);
   1.293 +            RDebug::Printf("PointerNumber() = %d, proximity=%d, pressure=%d", 
   1.294 +                    pointer->PointerNumber(), pointer->Proximity(), pointer->Pressure());
   1.295 +            RDebug::Printf("modifiers = 0x%08x", pointer->iModifiers);
   1.296 +            }
   1.297 +        else
   1.298 +            {
   1.299 +            RDebug::Printf("Not a pointer event, event type");
   1.300 +            }
   1.301 +        }
   1.302 +    else
   1.303 +        {
   1.304 +        // aEvent is NULL, just let us know it is. 
   1.305 +        RDebug::Printf("%s: is NULL which means not applicapable");
   1.306 +        }
   1.307 +    }
   1.308 +
   1.309 +void CTMultiPtrEventBuffer::TestL(TInt aTest, TInt aVal1, TInt aVal2, const char *aOper, const char *aTestStr, 
   1.310 +        const TWsEvent *aEvent, const TWsEvent *aExpected, const char *aFile, TUint aLine)
   1.311 +    {
   1.312 +    if (!aTest)
   1.313 +        {
   1.314 +        RDebug::Printf("Expression %d %s %d [%s] (=%d) failed [call from %s:%d]", aVal1, aOper, aVal2, aTestStr, aTest, aFile, aLine);
   1.315 +        DumpEvent("actual", aEvent);
   1.316 +        DumpEvent("expected", aExpected);
   1.317 +        iTest->Failed();
   1.318 +        User::Leave(ETestFailed);
   1.319 +        }
   1.320 +    }
   1.321 +
   1.322 +
   1.323 +void CTMultiPtrEventBuffer::TestL(TInt aTest, TPoint aVal1, TPoint aVal2, const char *oper, const char *aTestStr, 
   1.324 +        const TWsEvent *aEvent, const TWsEvent *aExpected, const char *aFile, TUint aLine)
   1.325 +    {
   1.326 +    if (!aTest)
   1.327 +        {
   1.328 +        RDebug::Printf("Expression (%d, %d) %s (%d, %d) [%s] (=%d) failed [call from %s:%d]", 
   1.329 +                aVal1.iX, aVal1.iY, oper, aVal2.iX, aVal2.iY, aTestStr, aTest, aFile, aLine);
   1.330 +        DumpEvent("actual", aEvent);
   1.331 +        DumpEvent("expected", aExpected);
   1.332 +        iTest->Failed();
   1.333 +        User::Leave(ETestFailed);
   1.334 +        }
   1.335 +    }
   1.336 +
   1.337 +//CTMultiPtrEventClient
   1.338 +CTMultiPtrEventClient::CTMultiPtrEventClient(CTMultiPtrEventTest *aTest, TBool aSecondaryClient) 
   1.339 +	: iTest(aTest), iSecondaryClient(aSecondaryClient)
   1.340 +	{
   1.341 +	}
   1.342 +
   1.343 +CTMultiPtrEventClient::~CTMultiPtrEventClient()
   1.344 +	{
   1.345 +	if (iWinAutoFocus1 || iWinAutoFocus2 || iGroupWinAutoFocus2 || iGroupWinAutoFocus1)
   1.346 +		{
   1.347 +		DeleteGroupBlankWin();
   1.348 +		}
   1.349 +	delete iChildWin;
   1.350 +	delete iParentWin;
   1.351 +	}
   1.352 +
   1.353 +void CTMultiPtrEventClient::ConstructL()
   1.354 +	{
   1.355 +	CTClient::ConstructL();
   1.356 +	
   1.357 +	// Create a group window and assign it iGroup
   1.358 +	iGroup = new(ELeave) CTWindowGroup(this);
   1.359 +	iGroup->ConstructL();
   1.360 +	
   1.361 +	iParentWinSize = iScreen->SizeInPixels();
   1.362 +	iParentWinPos = TPoint();
   1.363 +	
   1.364 +	// Change the parent window size and position for secondary client
   1.365 +	if (iSecondaryClient)
   1.366 +		{
   1.367 +		iParentWinSize.iWidth /= 2; 
   1.368 +		iParentWinPos.iX = iParentWinSize.iWidth;
   1.369 +		}
   1.370 +	
   1.371 +	// Create window/s for this client so that events can come to this client
   1.372 +	iParentWin=new(ELeave) CTBlankWindow();
   1.373 +	iParentWin->ConstructL(*iGroup);
   1.374 +	iParentWin->SetExt(iParentWinPos, iParentWinSize);
   1.375 +	iParentWin->SetColor(KRgbRed);
   1.376 +	if (iTest->TestBase()->iState != 12)
   1.377 +		{
   1.378 +		iParentWin->BaseWin()->EnableAdvancedPointers();
   1.379 +		}
   1.380 +	iParentWin->Activate();
   1.381 +	
   1.382 +	// Don't create child window for secodary client
   1.383 +	if (!iSecondaryClient)
   1.384 +		{
   1.385 +		iChildWinSize = TSize(iParentWinSize.iWidth/2, iParentWinSize.iHeight);
   1.386 +		iChildWinPos = TPoint(iParentWinSize.iWidth/2,0);
   1.387 +		
   1.388 +		iChildWin=new(ELeave) CTBlankWindow();
   1.389 +		iChildWin->ConstructL(*iGroup);
   1.390 +		iChildWin->SetExt(iChildWinPos, iChildWinSize);
   1.391 +		iChildWin->SetColor(KRgbRed);
   1.392 +		iChildWin->BaseWin()->EnableAdvancedPointers();
   1.393 +		iChildWin->Activate();
   1.394 +		}
   1.395 +	}
   1.396 +
   1.397 +void CTMultiPtrEventClient::CalculatePtrPosAndSet3Ddata(TWsEvent& aEvent, TPointerEvent::TType aType, TPoint aPos, TUint aModifiers, TInt aZ, TUint8 aPointerNumber, TUint aHandle)
   1.398 +	{
   1.399 +	// If in future you need to change parent position then put this in corresponding if statements
   1.400 +	aEvent.Pointer()->iParentPosition = aPos;
   1.401 +	
   1.402 +	// This is for Auto foreground test
   1.403 +	if (iTest->TestBase()->iState == 11)
   1.404 +		{
   1.405 +		if (TRect(iWinPosAutoFocus1, iWinSizeAutoFocus1).Contains(aPos))
   1.406 +			{
   1.407 +			aPos -= iWinPosAutoFocus1;
   1.408 +			aEvent.SetHandle((TUint)iWinAutoFocus1);
   1.409 +			}
   1.410 +		else if (TRect(iWinPosAutoFocus2, iWinSizeAutoFocus2).Contains(aPos))
   1.411 +			{
   1.412 +			aPos -= iWinPosAutoFocus2;
   1.413 +			aEvent.SetHandle((TUint)iWinAutoFocus2);
   1.414 +			}
   1.415 +		goto SETOTHERDATA;
   1.416 +		}
   1.417 +
   1.418 +	// Here simulated pointer position is w.r.t to 0,0
   1.419 +	// Actual pointer position is w.r.t windowPosition
   1.420 +	if (iSecondaryClient)
   1.421 +		{
   1.422 +		if (TRect(iParentWinPos, TSize(iParentWinSize.iWidth, iParentWinSize.iHeight)).Contains(aPos))
   1.423 +			{
   1.424 +			// Since for secondary client parent window is at half of screensize
   1.425 +			aPos -= iParentWinPos;
   1.426 +			aEvent.SetHandle((aHandle == 0) ? (TUint)iParentWin : aHandle);
   1.427 +			}
   1.428 +		}
   1.429 +	else
   1.430 +		{
   1.431 +		// If sent position is on blankWindow then
   1.432 +		if (TRect(iParentWinPos, TSize(iParentWinSize.iWidth/2, iParentWinSize.iHeight)).Contains(aPos))
   1.433 +			{
   1.434 +			aEvent.SetHandle((aHandle == 0) ? (TUint)iParentWin : aHandle);
   1.435 +			}
   1.436 +		else // else the pointer event occured on child window
   1.437 +			{
   1.438 +			// if aPos < 0 then position has been generated in test code and should not be adjusted
   1.439 +			if (aPos.iX >= 0)
   1.440 +				{
   1.441 +				aPos -= iChildWinPos;	
   1.442 +				}
   1.443 +			aEvent.SetHandle((aHandle == 0) ? (TUint)iChildWin : aHandle);
   1.444 +			}
   1.445 +		}
   1.446 +	
   1.447 +SETOTHERDATA:	
   1.448 +	aEvent.Pointer()->iType = aType;
   1.449 +	aEvent.Pointer()->iPosition = aPos;
   1.450 +	if(iExpectNonAdvancedPointerEvents)
   1.451 +		{
   1.452 +		aEvent.Pointer()->iModifiers = aModifiers;		
   1.453 +		}
   1.454 +	else
   1.455 +		{
   1.456 +		aEvent.Pointer()->iModifiers = aModifiers|EModifierAdvancedPointerEvent;
   1.457 +		aEvent.SetPointerNumber(aPointerNumber);
   1.458 +		aEvent.SetPointerZ(aZ);
   1.459 +		}
   1.460 +	}
   1.461 +
   1.462 +void CTMultiPtrEventClient::AddExpectedPointerEvent(TPointerEvent::TType aType, TPoint aPos, TUint8 aPointerNumber, TUint aHandle)
   1.463 +	{
   1.464 +	AddExpectedPointerEvent(aType, aPos, 0, 0, aPointerNumber, aHandle);
   1.465 +	}
   1.466 +
   1.467 +void CTMultiPtrEventClient::AddExpectedPointerEvent(TPointerEvent::TType aType, TPoint aPos, TInt aZ, TUint aModifier, TUint8 aPointerNumber, TUint aHandle)
   1.468 +	{
   1.469 +	TWsEvent ptrEvent;
   1.470 +	ptrEvent.SetType(EEventPointer);
   1.471 +	if (aType != TPointerEvent::ESwitchOn)
   1.472 +		{
   1.473 +		CalculatePtrPosAndSet3Ddata(ptrEvent, aType, aPos, aModifier, aZ, aPointerNumber, aHandle);
   1.474 +		}
   1.475 +	static_cast<CTMultiPtrEventBuffer*>(iEventHandler)->AddExpectedEvent(ptrEvent);
   1.476 +	}
   1.477 +
   1.478 +void CTMultiPtrEventClient::AddExpectedWsEvent(TEventCode aType, TInt aPointerNumber, TUint aHandle)
   1.479 +	{
   1.480 +	TWsEvent ptrEvent;
   1.481 +	ptrEvent.SetType(aType);
   1.482 +	if (aType == EEventPointerEnter || aType == EEventPointerExit)
   1.483 +		{
   1.484 +		*ptrEvent.Int() = aPointerNumber;
   1.485 +		}
   1.486 +	if (aType == EEventPointerBufferReady)
   1.487 +		{
   1.488 +		ptrEvent.SetHandle(aHandle);
   1.489 +		}
   1.490 +	static_cast<CTMultiPtrEventBuffer*>(iEventHandler)->AddExpectedEvent(ptrEvent);
   1.491 +	}
   1.492 +
   1.493 +void CTMultiPtrEventClient::AddExpectedMovePoint(TPoint aPos)
   1.494 +	{
   1.495 +	static_cast<CTMultiPtrEventBuffer*>(iEventHandler)->AddExpectedMovePtEvent(aPos);
   1.496 +	}
   1.497 +
   1.498 +// Create and store CTMultiPtrEventBuffer in iEventHandler
   1.499 +void CTMultiPtrEventClient::ConstructEventHandlerL()
   1.500 +	{
   1.501 +	CTMultiPtrEventBuffer* eventBufferAndHandler = new(ELeave) CTMultiPtrEventBuffer(&iWs, iTest, this);
   1.502 +	eventBufferAndHandler->ConstructL();
   1.503 +	iEventHandler = eventBufferAndHandler;
   1.504 +	}
   1.505 +
   1.506 +// Create groupwindow and blank window for AutoFocus tests
   1.507 +void CTMultiPtrEventClient::ConstructGroupBlankWinL()
   1.508 +	{
   1.509 +	iWinPosAutoFocus1 = TPoint(10,10);
   1.510 +	iWinSizeAutoFocus1 = TSize(40,40);
   1.511 +	
   1.512 +	iWinPosAutoFocus2 = TPoint(50,50);
   1.513 +	iWinSizeAutoFocus2 = TSize(80,80);
   1.514 +	
   1.515 +	iGroupWinAutoFocus1 = new(ELeave) CTWindowGroup(this);
   1.516 +	iGroupWinAutoFocus1->ConstructL();
   1.517 +	iGroupWinAutoFocus1->GroupWin()->AutoForeground(ETrue);
   1.518 +	iGroupWinAutoFocus1->GroupWin()->EnableFocusChangeEvents();
   1.519 +	
   1.520 +	iGroupWinAutoFocus2 = new(ELeave) CTWindowGroup(this);
   1.521 +	iGroupWinAutoFocus2->ConstructL();
   1.522 +	iGroupWinAutoFocus2->GroupWin()->AutoForeground(ETrue);
   1.523 +	iGroupWinAutoFocus2->GroupWin()->EnableFocusChangeEvents();
   1.524 +	
   1.525 +	iWinAutoFocus1=new(ELeave) CTBlankWindow();
   1.526 +	iWinAutoFocus1->ConstructL(*iGroupWinAutoFocus1);
   1.527 +	iWinAutoFocus1->SetExt(iWinPosAutoFocus1, iWinSizeAutoFocus1);
   1.528 +	iWinAutoFocus1->SetColor(KRgbDarkYellow);
   1.529 +	iWinAutoFocus1->BaseWin()->EnableAdvancedPointers();
   1.530 +	iWinAutoFocus1->Activate();
   1.531 +	
   1.532 +	iWinAutoFocus2=new(ELeave) CTBlankWindow();
   1.533 +	iWinAutoFocus2->ConstructL(*iGroupWinAutoFocus2);
   1.534 +	iWinAutoFocus2->SetExt(iWinPosAutoFocus2, iWinSizeAutoFocus2);
   1.535 +	iWinAutoFocus2->SetColor(KRgbDarkCyan);
   1.536 +	iWinAutoFocus2->BaseWin()->EnableAdvancedPointers();
   1.537 +	iWinAutoFocus2->Activate();
   1.538 +	}
   1.539 +
   1.540 +void CTMultiPtrEventClient::DeleteGroupBlankWin()
   1.541 +	{
   1.542 +	delete iWinAutoFocus2;
   1.543 +	iWinAutoFocus2 = NULL;
   1.544 +	delete iGroupWinAutoFocus2;
   1.545 +	iGroupWinAutoFocus2 = NULL;
   1.546 +	delete iWinAutoFocus1;
   1.547 +	iWinAutoFocus1 = NULL;
   1.548 +	delete iGroupWinAutoFocus1;
   1.549 +	iGroupWinAutoFocus1 = NULL;
   1.550 +	}
   1.551 +
   1.552 +TBool CTMultiPtrEventClient::CheckOrdinalPosition(TInt aAutoFocusWin)
   1.553 +	{
   1.554 +	if (aAutoFocusWin == 1)
   1.555 +		{
   1.556 +		return iWinAutoFocus1->BaseWin()->OrdinalPosition() == 0;
   1.557 +		}
   1.558 +	else
   1.559 +		{
   1.560 +		return iWinAutoFocus2->BaseWin()->OrdinalPosition() == 0;
   1.561 +		}
   1.562 +	}
   1.563 +
   1.564 +//CTMultiPtrEventTest
   1.565 +CTMultiPtrEventTest::CTMultiPtrEventTest(CTestStep* aStep)
   1.566 +	: CTWsGraphicsBase(aStep)
   1.567 +	{
   1.568 +	}
   1.569 +
   1.570 +CTMultiPtrEventTest::~CTMultiPtrEventTest()
   1.571 +	{
   1.572 +	((CTMultiPtrEventTestStep*)iStep)->CloseTMSGraphicsStep();
   1.573 +	delete iMultiPtrEventClient;
   1.574 +	DestroyAnimDllAndAnim();	
   1.575 +	if (iPtrPluginLoaded)
   1.576 +		{
   1.577 +		iClick.Unload();
   1.578 +		}
   1.579 +	iClick.Close();
   1.580 +	if (iHeap)
   1.581 +		{
   1.582 +		iHeap->Close();
   1.583 +		iChunk.Close();
   1.584 +		}
   1.585 +	DeleteGroupWin();
   1.586 +	}
   1.587 +
   1.588 +void CTMultiPtrEventTest::ConstructL()
   1.589 +	{
   1.590 +	// Here check if the HAL configuration are correct if not then finish the test case
   1.591 +	TInt ret = HAL::Get(HALData::EPointerMaxPointers, iMaxDevPointers);
   1.592 +	if (ret != KErrNone || iMaxDevPointers < 2 || iMaxDevPointers > 8)
   1.593 +		{
   1.594 +		TLogMessageText logText1;
   1.595 +		_LIT(KWrongHALConfig, "HAL configuration are incorrect. \n");
   1.596 +		logText1.Append(KWrongHALConfig);
   1.597 +		LOG_MESSAGE(logText1);
   1.598 +		TEST(EFalse);
   1.599 +		User::Leave(ret);
   1.600 +		}
   1.601 +	
   1.602 +	// Get the data by using HAL api
   1.603 +  	User::LeaveIfError(HAL::Get(HALData::EPointerMaxPointers,iMaxDevPointers));
   1.604 +  	User::LeaveIfError(HAL::Get(HALData::EPointerNumberOfPointers,iMaxUiPointers));
   1.605 +  	User::LeaveIfError(HAL::Get(HALData::EPointer3DMaxPressure, iMaxPressure));
   1.606 +  	User::LeaveIfError(HAL::Get(HALData::EPointer3DPressureStep, iPressureStep));
   1.607 +  	User::LeaveIfError(HAL::Get(HALData::EPointer3DMaxProximity, iMaxProximity));
   1.608 +  	User::LeaveIfError(HAL::Get(HALData::EPointer3DProximityStep, iProximityStep));
   1.609 +	
   1.610 +    _LIT(KWsIniFile, "z:\\system\\data\\wsini.ini");
   1.611 +    CIniData* iniData = CIniData::NewL(KWsIniFile, ' ');
   1.612 +    _LIT( KWsiniYShifting, "YSHIFTING");
   1.613 +    iniData->FindVar(KWsiniYShifting, iYOffset);
   1.614 +    delete iniData;
   1.615 +	TheClient->iScreen->SetAppScreenMode(0);
   1.616 +	TheClient->iScreen->SetScreenMode(0);
   1.617 +	iPhysicalScreenSize = TheClient->iScreen->SizeInPixels();
   1.618 +	
   1.619 +	TheGc->Activate(*BaseWin->Win());
   1.620 +	TheGc->SetBrushColor(TRgb::Gray16(12));
   1.621 +	TheGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
   1.622 +	TheGc->SetPenStyle(CGraphicsContext::ENullPen);
   1.623 +	TheGc->DrawRect(TRect(BaseWin->Win()->Size()));
   1.624 +	TheGc->Deactivate();
   1.625 +	
   1.626 +	TheGc->Activate(*TestWin->Win());
   1.627 +	TheGc->SetBrushColor(TRgb::Gray16(4));
   1.628 +	TheGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
   1.629 +	TheGc->SetPenStyle(CGraphicsContext::ENullPen);
   1.630 +	TheGc->DrawRect(TRect(TestWin->Win()->Size()));
   1.631 +	TheGc->Deactivate();
   1.632 +	
   1.633 +	TheClient->iWs.Flush();
   1.634 +	}
   1.635 +
   1.636 +// Create raw event setting type, X, Y, Z and pointernumber for rawevent
   1.637 +// use UserSvr for simulating the event
   1.638 +void CTMultiPtrEventTest::SimulatePointerEvent(TRawEvent::TType aType, TInt aX, TInt aY, TUint8 aPointerNumber)
   1.639 +	{
   1.640 +	TRawEvent rawEvent;
   1.641 +	rawEvent.Set(aType, aX, aY+iYOffset, aPointerNumber);
   1.642 +	UserSvr::AddEvent(rawEvent);
   1.643 +	}
   1.644 +
   1.645 +void CTMultiPtrEventTest::SimulatePointerEvent(TRawEvent::TType aType, TInt aX, TInt aY, TInt aZ, TUint8 aPointerNumber)
   1.646 +	{
   1.647 +	TRawEvent rawEvent;
   1.648 +	rawEvent.Set(aType, aX, aY+iYOffset, aZ, aPointerNumber);
   1.649 +	UserSvr::AddEvent(rawEvent);
   1.650 +	}
   1.651 +
   1.652 +// Simulate multipointer down and up event
   1.653 +void CTMultiPtrEventTest::SimulatePointerDownUp(TInt aX, TInt aY, TInt aZ, TUint8 aPointerNumber)
   1.654 +	{
   1.655 +	SimulatePointerEvent(TRawEvent::EButton1Down, aX, aY, aZ, aPointerNumber);
   1.656 +	SimulatePointerEvent(TRawEvent::EButton1Up, aX, aY, aZ, aPointerNumber);
   1.657 +	}
   1.658 +
   1.659 +void CTMultiPtrEventTest::AddExpectedKey(TInt aEventCode, TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=0*/)
   1.660 +	{
   1.661 +	TPckgBuf<TWsEvent> evtPkg;
   1.662 +	TWsEvent& event=evtPkg();
   1.663 +	if (aEventCode==EEventKey && aCode==0)
   1.664 +		aCode=aScanCode;
   1.665 +	event.SetType(aEventCode);
   1.666 +	event.SetHandle((TUint)iMultiPtrEventClient->iGroup);
   1.667 +	event.Key()->iCode=aCode;
   1.668 +	event.Key()->iScanCode=aScanCode;
   1.669 +	event.Key()->iModifiers=aModifiers;
   1.670 +	event.Key()->iRepeats=aRepeats;
   1.671 +	iMultiPtrEventClient->EventBuffer()->AddExpectedEvent(event);
   1.672 +	}
   1.673 +
   1.674 +void CTMultiPtrEventTest::AddExpectedKeyDownUp(TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=0*/)
   1.675 +	{
   1.676 +	__ASSERT_DEBUG(aScanCode<'a' || aScanCode>'z',AutoPanic(EAutoPanicScanCapital));
   1.677 +	AddExpectedKey(EEventKeyDown,aScanCode,0,aRepeats,aModifiers);
   1.678 +	AddExpectedKey(EEventKey,aScanCode,aCode,aRepeats,aModifiers);
   1.679 +	AddExpectedKey(EEventKeyUp,aScanCode,0,aRepeats,aModifiers);
   1.680 +	}
   1.681 +
   1.682 +void CTMultiPtrEventTest::AddExpectedPointerEvent(TPointerEvent::TType aType, TPoint aPos, TUint8 aPointerNumber, TUint aHandle)
   1.683 +	{
   1.684 +	AddExpectedPointerEvent(aType, aPos, 0, 0, aPointerNumber, aHandle);
   1.685 +	}
   1.686 +
   1.687 +void CTMultiPtrEventTest::AddExpectedPointerEvent(TPointerEvent::TType aType, TPoint aPos, TInt aZ, TUint aModifier, TUint8 aPointerNumber, TUint aHandle, TBool aSecondaryClient)
   1.688 +	{
   1.689 +	if (aSecondaryClient)
   1.690 +		{
   1.691 +		iSecMultiPtrEventClient->AddExpectedPointerEvent(aType, aPos, aZ, aModifier, aPointerNumber, aHandle);
   1.692 +		}
   1.693 +	else
   1.694 +		{
   1.695 +		iMultiPtrEventClient->AddExpectedPointerEvent(aType, aPos, aZ, aModifier, aPointerNumber, aHandle);
   1.696 +		}
   1.697 +	}
   1.698 +
   1.699 +void CTMultiPtrEventTest::SetExpectNonAdvancedPointerEvents(TBool aSecondaryClient)
   1.700 +	{
   1.701 +	if (aSecondaryClient)
   1.702 +		{
   1.703 +		iSecMultiPtrEventClient->SetExpectNonAdvancedPointerEvents();
   1.704 +		}
   1.705 +	else
   1.706 +		{
   1.707 +		iMultiPtrEventClient->SetExpectNonAdvancedPointerEvents();
   1.708 +		}
   1.709 +	}
   1.710 +
   1.711 +void CTMultiPtrEventTest::ClearExpectNonAdvancedPointerEvents(TBool aSecondaryClient)
   1.712 +	{
   1.713 +	if (aSecondaryClient)
   1.714 +		{
   1.715 +		iSecMultiPtrEventClient->ClearExpectNonAdvancedPointerEvents();
   1.716 +		}
   1.717 +	else
   1.718 +		{
   1.719 +		iMultiPtrEventClient->ClearExpectNonAdvancedPointerEvents();
   1.720 +		}
   1.721 +	}
   1.722 +
   1.723 +void CTMultiPtrEventTest::AddExpectedPointerDownUp(TPoint aPos, TInt aZ, TUint8 aPointerNumber)
   1.724 +	{
   1.725 +	AddExpectedPointerEvent(TPointerEvent::EButton1Down, aPos, aZ, 0, aPointerNumber);
   1.726 +	AddExpectedPointerEvent(TPointerEvent::EButton1Up, aPos, aZ, 0, aPointerNumber);
   1.727 +	}
   1.728 +
   1.729 +void CTMultiPtrEventTest::AddExpectedWsEvent(TEventCode aType, TBool aSecondaryClient, TInt aPointerNumber, TUint aHandle)
   1.730 +	{
   1.731 +	if (aSecondaryClient)
   1.732 +		{
   1.733 +		iSecMultiPtrEventClient->AddExpectedWsEvent(aType);
   1.734 +		}
   1.735 +	else
   1.736 +		{
   1.737 +		iMultiPtrEventClient->AddExpectedWsEvent(aType, aPointerNumber, aHandle);
   1.738 +		}
   1.739 +	}
   1.740 +
   1.741 +void CTMultiPtrEventTest::TestDragForMultiPointer(TPoint aPtrPos, TInt aPrValue, TUint8 aPointerNumber)
   1.742 +	{
   1.743 +	SimulatePointerEvent(TRawEvent::EButton1Down, aPtrPos.iX, aPtrPos.iY, aPrValue, aPointerNumber);
   1.744 +	SimulatePointerEvent(TRawEvent::EPointerMove, aPtrPos.iX+2, aPtrPos.iY+1, aPrValue, aPointerNumber);
   1.745 +	SimulatePointerEvent(TRawEvent::EButton1Up, aPtrPos.iX+2, aPtrPos.iY+1, 0, aPointerNumber);
   1.746 +	AddExpectedPointerEvent(TPointerEvent::EButton1Down, aPtrPos, aPrValue, 0, aPointerNumber);
   1.747 +	aPtrPos.iX += 2; aPtrPos.iY += 1;
   1.748 +	AddExpectedPointerEvent(TPointerEvent::EDrag, aPtrPos, aPrValue, 0, aPointerNumber);
   1.749 +	AddExpectedPointerEvent(TPointerEvent::EButton1Up, aPtrPos, 0, 0, aPointerNumber);
   1.750 +	}
   1.751 +
   1.752 +void CTMultiPtrEventTest::SimulateAndAddLoneUpEvents(TInt aNumSimulation, TInt aNumAddition, TPoint aPos)
   1.753 +	{
   1.754 +	for (TInt count = 0; count < aNumSimulation; count++)
   1.755 +		{
   1.756 +		SimulatePointerEvent(TRawEvent::EButton1Up, aPos.iX, aPos.iY, 0, 0);
   1.757 +		}
   1.758 +	for (TInt count = 0; count < aNumAddition; count++)
   1.759 +		{
   1.760 +		AddExpectedPointerEvent(TPointerEvent::EButton1Up, aPos, 0, 0, 0);
   1.761 +		}
   1.762 +	}
   1.763 +
   1.764 +void CTMultiPtrEventTest::TestFilteringForMultiPointer(TBool aFiltering)
   1.765 +	{
   1.766 +	TPoint ptrPos;
   1.767 +	TInt ptrNum;
   1.768 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
   1.769 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
   1.770 +	
   1.771 +	for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
   1.772 +		{
   1.773 +		SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.774 +		SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.775 +		if(!aFiltering)
   1.776 +			{
   1.777 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, ptrNum);
   1.778 +			}
   1.779 +		AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
   1.780 +		ptrPos.iX += xInc/2;
   1.781 +		ptrPos.iY += yInc/2;
   1.782 +		}
   1.783 +	
   1.784 +	ptrPos.SetXY(0,0);
   1.785 +	TPoint interPt = ptrPos;
   1.786 +	for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
   1.787 +		{
   1.788 +		SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX+2, interPt.iY+1, 0, ptrNum);
   1.789 +		SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX+4, interPt.iY+2, 0, ptrNum);
   1.790 +		SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX+6, interPt.iY+3, 0, ptrNum);
   1.791 +		if(!aFiltering)
   1.792 +			{
   1.793 +			interPt.iX += 6; interPt.iY += 3;
   1.794 +			AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, ptrNum);
   1.795 +			}
   1.796 +		ptrPos.iX += xInc/2;
   1.797 +		ptrPos.iY += yInc/2;
   1.798 +		interPt = ptrPos; 
   1.799 +		}
   1.800 +
   1.801 +	ptrPos.SetXY(0,0);
   1.802 +	interPt = ptrPos;
   1.803 +	for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
   1.804 +		{
   1.805 +		interPt.iX += 6;
   1.806 +		interPt.iY += 3;
   1.807 +		SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
   1.808 +		AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, ptrNum);
   1.809 +		ptrPos.iX += xInc/2;
   1.810 +		ptrPos.iY += yInc/2;
   1.811 +		interPt = ptrPos; 
   1.812 +		}
   1.813 +	}
   1.814 +
   1.815 +void CTMultiPtrEventTest::TestGrabbingForMultiPointer(TBool aGrabbing)
   1.816 +	{
   1.817 +	TPoint ptrPos;
   1.818 +	TInt ptrNum;
   1.819 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
   1.820 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
   1.821 +	
   1.822 +	for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
   1.823 +		{
   1.824 +		SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.825 +		AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
   1.826 +		ptrPos.iX += xInc/3;	// Ensure all Button1Down events are on iParentWin
   1.827 +		ptrPos.iY += yInc/3;
   1.828 +		}
   1.829 +	
   1.830 +	ptrPos.SetXY(0,0);
   1.831 +	ptrPos.iX += iPhysicalScreenSize.iWidth/2;		// Ensure all Drag and Button1Up events are on iChildWin
   1.832 +	ptrPos.iY += iPhysicalScreenSize.iHeight/2;
   1.833 +	for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
   1.834 +		{
   1.835 +		SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.836 +		if(aGrabbing)
   1.837 +			{
   1.838 +			// CalculatePtrPosAndSet3Ddata will subtract iChildWinPos from ptrPos if pointer event occured on child window. Thus we add iChildWinPos here.
   1.839 +			AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos+iMultiPtrEventClient->ChildWin()->Position(), ptrNum, (TUint)iMultiPtrEventClient->ParentWin());	
   1.840 +			}
   1.841 +		else
   1.842 +			{
   1.843 +			AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos, ptrNum);
   1.844 +			}
   1.845 +		ptrPos.iX += xInc/3;
   1.846 +		ptrPos.iY += yInc/3; 
   1.847 +		}
   1.848 +
   1.849 +	ptrPos.SetXY(0,0);
   1.850 +	ptrPos.iX += iPhysicalScreenSize.iWidth/2;
   1.851 +	ptrPos.iY += iPhysicalScreenSize.iHeight/2;
   1.852 +	for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
   1.853 +		{
   1.854 +		SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.855 +		if(aGrabbing)
   1.856 +			{
   1.857 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos+iMultiPtrEventClient->ChildWin()->Position(), ptrNum, (TUint)iMultiPtrEventClient->ParentWin());
   1.858 +			}
   1.859 +		else
   1.860 +			{
   1.861 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
   1.862 +			}
   1.863 +		ptrPos.iX += xInc/3;
   1.864 +		ptrPos.iY += yInc/3;
   1.865 +		}
   1.866 +	}
   1.867 +
   1.868 +void CTMultiPtrEventTest::TestCapturingForMultiPointer(TBool aAllWinGroups)
   1.869 +	{
   1.870 +	TPoint ptrPos;
   1.871 +	TInt ptrNum = 0;
   1.872 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
   1.873 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
   1.874 +	
   1.875 +	// These are some typical values which are used only for testing purposes.
   1.876 +	// 20mm to screen
   1.877 +	// 50mm to screen
   1.878 +	// 4N of pressure
   1.879 +	// 2N of pressure
   1.880 +	SetThresholdValues(-20,-50,4000,2000);
   1.881 +	
   1.882 +	iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerMoveEvents, 0);
   1.883 +	
   1.884 +	if(!aAllWinGroups)
   1.885 +		{
   1.886 +		for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
   1.887 +			{
   1.888 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, -30, ptrNum);
   1.889 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), -30, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.890 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, -10, ptrNum);
   1.891 +			AddExpectedPointerEvent(TPointerEvent::EEnterCloseProximity, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), -10, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.892 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.893 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), 0, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.894 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+=2, ptrPos.iY+=2, 5000, ptrNum);
   1.895 +			AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), 5000, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.896 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX-=2, ptrPos.iY-=2, 1000, ptrNum);
   1.897 +			AddExpectedPointerEvent(TPointerEvent::EExitHighPressure, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), 1000, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.898 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+=2, ptrPos.iY+=2, 1000, ptrNum);
   1.899 +			AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), 1000, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.900 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.901 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), 0, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.902 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX-=2, ptrPos.iY-=2, -60, ptrNum);
   1.903 +			AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos-iMultiPtrEventClient->ChildWin()->Position(), -60, 0, ptrNum, (TInt)iMultiPtrEventClient->ChildWin());
   1.904 +			ptrPos.iX += xInc/3;	// Ensure all Pointer events are on iParentWin
   1.905 +			ptrPos.iY += yInc/3;
   1.906 +			}		
   1.907 +		}
   1.908 +	else
   1.909 +		{
   1.910 +		ptrPos.iX = iPhysicalScreenSize.iWidth/2 + xInc/3;
   1.911 +		ptrPos.iY = 0;
   1.912 +		 		
   1.913 +		for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
   1.914 +			{
   1.915 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, -10, ptrNum);
   1.916 +			AddExpectedPointerEvent(TPointerEvent::EEnterCloseProximity, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), -10, 0, ptrNum, (TInt)iWinForCapturing);
   1.917 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.918 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 0, 0, ptrNum, (TInt)iWinForCapturing);		
   1.919 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+=2, ptrPos.iY+=2, 5000, ptrNum);
   1.920 +			AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 5000, 0, ptrNum, (TInt)iWinForCapturing);			
   1.921 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX-=2, ptrPos.iY-=2, 1000, ptrNum);
   1.922 +			AddExpectedPointerEvent(TPointerEvent::EExitHighPressure, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 1000, 0, ptrNum, (TInt)iWinForCapturing);
   1.923 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+=2, ptrPos.iY+=2, 1000, ptrNum);
   1.924 +			AddExpectedPointerEvent(TPointerEvent::EDrag, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 1000, 0, ptrNum, (TInt)iWinForCapturing);
   1.925 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
   1.926 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 0, 0, ptrNum, (TInt)iWinForCapturing);
   1.927 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
   1.928 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, TPoint(ptrPos.iX+iPhysicalScreenSize.iWidth/2, ptrPos.iY), 0, 0, ptrNum, (TInt)iWinForCapturing);
   1.929 +			ptrPos.iX += xInc/3;	
   1.930 +			ptrPos.iY += yInc/3;
   1.931 +			}
   1.932 +		}
   1.933 +	}
   1.934 +
   1.935 +void CTMultiPtrEventTest::SetAutoFlush()
   1.936 +	{
   1.937 +	iTheClientFlush = TheClient->iWs.SetAutoFlush(ETrue);
   1.938 +	iClientFlush = iMultiPtrEventClient->iWs.SetAutoFlush(ETrue);
   1.939 +	}
   1.940 +
   1.941 +void CTMultiPtrEventTest::ResetFlushStopAS()
   1.942 +	{
   1.943 +	if (iActiveSchedulerStarted)
   1.944 +		{
   1.945 +		iActiveSchedulerStarted = EFalse;
   1.946 +		CActiveScheduler::Stop();
   1.947 +		}
   1.948 +	TheClient->iWs.SetAutoFlush(iTheClientFlush);
   1.949 +	iMultiPtrEventClient->iWs.SetAutoFlush(iClientFlush);
   1.950 +	}
   1.951 +
   1.952 +// Common function for all test cases
   1.953 +void CTMultiPtrEventTest::RunTestsL()
   1.954 +	{
   1.955 +	// Create CTMultiPtrEventClient for each test case and call NextSetOfEventsL()
   1.956 +	iMultiPtrEventClient = new(ELeave) CTMultiPtrEventClient(this);
   1.957 +	iMultiPtrEventClient->SetScreenNumber(iTest->iScreenNumber);
   1.958 +	iMultiPtrEventClient->ConstructL();
   1.959 +	
   1.960 +	iEventSet=0;
   1.961 +
   1.962 +	// Create secondary client for test case number 3
   1.963 +	if (iTest->iState == 3)
   1.964 +		{
   1.965 +		iSecMultiPtrEventClient = new(ELeave) CTMultiPtrEventClient(this, 1);
   1.966 +		iSecMultiPtrEventClient->SetScreenNumber(iTest->iScreenNumber);
   1.967 +		iSecMultiPtrEventClient->ConstructL(); 
   1.968 +		}
   1.969 +	
   1.970 +	TRAPD(err, NextSetOfEventsL());
   1.971 +	if (err != KErrNone)
   1.972 +		{
   1.973 +		iFailed = ETrue;
   1.974 +		}
   1.975 +
   1.976 +	// Start nested activescheduler if it is not failed for the first attempt
   1.977 +	if (!iFailed)
   1.978 +		{
   1.979 +		iActiveSchedulerStarted = ETrue;
   1.980 +		CActiveScheduler::Start();
   1.981 +		}
   1.982 +
   1.983 +	//
   1.984 +	TInt eventsRem = iMultiPtrEventClient->EventBuffer()->EventsRemaining();
   1.985 +	if (eventsRem > 0)
   1.986 +		{
   1.987 +		iFailed=ETrue;
   1.988 +		}
   1.989 +
   1.990 +	// Delete secondary client for test case number 3
   1.991 +	if (iTest->iState == 3)
   1.992 +		{
   1.993 +		delete iSecMultiPtrEventClient;
   1.994 +		iSecMultiPtrEventClient = NULL;
   1.995 +		}
   1.996 +	
   1.997 +	delete iMultiPtrEventClient;
   1.998 +	iMultiPtrEventClient = NULL;
   1.999 +	}
  1.1000 +
  1.1001 +// Common function for all tests
  1.1002 +// Important point to remember is that this function should not leave when running tests
  1.1003 +void CTMultiPtrEventTest::NextSetOfEventsL()
  1.1004 +	{
  1.1005 +	// For each test case calls its respective tests
  1.1006 +		
  1.1007 +	((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
  1.1008 +	switch (iTest->iState)
  1.1009 +		{
  1.1010 +	case 0:
  1.1011 +/**
  1.1012 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0036
  1.1013 +*/
  1.1014 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0036"));
  1.1015 +		MultiPointerEvents();
  1.1016 +		break;
  1.1017 +	case 1:
  1.1018 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0014"));
  1.1019 +		PurgingMultiPointerEvents();
  1.1020 +		break;
  1.1021 +	case 2:
  1.1022 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0013"));
  1.1023 +		MultiPointerEventsForAnimsL();
  1.1024 +		break;
  1.1025 +	case 3:
  1.1026 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0011"));
  1.1027 +		GetRemainingEventsFromSecondaryClient();	// Does nothing for first time
  1.1028 +		MultiClientMultiPointerEvents();
  1.1029 +		break;
  1.1030 +	case 4:
  1.1031 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0027"));
  1.1032 +		MultiPointerEventsForPointerClickL();
  1.1033 +		break;
  1.1034 +	case 5:
  1.1035 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0028"));
  1.1036 +		MultiPointerEventsInDiffScreenModes();
  1.1037 +		break;
  1.1038 +	case 6:
  1.1039 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0025"));
  1.1040 +		FilteringMultiPointerEvents();
  1.1041 +		break;
  1.1042 +	case 7:
  1.1043 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0021"));
  1.1044 +		GrabbingMultiPointerEvents();
  1.1045 +		break;
  1.1046 +	case 8:
  1.1047 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0031"));
  1.1048 +		VirtualKeyBoardForMultiplePointers();
  1.1049 +		break;
  1.1050 +	case 9:
  1.1051 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0032"));
  1.1052 +		DoubleClickForMultiplePointers();
  1.1053 +		break;
  1.1054 +	case 10:
  1.1055 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0015"));
  1.1056 +		MultiPointerOutOfRangeEvents();
  1.1057 +		break;
  1.1058 +	case 11:
  1.1059 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0026"));
  1.1060 +		AutoForeGroundForMultiplePointersL();
  1.1061 +		break;
  1.1062 +	case 12:
  1.1063 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0029"));
  1.1064 +		EmulationRulesForMultiplePointers();
  1.1065 +		break;
  1.1066 +	case 13:
  1.1067 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0034"));
  1.1068 +		CloseProximityAndHighPressureEventsL();
  1.1069 +		break;
  1.1070 +	case 14:
  1.1071 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0017"));
  1.1072 +		OutOfBoundValueTesting();
  1.1073 +		break;	
  1.1074 +	case 15:
  1.1075 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0019"));
  1.1076 +		CapturingMultiPointerEvents();
  1.1077 +		break;
  1.1078 +	case 16:
  1.1079 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0035"));
  1.1080 +		NegativeTestsForProximityPressureEventsL();
  1.1081 +		break;
  1.1082 +	case 17:
  1.1083 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-ADVANCEDPOINTER-0034"));
  1.1084 +		PointerRepeatEventForMultiplePointers();
  1.1085 +		break;
  1.1086 +	// Any new test case should be added here.
  1.1087 +	// because some of the above tests use testcase number for certain checks
  1.1088 +	default:
  1.1089 +		((CTMultiPtrEventTestStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
  1.1090 +		AutoPanic(EAutoPanicWrongTest);
  1.1091 +		}
  1.1092 +	((CTMultiPtrEventTestStep*)iStep)->RecordTestResultL();
  1.1093 +	}
  1.1094 +
  1.1095 +/**
  1.1096 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0033
  1.1097 +@SYMPREQ				PREQ1226
  1.1098 +@SYMREQ					REQ9677
  1.1099 +@SYMTestPriority		High
  1.1100 +@SYMTestCaseDesc		To check Wserv sends Pointer Repeat Events for all pointers. 
  1.1101 +@SYMTestStatus			Implemented
  1.1102 +
  1.1103 +@SYMTestActions			Simulate events being passed to the client by implementing each discrete test 
  1.1104 +						over 4 seperate test cases. 
  1.1105 +						In the first test case simulate EButton1Down and add event to a TWsEvent buffer. 
  1.1106 +						In the second test case call RequestPointerRepeatEvent on the base window passing 
  1.1107 +						in a time interval,	a rectangle (the 'hitbox') and pointer number. 
  1.1108 +						Add EButtonRepeat to TWsEvent buffer.  
  1.1109 +						In the third test case simulate EPointerMove event within the hitbox, then simulate 
  1.1110 +						an elapsed period of time longer that specified interval. Add only a EButtonRepeat
  1.1111 +						to TWsEvent buffer.
  1.1112 +						In the final test case simulate EButton1Up and add event to TWsEvent buffer.
  1.1113 +						
  1.1114 +						Repeat steps for the second discrete test, however, in the third test case simulate 
  1.1115 +						EPointerMove event outside the hitbox. In addition add EDrag to TWsEvent buffer 
  1.1116 +						instead of EButtonRepeat. 
  1.1117 +						
  1.1118 +						A third discrete test will be executed over two test cases and will test
  1.1119 +						CancelPointerRepeatEventRequest API.
  1.1120 +						
  1.1121 +@SYMTestExpectedResults The received events must match the events added to the buffer except where EPointerMove
  1.1122 + 						events should be filtered out. In addition, EButtonRepeat will be generated by wserv
  1.1123 + 						after calling RequestPointerRepeatEvent and time interval specified has elapsed.
  1.1124 +						
  1.1125 +*/
  1.1126 +void CTMultiPtrEventTest::PointerRepeatEventForMultiplePointers()
  1.1127 +	{
  1.1128 +	// Test PointerRepeatEvent for Multiple Pointers 
  1.1129 +	TLogMessageText logText;
  1.1130 +	_LIT(KSet, "PointerRepeatEventForMultiplePointers SetOfEvents: %d of 10");
  1.1131 +	logText.AppendFormat(KSet, iEventSet);
  1.1132 +	LOG_MESSAGE(logText);
  1.1133 +	
  1.1134 +	if (!iEventSet)
  1.1135 +		{
  1.1136 +		SetAutoFlush();
  1.1137 +		AddExpectedWsEvent(EEventFocusGained);
  1.1138 +		}
  1.1139 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.1140 +	
  1.1141 +	TPoint ptrPos;
  1.1142 +	TInt ptrNum;
  1.1143 +	// Ensure all pointers are on iParentWin
  1.1144 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers/3;
  1.1145 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers/3;
  1.1146 +		
  1.1147 +	switch(iEventSet++)
  1.1148 +		{
  1.1149 +		// Test cases 0 - 3 represent first discrete test for PointerRepeatEvents
  1.1150 +		case 0:
  1.1151 +			// Simulate EButton1Down events only. This is in order to simulate the event being passed to the client. 
  1.1152 +			// If the event remained in the window queue the PointerRepeatEvent request would be cancelled when PointerRepeatPurgeCheck is performed.
  1.1153 +			INFO_PRINTF1(_L("Simulate EButton1Down event for all pointers."));
  1.1154 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1155 +				{
  1.1156 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);			
  1.1157 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
  1.1158 +				ptrPos.iX+=xInc;
  1.1159 +				ptrPos.iY+=yInc;
  1.1160 +				}	
  1.1161 +			break;
  1.1162 +		case 1:
  1.1163 +			// Simulate client calling RequestPointerRepeatEvent in response to EButton1Down event being within a 'hitbox'.
  1.1164 +			INFO_PRINTF1(_L("Simulate PointerRepeatEvent request for all pointers."));
  1.1165 +			ptrPos.SetXY(0,0);
  1.1166 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1167 +				{
  1.1168 +				iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(iPhysicalScreenSize.iWidth/2,iPhysicalScreenSize.iHeight)),ptrNum);				
  1.1169 +				User::After(200000);	
  1.1170 +				AddExpectedPointerEvent(TPointerEvent::EButtonRepeat, ptrPos, ptrNum);			
  1.1171 +				ptrPos.iX+=xInc;
  1.1172 +				ptrPos.iY+=yInc;
  1.1173 +				}
  1.1174 +			break;
  1.1175 +		case 2:
  1.1176 +			// Simulate client calling RequestPointerRepeatEvent in response to EButtonRepeat and pointer remaining within the 'hitbox'.
  1.1177 +			INFO_PRINTF1(_L("Simulate additional PointerRepeatEvent request for all pointers."));
  1.1178 +			// New coordinates will be used for a simulated EPointerMove. This event will be filtered out, however, EButtonRepeat will occur at new coordinates
  1.1179 +			ptrPos.iX = xInc;
  1.1180 +			ptrPos.iY = yInc;
  1.1181 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1182 +				{
  1.1183 +				iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(iPhysicalScreenSize.iWidth/2,iPhysicalScreenSize.iHeight)),ptrNum);				
  1.1184 +				// EPointerMove event is filtered out by TWsPointer::PointerRepeatPurgeCheck
  1.1185 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1186 +				User::After(200000);
  1.1187 +				AddExpectedPointerEvent(TPointerEvent::EButtonRepeat, ptrPos, ptrNum);
  1.1188 +				ptrPos.iX+=xInc;
  1.1189 +				ptrPos.iY+=yInc;
  1.1190 +				}
  1.1191 +			break;		
  1.1192 +		case 3:
  1.1193 +			INFO_PRINTF1(_L("Simulate EButton1Up for all pointers."));
  1.1194 +			ptrPos.iX = xInc;
  1.1195 +			ptrPos.iY = yInc;
  1.1196 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1197 +				{
  1.1198 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1199 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
  1.1200 +				ptrPos.iX+=xInc;
  1.1201 +				ptrPos.iY+=yInc;
  1.1202 +				}
  1.1203 +			break; 			
  1.1204 +		// Test cases 4 - 7 represent second second discrete test for PointerRepeatEvents	
  1.1205 +		case 4:
  1.1206 +			// Simulate EButton1Down events only. This is in order to simulate the event being passed to the client. 
  1.1207 +			// If the event remained in the window queue the PointerRepeatEvent request would be cancelled when PointerRepeatPurgeCheck is performed.
  1.1208 +			INFO_PRINTF1(_L("Simulate EButton1Down event for all pointers.")); 
  1.1209 +			ptrPos.SetXY(0,0);
  1.1210 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1211 +				{
  1.1212 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);			
  1.1213 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
  1.1214 +				ptrPos.iX+=xInc;
  1.1215 +				ptrPos.iY+=yInc;
  1.1216 +				}	
  1.1217 +			break;
  1.1218 +		case 5:
  1.1219 +			// Simulate client calling RequestPointerRepeatEvent in response to EButton1Down event being within a 'hitbox'.
  1.1220 +			INFO_PRINTF1(_L("Call RequestPointerRepeatEvent for all pointers."));
  1.1221 +			ptrPos.SetXY(0,0);
  1.1222 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1223 +				{
  1.1224 +				iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(iPhysicalScreenSize.iWidth/3,iPhysicalScreenSize.iHeight)),ptrNum); // hitbox size reduced 				
  1.1225 +				User::After(200000);	
  1.1226 +				AddExpectedPointerEvent(TPointerEvent::EButtonRepeat, ptrPos, ptrNum);			
  1.1227 +				ptrPos.iX+=xInc;
  1.1228 +				ptrPos.iY+=yInc;
  1.1229 +				}
  1.1230 +			break;
  1.1231 +		case 6:
  1.1232 +			// Simulate client calling RequestPointerRepeatEvent in response to EButtonRepeat and event remaining within the 'hitbox' rect.
  1.1233 +			// EPointerMove will take pointer out of the hitbox so should not be filtered. PointerRepeatEvent should be cancelled.
  1.1234 +			INFO_PRINTF1(_L("Simulate a PointerMove event for all pointers to a coordinate outside the hitbox."));
  1.1235 +			// New coordinates will be used for a simulated EPointerMove outisde the hitbox. 
  1.1236 +			ptrPos.iX = iPhysicalScreenSize.iWidth/3 + xInc;
  1.1237 +			ptrPos.iY = 0;
  1.1238 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1239 +				{
  1.1240 +				iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(iPhysicalScreenSize.iWidth/3,iPhysicalScreenSize.iHeight)),ptrNum);				
  1.1241 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1242 +				User::After(200000);
  1.1243 +				AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos, ptrNum);
  1.1244 +				}
  1.1245 +			break;		
  1.1246 +		case 7:
  1.1247 +			INFO_PRINTF1(_L("Simulate EButton1Up for all pointers."));
  1.1248 +			ptrNum = 0;
  1.1249 +			ptrPos.iX = iPhysicalScreenSize.iWidth/3 + xInc;
  1.1250 +			ptrPos.iY = 0;
  1.1251 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1252 +				{
  1.1253 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1254 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
  1.1255 +				}
  1.1256 +			break;
  1.1257 +		// Test cases 8 and 9 represent third discrete test for PointerRepeatEvents
  1.1258 +		case 8:
  1.1259 +			// Simulate EButton1Down events only. This is in order to simulate the event being passed to the client. 
  1.1260 +			// If the event remained in the window queue the PointerRepeatEvent request would be cancelled when PointerRepeatPurgeCheck is performed.
  1.1261 +			INFO_PRINTF1(_L("Simulate EButton1Down event for all pointers.")); 
  1.1262 +			ptrPos.SetXY(0,0);
  1.1263 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1264 +				{
  1.1265 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);			
  1.1266 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
  1.1267 +				ptrPos.iX+=xInc;
  1.1268 +				ptrPos.iY+=yInc;
  1.1269 +				}	
  1.1270 +			break;	
  1.1271 +		case 9:
  1.1272 +			// No simulated events. This test case is to explicity call RWindowBase::CancelPointerRepeatEventRequest(const TUint8 aPointerNumber)
  1.1273 +			INFO_PRINTF1(_L("Call RequestPointerRepeatEvent and CancelPointerRepeatEventRequest for all pointers."));
  1.1274 +			ptrPos.SetXY(0,0);
  1.1275 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1276 +				{
  1.1277 +				iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(iPhysicalScreenSize.iWidth/3,iPhysicalScreenSize.iHeight)),ptrNum); 				
  1.1278 +				iMultiPtrEventClient->ParentWin()->BaseWin()->CancelPointerRepeatEventRequest(ptrNum); 
  1.1279 +				ptrPos.iX+=xInc;
  1.1280 +				ptrPos.iY+=yInc;
  1.1281 +				}
  1.1282 +			INFO_PRINTF1(_L("Simulate EButton1Up for all pointers."));
  1.1283 +			ptrPos.iX = xInc;
  1.1284 +			ptrPos.iY = yInc;
  1.1285 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1286 +				{
  1.1287 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1288 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
  1.1289 +				ptrPos.iX+=xInc;
  1.1290 +				ptrPos.iY+=yInc;
  1.1291 +				}
  1.1292 +			break;	
  1.1293 +		default:
  1.1294 +			ResetFlushStopAS();
  1.1295 +			break;
  1.1296 +		}
  1.1297 +	LogEventsAdded();
  1.1298 +	}
  1.1299 +
  1.1300 +void CTMultiPtrEventTest::TestErrorCodeL(TInt aExpErrCode, TInt aActualErrCode)
  1.1301 +	{
  1.1302 +	if (aExpErrCode != aActualErrCode)
  1.1303 +		{
  1.1304 +		TLogMessageText logText;
  1.1305 +		_LIT(KError, "Expected Error code = %d Actual Actual Error code %d");
  1.1306 +		logText.AppendFormat(KError, aExpErrCode, aActualErrCode);
  1.1307 +		LOG_MESSAGE(logText);
  1.1308 +		User::Leave(ETestFailed);
  1.1309 +		}
  1.1310 +	}
  1.1311 +
  1.1312 +void CTMultiPtrEventTest::NegativeTestingOfProximityPressureAPIsL()
  1.1313 +	{
  1.1314 +	// First send -10 for EnterCloseProximity and -5 for ExitCLoseProximity, it should return KErrArgument
  1.1315 +	// Then send 20 and 10 which should return KErrNone
  1.1316 +	// Then sent 10 and 20 which should return KErrArgument
  1.1317 +	TInt retVal;
  1.1318 +	retVal = iMultiPtrEventClient->iWs.SetCloseProximityThresholds(-10, -5);
  1.1319 +	TestErrorCodeL(KErrArgument, retVal);
  1.1320 +	
  1.1321 +	retVal = iMultiPtrEventClient->iWs.SetCloseProximityThresholds(20, 10);
  1.1322 +	TestErrorCodeL(KErrNone, retVal);
  1.1323 +	
  1.1324 +	retVal = iMultiPtrEventClient->iWs.SetCloseProximityThresholds(10, 20);
  1.1325 +	TestErrorCodeL(KErrArgument, retVal);
  1.1326 +	
  1.1327 +	// Repeat the above for EnterHighPressure and ExitHighPressure with these values
  1.1328 +	// -10 and -5 it should return KErrArgument
  1.1329 +	// -5 and -10 it should return KErrNone
  1.1330 +	retVal = iMultiPtrEventClient->iWs.SetHighPressureThresholds(-10, -5);
  1.1331 +	TestErrorCodeL(KErrArgument, retVal);
  1.1332 +	
  1.1333 +	retVal = iMultiPtrEventClient->iWs.SetHighPressureThresholds(-5, -10);
  1.1334 +	TestErrorCodeL(KErrNone, retVal);
  1.1335 +	}
  1.1336 +
  1.1337 +void CTMultiPtrEventTest::SimulateProximityAndPressureEvents(TInt aCloseProxEnterValue, TInt aCloseProxExitValue, TInt aHighPresEnterValue, TInt aHighPresExitValue)
  1.1338 +	{
  1.1339 +	TPoint ptrPos(10,10);
  1.1340 +	// Simulate EPointerMove with proximity value > EnterCloseProximity threshold 
  1.1341 +	for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1342 +		{
  1.1343 +		SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, aCloseProxEnterValue, ptrNum);
  1.1344 +		AddExpectedPointerEvent(TPointerEvent::EEnterCloseProximity, ptrPos, aCloseProxEnterValue, 0, ptrNum);
  1.1345 +		}
  1.1346 +	
  1.1347 +	// Simulate EPointerMove with proximity value < ExitCloseProximity threshold
  1.1348 +	for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1349 +		{
  1.1350 +		SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, aCloseProxExitValue, ptrNum);
  1.1351 +		AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, aCloseProxExitValue, 0, ptrNum);
  1.1352 +		}
  1.1353 +	
  1.1354 +	// Simulate EBUtton1Down with presure value > EnterHighPressure threshold
  1.1355 +	for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1356 +		{
  1.1357 +		SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, aHighPresEnterValue, ptrNum);
  1.1358 +		AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, aHighPresEnterValue, 0, ptrNum);
  1.1359 +		AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos, aHighPresEnterValue, 0, ptrNum);
  1.1360 +		}
  1.1361 +	
  1.1362 +	// Simulate EPointerMove with presure value < ExitHighPressure threshold
  1.1363 +	for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1364 +		{
  1.1365 +		SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, aHighPresExitValue, ptrNum);
  1.1366 +		AddExpectedPointerEvent(TPointerEvent::EExitHighPressure, ptrPos, aHighPresExitValue, 0, ptrNum);
  1.1367 +		}
  1.1368 +	
  1.1369 +	// Finally simulate Ebutton1Up with proximity value < ExitCloseProximity
  1.1370 +	for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1371 +		{
  1.1372 +		SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, aCloseProxExitValue, ptrNum);
  1.1373 +		AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, aCloseProxExitValue, 0, ptrNum);
  1.1374 +		AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, aCloseProxExitValue, 0, ptrNum);
  1.1375 +		}
  1.1376 +	}
  1.1377 +
  1.1378 +/**
  1.1379 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0035
  1.1380 +@SYMPREQ				PREQ1226
  1.1381 +@SYMREQ					REQ10887, REQ10886
  1.1382 +@SYMTestPriority		High
  1.1383 +@SYMTestCaseDesc		Negative tests for close Proximity and high Pressure events. 
  1.1384 +@SYMTestStatus			Implemented
  1.1385 +
  1.1386 +@SYMTestActions			Set CloseProximity and HighPressure thresholds with positive and negative values.
  1.1387 +  						Simulate Enter/ExitCloseProximity and Enter/ExitHighPressure events.
  1.1388 +@SYMTestExpectedResults The received events must match the simulated pointer events
  1.1389 +*/
  1.1390 +void CTMultiPtrEventTest::NegativeTestsForProximityPressureEventsL()
  1.1391 +	{
  1.1392 +	TLogMessageText logText;
  1.1393 +	_LIT(KSet, "Negative tests for pressure and proximity events: %d of 3");
  1.1394 +	logText.AppendFormat(KSet, iEventSet);
  1.1395 +	LOG_MESSAGE(logText);
  1.1396 +	
  1.1397 +	if (!iEventSet)
  1.1398 +		{
  1.1399 +		SetAutoFlush();
  1.1400 +		NegativeTestingOfProximityPressureAPIsL();
  1.1401 +		AddExpectedWsEvent(EEventFocusGained);
  1.1402 +		}
  1.1403 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.1404 +	switch(iEventSet++)
  1.1405 +		{
  1.1406 +		case 0:
  1.1407 +			// This is to check close proximity threshold API can be given +ve values
  1.1408 +			// and high pressure threshold API can begiven -ve values
  1.1409 +			iMultiPtrEventClient->iWs.SetCloseProximityThresholds(50, 20);
  1.1410 +			iMultiPtrEventClient->iWs.SetHighPressureThresholds(-20, -50);
  1.1411 +			SimulateProximityAndPressureEvents(60, 10, -10, -60);
  1.1412 +			break;
  1.1413 +		case 1:
  1.1414 +			// Repeat the above with +ve values
  1.1415 +			iMultiPtrEventClient->iWs.SetCloseProximityThresholds(50, 20);
  1.1416 +			iMultiPtrEventClient->iWs.SetHighPressureThresholds(50, 20);
  1.1417 +			SimulateProximityAndPressureEvents(60, 10, 60, 10);
  1.1418 +			break;
  1.1419 +		case 2:
  1.1420 +			// Repeat the above -ve values
  1.1421 +			iMultiPtrEventClient->iWs.SetCloseProximityThresholds(-20, -50);
  1.1422 +			iMultiPtrEventClient->iWs.SetHighPressureThresholds(-20, -50);
  1.1423 +			SimulateProximityAndPressureEvents(-10, -60, -10, -60);
  1.1424 +			break;
  1.1425 +		default:
  1.1426 +			SetThresholdValues(KMaxTInt, KMinTInt, KMaxTInt, KMinTInt);
  1.1427 +			ResetFlushStopAS();
  1.1428 +			break;
  1.1429 +		}
  1.1430 +
  1.1431 +	LogEventsAdded();
  1.1432 +	}
  1.1433 +
  1.1434 +
  1.1435 +void CTMultiPtrEventTest::CreateGroupWinForCapturingL()
  1.1436 +	{
  1.1437 +	iGroupWinForCapturing = new(ELeave) CTWindowGroup(iMultiPtrEventClient);
  1.1438 +	iGroupWinForCapturing->ConstructL();
  1.1439 +	iGroupWinForCapturing->GroupWin()->AutoForeground(ETrue);
  1.1440 +	iGroupWinForCapturing->GroupWin()->EnableFocusChangeEvents();
  1.1441 +				
  1.1442 +	iWinForCapturing = new(ELeave) CTBlankWindow();
  1.1443 +	iWinForCapturing->ConstructL(*iGroupWinForCapturing);
  1.1444 +	iWinForCapturing->SetExt(TPoint(), TSize(iPhysicalScreenSize.iWidth/2, iPhysicalScreenSize.iHeight));
  1.1445 +	iWinForCapturing->SetColor(KRgbBlue);
  1.1446 +	iWinForCapturing->BaseWin()->EnableAdvancedPointers();
  1.1447 +	iWinForCapturing->Activate();
  1.1448 +	}
  1.1449 +
  1.1450 +void CTMultiPtrEventTest::DeleteGroupWinForCapturing()
  1.1451 +	{
  1.1452 +	if (iWinForCapturing)
  1.1453 +		{
  1.1454 +		delete iWinForCapturing;
  1.1455 +		iWinForCapturing = NULL;
  1.1456 +		}
  1.1457 +	if (iGroupWinForCapturing)
  1.1458 +		{
  1.1459 +		delete iGroupWinForCapturing;
  1.1460 +		iGroupWinForCapturing = NULL;
  1.1461 +		}
  1.1462 +	}
  1.1463 +
  1.1464 +/**
  1.1465 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0019
  1.1466 +@SYMPREQ				PREQ1226
  1.1467 +@SYMREQ					REQ9677,REQ9683,
  1.1468 +@SYMTestPriority		High
  1.1469 +@SYMTestCaseDesc		Checks Wserv supports Capturing in case of multi pointer events.
  1.1470 +@SYMTestStatus			Implemented
  1.1471 +
  1.1472 +@SYMTestActions			Create a window with group window as its parent. 
  1.1473 +						Create another window with same parent and partially overlapping the first one. 
  1.1474 +						SetPointerCapture for second window with TCaptureEnabled flag. 
  1.1475 +						Simulate TRawEvent::EButton1Down from each pointer the device supports
  1.1476 +						
  1.1477 +						Repeat the above with TCaptureFlagAllGroups flag for SetPointerCapture 
  1.1478 +						and creating windows from different window group
  1.1479 +   						
  1.1480 +@SYMTestExpectedResults Even if events were simulated on first window events are delivered to 
  1.1481 +						second window as it is capturing. 
  1.1482 +						With TCaptureFlagAllGroups flag set	events are delivered to window which is
  1.1483 +						capturing even if events were simulated on a window from different group
  1.1484 +						
  1.1485 +*/
  1.1486 +void CTMultiPtrEventTest::CapturingMultiPointerEvents()
  1.1487 +	{
  1.1488 +	// Test Capturing of multi pointer events
  1.1489 +	// 1. Test Wserv supports Capturing in case of multi-pointer events
  1.1490 +	// 2. Test pointer events are delivered correctly when Capturing is disabled.
  1.1491 +	TLogMessageText logText;
  1.1492 +	_LIT(KSet, "CapturingMultiPtrEvents SetOfEvents: %d of 3");
  1.1493 +	logText.AppendFormat(KSet, iEventSet);
  1.1494 +	LOG_MESSAGE(logText);
  1.1495 +	
  1.1496 +	if (!iEventSet)
  1.1497 +		{
  1.1498 +		SetAutoFlush();
  1.1499 +		}
  1.1500 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.1501 +
  1.1502 +	TPoint ptrPos;
  1.1503 +	TInt ptrNum;
  1.1504 +		
  1.1505 +	switch(iEventSet++)
  1.1506 +		{
  1.1507 +		case 0:
  1.1508 +			INFO_PRINTF1(_L("Ensure pointer state is Out of Range"));
  1.1509 +			AddExpectedWsEvent(EEventFocusGained);
  1.1510 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1511 +				{
  1.1512 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1513 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
  1.1514 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1515 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, ptrNum);
  1.1516 +				}
  1.1517 +			break;			
  1.1518 +		case 1:
  1.1519 +			INFO_PRINTF1(_L("Check Wserv supports Capturing in case of multi-pointer events, within window group"));
  1.1520 +			iMultiPtrEventClient->ChildWin()->BaseWin()->SetPointerCapture(RWindowBase::TCaptureEnabled);
  1.1521 +			TestCapturingForMultiPointer(EFalse);
  1.1522 +			break;	
  1.1523 +		case 2:
  1.1524 +			INFO_PRINTF1(_L("Check Wserv supports Capturing in case of multi-pointer events, from different window groups"));
  1.1525 +			TRAPD(err, CreateGroupWinForCapturingL());	// it cannot leave so trap and fail
  1.1526 +			if (err != KErrNone)
  1.1527 +				{
  1.1528 +				Failed();
  1.1529 +				}			
  1.1530 +			AddExpectedWsEvent(EEventFocusLost);		// First group window losing focus because of second group creation
  1.1531 +			AddExpectedWsEvent(EEventFocusGained);		// Second group window creation
  1.1532 +			
  1.1533 +			iWinForCapturing->BaseWin()->SetPointerCapture(RWindowBase::TCaptureEnabled|RWindowBase::TCaptureFlagAllGroups);
  1.1534 +			TestCapturingForMultiPointer(ETrue);
  1.1535 +			break;
  1.1536 +		default:
  1.1537 +			DeleteGroupWinForCapturing();
  1.1538 +			ResetFlushStopAS();
  1.1539 +			break;
  1.1540 +		}
  1.1541 +	LogEventsAdded();
  1.1542 +	}
  1.1543 +
  1.1544 +/**
  1.1545 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0017
  1.1546 +@SYMPREQ				PREQ1226
  1.1547 +@SYMREQ					Negative Testing
  1.1548 +@SYMTestPriority		High
  1.1549 +@SYMTestCaseDesc		Out of bound value testing
  1.1550 +@SYMTestStatus			Implemented
  1.1551 +
  1.1552 +@SYMTestActions			Simulate raw events of TRawEvent with pointer number greater than EPointerMaxPointers
  1.1553 +						 						
  1.1554 +@SYMTestExpectedResults The received events must match the events added to the buffer and check that out of bound events are ignored.
  1.1555 + 
  1.1556 +*/
  1.1557 +void CTMultiPtrEventTest::OutOfBoundValueTesting()
  1.1558 +	{
  1.1559 +	// Test Wserv ignores pointer events which have a pointer number greater than EPointerMaxPointers. 	 
  1.1560 +	TLogMessageText logText;
  1.1561 +	_LIT(KSet, "OutOfBoundValueTesting SetOfEvents: %d of 1");
  1.1562 +	logText.AppendFormat(KSet, iEventSet);
  1.1563 +	LOG_MESSAGE(logText);
  1.1564 +	
  1.1565 +	if (!iEventSet)
  1.1566 +		{
  1.1567 +		SetAutoFlush();
  1.1568 +		AddExpectedWsEvent(EEventFocusGained);
  1.1569 +		}
  1.1570 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.1571 +
  1.1572 +	TPoint ptrPos;
  1.1573 +	TInt ptrNum;
  1.1574 +	TInt ptrNumOutOfBounds;
  1.1575 +			
  1.1576 +	switch(iEventSet++)
  1.1577 +		{
  1.1578 +		case 0:
  1.1579 +			INFO_PRINTF1(_L("Checks Wserv ignores pointer events which have a pointer number greater than EPointerMaxPointers."));
  1.1580 +			ptrPos.SetXY(0,0);
  1.1581 +			ptrNum = iMaxDevPointers-1;				// Max value for ptrNum
  1.1582 +			ptrNumOutOfBounds = iMaxDevPointers;	// Invalid ptrNum as pointer numbers are zero indexed
  1.1583 +			
  1.1584 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.1585 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNumOutOfBounds);
  1.1586 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+10, ptrPos.iY+10, 0, ptrNum);
  1.1587 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX+10, ptrPos.iY+10, 0, ptrNumOutOfBounds);
  1.1588 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX+10, ptrPos.iY+10, 0, ptrNum);
  1.1589 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX+10, ptrPos.iY+10, 0, ptrNumOutOfBounds);
  1.1590 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, ptrNum);
  1.1591 +			ptrPos.iX += 10; ptrPos.iY += 10;
  1.1592 +			AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos, ptrNum);
  1.1593 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, ptrNum);
  1.1594 +			break;	 
  1.1595 +		default:
  1.1596 +			ResetFlushStopAS();
  1.1597 +			break;
  1.1598 +		}
  1.1599 +	LogEventsAdded();
  1.1600 +	}
  1.1601 +
  1.1602 +void CTMultiPtrEventTest::SetThresholdValues(TInt aEnterCloseProx, TInt aExitCloseProx, TInt aEnterHighPres, TInt aExitHighPres)
  1.1603 +	{
  1.1604 +	iEnterCloseProximityThreshold = aEnterCloseProx;
  1.1605 +	iExitCloseProximityThreshold = aExitCloseProx;
  1.1606 +	iEnterHighPressureThreshold = aEnterHighPres;
  1.1607 +	iExitHighPressureThreshold  = aExitHighPres;
  1.1608 +	
  1.1609 +	iMultiPtrEventClient->iWs.SetCloseProximityThresholds(iEnterCloseProximityThreshold,iExitCloseProximityThreshold);
  1.1610 +	iMultiPtrEventClient->iWs.SetHighPressureThresholds(iEnterHighPressureThreshold,iExitHighPressureThreshold);
  1.1611 +	}
  1.1612 +
  1.1613 +void CTMultiPtrEventTest::TestCloseProximityHighPressureAPIsL()
  1.1614 +	{
  1.1615 +	// These are some typical values which are used only for testing purposes.
  1.1616 +	// 20mm to screen
  1.1617 +	// 50mm to screen
  1.1618 +	// 4N of pressure
  1.1619 +	// 2N of pressure
  1.1620 +	SetThresholdValues(-20,-50,4000,2000);
  1.1621 +	
  1.1622 +	if (iMultiPtrEventClient->iWs.GetEnterCloseProximityThreshold() != iEnterCloseProximityThreshold)
  1.1623 +		{
  1.1624 +		TLogMessageText logText;
  1.1625 +		_LIT(KError, "Expected EnterCloseProximityThreshold = %d Actual EnterCloseProximityThreshold %d");
  1.1626 +		logText.AppendFormat(KError, iEnterCloseProximityThreshold, iMultiPtrEventClient->iWs.GetEnterCloseProximityThreshold());
  1.1627 +		LOG_MESSAGE(logText);
  1.1628 +		User::Leave(ETestFailed);
  1.1629 +		}
  1.1630 +	
  1.1631 +	if (iMultiPtrEventClient->iWs.GetExitCloseProximityThreshold() != iExitCloseProximityThreshold)
  1.1632 +		{
  1.1633 +		TLogMessageText logText;
  1.1634 +		_LIT(KError, "Expected ExitCloseProximityThreshold = %d Actual ExitCloseProximityThreshold %d");
  1.1635 +		logText.AppendFormat(KError, iExitCloseProximityThreshold, iMultiPtrEventClient->iWs.GetExitCloseProximityThreshold());
  1.1636 +		LOG_MESSAGE(logText);		
  1.1637 +		User::Leave(ETestFailed);
  1.1638 +		}
  1.1639 +	
  1.1640 +	if (iMultiPtrEventClient->iWs.GetEnterHighPressureThreshold() != iEnterHighPressureThreshold)
  1.1641 +		{
  1.1642 +		TLogMessageText logText;
  1.1643 +		_LIT(KError, "Expected EnterHighPressureThreshold = %d Actual EnterHighPressureThreshold %d");
  1.1644 +		logText.AppendFormat(KError, iEnterHighPressureThreshold, iMultiPtrEventClient->iWs.GetEnterHighPressureThreshold());
  1.1645 +		LOG_MESSAGE(logText);
  1.1646 +		User::Leave(ETestFailed);
  1.1647 +		}
  1.1648 +	
  1.1649 +	if (iMultiPtrEventClient->iWs.GetExitHighPressureThreshold() != iExitHighPressureThreshold)
  1.1650 +		{
  1.1651 +		TLogMessageText logText;
  1.1652 +		_LIT(KError, "Expected ExitHighPressureThreshold = %d Actual ExitHighPressureThreshold %d");
  1.1653 +		logText.AppendFormat(KError, iExitHighPressureThreshold, iMultiPtrEventClient->iWs.GetExitHighPressureThreshold());
  1.1654 +		LOG_MESSAGE(logText);
  1.1655 +		User::Leave(ETestFailed);
  1.1656 +		}
  1.1657 +	}
  1.1658 +
  1.1659 +/**
  1.1660 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0034
  1.1661 +@SYMPREQ				PREQ1226
  1.1662 +@SYMREQ					REQ10887,REQ10886
  1.1663 +@SYMTestPriority		High
  1.1664 +@SYMTestCaseDesc		Tests close Proximity and high Pressure event types. 
  1.1665 +@SYMTestStatus			Implemented
  1.1666 +
  1.1667 +@SYMTestActions			Set CloseProximity and HighPressure thresholds and simulate events with different Z values  
  1.1668 +@SYMTestExpectedResults The received events must match the simulated pointer events
  1.1669 +*/
  1.1670 +void CTMultiPtrEventTest::CloseProximityAndHighPressureEventsL()
  1.1671 +	{
  1.1672 +	TLogMessageText logText;
  1.1673 +	_LIT(KSet, "Close Proximity and High Pressure events: %d of 11");
  1.1674 +	logText.AppendFormat(KSet, iEventSet);
  1.1675 +	LOG_MESSAGE(logText);
  1.1676 +	
  1.1677 +	if (!iEventSet)
  1.1678 +		{
  1.1679 +		SetAutoFlush();
  1.1680 +		TestCloseProximityHighPressureAPIsL();
  1.1681 +		AddExpectedWsEvent(EEventFocusGained);
  1.1682 +		}
  1.1683 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.1684 +
  1.1685 +	TPoint ptrPos(10,10);
  1.1686 +	TInt proxValue;
  1.1687 +	TInt prValue;
  1.1688 +	TInt tempCount; 
  1.1689 +	switch(iEventSet++)
  1.1690 +		{
  1.1691 +		case 0:
  1.1692 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.1693 +			// One whole cycle of events
  1.1694 +			// Simulate out-of-range from all pointers and don't expect out-of-range events
  1.1695 +			// since all the pointers are already in same state
  1.1696 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1697 +				{
  1.1698 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1699 +				}
  1.1700 +			
  1.1701 +			// Simulate moves with proximity value < EEnterCloseProximity
  1.1702 +			proxValue = -30;
  1.1703 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1704 +				{
  1.1705 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1706 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.1707 +				}
  1.1708 +
  1.1709 +			// Simulate moves with proximity value > EEnterCloseProximity
  1.1710 +			proxValue = -10;
  1.1711 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1712 +				{
  1.1713 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1714 +				AddExpectedPointerEvent(TPointerEvent::EEnterCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1715 +				}
  1.1716 +			
  1.1717 +			// Simulate EButton1Down with pressure value < EEnterHighPressure
  1.1718 +			prValue = 1000;
  1.1719 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1720 +				{
  1.1721 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1722 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1723 +				}
  1.1724 +			
  1.1725 +			// Simulate moves with pressure value > EEnterHighPressure
  1.1726 +			prValue = 5000;
  1.1727 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1728 +				{
  1.1729 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1730 +				AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos, prValue, 0, ptrNum);
  1.1731 +				}
  1.1732 +			
  1.1733 +			// Simulate moves with pressure value < EExitHighPressure
  1.1734 +			prValue = 1000;
  1.1735 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1736 +				{
  1.1737 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1738 +				AddExpectedPointerEvent(TPointerEvent::EExitHighPressure, ptrPos, prValue, 0, ptrNum);
  1.1739 +				}
  1.1740 +			
  1.1741 +			// Simulate EButton1Up with proximity value > EEnterCloseProximity
  1.1742 +			proxValue = -10;
  1.1743 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1744 +				{
  1.1745 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1746 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1747 +				}
  1.1748 +			
  1.1749 +			// Simulate moves with proximity value < EExitCloseProximity
  1.1750 +			proxValue = -60;
  1.1751 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1752 +				{
  1.1753 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1754 +				AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1755 +				}
  1.1756 +			break;
  1.1757 +		case 1:
  1.1758 +			// Simulate events to meet all scenarios 
  1.1759 +			// Simulate EButton1Down with pressure value < EEnterHighPressure
  1.1760 +			prValue = 1000;
  1.1761 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1762 +				{
  1.1763 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1764 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1765 +				}
  1.1766 +			
  1.1767 +			// Simulate EButton1Up with proximity value < EExitCloseProximity
  1.1768 +			proxValue = -60;
  1.1769 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1770 +				{
  1.1771 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1772 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1773 +				AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1774 +				}
  1.1775 +			
  1.1776 +			// Simulate EButton1Down with pressure value > EEnterHighPressure
  1.1777 +			prValue = 5000;
  1.1778 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1779 +				{
  1.1780 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1781 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1782 +				AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos, prValue, 0, ptrNum);
  1.1783 +				}
  1.1784 +			
  1.1785 +			// Simulate EButton1Up with proximity value < EExitCloseProximity
  1.1786 +			proxValue = -60;
  1.1787 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1788 +				{
  1.1789 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1790 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1791 +				AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1792 +				}
  1.1793 +			break;
  1.1794 +		case 2:
  1.1795 +			// Simulate moves with proximity value > EEnterCloseProximity
  1.1796 +			proxValue = -10;
  1.1797 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1798 +				{
  1.1799 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1800 +				AddExpectedPointerEvent(TPointerEvent::EEnterCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1801 +				}
  1.1802 +			
  1.1803 +			// Simulate EButton1Down with pressure value > EEnterHighPressure
  1.1804 +			prValue = 5000;
  1.1805 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1806 +				{
  1.1807 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1808 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1809 +				AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos, prValue, 0, ptrNum);
  1.1810 +				}
  1.1811 +			
  1.1812 +			// Simulate EButton1Up with proximity value > EExitCloseProximity
  1.1813 +			proxValue = -40;		// When you coming up, EEnterCloseProximity is of no use
  1.1814 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1815 +				{
  1.1816 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1817 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1818 +				}
  1.1819 +			
  1.1820 +			// Simulate out-of-range events
  1.1821 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1822 +				{
  1.1823 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1824 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1825 +				}
  1.1826 +			break;
  1.1827 +		case 3:
  1.1828 +			// From out-of-range state to EButton1Down
  1.1829 +			// Simulate EButton1Down with pressure value < EEnterHighPressure
  1.1830 +			prValue = 1000;
  1.1831 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1832 +				{
  1.1833 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1834 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1835 +				}
  1.1836 +			
  1.1837 +			// Simulate EButton1Up with proximity value > EExitCloseProximity
  1.1838 +			proxValue = -40;
  1.1839 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1840 +				{
  1.1841 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1842 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1843 +				}
  1.1844 +			
  1.1845 +			// Simulate out-of-range events
  1.1846 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1847 +				{
  1.1848 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1849 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1850 +				}
  1.1851 +			
  1.1852 +			// Simulate EButton1Down with pressure value > EEnterHighPressure
  1.1853 +			prValue = 5000;
  1.1854 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1855 +				{
  1.1856 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1857 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1858 +				AddExpectedPointerEvent(TPointerEvent::EEnterHighPressure, ptrPos, prValue, 0, ptrNum);
  1.1859 +				}
  1.1860 +			
  1.1861 +			// Simulate EButton1Up with proximity value > EExitCloseProximity
  1.1862 +			proxValue = -40;
  1.1863 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1864 +				{
  1.1865 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1866 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1867 +				}
  1.1868 +			
  1.1869 +			// Simulate out-of-range events
  1.1870 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1871 +				{
  1.1872 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1873 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1874 +				}
  1.1875 +			break;
  1.1876 +		case 4:
  1.1877 +			// Simulate EButton1Dowm with pressure value < EEnterHighPressure
  1.1878 +			prValue = 1000;
  1.1879 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1880 +				{
  1.1881 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1882 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, ptrNum);
  1.1883 +				}
  1.1884 +			
  1.1885 +			// Simulate EButton1Up with proximity value < EExitCloseProximity
  1.1886 +			proxValue = -60;
  1.1887 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1888 +				{
  1.1889 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1890 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1891 +				AddExpectedPointerEvent(TPointerEvent::EExitCloseProximity, ptrPos, proxValue, 0, ptrNum);
  1.1892 +				}
  1.1893 +			
  1.1894 +			// Simulate out-of-range from Up/OutOfCloseProximity
  1.1895 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1896 +				{
  1.1897 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1898 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1899 +				}
  1.1900 +			break;
  1.1901 +		case 5:
  1.1902 +			// Purging of proximity and pressure events
  1.1903 +			// Simulate EnterCloseProximity and ExitCloseProximity events which will be purged
  1.1904 +			// when you send Button1Up events for KMaxQueueSize
  1.1905 +			proxValue = -10;
  1.1906 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 4); ptrNum++)
  1.1907 +				{
  1.1908 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1909 +				}
  1.1910 +			proxValue = -60;
  1.1911 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 4); ptrNum++)
  1.1912 +				{
  1.1913 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1914 +				}
  1.1915 +			for (TInt count = 0; count < KMaxQueueSize; count++)
  1.1916 +				{
  1.1917 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.1918 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, 0);
  1.1919 +				}
  1.1920 +			break;
  1.1921 +		case 6:
  1.1922 +			// Simulate EnterCloseProximity for 4 pointers. 
  1.1923 +			// As we cannot create lone ExitCloseProximity events, so create just moves from next 4 pointers
  1.1924 +			// Simulate out-of-range for these events on thier respective pointers
  1.1925 +			// Then simulate EButton1Up events which will purge EnterCloseProximity and move events
  1.1926 +			// which checks that lone EnterCloseProximity and lone move events will be purged
  1.1927 +			proxValue = -10;
  1.1928 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.1929 +				{
  1.1930 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1931 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1932 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1933 +				}
  1.1934 +			proxValue = -60;
  1.1935 +			for (TInt ptrNum = iMaxDevPointers/2; ptrNum < iMaxDevPointers; ptrNum++)
  1.1936 +				{
  1.1937 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1938 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1939 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1940 +				}
  1.1941 +			for (TInt count = 0; count < KMaxQueueSize-iMaxDevPointers; count++)
  1.1942 +				{
  1.1943 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.1944 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, 0);
  1.1945 +				}
  1.1946 +			break;
  1.1947 +		case 7:
  1.1948 +			// Bring all other pointers to Up state, becasue of previous test
  1.1949 +			// Then simulate out-of-range twice for all the pointers
  1.1950 +			// Then simulate Button1Up which will cause purging of successive out-of-range events
  1.1951 +			proxValue = -60;
  1.1952 +			tempCount = 0;
  1.1953 +			for (TInt ptrNum = 1; ptrNum < iMaxDevPointers; ptrNum++)
  1.1954 +				{
  1.1955 +				tempCount++;
  1.1956 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.1957 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, ptrNum);
  1.1958 +				}
  1.1959 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.1960 +				{
  1.1961 +				tempCount++;
  1.1962 +				// Wserv does nothing if current state is outofrange and if receives again EOutOfRange event which is practically not possible
  1.1963 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1964 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.1965 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.1966 +				}
  1.1967 +			for (TInt count = 0; count < KMaxQueueSize-tempCount; count++)
  1.1968 +				{
  1.1969 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.1970 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, proxValue, 0, 0);
  1.1971 +				}
  1.1972 +			break;
  1.1973 +		case 8:
  1.1974 +			// Simulate EButton1Down with pressure value > EnterHIghPressure threshold
  1.1975 +			// which will cause EButton1Down and EnterHighPressure to be filled in queue
  1.1976 +			// Simulate ExitHighPressure and EButton1Up events for 2 pointers
  1.1977 +			// Then simulate EButton1Up events from pointer0 so that all of the above events are purged
  1.1978 +			prValue = 5000;
  1.1979 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 2); ptrNum++)
  1.1980 +				{
  1.1981 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1982 +				}
  1.1983 +			prValue = 1000;
  1.1984 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 2); ptrNum++)
  1.1985 +				{
  1.1986 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.1987 +				// Here these events are purged becasue their correpsonding  down event would have been purged
  1.1988 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);	
  1.1989 +				}
  1.1990 +			// All the above events get purged by this
  1.1991 +			for (TInt count = 0; count < KMaxQueueSize; count++)
  1.1992 +				{
  1.1993 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.1994 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.1995 +				}
  1.1996 +			break;
  1.1997 +		case 9:
  1.1998 +			// Simulate EButton1Down for 2 pointers, which will generate Button1Down and EnterHighPressure
  1.1999 +			// Simulate Ebutton1Up events for MaxQueueSize from last pointer so that all the above events are purged  
  1.2000 +			prValue = 5000;
  1.2001 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrNum < 2); ptrNum++)
  1.2002 +				{
  1.2003 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.2004 +				}
  1.2005 +			
  1.2006 +			// This will cause above down and enterhighpressure events to be purged
  1.2007 +			// When pointer is in outofrange state and when EButton1Up event is sent Wserv sends EnterCloseProximity 
  1.2008 +			// EnterCloseProximity cannot be purged unless the next event is EExitCloseProximity or EOutOfRange
  1.2009 +			for (TInt count = 0; count < KMaxQueueSize; count++)
  1.2010 +				{
  1.2011 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, iMaxDevPointers-1);
  1.2012 +				AddExpectedPointerEvent((count ? TPointerEvent::EButton1Up : TPointerEvent::EEnterCloseProximity), ptrPos, 0, 0, iMaxDevPointers-1);
  1.2013 +				}
  1.2014 +
  1.2015 +			// As the first 2 pointers are in down state, and if we send the move events with prValue = 1000
  1.2016 +			// This will generate the exithigh pressure events, which will be ignored
  1.2017 +			// This will also generate the Ebutton1Up event which will also be ignored
  1.2018 +			prValue = 1000;
  1.2019 +			for (TInt ptrNum = 0; (ptrNum < iMaxDevPointers/2  && ptrNum < 2); ptrNum++)
  1.2020 +				{
  1.2021 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.2022 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2023 +				}
  1.2024 +			break;
  1.2025 +		case 10:
  1.2026 +			// This is to just bring all the pointers to out-of-range state
  1.2027 +			// to make all pointers in valid state for other test to run
  1.2028 +			// Wserv processes EOutOfRange events only when its current state is not in outofrange. 
  1.2029 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers && ptrNum < 2; ptrNum++)
  1.2030 +				{
  1.2031 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2032 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, ptrNum);
  1.2033 +				}
  1.2034 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, iMaxDevPointers-1);
  1.2035 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, iMaxDevPointers-1);
  1.2036 +			break;
  1.2037 +		default:
  1.2038 +			SetThresholdValues(KMaxTInt, KMinTInt, KMaxTInt, KMinTInt);
  1.2039 +			ResetFlushStopAS();
  1.2040 +			break;
  1.2041 +		}
  1.2042 +
  1.2043 +	LogEventsAdded();
  1.2044 +	}
  1.2045 +
  1.2046 +void CTMultiPtrEventTest::CreateAnimDllAndAnimL()
  1.2047 +	{
  1.2048 +	iAnimDll = new(ELeave) RAnimDll(iMultiPtrEventClient->iWs);
  1.2049 +	User::LeaveIfError(iAnimDll->Load(KAnimDLLName));
  1.2050 +	iAnim = RMultiPointerAnim::NewL(iMultiPtrEventClient->ParentWin()->BaseWin(), iAnimDll);
  1.2051 +	}
  1.2052 +
  1.2053 +void CTMultiPtrEventTest::DestroyAnimDllAndAnim()
  1.2054 +	{
  1.2055 +	if (iAnim)
  1.2056 +		{
  1.2057 +		iAnim->Destroy();
  1.2058 +		iAnim = NULL;
  1.2059 +		}
  1.2060 +	if (iAnimDll)
  1.2061 +		{
  1.2062 +		iAnimDll->Destroy();
  1.2063 +		iAnimDll = NULL;
  1.2064 +		}
  1.2065 +	}
  1.2066 +
  1.2067 +void CTMultiPtrEventTest::CreateGroupWinL()
  1.2068 +	{
  1.2069 +	iGroupWinForEmul = new(ELeave) CTWindowGroup(iMultiPtrEventClient);
  1.2070 +	iGroupWinForEmul->ConstructL();
  1.2071 +	iGroupWinForEmul->GroupWin()->AutoForeground(ETrue);
  1.2072 +	iGroupWinForEmul->GroupWin()->EnableFocusChangeEvents();
  1.2073 +
  1.2074 +	iWinForEmul = new(ELeave) CTBlankWindow();
  1.2075 +	iWinForEmul->ConstructL(*iGroupWinForEmul);
  1.2076 +	iWinForEmul->SetExt(TPoint(50,50), TSize(80,80));
  1.2077 +	iWinForEmul->SetColor(KRgbDarkYellow);
  1.2078 +	iWinForEmul->Activate();	
  1.2079 +	}
  1.2080 +
  1.2081 +void CTMultiPtrEventTest::DeleteGroupWin()
  1.2082 +	{
  1.2083 +	if (iWinForEmul)
  1.2084 +		{
  1.2085 +		delete iWinForEmul;
  1.2086 +		iWinForEmul = NULL;
  1.2087 +		}
  1.2088 +	if (iGroupWinForEmul)
  1.2089 +		{
  1.2090 +		delete iGroupWinForEmul;
  1.2091 +		iGroupWinForEmul = NULL;
  1.2092 +		}
  1.2093 +	}
  1.2094 +
  1.2095 +/**
  1.2096 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0029
  1.2097 +@SYMPREQ				PREQ1226
  1.2098 +@SYMREQ					REQ9688
  1.2099 +@SYMTestPriority		High
  1.2100 +@SYMTestCaseDesc		Tests the emulation rules for Apps, Anims, Autofocus and Buffered delivery
  1.2101 +@SYMTestStatus			Implemented
  1.2102 +
  1.2103 +@SYMTestActions			Simulate event to make a pointer primary. EnableAdvancedPointers API is not called. And then simulate events from other pointers  
  1.2104 +@SYMTestExpectedResults The events from other pointer are not received
  1.2105 +*/
  1.2106 +void CTMultiPtrEventTest::EmulationRulesForMultiplePointers()
  1.2107 +	{
  1.2108 +	TLogMessageText logText;
  1.2109 +	_LIT(KSet, "Emulation rules set of events: %d of 15");
  1.2110 +	logText.AppendFormat(KSet, iEventSet);
  1.2111 +	LOG_MESSAGE(logText);
  1.2112 +	
  1.2113 +	if (!iEventSet)
  1.2114 +		{
  1.2115 +		SetExpectNonAdvancedPointerEvents();
  1.2116 +		SetAutoFlush();
  1.2117 +		AddExpectedWsEvent(EEventFocusGained);
  1.2118 +		}
  1.2119 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.2120 +	
  1.2121 +	TPoint ptrPos(10,10);
  1.2122 +	TInt proxValue = -iProximityStep;
  1.2123 +	TInt prValue = iPressureStep;
  1.2124 +	TInt ptrNum = 0;
  1.2125 +	switch(iEventSet++)
  1.2126 +		{
  1.2127 +		case 0:
  1.2128 +			// This event is for simulated/primary pointer
  1.2129 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.2130 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2131 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2132 +			
  1.2133 +			// Parent window has not called EnableAdvancedPointers API
  1.2134 +			// So even if we simulate moves and out-of-range these are not delivered to client
  1.2135 +			for (ptrNum = 1; ptrNum < iMaxDevPointers; ptrNum++)
  1.2136 +				{
  1.2137 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2138 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2139 +				}
  1.2140 +			break;
  1.2141 +		case 1:
  1.2142 +			// Since the primary pointer is 0, simulate EButton1Down for making pointer 1 as primary 
  1.2143 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2144 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2145 +			
  1.2146 +			// Simulate move or Ebutton1Down from pointer0 they are NOT sent back to client
  1.2147 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2148 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2149 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2150 +			
  1.2151 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2152 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2153 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2154 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2155 +			break;
  1.2156 +		case 2:
  1.2157 +			// Simulate EButton1Down from pointer0 to make it primary
  1.2158 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2159 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, 0);
  1.2160 +			
  1.2161 +			// Move from pointer1
  1.2162 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2163 +			
  1.2164 +			// Take the zero pointer out-of-range, this will not result in Pointer 1 becoming primary
  1.2165 +			// and out-of-range event is sent to client
  1.2166 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2167 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.2168 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2169 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, 0);
  1.2170 +			
  1.2171 +			// Send moves from pointer1, but these are not sent to the Client.
  1.2172 +			ptrPos.iX += 10;
  1.2173 +			ptrPos.iY += 10;
  1.2174 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2175 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2176 +			
  1.2177 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2178 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2179 +			
  1.2180 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2181 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2182 +			break;
  1.2183 +		case 3:
  1.2184 +			// Simulate EButton1Down from pointer0 to make it primary
  1.2185 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2186 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2187 +			
  1.2188 +			// Simulate EButton1Down from pointer1, which is not sent to client 
  1.2189 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2190 +			
  1.2191 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2192 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2193 +			
  1.2194 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2195 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2196 +			
  1.2197 +			// Drag events are not sent becasue pointer1 has NOT become primary
  1.2198 +			ptrPos.iX += 10;
  1.2199 +			ptrPos.iY += 10;
  1.2200 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2201 +			
  1.2202 +			// Simulate up from pointer1, still not primary, so event is not sent
  1.2203 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2204 +			
  1.2205 +			// Simulate out-of-range from pointer1, still not primary, so event is not sent
  1.2206 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2207 +			
  1.2208 +			// Now moves from out-of-range to move state 
  1.2209 +			ptrPos.iX += 10;
  1.2210 +			ptrPos.iY += 10;
  1.2211 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2212 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2213 +			
  1.2214 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2215 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2216 +			break;
  1.2217 +		case 4:
  1.2218 +			// pointer0 sends move (becomes primary)
  1.2219 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2220 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2221 +			
  1.2222 +			// pointer0 sends down
  1.2223 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2224 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2225 +			
  1.2226 +			// pointer1 sends down, doesn't become primary
  1.2227 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2228 +
  1.2229 +			// pointer0 sends up, stays primary
  1.2230 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2231 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2232 +
  1.2233 +			// pointer2, pointer3 and pointer4 sends move with proximity -5, -10, -15
  1.2234 +			for (ptrNum = 2; ptrNum < iMaxDevPointers; ptrNum++, proxValue -= iProximityStep)
  1.2235 +				{
  1.2236 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2237 +				}
  1.2238 +			
  1.2239 +			// pointer0 sends out-of-range, loses primary pointer, But NO events are sent
  1.2240 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2241 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2242 +			
  1.2243 +			// Send moves for pointer2, pointer3 and pointer4.
  1.2244 +			// None of the evnst are sent
  1.2245 +			ptrPos.SetXY(0,0);
  1.2246 +			for (ptrNum = 2; ptrNum < iMaxDevPointers; ptrNum++)
  1.2247 +				{
  1.2248 +				ptrPos.iX += 10;
  1.2249 +				ptrPos.iY += 5;
  1.2250 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2251 +				}
  1.2252 +			
  1.2253 +			// Drag from pointer1, NOT sent, since it is not primary
  1.2254 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, 1);
  1.2255 +
  1.2256 +			// Send out-of-range from all pointers
  1.2257 +			for (ptrNum = 2; ptrNum < iMaxDevPointers; ptrNum++)
  1.2258 +				{
  1.2259 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2260 +				}
  1.2261 +			
  1.2262 +			// As the pointer1 is down, this will not become primary even if EButton1Up is called
  1.2263 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2264 +			
  1.2265 +			// And now sending out-of-range will also not send the event to client as it is not primary
  1.2266 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2267 +			break;
  1.2268 +		case 5:
  1.2269 +			// Test cases 5 - 7 represent one discrete test for PointerRepeatEvents
  1.2270 +			// Case 5 simulates EButton1Down events only. This is to ensure the event is delivered to the client. 
  1.2271 +			// If the event remained in the window queue the PointerRepeatEvent request would be cancelled when PointerRepeatPurgeCheck is performed.
  1.2272 +			ptrPos.SetXY(0,0);
  1.2273 +			
  1.2274 +			// pointer0 sends down (become primary)
  1.2275 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2276 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2277 +			
  1.2278 +			// pointer1 sends down, doesn't become primary
  1.2279 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2280 +			
  1.2281 +			// pointer4 sends down
  1.2282 +			if (4 < iMaxDevPointers)
  1.2283 +				{
  1.2284 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 4);
  1.2285 +				}
  1.2286 +			break;
  1.2287 +		case 6:
  1.2288 +			ptrPos.SetXY(0,0);
  1.2289 +			// Simulate client calling RequestPointerRepeatEvent in response to EButton1Down event being within a 'hitbox'.
  1.2290 +			// Legacy API called which does not specify a pointer number. EButtonRepeat should be generated for primary pointer only.
  1.2291 +			iMultiPtrEventClient->ParentWin()->BaseWin()->RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(100000),TRect(TPoint(0,0), TSize(20,20)));				
  1.2292 +			User::After(200000);	
  1.2293 +			AddExpectedPointerEvent(TPointerEvent::EButtonRepeat, ptrPos, TAdvancedPointerEvent::EDefaultPointerNumber);			
  1.2294 +			break;
  1.2295 +		case 7:
  1.2296 +			// pointer0 sends up 
  1.2297 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2298 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2299 +			
  1.2300 +			// pointer2 sends out-of-range
  1.2301 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2302 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2303 +			
  1.2304 +			// Send up and out-of-range for pointer1 and 4
  1.2305 +			SimulatePointerEvent(TRawEvent::EButton1Up, 0, 0, 0, 1);
  1.2306 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2307 +			
  1.2308 +			if (4 < iMaxDevPointers)
  1.2309 +				{
  1.2310 +				SimulatePointerEvent(TRawEvent::EButton1Up, 0, 0, 0, 4);
  1.2311 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 4);
  1.2312 +				}
  1.2313 +			break;
  1.2314 +		case 8:
  1.2315 +			// Autofocus does not work for other than primary pointers
  1.2316 +			// Create group window which will send focus lost and gained
  1.2317 +			TRAPD(err, CreateGroupWinL());	// it cannot leave so trap and fail
  1.2318 +			if (err != KErrNone)
  1.2319 +				{
  1.2320 +				Failed();
  1.2321 +				}
  1.2322 +			AddExpectedWsEvent(EEventFocusLost);
  1.2323 +			AddExpectedWsEvent(EEventFocusGained);
  1.2324 +			
  1.2325 +			// Simulate Epointer down which will send focuslost, focusgained and focusgroupchanged events 
  1.2326 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2327 +			AddExpectedWsEvent(EEventFocusLost); 
  1.2328 +			AddExpectedWsEvent(EEventFocusGained);
  1.2329 +			AddExpectedWsEvent(EEventFocusGroupChanged);
  1.2330 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2331 +			
  1.2332 +			// Now simulate EButton1Down from first or second pointer on second group
  1.2333 +			// This should not reflect the autofocus
  1.2334 +			ptrPos.iX = 60;
  1.2335 +			ptrPos.iY = 60;
  1.2336 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2337 +			if (2 < iMaxDevPointers)
  1.2338 +				{
  1.2339 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 2);
  1.2340 +				}
  1.2341 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2342 +			if (2 < iMaxDevPointers)
  1.2343 +				{
  1.2344 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 2);
  1.2345 +				}
  1.2346 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2347 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2348 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2349 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2350 +			break;
  1.2351 +		case 9:
  1.2352 +			// First thing to do in this case is to delete the group window created
  1.2353 +			DeleteGroupWin();
  1.2354 +			
  1.2355 +			TRAP(err, CreateAnimDllAndAnimL());	// it cannot leave so trap and fail
  1.2356 +			if (err != KErrNone)
  1.2357 +				{
  1.2358 +				Failed();
  1.2359 +				}
  1.2360 +
  1.2361 +			// This is the first event which makes first pointer as primary
  1.2362 +			// When the last argument is EFalse, it means that the event is not consumed by Anim
  1.2363 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointerMove, ptrPos, 0, 0, 0, EFalse);
  1.2364 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2365 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2366 +			
  1.2367 +			// Now simulate moves from other pointers and these events are not sent to anim
  1.2368 +			for (ptrNum = 1; ptrNum < iMaxDevPointers; ptrNum++)
  1.2369 +				{
  1.2370 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2371 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2372 +				}
  1.2373 +
  1.2374 +			// This is to reset the primary pointer 
  1.2375 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointer3DOutOfRange, ptrPos, 0, 0, 0, EFalse);
  1.2376 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2377 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2378 +	
  1.2379 +			// Now simulate EButton1Down, which will make it as primary
  1.2380 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Down, ptrPos, 0, 0, 1, EFalse);
  1.2381 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2382 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2383 +			
  1.2384 +			// Simulate move or Ebutton1Down from any other prointer they are not sent back to client
  1.2385 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2386 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2387 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2388 +			
  1.2389 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Up, ptrPos, 0, 0, 1, EFalse);
  1.2390 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2391 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2392 +			
  1.2393 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointer3DOutOfRange, ptrPos, 0, 0, 1, EFalse);
  1.2394 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2395 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2396 +
  1.2397 +			// Set the primary pointer to Zero			
  1.2398 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Down, ptrPos, 0, 0, 0, EFalse);
  1.2399 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2400 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2401 +			
  1.2402 +			// Move from second pointer
  1.2403 +			// As EnableMultiPointer is not called and this is not a primary pointer so this event
  1.2404 +			// will cause the pointer 1 into move state
  1.2405 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2406 +			
  1.2407 +			// Take the zero pointer out-of-range 
  1.2408 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Up, ptrPos, 0, 0, 0, EFalse);
  1.2409 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2410 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2411 +			
  1.2412 +			iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointer3DOutOfRange, ptrPos, 0, 0, 0, EFalse);
  1.2413 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2414 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2415 +			
  1.2416 +			// These moves will not be sent
  1.2417 +			ptrPos.iX += 10;
  1.2418 +			ptrPos.iY += 10;
  1.2419 +			
  1.2420 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2421 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2422 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);		
  1.2423 +
  1.2424 +			TestAndDisplayAnimError();
  1.2425 +			
  1.2426 +			_LIT(KEventsChecked, "Events checked at server side = %d");
  1.2427 +			logText.Format(KEventsChecked, 10);
  1.2428 +			LOG_MESSAGE(logText);
  1.2429 +			break;
  1.2430 +		case 10:
  1.2431 +			DestroyAnimDllAndAnim();
  1.2432 +			
  1.2433 +			// Test for PointerMove buffers
  1.2434 +			// AllocPointerMoveBuffer, EnablePointerMoveBuffer and then simulate few moves
  1.2435 +			// Add these moves to another points buffer for testing
  1.2436 +			// Simulate moves from other pointers, these should not be delivered to clients.
  1.2437 +			iMultiPtrEventClient->ParentWin()->BaseWin()->AllocPointerMoveBuffer(10, 0);
  1.2438 +			iMultiPtrEventClient->ParentWin()->BaseWin()->EnablePointerMoveBuffer();
  1.2439 +			
  1.2440 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2441 +			AddExpectedWsEvent(EEventPointerBufferReady, EFalse, TAdvancedPointerEvent::EDefaultPointerNumber, (TUint)iMultiPtrEventClient->ParentWin());
  1.2442 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);   // If this position is above some other window then we need to consider its window postion also
  1.2443 +			ptrPos.iX += 10;
  1.2444 +			ptrPos.iY += 10;
  1.2445 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2446 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);
  1.2447 +			ptrPos.iX += 10;
  1.2448 +			ptrPos.iY += 10;
  1.2449 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2450 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);
  1.2451 +			
  1.2452 +			// These events should not be added to buffer
  1.2453 +			for (ptrNum = 1; ptrNum < iMaxDevPointers; ptrNum++)
  1.2454 +				{
  1.2455 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2456 +				ptrPos.iX += 10;
  1.2457 +				ptrPos.iY += 10;
  1.2458 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2459 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2460 +				}
  1.2461 +			break;
  1.2462 +		case 11:
  1.2463 +			// Repeat the above for drag events
  1.2464 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2465 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2466 +			
  1.2467 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2468 +			AddExpectedWsEvent(EEventPointerBufferReady, EFalse, TAdvancedPointerEvent::EDefaultPointerNumber, (TUint)iMultiPtrEventClient->ParentWin());
  1.2469 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);
  1.2470 +			ptrPos.iX += 10;
  1.2471 +			ptrPos.iY += 10;
  1.2472 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2473 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);
  1.2474 +			ptrPos.iX += 10;
  1.2475 +			ptrPos.iY += 10;
  1.2476 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2477 +			iMultiPtrEventClient->AddExpectedMovePoint(ptrPos);
  1.2478 +			
  1.2479 +			// These events should not be added to buffer
  1.2480 +			for (ptrNum = 1; ptrNum < iMaxDevPointers; ptrNum++)
  1.2481 +				{
  1.2482 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2483 +				ptrPos.iX += 10;
  1.2484 +				ptrPos.iY += 10;
  1.2485 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2486 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2487 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2488 +				}
  1.2489 +			
  1.2490 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2491 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2492 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2493 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2494 +			break;
  1.2495 +		case 12:
  1.2496 +			iMultiPtrEventClient->ParentWin()->BaseWin()->FreePointerMoveBuffer();
  1.2497 +			iMultiPtrEventClient->ParentWin()->BaseWin()->DisablePointerMoveBuffer();
  1.2498 +			
  1.2499 +			// Pointer Cursor Position test 
  1.2500 +			// This event is for simulating primary pointer
  1.2501 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2502 +			// Here I am not adding the event because this event is deleted by another move of same pointer
  1.2503 +			if (ptrPos != iMultiPtrEventClient->iWs.PointerCursorPosition())
  1.2504 +				{
  1.2505 +				TEST(EFalse);
  1.2506 +				Failed();
  1.2507 +				}
  1.2508 +			
  1.2509 +			iMultiPtrEventClient->iWs.SetPointerCursorPosition(TPoint(20,20));
  1.2510 +			if (TPoint(20,20) != iMultiPtrEventClient->iWs.PointerCursorPosition())
  1.2511 +				{
  1.2512 +				TEST(EFalse);
  1.2513 +				Failed();
  1.2514 +				}
  1.2515 +			
  1.2516 +			// Now simulate moves from other pointer, this should not have any effect on pointer cursor position
  1.2517 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2518 +
  1.2519 +			// Now move the primary pointer, and check the pointer cursor position which should be same as position used for move
  1.2520 +			ptrPos.iX = 30;
  1.2521 +			ptrPos.iY = 30;
  1.2522 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2523 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2524 +			if (ptrPos != iMultiPtrEventClient->iWs.PointerCursorPosition())
  1.2525 +				{
  1.2526 +				TEST(EFalse);
  1.2527 +				Failed();
  1.2528 +				}
  1.2529 +			
  1.2530 +			// Send out-of-range event which will not lead to pointer 1 becoming primary
  1.2531 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2532 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2533 +			
  1.2534 +			// Now check the pointer cursor position, which should be same
  1.2535 +			// as primary even if there is other pointer in up state, but that is not primary
  1.2536 +			if (ptrPos != iMultiPtrEventClient->iWs.PointerCursorPosition())
  1.2537 +				{
  1.2538 +				TEST(EFalse);
  1.2539 +				Failed();
  1.2540 +				}
  1.2541 +			
  1.2542 +			// This is to bring the pointer1 to out-of-range state
  1.2543 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2544 +			
  1.2545 +			// then send move event and then again check the pointer cursor position
  1.2546 +			ptrPos.iX = 20;
  1.2547 +			ptrPos.iY = 20;
  1.2548 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2549 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2550 +			if (ptrPos != iMultiPtrEventClient->iWs.PointerCursorPosition())
  1.2551 +				{
  1.2552 +				TEST(EFalse);
  1.2553 +				Failed();
  1.2554 +				}
  1.2555 +			
  1.2556 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2557 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2558 +			
  1.2559 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2560 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2561 +			break;
  1.2562 +		case 13:
  1.2563 +			{
  1.2564 +			// Pointer Cursor Area test-1
  1.2565 +			iOrigPtrCursorArea = iMultiPtrEventClient->iWs.PointerCursorArea();
  1.2566 +			TRect ptrCurArea(0,0,40,40);
  1.2567 +			iMultiPtrEventClient->iWs.SetPointerCursorArea(ptrCurArea);
  1.2568 +			
  1.2569 +			// Simulate move from pointer0 in PointerCursorArea
  1.2570 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2571 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2572 +			
  1.2573 +			// Simulate move from other pointer, This should have no effect
  1.2574 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2575 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2576 +			
  1.2577 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2578 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2579 +
  1.2580 +			// Repeat the above with moves outside pointer cursor area 
  1.2581 +			ptrPos.iX = 50;
  1.2582 +			ptrPos.iY = 50;
  1.2583 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 0);
  1.2584 +			TPoint pointInCurArea(39, 39);
  1.2585 +			AddExpectedPointerEvent(TPointerEvent::EMove, pointInCurArea, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2586 +			
  1.2587 +			// Simulate move from other pointer, This should have no effect			
  1.2588 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, 1);
  1.2589 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2590 +						
  1.2591 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2592 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, pointInCurArea, proxValue, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2593 +			}
  1.2594 +			break;
  1.2595 +		case 14:
  1.2596 +			{
  1.2597 +			// Pointer Cursor Area test-2
  1.2598 +			// repeat the above test with button1 down
  1.2599 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2600 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2601 +			
  1.2602 +			// Simulate move from other pointer, This should have no effect
  1.2603 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2604 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2605 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2606 +			
  1.2607 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2608 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2609 +			
  1.2610 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2611 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2612 +			
  1.2613 +			// Repeat the above with moves outside pointer cursor area 
  1.2614 +			ptrPos.iX = 50;
  1.2615 +			ptrPos.iY = 50;
  1.2616 +			TPoint pointInCurArea(39, 39);
  1.2617 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2618 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, pointInCurArea, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2619 +			
  1.2620 +			// Simulate move from other pointer, This should have no effect
  1.2621 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2622 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 1);
  1.2623 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 1);
  1.2624 +			
  1.2625 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.2626 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, pointInCurArea, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2627 +			
  1.2628 +			SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, 0);
  1.2629 +			AddExpectedPointerEvent(TPointerEvent::EOutOfRange, pointInCurArea, 0, 0, TAdvancedPointerEvent::EDefaultPointerNumber);
  1.2630 +			}
  1.2631 +			break;
  1.2632 +		default:
  1.2633 +			ClearExpectNonAdvancedPointerEvents();
  1.2634 +			iMultiPtrEventClient->iWs.SetPointerCursorArea(iOrigPtrCursorArea);
  1.2635 +			ResetFlushStopAS();
  1.2636 +			break;
  1.2637 +		}
  1.2638 +	LogEventsAdded();
  1.2639 +	}
  1.2640 +
  1.2641 +/**
  1.2642 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0026
  1.2643 +@SYMPREQ				PREQ1226
  1.2644 +@SYMREQ					REQ9677, REQ9683
  1.2645 +@SYMTestPriority		High
  1.2646 +@SYMTestCaseDesc		Checks Wserv supports Autofocus for multiple pointers
  1.2647 +@SYMTestStatus			Implemented
  1.2648 +
  1.2649 +@SYMTestActions			Create 2 group window and respective client windows for it. And simulate EButton1Down on each window consecutively 
  1.2650 +@SYMTestExpectedResults The received events must match the simulated pointer events
  1.2651 +*/
  1.2652 +void CTMultiPtrEventTest::AutoForeGroundForMultiplePointersL()
  1.2653 +	{
  1.2654 +	TLogMessageText logText;
  1.2655 +	_LIT(KSet, "Multiple pointer Auto foreground events: %d of 2");
  1.2656 +	logText.AppendFormat(KSet, iEventSet);
  1.2657 +	LOG_MESSAGE(logText);
  1.2658 +	
  1.2659 +	if (!iEventSet)
  1.2660 +		{
  1.2661 +		SetAutoFlush();
  1.2662 +		AddExpectedWsEvent(EEventFocusGained);			// This if for the main groupwindow
  1.2663 +		iMultiPtrEventClient->ConstructGroupBlankWinL();
  1.2664 +		
  1.2665 +		// These are for child group window creation
  1.2666 +		AddExpectedWsEvent(EEventFocusLost);			// This if for the main groupwindow losing focus
  1.2667 +		AddExpectedWsEvent(EEventFocusGained);			// First group window of this test creation
  1.2668 +		
  1.2669 +		AddExpectedWsEvent(EEventFocusLost);			// First group window losing focus because of second group creation
  1.2670 +		AddExpectedWsEvent(EEventFocusGained);			// Second group window creation
  1.2671 +		AddExpectedWsEvent(EEventFocusGroupChanged);	// First group window's Enable Focus changed flag is set
  1.2672 +		}
  1.2673 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.2674 +	
  1.2675 +	TPoint win1PtrPos(20,20);
  1.2676 +	TPoint win2PtrPos(60,60);
  1.2677 +	TPoint ptrPos;
  1.2678 +	TInt autoFocusWin;
  1.2679 +	switch(iEventSet++)
  1.2680 +		{
  1.2681 +		case 0:
  1.2682 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.2683 +				{
  1.2684 +				if ((ptrNum & 1) == 0)
  1.2685 +					{
  1.2686 +					ptrPos = win1PtrPos;
  1.2687 +					autoFocusWin = 1;
  1.2688 +					}
  1.2689 +				else
  1.2690 +					{
  1.2691 +					ptrPos = win2PtrPos;
  1.2692 +					autoFocusWin = 0;
  1.2693 +					}
  1.2694 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2695 +				AddExpectedWsEvent(EEventFocusLost);				// Second group window losing focus 
  1.2696 +				AddExpectedWsEvent(EEventFocusGained);				// First group window gaining focus
  1.2697 +				if (ptrNum == 0)
  1.2698 +					{												// First group window has already received EEventFocusGroupChanged
  1.2699 +					AddExpectedWsEvent(EEventFocusGroupChanged);	// Second group window's Enable Focus changed flag is set
  1.2700 +					}
  1.2701 +				// In the queue only once EEventFocusGroupChanged is sent
  1.2702 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.2703 +				
  1.2704 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2705 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.2706 +				
  1.2707 +				// These events are to clear out the pointer state
  1.2708 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2709 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, ptrNum);
  1.2710 +				
  1.2711 +				if (!iMultiPtrEventClient->CheckOrdinalPosition(autoFocusWin))
  1.2712 +					{
  1.2713 +					TEST(EFalse);
  1.2714 +					Failed();
  1.2715 +					}
  1.2716 +				}
  1.2717 +			break;
  1.2718 +		case 1:
  1.2719 +			for (TInt ptrNum = iMaxDevPointers/2; ptrNum < iMaxDevPointers; ptrNum++)
  1.2720 +				{
  1.2721 +				if ((ptrNum & 1) == 0)
  1.2722 +					{
  1.2723 +					ptrPos = win1PtrPos;
  1.2724 +					autoFocusWin = 1;
  1.2725 +					}
  1.2726 +				else
  1.2727 +					{
  1.2728 +					ptrPos = win2PtrPos;
  1.2729 +					autoFocusWin = 0;
  1.2730 +					}
  1.2731 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2732 +				AddExpectedWsEvent(EEventFocusLost);				// Second group window losing focus 
  1.2733 +				AddExpectedWsEvent(EEventFocusGained);				// First group window gaining focus
  1.2734 +				if (ptrNum == iMaxDevPointers/2) // first loop
  1.2735 +					{												
  1.2736 +					// When ever a group window changes focus, For all the group/client windows which have 
  1.2737 +					// registered for receiving group window changes recive EEventFocusGroupChanged
  1.2738 +					// EEventFocusGroupChanged is sent only once in one queue
  1.2739 +					AddExpectedWsEvent(EEventFocusGroupChanged);
  1.2740 +					AddExpectedWsEvent(EEventFocusGroupChanged);
  1.2741 +					}
  1.2742 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.2743 +
  1.2744 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2745 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.2746 +				
  1.2747 +				// These events are to clear out the pointer state
  1.2748 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2749 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, 0, 0, ptrNum);
  1.2750 +				if (!iMultiPtrEventClient->CheckOrdinalPosition(autoFocusWin))
  1.2751 +					{
  1.2752 +					TEST(EFalse);
  1.2753 +					Failed();
  1.2754 +					}
  1.2755 +				}
  1.2756 +			break;
  1.2757 +		default:
  1.2758 +			iMultiPtrEventClient->DeleteGroupBlankWin();
  1.2759 +			ResetFlushStopAS();
  1.2760 +			break;
  1.2761 +		}
  1.2762 +	
  1.2763 +	LogEventsAdded();
  1.2764 +	}
  1.2765 +
  1.2766 +/**
  1.2767 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0015
  1.2768 +@SYMPREQ				PREQ1226
  1.2769 +@SYMREQ					REQ9684
  1.2770 +@SYMTestPriority		High
  1.2771 +@SYMTestCaseDesc		Checks Wserv supports out-of-range and pointer Enter/Exit events.
  1.2772 +@SYMTestStatus			Implemented
  1.2773 +
  1.2774 +@SYMTestActions			Simulate moves and EPointer3DOutOfRange from different pointers
  1.2775 +@SYMTestExpectedResults The received events must match the simulated pointer events
  1.2776 +*/
  1.2777 +void CTMultiPtrEventTest::MultiPointerOutOfRangeEvents()
  1.2778 +	{
  1.2779 +	TLogMessageText logText;
  1.2780 +	_LIT(KSet, "OutOfRange & Enter/Exit events: %d of 4");
  1.2781 +	logText.AppendFormat(KSet, iEventSet);
  1.2782 +	LOG_MESSAGE(logText);
  1.2783 +	
  1.2784 +	if (!iEventSet)
  1.2785 +		{
  1.2786 +		SetAutoFlush();
  1.2787 +		AddExpectedWsEvent(EEventFocusGained);
  1.2788 +		}
  1.2789 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.2790 +	
  1.2791 +	TPoint ptrPos(10,10);
  1.2792 +	TInt proxValue = -iProximityStep; 
  1.2793 +	switch(iEventSet++)
  1.2794 +		{
  1.2795 +		case 0:
  1.2796 +			// Simulate moves and EPointer3DOutOfRange from all pointers
  1.2797 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.2798 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.2799 +				{
  1.2800 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2801 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.2802 +				
  1.2803 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2804 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.2805 +				// Here I am not enabling the enter/exit events filter so not getting those 
  1.2806 +				}
  1.2807 +			break;
  1.2808 +		case 1:
  1.2809 +			// Repeat the above by enabling the enter/exit events
  1.2810 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterEnterExit, 0);
  1.2811 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum = ptrNum+2)
  1.2812 +				{
  1.2813 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2814 +				AddExpectedWsEvent(EEventPointerEnter, EFalse, ptrNum);
  1.2815 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.2816 +				
  1.2817 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2818 +				AddExpectedWsEvent(EEventPointerExit, EFalse, ptrNum);
  1.2819 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.2820 +				}
  1.2821 +			break;
  1.2822 +		case 2:
  1.2823 +			// Check the moves from one window to other
  1.2824 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum = ptrNum+2)
  1.2825 +				{
  1.2826 +				ptrPos.iX = 10;
  1.2827 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2828 +				AddExpectedWsEvent(EEventPointerEnter, EFalse, ptrNum);
  1.2829 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.2830 +				
  1.2831 +				ptrPos.iX = (iMultiPtrEventClient->ParentWin()->Size().iWidth)/2 + 10;
  1.2832 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2833 +				AddExpectedWsEvent(EEventPointerExit, EFalse, ptrNum); // move and enter of child window is filtered out
  1.2834 +				}
  1.2835 +			break;
  1.2836 +		case 3:
  1.2837 +			// Since all the pointers are now on child and when we change the pointer filter
  1.2838 +			// wserv sends enter event to all pointers
  1.2839 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterEnterExit, 0);
  1.2840 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum = ptrNum+2)
  1.2841 +				{
  1.2842 +				AddExpectedWsEvent(EEventPointerEnter, EFalse, ptrNum);
  1.2843 +				}
  1.2844 +			for (TInt ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum = ptrNum+2)
  1.2845 +				{
  1.2846 +				ptrPos.iX = ptrPos.iY =10;
  1.2847 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.2848 +				AddExpectedWsEvent(EEventPointerExit, EFalse, ptrNum);
  1.2849 +				AddExpectedWsEvent(EEventPointerEnter, EFalse, ptrNum);
  1.2850 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.2851 +				
  1.2852 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, 0, 0, 0, ptrNum);
  1.2853 +				AddExpectedWsEvent(EEventPointerExit, EFalse, ptrNum);
  1.2854 +				AddExpectedPointerEvent(TPointerEvent::EOutOfRange, ptrPos, proxValue, 0, ptrNum);
  1.2855 +				}
  1.2856 +			break;			
  1.2857 +		default:
  1.2858 +			ResetFlushStopAS();
  1.2859 +			break;
  1.2860 +		}
  1.2861 +	
  1.2862 +	LogEventsAdded();
  1.2863 +	}
  1.2864 +
  1.2865 +/**
  1.2866 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0032
  1.2867 +@SYMPREQ				PREQ1226
  1.2868 +@SYMREQ					REQ9677
  1.2869 +@SYMTestPriority		High
  1.2870 +@SYMTestCaseDesc		Checks Wserv supports Double click events for multi pointer events.
  1.2871 +@SYMTestStatus			Implemented
  1.2872 +
  1.2873 +@SYMTestActions			Simulate double click events from different pointers 			
  1.2874 +@SYMTestExpectedResults The received events must match the simulated pointer events
  1.2875 +*/
  1.2876 +void CTMultiPtrEventTest::DoubleClickForMultiplePointers()
  1.2877 +	{
  1.2878 +	// Logic involved, double click settings are global no need to test them
  1.2879 +	// Check that double click events are sent by wserv for all pointers
  1.2880 +	TLogMessageText logText;
  1.2881 +	_LIT(KSet, "Double click settings and events: %d of 1");
  1.2882 +	logText.AppendFormat(KSet, iEventSet);
  1.2883 +	LOG_MESSAGE(logText);
  1.2884 +	
  1.2885 +	if (!iEventSet)
  1.2886 +		{
  1.2887 +		SetAutoFlush();
  1.2888 +		AddExpectedWsEvent(EEventFocusGained);
  1.2889 +		}
  1.2890 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.2891 +	
  1.2892 +	TPoint ptrPos(10,10);
  1.2893 +	switch(iEventSet++)
  1.2894 +		{
  1.2895 +		case 0:
  1.2896 +			for (TInt ptrNum = 0; ptrNum < Min(iMaxDevPointers, 7); ptrNum++)
  1.2897 +				{
  1.2898 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2899 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.2900 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.2901 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, EModifierDoubleClick, ptrNum);
  1.2902 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.2903 +				}
  1.2904 +			break;
  1.2905 +		default:
  1.2906 +			ResetFlushStopAS();
  1.2907 +			break;
  1.2908 +		}
  1.2909 +	
  1.2910 +	LogEventsAdded();
  1.2911 +	}
  1.2912 +
  1.2913 +
  1.2914 +/**
  1.2915 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0031
  1.2916 +@SYMPREQ				PREQ1226
  1.2917 +@SYMREQ					REQ9677
  1.2918 +@SYMTestPriority		High
  1.2919 +@SYMTestCaseDesc		Checks Wserv supports Virtual keyboard for multi pointer events.
  1.2920 +@SYMTestStatus			Implemented
  1.2921 +
  1.2922 +@SYMTestActions			Create virtual keyboard by AddKeyRect() to a window and simulate pointer events from all pointers			
  1.2923 +@SYMTestExpectedResults The received events must match the simulated Key events
  1.2924 +*/
  1.2925 +void CTMultiPtrEventTest::VirtualKeyBoardForMultiplePointers()
  1.2926 +	{
  1.2927 +	TLogMessageText logText;
  1.2928 +	_LIT(KSet, "VirtualKeyboard SetOfEvents: %d of 8");
  1.2929 +	logText.AppendFormat(KSet, iEventSet);
  1.2930 +	LOG_MESSAGE(logText);
  1.2931 +
  1.2932 +	// Create virtual keyboard for 8 keys on parent window
  1.2933 +	// give a 5 pixel spacing at start/end and in between keys
  1.2934 +	const TInt noVirtualKeys = iMaxDevPointers;
  1.2935 +	const TInt keySpacing = 5;
  1.2936 +	const TInt keyWidth = ((iPhysicalScreenSize.iWidth/2) - ((noVirtualKeys+1)*keySpacing))/noVirtualKeys;
  1.2937 +	const TInt keyHeight = keyWidth/2; 
  1.2938 +	TInt startX = keySpacing;
  1.2939 +	const TInt baseChar ='A';
  1.2940 +	
  1.2941 +	if (!iEventSet)
  1.2942 +		{
  1.2943 +		SetAutoFlush();
  1.2944 +		for (TInt count=0; count < noVirtualKeys; count++)
  1.2945 +			{
  1.2946 +			iMultiPtrEventClient->ParentWin()->BaseWin()->AddKeyRect(TRect(startX, keySpacing, startX+keyWidth, keySpacing+keyHeight), baseChar+count,EFalse);
  1.2947 +			startX+=(keyWidth+keySpacing);
  1.2948 +			}
  1.2949 +		AddExpectedWsEvent(EEventFocusGained);
  1.2950 +		}
  1.2951 +	
  1.2952 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.2953 +	TPoint ptrPos(keySpacing+(keyWidth/2), keySpacing+(keyHeight/2));
  1.2954 +
  1.2955 +	TInt count = 0;
  1.2956 +	if (iEventSet < iMaxDevPointers)
  1.2957 +		{
  1.2958 +		for (; ptrPos.iX < (iPhysicalScreenSize.iWidth/2)-5; ptrPos.iX += (keySpacing+keyWidth), count++)
  1.2959 +			{
  1.2960 +			SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, iEventSet);
  1.2961 +			AddExpectedKeyDownUp(baseChar+count);
  1.2962 +			}
  1.2963 +		}
  1.2964 +	else
  1.2965 +		{
  1.2966 +		ResetFlushStopAS();
  1.2967 +		}
  1.2968 +	iEventSet++;
  1.2969 +
  1.2970 +	LogEventsAdded();
  1.2971 +	}
  1.2972 +
  1.2973 +/**
  1.2974 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0021
  1.2975 +@SYMPREQ				PREQ1226
  1.2976 +@SYMREQ					REQ9677,REQ9683,
  1.2977 +@SYMTestPriority		High
  1.2978 +@SYMTestCaseDesc		Checks Wserv supports Grabbing in case of multi pointer events.
  1.2979 +@SYMTestStatus			Implemented
  1.2980 +
  1.2981 +@SYMTestActions			Simulate EButton1Down events on iParentWin. Simulate Drag and Button1Up events on iChildWin.
  1.2982 + 						SetPointerGrab is called on iParentWin for first test and disabled for the second. 
  1.2983 +@SYMTestExpectedResults The Drag and Button1Up events contain a handle to iParentWin when Grabbing active. 
  1.2984 +						The Drag and Button1Up events contain a handle to iChildWin when Grabbing disabled.
  1.2985 +*/
  1.2986 +void CTMultiPtrEventTest::GrabbingMultiPointerEvents()
  1.2987 +	{
  1.2988 +	// Test Grabbing of multi pointer events
  1.2989 +	// 1. Test Wserv supports Grabbing in case of multi-pointer events
  1.2990 +	// 2. Test pointer events are delivered correctly when Grabbing is disabled.
  1.2991 +	TLogMessageText logText;
  1.2992 +	_LIT(KSet, "GrabbingMultiPtrEvents SetOfEvents: %d of 2");
  1.2993 +	logText.AppendFormat(KSet, iEventSet);
  1.2994 +	LOG_MESSAGE(logText);
  1.2995 +	
  1.2996 +	if (!iEventSet)
  1.2997 +		{
  1.2998 +		SetAutoFlush();
  1.2999 +		}
  1.3000 +	
  1.3001 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3002 +
  1.3003 +	TPoint ptrPos;
  1.3004 +		
  1.3005 +	switch(iEventSet++)
  1.3006 +		{
  1.3007 +		case 0:
  1.3008 +			INFO_PRINTF1(_L("Check Wserv supports Grabbing in case of multi-pointer events"));
  1.3009 +			// Check pointer events are delivered to the window where the EButton1Down event occured, 
  1.3010 +			// even if subsequent events are simulated outside this window.
  1.3011 +			AddExpectedWsEvent(EEventFocusGained);
  1.3012 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.3013 +			iMultiPtrEventClient->ParentWin()->BaseWin()->SetPointerGrab(ETrue);
  1.3014 +			TestGrabbingForMultiPointer(ETrue);
  1.3015 +			break;	
  1.3016 +		case 1:
  1.3017 +			INFO_PRINTF1(_L("Check pointer events are delivered correctly when Grabbing is disabled."));
  1.3018 +			// Check pointer events are delivered to the window on which they occured.					
  1.3019 +			iMultiPtrEventClient->ParentWin()->BaseWin()->SetPointerGrab(EFalse);
  1.3020 +			TestGrabbingForMultiPointer(EFalse);
  1.3021 +			break;	
  1.3022 +		default:
  1.3023 +			ResetFlushStopAS();
  1.3024 +			break;
  1.3025 +		}
  1.3026 +	LogEventsAdded();
  1.3027 +	}
  1.3028 +
  1.3029 +/**
  1.3030 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0025
  1.3031 +@SYMPREQ				PREQ1226
  1.3032 +@SYMREQ					REQ9677,REQ9683,
  1.3033 +@SYMTestPriority		High
  1.3034 +@SYMTestCaseDesc		Checks Wserv supports Filtering in case of multi pointer events.
  1.3035 +@SYMTestStatus			Implemented
  1.3036 +
  1.3037 +@SYMTestActions			Simulate Move and Drag events. Add only Button1Up and Button1Down to TWsEvent buffer.
  1.3038 +   						Disable Filtering and repeat test with the addition of Move and Drag events to TWsEvent buffer. 
  1.3039 +@SYMTestExpectedResults The received events must match the expected simulated raw events
  1.3040 +						The received events must match the simulated raw events
  1.3041 +*/
  1.3042 +void CTMultiPtrEventTest::FilteringMultiPointerEvents()
  1.3043 +	{
  1.3044 +	// Test Filtering of multi pointer events
  1.3045 +	// 1. Test pointer move and drag events are filtered correctly by Wserv
  1.3046 +	// 2. Test pointer events are delivered correctly when Filtered is disabled.
  1.3047 +	TLogMessageText logText;
  1.3048 +	_LIT(KSet, "FilteringMultiPtrEvents SetOfEvents: %d of 2");
  1.3049 +	logText.AppendFormat(KSet, iEventSet);
  1.3050 +	LOG_MESSAGE(logText);
  1.3051 +	
  1.3052 +	if (!iEventSet)
  1.3053 +		{
  1.3054 +		SetAutoFlush();
  1.3055 +		}
  1.3056 +	
  1.3057 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3058 +
  1.3059 +	TPoint ptrPos;
  1.3060 +		
  1.3061 +	switch(iEventSet++)
  1.3062 +		{
  1.3063 +		case 0:
  1.3064 +			INFO_PRINTF1(_L("Check pointer move and drag events are filtered with multi-pointer events"));
  1.3065 +			// Check pointer move and drag events are filtered by Wserv
  1.3066 +			AddExpectedWsEvent(EEventFocusGained);
  1.3067 +			
  1.3068 +			// Ensure default values are set i.e. Drag and Move events are filtered out and not delivered to the client.
  1.3069 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag|EPointerFilterMove,
  1.3070 +																		EPointerFilterDrag|EPointerFilterMove);
  1.3071 +			TestFilteringForMultiPointer(ETrue);
  1.3072 +			break;	
  1.3073 +		case 1:
  1.3074 +			INFO_PRINTF1(_L("Check pointer move and drag events are not filtered, with multi-pointer events, when filtering is disabled"));
  1.3075 +			// Check move and drag events are not filtered by Wserv when filtering is disabled					
  1.3076 +
  1.3077 +			// Enable Drag and Move events
  1.3078 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag|EPointerFilterMove, 0);
  1.3079 +			TestFilteringForMultiPointer(EFalse);
  1.3080 +			break;				
  1.3081 +		default:
  1.3082 +			ResetFlushStopAS();
  1.3083 +			break;
  1.3084 +		}
  1.3085 +	LogEventsAdded();
  1.3086 +	}
  1.3087 +
  1.3088 +void CTMultiPtrEventTest::SetDefaultScreenMode()
  1.3089 +	{
  1.3090 +	iMultiPtrEventClient->iScreen->SetAppScreenMode(0);
  1.3091 +	TheClient->iScreen->SetAppScreenMode(0);
  1.3092 +	iMultiPtrEventClient->iScreen->SetScreenMode(0);
  1.3093 +	iMultiPtrEventClient->iScreen->SetCurrentRotations(0, CFbsBitGc::EGraphicsOrientationNormal);
  1.3094 +	}
  1.3095 +
  1.3096 +TPoint PhysicalToLogical(TPoint aPhysicalPt, TPoint aOrigin, TSize aSize)
  1.3097 +	{
  1.3098 +	return PhysicalToLogical(aPhysicalPt-aOrigin, aSize);
  1.3099 +	}
  1.3100 +
  1.3101 +TPoint CTMultiPtrEventTest::GetPointerPostionOnRotatedMode(TPoint aPointerPos, CFbsBitGc::TGraphicsOrientation aRotation)
  1.3102 +	{
  1.3103 +	if (aRotation == CFbsBitGc::EGraphicsOrientationNormal)
  1.3104 +		{
  1.3105 +		return aPointerPos;
  1.3106 +		}
  1.3107 +	else if (aRotation == CFbsBitGc::EGraphicsOrientationRotated90)
  1.3108 +		{
  1.3109 +		// here width is actually height in rotated mode
  1.3110 +		return TPoint(iPhysicalScreenSize.iWidth - aPointerPos.iY - 1, aPointerPos.iX);
  1.3111 +		}
  1.3112 +	else if (aRotation == CFbsBitGc::EGraphicsOrientationRotated180)
  1.3113 +		{
  1.3114 +		return TPoint(iPhysicalScreenSize.iWidth - aPointerPos.iX - 1, iPhysicalScreenSize.iHeight - aPointerPos.iY - 1);
  1.3115 +		}
  1.3116 +	else if (aRotation == CFbsBitGc::EGraphicsOrientationRotated270)
  1.3117 +		{
  1.3118 +		// here width is actually height in rotated mode
  1.3119 +		return TPoint(aPointerPos.iY, iPhysicalScreenSize.iHeight - aPointerPos.iX -1);
  1.3120 +		}
  1.3121 +	return TPoint(0,0);
  1.3122 +	}
  1.3123 +
  1.3124 +/**
  1.3125 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0028
  1.3126 +@SYMPREQ				PREQ1226
  1.3127 +@SYMREQ					REQ9677, REQ9683
  1.3128 +@SYMTestPriority		High 
  1.3129 +@SYMTestCaseDesc		To check Wserv sends multi pointer events in Different screen modes
  1.3130 +@SYMTestStatus			Implemented
  1.3131 +
  1.3132 +@SYMTestActions			Simulate multi pointer events in Different screenmodes
  1.3133 +@SYMTestExpectedResults The received events must match the simulated raw events  
  1.3134 +*/
  1.3135 +void CTMultiPtrEventTest::MultiPointerEventsInDiffScreenModes()
  1.3136 +	{
  1.3137 +	// Logic inloved, For a particular screen mode check pointer down/up, moves and drags
  1.3138 +	// for different pointers and for different co-ordinates.
  1.3139 +	// For each screen mode check these events on diffferent rotation that screen mode supports
  1.3140 +	// During the last switch case increment the screenmode
  1.3141 +	TLogMessageText logText;
  1.3142 +	_LIT(KSet, "Multi pointer events in screenmode(%d): %d of 2");
  1.3143 +	logText.AppendFormat(KSet, iCurrentScreenMode+1, iEventSet);
  1.3144 +	LOG_MESSAGE(logText);
  1.3145 +	
  1.3146 +	TInt numScrMode = iMultiPtrEventClient->iScreen->NumScreenModes();
  1.3147 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3148 +	
  1.3149 +	if (!iEventSet && !iChangeScreenMode)
  1.3150 +		{
  1.3151 +		SetAutoFlush();
  1.3152 +		iChangeScreenMode = ETrue;
  1.3153 +		AddExpectedWsEvent(EEventFocusGained);
  1.3154 +		}
  1.3155 +	else
  1.3156 +		{
  1.3157 +		if (iChangeScreenMode)
  1.3158 +			{
  1.3159 +			if (iCurrentScreenMode >= numScrMode)
  1.3160 +				{
  1.3161 +EndFun:
  1.3162 +				SetDefaultScreenMode();
  1.3163 +				ResetFlushStopAS();
  1.3164 +				return;
  1.3165 +				}
  1.3166 +			}
  1.3167 +		}
  1.3168 +
  1.3169 +	if (iChangeScreenMode)
  1.3170 +		{
  1.3171 +		iMultiPtrEventClient->iScreen->SetAppScreenMode(iCurrentScreenMode);
  1.3172 +		TheClient->iScreen->SetAppScreenMode(iCurrentScreenMode);
  1.3173 +		iMultiPtrEventClient->iScreen->SetScreenMode(iCurrentScreenMode);
  1.3174 +		iChangeScreenMode = EFalse;
  1.3175 +		}
  1.3176 +	
  1.3177 +	CArrayFixFlat<TInt>* rotations = NULL;
  1.3178 +	TRAPD(err, 
  1.3179 +			rotations = new(ELeave) CArrayFixFlat<TInt>(1);
  1.3180 +			iMultiPtrEventClient->iScreen->GetRotationsList(iCurrentScreenMode, rotations));
  1.3181 +	if (err != KErrNone)
  1.3182 +		{
  1.3183 +		if (iEventSet)
  1.3184 +			{
  1.3185 +			goto EndFun;
  1.3186 +			}
  1.3187 +		else
  1.3188 +			{
  1.3189 +			return;
  1.3190 +			}
  1.3191 +		}
  1.3192 +
  1.3193 +#if !defined(__WINS__)	
  1.3194 +	TPoint ptrRotatedPos;
  1.3195 +	TPoint ptrNormalPos;
  1.3196 +#else
  1.3197 +	TPoint ptrPhyPos;
  1.3198 +#endif
  1.3199 +	TPoint ptrLogPos;	
  1.3200 +	
  1.3201 +	TInt ptrNum = 0;
  1.3202 +	TInt proxValue = 0;
  1.3203 +	// Since screenmode positioning and screenmode scaling is not supported in NGA wserv2
  1.3204 +	// but it is supported in Non NGA. But for NGA it will return (0,0) as origin and (1,1) as scale.
  1.3205 +	TPoint screenOrigin(iMultiPtrEventClient->iScreen->GetDefaultScreenModeOrigin());
  1.3206 +	TPoint scaledScreenOrigin(iMultiPtrEventClient->iScreen->GetCurrentScreenModeScaledOrigin());
  1.3207 +	TSize scale(iMultiPtrEventClient->iScreen->GetCurrentScreenModeScale());
  1.3208 +	
  1.3209 +	switch(iEventSet++)
  1.3210 +		{
  1.3211 +		case 0:
  1.3212 +			// Simulate Pointer down/up for different rotations of a screenmode
  1.3213 +			for (TInt rotCou = 0; rotCou < rotations->Count(); rotCou++)
  1.3214 +				{
  1.3215 +				CFbsBitGc::TGraphicsOrientation newOrientation = static_cast<CFbsBitGc::TGraphicsOrientation>(rotations[0][rotCou]);
  1.3216 +				iMultiPtrEventClient->iScreen->SetCurrentRotations(iCurrentScreenMode, newOrientation);
  1.3217 +				
  1.3218 +#if !defined(__WINS__)
  1.3219 +				ptrNormalPos = screenOrigin;
  1.3220 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3221 +				SimulatePointerDownUp(ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3222 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);				
  1.3223 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3224 +				
  1.3225 +				ptrNormalPos.iX += 10;
  1.3226 +				ptrNormalPos.iY += 5;
  1.3227 +				ptrNum = iMaxDevPointers/2;
  1.3228 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3229 +				SimulatePointerDownUp(ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3230 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);				
  1.3231 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3232 +				
  1.3233 +				ptrNormalPos.iX += 5;
  1.3234 +				ptrNormalPos.iY += 10;
  1.3235 +				ptrNum = iMaxDevPointers-1;
  1.3236 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3237 +				SimulatePointerDownUp(ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3238 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);				
  1.3239 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3240 +				ptrNum = 0;
  1.3241 +#else
  1.3242 +				// This is not needed for NGA, becasue NGA wserv does not support positioning and scaling 
  1.3243 +				// but for early access we are deliverying for NonNGA so we need it. 
  1.3244 +				ptrPhyPos = screenOrigin;
  1.3245 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3246 +				SimulatePointerDownUp(ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3247 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3248 +				ptrPhyPos.iX += 10;
  1.3249 +				ptrPhyPos.iY += 5;
  1.3250 +				ptrNum = iMaxDevPointers/2;
  1.3251 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3252 +				SimulatePointerDownUp(ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3253 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3254 +				ptrPhyPos.iX += 5;
  1.3255 +				ptrPhyPos.iY += 10;
  1.3256 +				ptrNum = iMaxDevPointers-1;
  1.3257 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3258 +				SimulatePointerDownUp(ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3259 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3260 +				ptrNum = 0;
  1.3261 +#endif
  1.3262 +				}
  1.3263 +			break;
  1.3264 +		case 1:
  1.3265 +			// Simulate moves for different rotations of a screenmode with different Proximity
  1.3266 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove,0);
  1.3267 +			for (TInt rotCou = 0; rotCou < rotations->Count(); rotCou++)
  1.3268 +				{
  1.3269 +				CFbsBitGc::TGraphicsOrientation newOrientation = static_cast<CFbsBitGc::TGraphicsOrientation>(rotations[0][rotCou]);
  1.3270 +				iMultiPtrEventClient->iScreen->SetCurrentRotations(iCurrentScreenMode, newOrientation);
  1.3271 +				
  1.3272 +#if !defined(__WINS__)				
  1.3273 +				ptrNormalPos = screenOrigin;
  1.3274 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3275 +				proxValue = -iProximityStep;
  1.3276 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrRotatedPos.iX, ptrRotatedPos.iY, proxValue, ptrNum);
  1.3277 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);			
  1.3278 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrLogPos, proxValue, 0, ptrNum);
  1.3279 +				SimulatePointerDownUp(ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3280 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3281 +				
  1.3282 +				ptrNormalPos.iX += 10;
  1.3283 +				ptrNormalPos.iY += 5;
  1.3284 +				ptrNum = iMaxDevPointers/2;
  1.3285 +				if (proxValue-iProximityStep > iMaxProximity)
  1.3286 +					{
  1.3287 +					proxValue -= iProximityStep;
  1.3288 +					}
  1.3289 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3290 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrRotatedPos.iX, ptrRotatedPos.iY, proxValue, ptrNum);
  1.3291 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);								
  1.3292 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrLogPos, proxValue, 0, ptrNum);
  1.3293 +				SimulatePointerDownUp(ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3294 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3295 +				ptrNum = 0;
  1.3296 +#else
  1.3297 +				ptrPhyPos = screenOrigin;
  1.3298 +				proxValue = -iProximityStep;
  1.3299 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3300 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPhyPos.iX, ptrPhyPos.iY, proxValue, ptrNum);
  1.3301 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrLogPos, proxValue, 0, ptrNum);
  1.3302 +				SimulatePointerDownUp(ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3303 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3304 +				
  1.3305 +				ptrPhyPos.iX += 10;
  1.3306 +				ptrPhyPos.iY += 5;
  1.3307 +				ptrNum = iMaxDevPointers/2;
  1.3308 +				if (proxValue-iProximityStep > iMaxProximity)
  1.3309 +					{
  1.3310 +					proxValue -= iProximityStep;
  1.3311 +					}
  1.3312 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3313 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPhyPos.iX, ptrPhyPos.iY, proxValue, ptrNum);
  1.3314 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrLogPos, proxValue, 0, ptrNum);
  1.3315 +				SimulatePointerDownUp(ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3316 +				AddExpectedPointerDownUp(ptrLogPos, 0, ptrNum);
  1.3317 +				ptrNum = 0;
  1.3318 +#endif
  1.3319 +				}
  1.3320 +			break;
  1.3321 +		case 2:
  1.3322 +			{
  1.3323 +			// Simulate drags for different rotations of a screenmode
  1.3324 +#if !defined(__WINS__)
  1.3325 +			TPoint intNormalPt;
  1.3326 +			TPoint intRotatedPt;
  1.3327 +#else
  1.3328 +			TPoint interPhyPt;
  1.3329 +			TPoint interLogPt;
  1.3330 +#endif			
  1.3331 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag,0);
  1.3332 +			for (TInt rotCou = 0; rotCou < rotations->Count(); rotCou++)
  1.3333 +				{
  1.3334 +				CFbsBitGc::TGraphicsOrientation newOrientation = static_cast<CFbsBitGc::TGraphicsOrientation>(rotations[0][rotCou]);
  1.3335 +				iMultiPtrEventClient->iScreen->SetCurrentRotations(iCurrentScreenMode, newOrientation);
  1.3336 +#if !defined(__WINS__)				
  1.3337 +				ptrNormalPos = screenOrigin;
  1.3338 +				intNormalPt.iX = ptrNormalPos.iX+4;
  1.3339 +				intNormalPt.iY = ptrNormalPos.iY+5;
  1.3340 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3341 +				intRotatedPt = GetPointerPostionOnRotatedMode(intNormalPt, newOrientation);				
  1.3342 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3343 +				SimulatePointerEvent(TRawEvent::EPointerMove, intRotatedPt.iX, intRotatedPt.iY, 0, ptrNum);
  1.3344 +				SimulatePointerEvent(TRawEvent::EButton1Up, intRotatedPt.iX, intRotatedPt.iY, 0, ptrNum);
  1.3345 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);				
  1.3346 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrLogPos, 0, 0, ptrNum);
  1.3347 +				TPoint intLogPt = PhysicalToLogical(intNormalPt, screenOrigin, scale);				
  1.3348 +				AddExpectedPointerEvent(TPointerEvent::EDrag, intLogPt, 0, 0, ptrNum);
  1.3349 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, intLogPt, 0, 0, ptrNum);
  1.3350 +				
  1.3351 +				ptrNormalPos.iX += 10;
  1.3352 +				ptrNormalPos.iY += 5;
  1.3353 +				ptrNum = iMaxDevPointers-1;
  1.3354 +				intNormalPt.iX = ptrNormalPos.iX+5;
  1.3355 +				intNormalPt.iY = ptrNormalPos.iY+4;
  1.3356 +				ptrRotatedPos = GetPointerPostionOnRotatedMode(ptrNormalPos, newOrientation);
  1.3357 +				intRotatedPt = GetPointerPostionOnRotatedMode(intNormalPt, newOrientation);
  1.3358 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrRotatedPos.iX, ptrRotatedPos.iY, 0, ptrNum);
  1.3359 +				SimulatePointerEvent(TRawEvent::EPointerMove, intRotatedPt.iX, intRotatedPt.iY, 0, ptrNum);
  1.3360 +				SimulatePointerEvent(TRawEvent::EButton1Up, intRotatedPt.iX, intRotatedPt.iY, 0, ptrNum);
  1.3361 +				ptrLogPos = PhysicalToLogical(ptrNormalPos, screenOrigin, scale);
  1.3362 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrLogPos, 0, 0, ptrNum);
  1.3363 +				intLogPt = PhysicalToLogical(intNormalPt, screenOrigin, scale);
  1.3364 +				AddExpectedPointerEvent(TPointerEvent::EDrag, intLogPt, 0, 0, ptrNum);
  1.3365 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, intLogPt, 0, 0, ptrNum);
  1.3366 +
  1.3367 +				ptrNum = 0;
  1.3368 +#else
  1.3369 +				ptrPhyPos = screenOrigin;
  1.3370 +				interPhyPt.iX = ptrPhyPos.iX+4;
  1.3371 +				interPhyPt.iY = ptrPhyPos.iY+5;
  1.3372 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3373 +				interLogPt = PhysicalToLogical(interPhyPt, screenOrigin, scale);
  1.3374 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3375 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPhyPt.iX, interPhyPt.iY, 0, ptrNum);
  1.3376 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPhyPt.iX, interPhyPt.iY, 0, ptrNum);
  1.3377 +				interLogPt = PhysicalToLogical(interPhyPt, screenOrigin, scale);
  1.3378 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrLogPos, 0, 0, ptrNum);
  1.3379 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interLogPt, 0, 0, ptrNum);
  1.3380 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interLogPt, 0, 0, ptrNum);
  1.3381 +				
  1.3382 +				ptrPhyPos.iX += 10;
  1.3383 +				ptrPhyPos.iY += 5;
  1.3384 +				ptrNum = iMaxDevPointers-1;
  1.3385 +				interPhyPt.iX = ptrPhyPos.iX+5;
  1.3386 +				interPhyPt.iY = ptrPhyPos.iY+4;
  1.3387 +				
  1.3388 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPhyPos.iX, ptrPhyPos.iY, 0, ptrNum);
  1.3389 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPhyPt.iX, interPhyPt.iY, 0, ptrNum);
  1.3390 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPhyPt.iX, interPhyPt.iY, 0, ptrNum);
  1.3391 +				
  1.3392 +				ptrLogPos = PhysicalToLogical(ptrPhyPos, screenOrigin, scale);
  1.3393 +				interLogPt = PhysicalToLogical(interPhyPt, screenOrigin, scale);
  1.3394 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrLogPos, 0, 0, ptrNum);
  1.3395 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interLogPt, 0, 0, ptrNum);
  1.3396 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interLogPt, 0, 0, ptrNum);
  1.3397 +				ptrNum = 0;
  1.3398 +#endif
  1.3399 +				}
  1.3400 +			}
  1.3401 +			iChangeScreenMode = ETrue;
  1.3402 +			iEventSet = 0;
  1.3403 +			iCurrentScreenMode++;
  1.3404 +			break;
  1.3405 +		default:
  1.3406 +			break;
  1.3407 +		}
  1.3408 +	
  1.3409 +	delete rotations;
  1.3410 +	
  1.3411 +	LogEventsAdded();
  1.3412 +	}
  1.3413 +
  1.3414 +/* 
  1.3415 + Checks if pointer click plugin has an error when testing its events
  1.3416 + If so then it gets the error deescription and displays the same
  1.3417 + */
  1.3418 +void CTMultiPtrEventTest::TestAndDisplayPtrClickError()
  1.3419 +	{
  1.3420 +	TPckgBuf<TInt> intPkg;
  1.3421 +	TInt retErr = iClick.CommandReply(EMultiPtrClickEventError, intPkg);
  1.3422 +	if (retErr != KErrNone)
  1.3423 +		{
  1.3424 +		_LIT(KError, "Failed in Pointer click plugin");
  1.3425 +		LOG_MESSAGE(KError);
  1.3426 +		// Error is ignored here, becasue this function should not leave
  1.3427 +		TRAPD(errMem, iErrDesc = iHeap->AllocL(KErrDescSize));
  1.3428 +		if (errMem == KErrNone)
  1.3429 +			{
  1.3430 +			intPkg() = reinterpret_cast<TUint8*>(iErrDesc) - iChunk.Base() ;
  1.3431 +			
  1.3432 +			// get the error desccription, print it out and stop the tests
  1.3433 +			TInt retVal = iClick.CommandReply(EADllMultiPtrEventErrorDesc, intPkg);
  1.3434 +			if (retVal > KErrNone)
  1.3435 +				{
  1.3436 +				TPtr8 memPtr2(reinterpret_cast<TUint8*>(iErrDesc), retVal, retVal);
  1.3437 +				HBufC16* buf16 = NULL;
  1.3438 +				TRAPD(err, buf16 = HBufC16::NewL(retVal));		// Error is ignored here
  1.3439 +				if (err == KErrNone)
  1.3440 +					{
  1.3441 +					buf16->Des().Copy(memPtr2);
  1.3442 +					LOG_MESSAGE(buf16->Des());
  1.3443 +					delete buf16;
  1.3444 +					}
  1.3445 +				}
  1.3446 +			iHeap->Free(iErrDesc);
  1.3447 +			}
  1.3448 +		Failed();
  1.3449 +		}
  1.3450 +	iClick.CommandReply(EMultiPtrClickEventReset, intPkg);
  1.3451 +	}
  1.3452 +
  1.3453 +void CTMultiPtrEventTest::AddExpectedMultiPtrClickEvent(TPointerEvent::TType aType, TPoint aPos, TInt aZ, TUint aModifier, TUint8 aPointerNumber, TUint aHandle)
  1.3454 +	{
  1.3455 +	TPckgBuf<TWsEvent> evtPkg;
  1.3456 +	TWsEvent& event=evtPkg();
  1.3457 +	event.SetType(EEventPointer);
  1.3458 +	iMultiPtrEventClient->CalculatePtrPosAndSet3Ddata(event, aType, aPos, aModifier, aZ, aPointerNumber, aHandle);
  1.3459 +	
  1.3460 +	// change the parent position here as they r with respect to screen corodinates.
  1.3461 +	event.Pointer()->iParentPosition = aPos;
  1.3462 +	
  1.3463 +	iClick.CommandReply(EMultiPtrClickEventAdd, evtPkg);
  1.3464 +	AddExpectedMultiPtrClickOtherEvent(aType, aPos, aZ, aModifier, aPointerNumber, aHandle);
  1.3465 +	}
  1.3466 +
  1.3467 +void CTMultiPtrEventTest::AddExpectedMultiPtrClickOtherEvent(TPointerEvent::TType aType, TPoint aPos, TInt aZ, TUint aModifier, TUint8 aPointerNumber, TUint aHandle)
  1.3468 +	{
  1.3469 +	TWsEvent event;
  1.3470 +	event.SetType(EEventPointer);
  1.3471 +	iMultiPtrEventClient->CalculatePtrPosAndSet3Ddata(event, aType, aPos, aModifier, aZ, aPointerNumber, aHandle);
  1.3472 +
  1.3473 +	TPointerEventData otherEvent;
  1.3474 +	otherEvent.iClientHandle = event.Handle();
  1.3475 +	otherEvent.iCurrentPos = aPos;
  1.3476 +	otherEvent.iPointerEvent = *event.Pointer();
  1.3477 +	
  1.3478 +	TPckgBuf<TPointerEventData> evtPkg(otherEvent);
  1.3479 +	iClick.CommandReply(EMultiPtrOtherEventAdd, evtPkg);
  1.3480 +	}
  1.3481 +
  1.3482 +/* 
  1.3483 + Function of creating 
  1.3484 + 1. Pointer click plugin
  1.3485 + 2. RChunk for transfering error description from pointer click plugin to current test
  1.3486 + 3. RHeap for allocating memory in RChunk
  1.3487 +*/
  1.3488 +void CTMultiPtrEventTest::CreatePointerClickPluginL()
  1.3489 +	{
  1.3490 +	// tranfer this to another function
  1.3491 +	iClick=RSoundPlugIn(TheClient->iWs);
  1.3492 +	User::LeaveIfError(iClick.Construct(TUid::Uid(MULTIPTR_CLICK_THIRD_UID)));
  1.3493 +	TBool ptrPluginLoadable = EFalse;
  1.3494 +	iClick.IsLoaded(ptrPluginLoadable);
  1.3495 +	if (ptrPluginLoadable)
  1.3496 +		{
  1.3497 +		User::LeaveIfError(iClick.Load(KMultiPtrPluginDll));
  1.3498 +		iPtrPluginLoaded = ETrue;
  1.3499 +		}
  1.3500 +	iClick.SetPenClick(ETrue);
  1.3501 +	iHeap = UserHeap::ChunkHeap(&KMultiPtrClickChunk, 128, 256, 10);
  1.3502 +	if (iHeap == NULL)
  1.3503 +		{
  1.3504 +		User::LeaveNoMemory();
  1.3505 +		}
  1.3506 +	User::LeaveIfError(iChunk.OpenGlobal(KMultiPtrClickChunk, ETrue));
  1.3507 +	}
  1.3508 +
  1.3509 +/**
  1.3510 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0027
  1.3511 +@SYMPREQ				PREQ1226
  1.3512 +@SYMREQ					REQ9677, REQ9683
  1.3513 +@SYMTestPriority		High 
  1.3514 +@SYMTestCaseDesc		To check Wserv sends multi pointer events to PointerClickPlugin
  1.3515 +@SYMTestStatus			Implemented
  1.3516 +
  1.3517 +@SYMTestActions			Simulate multi pointer events for PointerClickPlugin
  1.3518 +@SYMTestExpectedResults The received events must match the simulated raw events  
  1.3519 +*/
  1.3520 +void CTMultiPtrEventTest::MultiPointerEventsForPointerClickL()
  1.3521 +	{
  1.3522 +	TLogMessageText logText;
  1.3523 +	_LIT(KSet, "Multi pointer events for PointerClickPlugin: %d of 4");
  1.3524 +	logText.AppendFormat(KSet, iEventSet);
  1.3525 +	LOG_MESSAGE(logText);
  1.3526 +	
  1.3527 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3528 +	if (!iEventSet)
  1.3529 +		{
  1.3530 +		SetAutoFlush();
  1.3531 +		}
  1.3532 +	
  1.3533 +	TPoint ptrPos;
  1.3534 +	TInt ptrNum = 0;
  1.3535 +	TInt prValue = 0;
  1.3536 +	TInt proxValue = 0;
  1.3537 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
  1.3538 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
  1.3539 + 	
  1.3540 +	switch(iEventSet++)
  1.3541 +		{
  1.3542 +		case 0:
  1.3543 +			// Creates RSoundPlugin, loads the plugin DLL, create RChunk and RHeap
  1.3544 +			CreatePointerClickPluginL();
  1.3545 +			AddExpectedWsEvent(EEventFocusGained);
  1.3546 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.3547 +				{
  1.3548 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3549 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.3550 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.3551 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3552 +				ptrPos.iX += xInc;
  1.3553 +				ptrPos.iY += yInc;
  1.3554 +				}
  1.3555 +			TestAndDisplayPtrClickError();
  1.3556 +			break;
  1.3557 +		case 1:
  1.3558 +			// Simulate moves from different pointer with different pressure
  1.3559 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove,0);
  1.3560 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterMove,0);
  1.3561 +			ptrPos.SetXY(0,0);
  1.3562 +			prValue = iPressureStep;
  1.3563 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.3564 +				{
  1.3565 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.3566 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Down,ptrPos,0,0,ptrNum);
  1.3567 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Up,ptrPos,0,0,ptrNum);
  1.3568 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.3569 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.3570 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.3571 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3572 +				ptrPos.iX += xInc;
  1.3573 +				ptrPos.iY += yInc;
  1.3574 +				}
  1.3575 +			TestAndDisplayPtrClickError();
  1.3576 +			break;
  1.3577 +		case 2:
  1.3578 +			// Simulate moves from different pointer with different proximity
  1.3579 +			ptrPos.SetXY(0,0);
  1.3580 +			proxValue = -iProximityStep;
  1.3581 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.3582 +				{
  1.3583 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.3584 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Down,ptrPos,0,0,ptrNum);
  1.3585 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Up,ptrPos,0,0,ptrNum);
  1.3586 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.3587 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.3588 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.3589 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3590 +				ptrPos.iX += xInc;
  1.3591 +				ptrPos.iY += yInc;
  1.3592 +				}
  1.3593 +			TestAndDisplayPtrClickError();
  1.3594 +			break;
  1.3595 +		case 3:
  1.3596 +			{
  1.3597 +			// Simulate drags from all pointers
  1.3598 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag,0);
  1.3599 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterDrag,0);
  1.3600 +			ptrPos.SetXY(0,0);
  1.3601 +			TPoint interPt;
  1.3602 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.3603 +				{
  1.3604 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3605 +				interPt.iX = ptrPos.iX+1;
  1.3606 +				interPt.iY = ptrPos.iY+2;
  1.3607 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.3608 +				AddExpectedMultiPtrClickEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.3609 +				
  1.3610 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3611 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.3612 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.3613 +				
  1.3614 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3615 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.3616 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.3617 +				
  1.3618 +				ptrPos.iX += xInc;
  1.3619 +				ptrPos.iY += yInc;
  1.3620 +				}
  1.3621 +			TestAndDisplayPtrClickError();
  1.3622 +			}
  1.3623 +			break;
  1.3624 +		default:
  1.3625 +			iClick.Unload();
  1.3626 +			iClick.Close();
  1.3627 +			iPtrPluginLoaded = EFalse;
  1.3628 +			iHeap->Close();
  1.3629 +			iHeap = NULL;
  1.3630 +			iChunk.Close();
  1.3631 +			ResetFlushStopAS();
  1.3632 +			break;
  1.3633 +		}
  1.3634 +
  1.3635 +	LogEventsAdded();
  1.3636 +	}
  1.3637 +
  1.3638 +void CTMultiPtrEventTest::GetRemainingEventsFromSecondaryClient()
  1.3639 +	{
  1.3640 +	if (iSecMultiPtrEventClient->EventBuffer()->EventsRemaining() != 0)
  1.3641 +		{
  1.3642 +		iSecMultiPtrEventClient->EventBuffer()->SetNestedLoopState(ETrue);
  1.3643 +		CActiveScheduler::Start();
  1.3644 +		}	
  1.3645 +	}
  1.3646 +
  1.3647 +/**
  1.3648 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0011
  1.3649 +@SYMPREQ				PREQ1226
  1.3650 +@SYMREQ					REQ9677,REQ9674,
  1.3651 +@SYMTestPriority		High 
  1.3652 +@SYMTestCaseDesc		To check Wserv sends Multi Pointer events to correct clients
  1.3653 +@SYMTestStatus			Implemented
  1.3654 +
  1.3655 +@SYMTestActions			Simulate multi pointer events on windows from different client.
  1.3656 +@SYMTestExpectedResults The received events must match the simulated raw events 
  1.3657 +*/
  1.3658 +void CTMultiPtrEventTest::MultiClientMultiPointerEvents()
  1.3659 +	{
  1.3660 +	// Logic for this test code
  1.3661 +	// Create a secondary client when running this test
  1.3662 +	// Simulate events for both main client and secondary simulataneously
  1.3663 +	// Get events from DoRunL() of event buffer class
  1.3664 +	// Before running next set of events, get all the events from secondary client
  1.3665 +	// If test fails on any client make sure both active scheduler are stopped
  1.3666 +	TLogMessageText logText;
  1.3667 +	_LIT(KSet, "Multi pointer events for Multi client: %d of 5");
  1.3668 +	logText.AppendFormat(KSet, iEventSet);
  1.3669 +	LOG_MESSAGE(logText);
  1.3670 +	
  1.3671 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3672 +	iSecMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3673 +	if (!iEventSet)
  1.3674 +		{
  1.3675 +		SetAutoFlush();
  1.3676 +		iSecClientFlush = iSecMultiPtrEventClient->iWs.SetAutoFlush(ETrue);
  1.3677 +		}
  1.3678 +	
  1.3679 +	TPoint ptrPos;
  1.3680 +	TInt ptrNum = 0;
  1.3681 +	TInt prValue = 0;
  1.3682 +	TInt proxValue = 0;
  1.3683 +	TInt xInc = (iPhysicalScreenSize.iWidth/2)/iMaxDevPointers;
  1.3684 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
  1.3685 +	TPoint secPt(iPhysicalScreenSize.iWidth/2,0);
  1.3686 +	TInt ptrSecNum = iMaxDevPointers-1;
  1.3687 + 	
  1.3688 +	switch(iEventSet++)
  1.3689 +		{
  1.3690 +		case 0:
  1.3691 +			ptrPos.SetXY(0,0);
  1.3692 +			
  1.3693 +			// These events are generated when primary client is created and its group 
  1.3694 +			// window constructed and then when button down for primary client is called
  1.3695 +			AddExpectedWsEvent(EEventFocusGained);
  1.3696 +			AddExpectedWsEvent(EEventFocusLost);
  1.3697 +			AddExpectedWsEvent(EEventFocusGained);
  1.3698 +			
  1.3699 +			// Simulate pointer down/up events for primary client from 0,1,3... pointers and 6,5,4... pointers for secondary client
  1.3700 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.3701 +				{
  1.3702 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3703 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3704 +							
  1.3705 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3706 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.3707 +				
  1.3708 +				ptrPos.iX += xInc;
  1.3709 +				ptrPos.iY += yInc;
  1.3710 +				}
  1.3711 +			
  1.3712 +			ptrPos.iX = iPhysicalScreenSize.iWidth/2;
  1.3713 +			ptrPos.iY = 0;
  1.3714 +			
  1.3715 +			// These events are generated when secondary cleint is created and then when
  1.3716 +			// button down for primary client is called, then when SetOrdinalPosition is 
  1.3717 +			// called on secondary cleint's group window
  1.3718 +			AddExpectedWsEvent(EEventFocusGained, ETrue);
  1.3719 +			AddExpectedWsEvent(EEventFocusLost, ETrue);
  1.3720 +			iSecMultiPtrEventClient->iGroup->GroupWin()->SetOrdinalPosition(0, 1);
  1.3721 +			AddExpectedWsEvent(EEventFocusGained, ETrue);
  1.3722 +
  1.3723 +			AddExpectedWsEvent(EEventFocusLost);
  1.3724 +			
  1.3725 +			for (ptrNum = iMaxDevPointers/2; ptrNum < iMaxDevPointers; ptrNum++)
  1.3726 +				{
  1.3727 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3728 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3729 +							
  1.3730 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3731 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3732 +				
  1.3733 +				ptrPos.iX += xInc;
  1.3734 +				ptrPos.iY += yInc;
  1.3735 +				}
  1.3736 +			break;
  1.3737 +		case 1:
  1.3738 +			// Simulate move events from primary and secondary client simultaneously with pressure
  1.3739 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.3740 +			iSecMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.3741 +			
  1.3742 +			ptrPos.SetXY(0,0);
  1.3743 +			prValue = iPressureStep;
  1.3744 +				
  1.3745 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3746 +				{
  1.3747 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.3748 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.3749 +				ptrPos.iX += xInc;
  1.3750 +				ptrPos.iY += yInc;
  1.3751 +				
  1.3752 +				SimulatePointerEvent(TRawEvent::EPointerMove, secPt.iX, secPt.iY, prValue, ptrSecNum);
  1.3753 +				AddExpectedPointerEvent(TPointerEvent::EMove, secPt, prValue, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3754 +				secPt.iX += xInc;
  1.3755 +				secPt.iY += yInc;
  1.3756 +				}
  1.3757 +			break;
  1.3758 +		case 2:
  1.3759 +			// Simulate move events from primary and secondary client simultaneously with proximity
  1.3760 +			ptrPos.SetXY(0,0);
  1.3761 +			proxValue = -iProximityStep;
  1.3762 +			
  1.3763 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3764 +				{
  1.3765 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.3766 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.3767 +				ptrPos.iX += xInc;
  1.3768 +				ptrPos.iY += yInc;
  1.3769 +				
  1.3770 +				SimulatePointerEvent(TRawEvent::EPointerMove, secPt.iX, secPt.iY, proxValue, ptrSecNum);
  1.3771 +				AddExpectedPointerEvent(TPointerEvent::EMove, secPt, proxValue, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3772 +				secPt.iX += xInc;
  1.3773 +				secPt.iY += yInc;
  1.3774 +				}
  1.3775 +			break;
  1.3776 +		case 3:
  1.3777 +			{
  1.3778 +			// Simulate drag events on different clients window one after the other 
  1.3779 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.3780 +			iSecMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.3781 +			
  1.3782 +			ptrPos.SetXY(0,0);
  1.3783 +			secPt.iX = iPhysicalScreenSize.iWidth/2;
  1.3784 +			secPt.iY = 0; 
  1.3785 +			ptrSecNum = iMaxDevPointers-1;
  1.3786 +			TPoint interPt;
  1.3787 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3788 +				{
  1.3789 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3790 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3791 +				interPt.iX = ptrPos.iX+2;
  1.3792 +				interPt.iY = ptrPos.iY+1;
  1.3793 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.3794 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.3795 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.3796 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.3797 +				ptrPos.iX += xInc;
  1.3798 +				ptrPos.iY += yInc;
  1.3799 +				
  1.3800 +				SimulatePointerEvent(TRawEvent::EButton1Down, secPt.iX, secPt.iY, 0, ptrSecNum);
  1.3801 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, secPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3802 +				interPt.iX = secPt.iX+2;
  1.3803 +				interPt.iY = secPt.iY+1;
  1.3804 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrSecNum);
  1.3805 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3806 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrSecNum);
  1.3807 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3808 +				secPt.iX += xInc;
  1.3809 +				secPt.iY += yInc;
  1.3810 +				}
  1.3811 +			}
  1.3812 +			break;
  1.3813 +		case 4:
  1.3814 +			{
  1.3815 +			// Simulate drag events on different clients, but interleaved each other 
  1.3816 +			ptrPos.SetXY(0,0);
  1.3817 +			secPt.iX = iPhysicalScreenSize.iWidth/2;
  1.3818 +			secPt.iY = 0; 
  1.3819 +			ptrSecNum = iMaxDevPointers-1;
  1.3820 +			TPoint interPt;
  1.3821 +			
  1.3822 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3823 +				{
  1.3824 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3825 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.3826 +				ptrPos.iX += xInc;
  1.3827 +				ptrPos.iY += yInc;
  1.3828 +				
  1.3829 +				SimulatePointerEvent(TRawEvent::EButton1Down, secPt.iX, secPt.iY, 0, ptrSecNum);
  1.3830 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, secPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3831 +				secPt.iX += xInc;
  1.3832 +				secPt.iY += yInc;
  1.3833 +				}
  1.3834 +			
  1.3835 +			ptrPos.SetXY(0,0);
  1.3836 +			secPt.iX = iPhysicalScreenSize.iWidth/2;
  1.3837 +			secPt.iY = 0;
  1.3838 +			ptrSecNum = iMaxDevPointers-1;
  1.3839 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3840 +				{
  1.3841 +				interPt.iX = ptrPos.iX+2;
  1.3842 +				interPt.iY = ptrPos.iY+1;
  1.3843 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.3844 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.3845 +				ptrPos.iX += xInc;
  1.3846 +				ptrPos.iY += yInc;
  1.3847 +				
  1.3848 +
  1.3849 +				interPt.iX = secPt.iX+2;
  1.3850 +				interPt.iY = secPt.iY+1;
  1.3851 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrSecNum);
  1.3852 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3853 +				secPt.iX += xInc;
  1.3854 +				secPt.iY += yInc;
  1.3855 +				}
  1.3856 +
  1.3857 +			ptrPos.SetXY(0,0);
  1.3858 +			secPt.iX = iPhysicalScreenSize.iWidth/2;
  1.3859 +			secPt.iY = 0;
  1.3860 +			ptrSecNum = iMaxDevPointers-1;
  1.3861 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers/2 && ptrSecNum >= iMaxDevPointers/2); ptrNum++, ptrSecNum--)
  1.3862 +				{
  1.3863 +				interPt.iX = ptrPos.iX+2;
  1.3864 +				interPt.iY = ptrPos.iY+1;
  1.3865 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.3866 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.3867 +				ptrPos.iX += xInc;
  1.3868 +				ptrPos.iY += yInc;
  1.3869 +				
  1.3870 +				interPt.iX = secPt.iX+2;
  1.3871 +				interPt.iY = secPt.iY+1;
  1.3872 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrSecNum);
  1.3873 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrSecNum, (TUint)iSecMultiPtrEventClient->ParentWin(), ETrue);
  1.3874 +				secPt.iX += xInc;
  1.3875 +				secPt.iY += yInc;
  1.3876 +				}
  1.3877 +			}
  1.3878 +			break;
  1.3879 +		default:
  1.3880 +			ResetFlushStopAS();
  1.3881 +			iSecMultiPtrEventClient->iWs.SetAutoFlush(iSecClientFlush);
  1.3882 +			break;
  1.3883 +		}
  1.3884 +	
  1.3885 +	_LIT(KEventsAdded, "Events added to Primary client's buffer = %d");
  1.3886 +	logText.Format(KEventsAdded, iMultiPtrEventClient->EventBuffer()->EventsRemaining());
  1.3887 +	LOG_MESSAGE(logText);
  1.3888 +	_LIT(KEventsAdded1, "Events added to Secondary client's buffer = %d");
  1.3889 +	logText.Format(KEventsAdded1, iSecMultiPtrEventClient->EventBuffer()->EventsRemaining());
  1.3890 +	LOG_MESSAGE(logText);
  1.3891 +	}
  1.3892 +
  1.3893 +
  1.3894 +// RMultiPointerAnim
  1.3895 +RMultiPointerAnim* RMultiPointerAnim::NewL(RWindowBase* aWin, RAnimDll* aDll)
  1.3896 +	{
  1.3897 +	RMultiPointerAnim* self=new(ELeave) RMultiPointerAnim(aDll);
  1.3898 +	CleanupStack::PushL(TCleanupItem(DestroyAnim,self));
  1.3899 +	User::LeaveIfError(self->Construct(*aWin, EAnimTypeMultiPointer, TPtrC8()));
  1.3900 +	CleanupStack::Pop(self);
  1.3901 +	return self;
  1.3902 +	}
  1.3903 +
  1.3904 +TInt RMultiPointerAnim::AddExpectedAnimPointerEvent(TRawEvent::TType aType, TPoint aPos, TInt aZ, TUint /*aModifier*/, TUint8 aPointerNumber, TBool aEat /*= ETrue*/)
  1.3905 +	{
  1.3906 +	TRawEvent rawEvent;
  1.3907 +	rawEvent.Set(aType, aPos.iX, aPos.iY, aZ, aPointerNumber);
  1.3908 +	TAnimRawEvent animEvent;
  1.3909 +	animEvent.iRawEvent = rawEvent;
  1.3910 +	animEvent.iEat = aEat;
  1.3911 +	TPckgBuf<TAnimRawEvent> param;
  1.3912 +	param()=animEvent;
  1.3913 +	return CommandReply(EADllAddExpectedMultiPtrEvent, param);
  1.3914 +	}
  1.3915 +
  1.3916 +void CTMultiPtrEventTest::TestAndDisplayAnimError()
  1.3917 +	{
  1.3918 +	TInt err = iAnim->CommandReply(EADllMultiPtrEventError);
  1.3919 +	if (err != KErrNone)
  1.3920 +		{
  1.3921 +		_LIT(KError, "Failed in Anim dll");
  1.3922 +		LOG_MESSAGE(KError);
  1.3923 +		TBuf<255> errDesc;
  1.3924 +		errDesc.SetMax();
  1.3925 +		TIpcArgs ipcArgs;
  1.3926 +		ipcArgs.Set(KIpcSlot,&errDesc);
  1.3927 +		// get the error desccription, print it out and stop the tests
  1.3928 +		TInt retVal = iAnim->CommandReply(EADllMultiPtrEventErrorDesc, KNullDesC8, ipcArgs);
  1.3929 +		if (retVal == KErrNone)
  1.3930 +			{
  1.3931 +			LOG_MESSAGE(errDesc);
  1.3932 +			}
  1.3933 +		Failed();
  1.3934 +		}
  1.3935 +	iAnim->CommandReply(EADllMultiPtrEventReset);
  1.3936 +	}
  1.3937 +
  1.3938 +/**
  1.3939 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0013
  1.3940 +@SYMPREQ				PREQ1226
  1.3941 +@SYMREQ					REQ9677,REQ9683,
  1.3942 +@SYMTestPriority		High 
  1.3943 +@SYMTestCaseDesc		To check Wserv sends Multi Pointer events to Anims
  1.3944 +@SYMTestStatus			Implemented
  1.3945 +
  1.3946 +@SYMTestActions			Simulate multi pointer events for anims
  1.3947 +@SYMTestExpectedResults The received events must match the simulated raw events 
  1.3948 +*/
  1.3949 +void CTMultiPtrEventTest::MultiPointerEventsForAnimsL()
  1.3950 +	{
  1.3951 +	// The logic behind these tests is
  1.3952 +	// Create an anim, which creates animation at server side(which swicthes raw event handling on)
  1.3953 +	// Add the required events to the animtaion at server side buffer
  1.3954 +	// Simulate those events and check simulated events are same as required at server side
  1.3955 +	// If any test fail, error description is got from server and displayed in the log file
  1.3956 +	TLogMessageText logText;
  1.3957 +	_LIT(KSet, "Multi pointer events for Anims: %d of 3");
  1.3958 +	logText.AppendFormat(KSet, iEventSet);
  1.3959 +	LOG_MESSAGE(logText);
  1.3960 +	_LIT(KEventsChecked, "Events checked at server side = %d");
  1.3961 +	
  1.3962 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.3963 +	if (!iEventSet)
  1.3964 +		{
  1.3965 +		SetAutoFlush();
  1.3966 +		iAnimDll = new(ELeave) RAnimDll(iMultiPtrEventClient->iWs);
  1.3967 +		User::LeaveIfError(iAnimDll->Load(KAnimDLLName));
  1.3968 +		}
  1.3969 +	
  1.3970 +	TPoint ptrPos;
  1.3971 +	TInt ptrNum = 0;
  1.3972 +	TInt prValue = 0;
  1.3973 +	TInt proxValue = 0;
  1.3974 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
  1.3975 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
  1.3976 + 	
  1.3977 +	switch(iEventSet++)
  1.3978 +		{
  1.3979 +		case 0:
  1.3980 +			// Simulate downup events for all pointers
  1.3981 +			iAnim = RMultiPointerAnim::NewL(iMultiPtrEventClient->ParentWin()->BaseWin(), iAnimDll);
  1.3982 +			AddExpectedWsEvent(EEventFocusGained);
  1.3983 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.3984 +				{
  1.3985 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Down,ptrPos,0,0,ptrNum);
  1.3986 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Up,ptrPos,0,0,ptrNum);
  1.3987 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.3988 +				ptrPos.iX += xInc;
  1.3989 +				ptrPos.iY += yInc;
  1.3990 +				}
  1.3991 +			TestAndDisplayAnimError();
  1.3992 +			logText.Format(KEventsChecked, iMaxDevPointers*2);
  1.3993 +			LOG_MESSAGE(logText);
  1.3994 +			break;
  1.3995 +		case 1:
  1.3996 +			// Simulate moves from different pointer with different pressure
  1.3997 +			// Here there is no need for events to be exaclty on the anim window. 
  1.3998 +			// becasue when the animtaions ask for events it will be delivered all the events
  1.3999 +			// irrespective of where they occured.
  1.4000 +			ptrPos.SetXY(0,0);
  1.4001 +			prValue = iPressureStep;
  1.4002 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4003 +				{
  1.4004 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointerMove, ptrPos, prValue, 0, ptrNum);
  1.4005 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Down,ptrPos,0,0,ptrNum);
  1.4006 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Up,ptrPos,0,0,ptrNum);
  1.4007 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4008 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4009 +				ptrPos.iX += xInc;
  1.4010 +				ptrPos.iY += yInc;
  1.4011 +				}
  1.4012 +			TestAndDisplayAnimError();
  1.4013 +			
  1.4014 +			// This is for just to add run the next test
  1.4015 +			SimulatePointerEvent(TRawEvent::EPointerSwitchOn, 0, 0, 0, 0);
  1.4016 +			
  1.4017 +			logText.Format(KEventsChecked, iMaxDevPointers*3);
  1.4018 +			LOG_MESSAGE(logText);
  1.4019 +			break;
  1.4020 +		case 2:
  1.4021 +			// Simulate moves from different pointer with different proximity
  1.4022 +			ptrPos.SetXY(0,0);
  1.4023 +			proxValue = -iProximityStep;
  1.4024 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4025 +				{
  1.4026 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EPointerMove, ptrPos, proxValue, 0, ptrNum);
  1.4027 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Down,ptrPos,0,0,ptrNum);
  1.4028 +				iAnim->AddExpectedAnimPointerEvent(TRawEvent::EButton1Up,ptrPos,0,0,ptrNum);
  1.4029 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.4030 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4031 +				ptrPos.iX += xInc;
  1.4032 +				ptrPos.iY += yInc;
  1.4033 +				}
  1.4034 +			TestAndDisplayAnimError();
  1.4035 +			
  1.4036 +			// This is for just to add run the next test
  1.4037 +			SimulatePointerEvent(TRawEvent::EPointerSwitchOn, 0, 0, 0, 0);
  1.4038 +			
  1.4039 +			logText.Format(KEventsChecked, iMaxDevPointers*3);
  1.4040 +			LOG_MESSAGE(logText);
  1.4041 +			break;
  1.4042 +		default:
  1.4043 +			DestroyAnimDllAndAnim();
  1.4044 +			ResetFlushStopAS();
  1.4045 +			break;
  1.4046 +		}
  1.4047 +
  1.4048 +	LogEventsAdded();
  1.4049 +	}
  1.4050 +
  1.4051 +
  1.4052 +/**
  1.4053 +@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0014
  1.4054 +@SYMPREQ				PREQ1226
  1.4055 +@SYMREQ					REQ9677,REQ9683,
  1.4056 +@SYMTestPriority		High 
  1.4057 +@SYMTestCaseDesc		To check Wserv purges multi pointer events with standard rules
  1.4058 +@SYMTestStatus			Implemented
  1.4059 +
  1.4060 +@SYMTestActions			Simulate raw events to be purged  
  1.4061 +@SYMTestExpectedResults The purged events should not be delivered to client 
  1.4062 +*/
  1.4063 +void CTMultiPtrEventTest::PurgingMultiPointerEvents()
  1.4064 +	{
  1.4065 +	// Test purging of multi pointer events
  1.4066 +	// 1. Test down/up pairs are purged
  1.4067 +	// 2. Test moves events are purged
  1.4068 +	// 3. Test drag events are purged
  1.4069 +	// 4. Test lone down events are purged
  1.4070 +	// 5. And finally test lone up events are also purged 
  1.4071 +	TLogMessageText logText;
  1.4072 +	_LIT(KSet, "Purging of multi pointer events: %d of 6");
  1.4073 +	logText.AppendFormat(KSet, iEventSet);
  1.4074 +	LOG_MESSAGE(logText);
  1.4075 +	
  1.4076 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.4077 +	TInt xInc = iPhysicalScreenSize.iWidth/KMaxQueueSize;
  1.4078 +	TInt yInc = iPhysicalScreenSize.iHeight/KMaxQueueSize;
  1.4079 +	TPoint ptrPos(xInc,yInc);
  1.4080 +	TInt ptrNum = 0;
  1.4081 +	TInt prValue = 0;
  1.4082 +	TInt proxValue = 0;
  1.4083 +	
  1.4084 +	if (!iEventSet)
  1.4085 +		{
  1.4086 +		SetAutoFlush();
  1.4087 +		}
  1.4088 +	
  1.4089 +	// Point to note is that Kernel has an event queue size of 40
  1.4090 +	// So make sure that you don't send more than 40 events
  1.4091 +	switch(iEventSet++)
  1.4092 +		{
  1.4093 +		case 0:
  1.4094 +			// Simulate pointer down/up events for all pointers
  1.4095 +			// Simulate many up events from any pointer which will purge down/up events
  1.4096 +			AddExpectedWsEvent(EEventFocusGained);
  1.4097 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 4); ptrNum++)
  1.4098 +				{
  1.4099 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4100 +				}
  1.4101 +			SimulateAndAddLoneUpEvents(KMaxQueueSize, KMaxQueueSize-1, ptrPos);
  1.4102 +			break;
  1.4103 +		case 1:
  1.4104 +			// Repeat the same for Move events
  1.4105 +			// Simulate moves for all pointers with different pressure and proximity value
  1.4106 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.4107 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.4108 +			prValue = iPressureStep;
  1.4109 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && prValue < iMaxPressure && ptrNum < 4); ptrNum++,prValue+=iPressureStep)
  1.4110 +				{
  1.4111 +				ptrPos.iX += xInc/2;
  1.4112 +				ptrPos.iY += yInc/2;
  1.4113 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4114 +				}
  1.4115 +			ptrPos.iX = xInc;
  1.4116 +			ptrPos.iY = yInc;
  1.4117 +			proxValue = -iProximityStep;
  1.4118 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && proxValue > iMaxProximity && ptrNum < 4); ptrNum++,proxValue-=iProximityStep)
  1.4119 +				{
  1.4120 +				ptrPos.iX += xInc/2;
  1.4121 +				ptrPos.iY += yInc/2;
  1.4122 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.4123 +				}
  1.4124 +			SimulateAndAddLoneUpEvents(KMaxQueueSize, KMaxQueueSize, ptrPos);
  1.4125 +			break;
  1.4126 +		case 2:
  1.4127 +			{
  1.4128 +			// Repeat the same for drag events
  1.4129 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.4130 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.4131 +			ptrPos.iX = xInc;
  1.4132 +			ptrPos.iY = yInc;
  1.4133 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 2); ptrNum++)
  1.4134 +				{
  1.4135 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4136 +				ptrPos.iX += xInc/2;
  1.4137 +				ptrPos.iY += yInc/2;
  1.4138 +				}
  1.4139 +			ptrPos.iX = xInc;
  1.4140 +			ptrPos.iY = yInc;
  1.4141 +			TPoint interPt = ptrPos;
  1.4142 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 2); ptrNum++)
  1.4143 +				{	
  1.4144 +				interPt.iX += 2;
  1.4145 +				interPt.iY += 1;
  1.4146 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.4147 +				ptrPos.iX += xInc/2;
  1.4148 +				ptrPos.iY += yInc/2;
  1.4149 +				interPt = ptrPos; 
  1.4150 +				}
  1.4151 +			ptrPos.iX = xInc;
  1.4152 +			ptrPos.iY = yInc;
  1.4153 +			interPt = ptrPos;
  1.4154 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 2); ptrNum++)
  1.4155 +				{
  1.4156 +				interPt.iX += 2;
  1.4157 +				interPt.iY += 1;
  1.4158 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.4159 +				ptrPos.iX += xInc/2;
  1.4160 +				ptrPos.iY += yInc/2;
  1.4161 +				interPt = ptrPos; 
  1.4162 +				}
  1.4163 +			SimulateAndAddLoneUpEvents(KMaxQueueSize, KMaxQueueSize, ptrPos);
  1.4164 +			}
  1.4165 +			break;
  1.4166 +		case 3:
  1.4167 +			// Repeat the same for lone down events
  1.4168 +			ptrPos.iX = xInc;
  1.4169 +			ptrPos.iY = yInc;
  1.4170 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 3); ptrNum++)
  1.4171 +				{
  1.4172 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4173 +				ptrPos.iX += xInc/2;
  1.4174 +				ptrPos.iY += yInc/2;
  1.4175 +				}
  1.4176 +			SimulateAndAddLoneUpEvents(KMaxQueueSize+1, KMaxQueueSize, ptrPos);
  1.4177 +
  1.4178 +			// Before this we had to send dummy 7 EButton1Up events from 1 to 7 pointers so that iLastUnmatchedDown1
  1.4179 +			// variable to be reset and that consecutive events was not sent to client. But now EPointer3DOutOfRange
  1.4180 +			// resets all the variables.
  1.4181 +			for (ptrNum = 1; (ptrNum < iMaxDevPointers && ptrNum < 3); ptrNum++)
  1.4182 +				{
  1.4183 +				SimulatePointerEvent(TRawEvent::EPointer3DOutOfRange, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4184 +				}
  1.4185 +			break;
  1.4186 +		case 4:
  1.4187 +			// Finally for even lone up events, check that when you send events more then the queuesize
  1.4188 +			// the events are not sent back and they are ignored in wserv
  1.4189 +			ptrPos.iX = xInc;
  1.4190 +			ptrPos.iY = yInc;
  1.4191 +			for (ptrNum = 0; (ptrNum < iMaxDevPointers && ptrNum < 4); ptrNum++)
  1.4192 +				{
  1.4193 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4194 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.4195 +				ptrPos.iX += xInc/2;
  1.4196 +				ptrPos.iY += yInc/2;
  1.4197 +				}
  1.4198 +			ptrPos.iX = xInc;
  1.4199 +			ptrPos.iY = yInc;
  1.4200 +			for (TInt count = 0; count < KMaxQueueSize; count++)
  1.4201 +				{
  1.4202 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.4203 +				// For all up events more then KMaxQueueSize, wserv igoners then as the queue if full
  1.4204 +				if (count < (KMaxQueueSize - iMaxDevPointers))
  1.4205 +					{
  1.4206 +					AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.4207 +					}
  1.4208 +				}
  1.4209 +			break;
  1.4210 +		case 5:
  1.4211 +			// Check PurgePointerEvents works with multi pointer events
  1.4212 +			ptrPos.iX = xInc;
  1.4213 +			ptrPos.iY = yInc;
  1.4214 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4215 +				{
  1.4216 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4217 +				ptrPos.iX += xInc/2;
  1.4218 +				ptrPos.iY += yInc/2;
  1.4219 +				}
  1.4220 +			ptrPos.iX = xInc;
  1.4221 +			ptrPos.iY = yInc;
  1.4222 +			iMultiPtrEventClient->iWs.PurgePointerEvents();
  1.4223 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.4224 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.4225 +			break;
  1.4226 +		default:
  1.4227 +			ResetFlushStopAS();
  1.4228 +			break;
  1.4229 +		}
  1.4230 +	LogEventsAdded();
  1.4231 +	}
  1.4232 +
  1.4233 +void CTMultiPtrEventTest::MultiPointerEvents()
  1.4234 +	{
  1.4235 +	TLogMessageText logText;
  1.4236 +	_LIT(KSet, "MultiPtrEvents SetOfEvents: %d of 9");
  1.4237 +	logText.AppendFormat(KSet, iEventSet);
  1.4238 +	LOG_MESSAGE(logText);
  1.4239 +
  1.4240 +	if (!iEventSet)
  1.4241 +		{
  1.4242 +		SetAutoFlush();
  1.4243 +		}
  1.4244 +	iMultiPtrEventClient->EventBuffer()->SetEventCount(0);
  1.4245 +
  1.4246 +	TPoint ptrPos;
  1.4247 +	TInt ptrNum = 0;
  1.4248 +	TInt prValue = 0;
  1.4249 +	TInt proxValue = 0;
  1.4250 +	TInt xInc = iPhysicalScreenSize.iWidth/iMaxDevPointers;
  1.4251 +	TInt yInc = iPhysicalScreenSize.iHeight/iMaxDevPointers;
  1.4252 +	
  1.4253 +	switch(iEventSet++)
  1.4254 +		{
  1.4255 +		case 0:
  1.4256 +			/**
  1.4257 +			@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0001
  1.4258 +			@SYMPREQ				PREQ1226
  1.4259 +			@SYMREQ					REQ9674,REQ9687,
  1.4260 +			@SYMTestPriority		High 
  1.4261 +			@SYMTestCaseDesc		Checks Wserv sends multi touch pointer events received by it
  1.4262 +			@SYMTestStatus			Implemented
  1.4263 +
  1.4264 +			@SYMTestActions			Simulate raw events from different pointers 
  1.4265 +			@SYMTestExpectedResults The received events must match the simulated raw events
  1.4266 +			*/
  1.4267 +			INFO_PRINTF1(_L("Simulate pointer events from all pointers"));
  1.4268 +			INFO_PRINTF1(_L("Test pattern is PointerDown0/PointerUp0, PointerDown1/PointerUp1, PointerDown2/PointerUp2..."));
  1.4269 +			// Test pattern is down0/up0, down1/up1, down2/up2, down3/up3....
  1.4270 +			AddExpectedWsEvent(EEventFocusGained);
  1.4271 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4272 +				{
  1.4273 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4274 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.4275 +				ptrPos.iX += xInc;
  1.4276 +				ptrPos.iY += yInc;
  1.4277 +				}
  1.4278 +			break;
  1.4279 +		case 1:
  1.4280 +			/**
  1.4281 +			@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0003
  1.4282 +			@SYMPREQ				PREQ1226
  1.4283 +			@SYMREQ					REQ9674,REQ9687,
  1.4284 +			@SYMTestPriority		High 
  1.4285 +			@SYMTestCaseDesc		To check Wserv sends simultaneous multi touch pointer events 
  1.4286 +			@SYMTestStatus			Implemented
  1.4287 +
  1.4288 +			@SYMTestActions			Simulate simultaneous raw events from different pointers 
  1.4289 +			@SYMTestExpectedResults The received events must match the simulated raw events
  1.4290 +			*/
  1.4291 +			INFO_PRINTF1(_L("Test pattern PointerDown0/PointerDown1/PointerDown2/... PointerUp0/PointerUp1/PointerUp2..."));
  1.4292 +			// Test pattern is pointer0Down/pointer1Down/pointer2Down/pointer3Down.... pointer0Up/pointer1Up/pointer2Up/pointer3Up.... 
  1.4293 +			ptrPos.SetXY(0,0);
  1.4294 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4295 +				{
  1.4296 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4297 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.4298 +				ptrPos.iX += xInc;
  1.4299 +				ptrPos.iY += yInc;
  1.4300 +				}
  1.4301 +
  1.4302 +			ptrPos.SetXY(0,0);
  1.4303 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4304 +				{
  1.4305 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4306 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.4307 +				ptrPos.iX += xInc;
  1.4308 +				ptrPos.iY += yInc;				
  1.4309 +				}
  1.4310 +			break;
  1.4311 +		case 2:
  1.4312 +			/**
  1.4313 +			@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0005
  1.4314 +			@SYMPREQ				PREQ1226
  1.4315 +			@SYMREQ					REQ9676
  1.4316 +			@SYMTestPriority		High 
  1.4317 +			@SYMTestCaseDesc		To check Wserv sends the multi touch pointer events received 
  1.4318 +									by it along with the Pressure or Proximity 
  1.4319 +			@SYMTestStatus			Implemented
  1.4320 +
  1.4321 +			@SYMTestActions			Simulate raw events with pressure and proximity from different pointers  
  1.4322 +			@SYMTestExpectedResults The received events must match the simulated raw events
  1.4323 +			*/
  1.4324 +			// Simulate Button1Down with differet pressure
  1.4325 +			// Simulate Button1Up with zero pressure
  1.4326 +			INFO_PRINTF1(_L("Simulate pointer events with different pressure values"));
  1.4327 +			ptrPos.SetXY(0,0);
  1.4328 +			prValue = iPressureStep;
  1.4329 +			for (; (prValue <= iMaxPressure && ptrPos.iX < iPhysicalScreenSize.iWidth && ptrPos.iY < iPhysicalScreenSize.iHeight); prValue+=iPressureStep)
  1.4330 +				{
  1.4331 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, 0);
  1.4332 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.4333 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, 0);
  1.4334 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.4335 +				ptrPos.iX += xInc;
  1.4336 +				ptrPos.iY += yInc;
  1.4337 +				}
  1.4338 +			
  1.4339 +			// Test with max pressure it might be that the width may cross the physical screen size
  1.4340 +			ptrPos.SetXY(0,0);
  1.4341 +			prValue = iMaxPressure;
  1.4342 +			SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, prValue, 0);
  1.4343 +			SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, 0);
  1.4344 +			AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, prValue, 0, 0);
  1.4345 +			AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, 0);
  1.4346 +			break;
  1.4347 +		case 3:
  1.4348 +			// Simulate EPointerMove with different pressure values and for differernt pointers
  1.4349 +			INFO_PRINTF1(_L("Simulate pointer events with different pressure values and from different pointers"));
  1.4350 +			ptrPos.SetXY(0,0);
  1.4351 +			prValue = iPressureStep;
  1.4352 +			
  1.4353 +			// Enable move events 
  1.4354 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.4355 +			iMultiPtrEventClient->ChildWin()->BaseWin()->PointerFilter(EPointerFilterMove, 0);
  1.4356 +			
  1.4357 +			// Right now when 2 or more moves occur, wserv deletes all the moves except the last one.
  1.4358 +			// So test only one move per Pointer and then one set of button down and button up
  1.4359 +			// Then repeat the same for different pressure values
  1.4360 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4361 +				{
  1.4362 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4363 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.4364 +				ptrPos.iX += xInc;
  1.4365 +				ptrPos.iY += yInc;
  1.4366 +				}
  1.4367 +			
  1.4368 +			ptrPos.SetXY(0,0);
  1.4369 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4370 +				{
  1.4371 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4372 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.4373 +				ptrPos.iX += xInc;
  1.4374 +				ptrPos.iY += yInc;
  1.4375 +				}
  1.4376 +			
  1.4377 +			// Test moves with different pressure 
  1.4378 +			ptrPos.SetXY(0,0);
  1.4379 +			if ((prValue+iPressureStep) <= iMaxPressure)
  1.4380 +				{
  1.4381 +				prValue += iPressureStep;
  1.4382 +				}
  1.4383 +			ptrNum = 0;
  1.4384 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4385 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.4386 +			break;
  1.4387 +		case 4:
  1.4388 +			INFO_PRINTF1(_L("Simulate pointer events with different proximity values"));
  1.4389 +			// Repeat the same test of case 3 for different proximity values
  1.4390 +			ptrPos.SetXY(0,0);
  1.4391 +			
  1.4392 +			proxValue = -iProximityStep;
  1.4393 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4394 +				{
  1.4395 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.4396 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.4397 +				ptrPos.iX += xInc;
  1.4398 +				ptrPos.iY += yInc;
  1.4399 +				}
  1.4400 +			
  1.4401 +			ptrPos.SetXY(0,0);
  1.4402 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4403 +				{
  1.4404 +				SimulatePointerDownUp(ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4405 +				AddExpectedPointerDownUp(ptrPos, 0, ptrNum);
  1.4406 +				ptrPos.iX += xInc;
  1.4407 +				ptrPos.iY += yInc;
  1.4408 +				}
  1.4409 +
  1.4410 +			ptrPos.SetXY(0,0);
  1.4411 +			if ((proxValue-iProximityStep) > iMaxProximity)
  1.4412 +				{
  1.4413 +				proxValue -= iProximityStep;
  1.4414 +				}
  1.4415 +			ptrNum = 0;
  1.4416 +			SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.4417 +			AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.4418 +			break;
  1.4419 +		case 5:
  1.4420 +			/**
  1.4421 +			@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0007
  1.4422 +			@SYMPREQ				PREQ1226
  1.4423 +			@SYMREQ					REQ9677
  1.4424 +			@SYMTestPriority		High 
  1.4425 +			@SYMTestCaseDesc		To check Wserv sends move/drags of different pointers  
  1.4426 +			@SYMTestStatus			Implemented
  1.4427 +
  1.4428 +			@SYMTestActions			Simulate raw move and drag events from different pointers  
  1.4429 +			@SYMTestExpectedResults The received events must match the simulated raw events
  1.4430 +			*/
  1.4431 +			INFO_PRINTF1(_L("Simulate pointer drag events"));
  1.4432 +			ptrPos.SetXY(0,0);
  1.4433 +			iMultiPtrEventClient->ParentWin()->BaseWin()->PointerFilter(EPointerFilterDrag, 0);
  1.4434 +			
  1.4435 +			// Simulate EButton1Down and then one move and then EButton1Up event  
  1.4436 +			// which will lead to corresponding drag, do it for all the pointers
  1.4437 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4438 +				{
  1.4439 +				TestDragForMultiPointer(ptrPos, 0, ptrNum);
  1.4440 +				ptrPos.iX += xInc/2;
  1.4441 +				ptrPos.iY += yInc/2;
  1.4442 +				}
  1.4443 +
  1.4444 +			// Check the drag with different pressure value with different pointer
  1.4445 +			prValue = iPressureStep;
  1.4446 +			ptrPos.iX = xInc;
  1.4447 +			ptrPos.iY = yInc;
  1.4448 +			if ((prValue+iPressureStep) <= iMaxPressure)
  1.4449 +				{
  1.4450 +				prValue += iPressureStep;
  1.4451 +				}
  1.4452 +			ptrNum = 0;
  1.4453 +			TestDragForMultiPointer(ptrPos, prValue, ptrNum);
  1.4454 +			break;
  1.4455 +		case 6:
  1.4456 +			{
  1.4457 +			/**
  1.4458 +			@SYMTestCaseID			GRAPHICS-WSERV-ADVANCEDPOINTER-0009
  1.4459 +			@SYMPREQ				PREQ1226
  1.4460 +			@SYMREQ					REQ9677, REQ9674
  1.4461 +			@SYMTestPriority		High 
  1.4462 +			@SYMTestCaseDesc		To check Wserv sends simultaneous move/drags of different pointers  
  1.4463 +			@SYMTestStatus			Implemented
  1.4464 +
  1.4465 +			@SYMTestActions			Simulate simulatneous raw move and drag events from different pointers  
  1.4466 +			@SYMTestExpectedResults The received events must match the simulated raw events
  1.4467 +			*/
  1.4468 +			INFO_PRINTF1(_L("Simulate pointer drag events in different pattern"));
  1.4469 +			// Dragging done in this pattern
  1.4470 +			// pointer0Down/pointer1Down/pointer2Down/pointer3Down... pointer0Up/pointer1Up/pointer2Up/pointer3Up....
  1.4471 +			
  1.4472 +			ptrPos.SetXY(0,0);
  1.4473 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4474 +				{
  1.4475 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4476 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.4477 +				ptrPos.iX += xInc/2;
  1.4478 +				ptrPos.iY += yInc/2;
  1.4479 +				}
  1.4480 +			
  1.4481 +			ptrPos.SetXY(0,0);
  1.4482 +			TPoint interPt = ptrPos;
  1.4483 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4484 +				{
  1.4485 +				interPt.iX += 2;
  1.4486 +				interPt.iY += 1;
  1.4487 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.4488 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.4489 +				ptrPos.iX += xInc/2;
  1.4490 +				ptrPos.iY += yInc/2;
  1.4491 +				interPt = ptrPos; 
  1.4492 +				}
  1.4493 +		
  1.4494 +			ptrPos.SetXY(0,0);
  1.4495 +			interPt = ptrPos;
  1.4496 +			for (ptrNum = 0; ptrNum < iMaxDevPointers; ptrNum++)
  1.4497 +				{
  1.4498 +				interPt.iX += 2;
  1.4499 +				interPt.iY += 1;
  1.4500 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.4501 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.4502 +				ptrPos.iX += xInc/2;
  1.4503 +				ptrPos.iY += yInc/2;
  1.4504 +				interPt = ptrPos; 
  1.4505 +				}
  1.4506 +			break;
  1.4507 +			}
  1.4508 +		case 7:
  1.4509 +			{
  1.4510 +			// Mixing of drag and moves of different pointers
  1.4511 +			ptrPos.SetXY(0,0);
  1.4512 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4513 +				{
  1.4514 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4515 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.4516 +				ptrPos.iX += xInc/2;
  1.4517 +				ptrPos.iY += yInc/2;
  1.4518 +				}
  1.4519 +			ptrPos.SetXY(0,0);
  1.4520 +			TPoint interPt = ptrPos;
  1.4521 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4522 +				{
  1.4523 +				interPt.iX += 2;
  1.4524 +				interPt.iY += 1;
  1.4525 +				SimulatePointerEvent(TRawEvent::EPointerMove, interPt.iX, interPt.iY, 0, ptrNum);
  1.4526 +				AddExpectedPointerEvent(TPointerEvent::EDrag, interPt, 0, 0, ptrNum);
  1.4527 +				ptrPos.iX += xInc/2;
  1.4528 +				ptrPos.iY += yInc/2;
  1.4529 +				interPt = ptrPos; 
  1.4530 +				}
  1.4531 +		
  1.4532 +			ptrPos.SetXY(0,0);
  1.4533 +			interPt = ptrPos;
  1.4534 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4535 +				{
  1.4536 +				interPt.iX += 2;
  1.4537 +				interPt.iY += 1;
  1.4538 +				SimulatePointerEvent(TRawEvent::EButton1Up, interPt.iX, interPt.iY, 0, ptrNum);
  1.4539 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, interPt, 0, 0, ptrNum);
  1.4540 +				ptrPos.iX += xInc/2;
  1.4541 +				ptrPos.iY += yInc/2;
  1.4542 +				interPt = ptrPos; 
  1.4543 +				}
  1.4544 +			
  1.4545 +			ptrPos.SetXY(0,0);
  1.4546 +			prValue = iPressureStep;
  1.4547 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2 && prValue < iMaxPressure; ptrNum++, prValue+=iPressureStep)
  1.4548 +				{
  1.4549 +				SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4550 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, prValue, 0, ptrNum);
  1.4551 +				ptrPos.iX += xInc;
  1.4552 +				ptrPos.iY += yInc;
  1.4553 +				}
  1.4554 +			}
  1.4555 +			break;
  1.4556 +		case 8:
  1.4557 +			{
  1.4558 +			INFO_PRINTF1(_L("Check intermediate Moves and Drags are deleted except last event"));
  1.4559 +			// Check if intermediate move and drag events are deleted
  1.4560 +			// The deletion is done with respect to same pointer and same window
  1.4561 +			xInc = iPhysicalScreenSize.iWidth/KMaxQueueSize;
  1.4562 +			yInc = iPhysicalScreenSize.iHeight/KMaxQueueSize;
  1.4563 +			ptrPos.iX = xInc;
  1.4564 +			ptrPos.iY = yInc;
  1.4565 +			TInt count = 0;
  1.4566 +			
  1.4567 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4568 +				{
  1.4569 +				// Make sure that ptrPos does not go out of screen area, i,e the loop count should not exceed 4
  1.4570 +				for (count = proxValue = 0; proxValue > iMaxProximity && count < 4; proxValue=proxValue-(4*iProximityStep), count++)
  1.4571 +					{
  1.4572 +					ptrPos.iX += xInc/2;
  1.4573 +					ptrPos.iY += yInc/2;
  1.4574 +					SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, proxValue, ptrNum);
  1.4575 +					}
  1.4576 +				// Since the for loop increments the variables at the end
  1.4577 +				proxValue = proxValue + (4*iProximityStep);
  1.4578 +				AddExpectedPointerEvent(TPointerEvent::EMove, ptrPos, proxValue, 0, ptrNum);
  1.4579 +				}
  1.4580 +			
  1.4581 +			ptrPos.iX = xInc;
  1.4582 +			ptrPos.iY = yInc;
  1.4583 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4584 +				{
  1.4585 +				ptrPos.iX += xInc/2;
  1.4586 +				ptrPos.iY += yInc/2;
  1.4587 +				SimulatePointerEvent(TRawEvent::EButton1Down, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4588 +				AddExpectedPointerEvent(TPointerEvent::EButton1Down, ptrPos, 0, 0, ptrNum);
  1.4589 +				}
  1.4590 +
  1.4591 +			ptrPos.iX = xInc;
  1.4592 +			ptrPos.iY = yInc;
  1.4593 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4594 +				{
  1.4595 +				// Make sure that ptrPos does not go out of screen area, i,e the loop count shuld not exceed 4
  1.4596 +				for (count = prValue = 0; prValue < iMaxPressure && count < 4; prValue=prValue+(4*iPressureStep), count++)
  1.4597 +					{
  1.4598 +					ptrPos.iX += xInc/2;
  1.4599 +					ptrPos.iY += yInc/2;
  1.4600 +					SimulatePointerEvent(TRawEvent::EPointerMove, ptrPos.iX, ptrPos.iY, prValue, ptrNum);
  1.4601 +					}
  1.4602 +				prValue = prValue-(4*iPressureStep);
  1.4603 +				AddExpectedPointerEvent(TPointerEvent::EDrag, ptrPos, prValue, 0, ptrNum);
  1.4604 +				}
  1.4605 +			
  1.4606 +			ptrPos.iX = xInc;
  1.4607 +			ptrPos.iY = yInc;
  1.4608 +			for (ptrNum = 0; ptrNum < iMaxDevPointers/2; ptrNum++)
  1.4609 +				{
  1.4610 +				ptrPos.iX += xInc/2;
  1.4611 +				ptrPos.iY += yInc/2;
  1.4612 +				SimulatePointerEvent(TRawEvent::EButton1Up, ptrPos.iX, ptrPos.iY, 0, ptrNum);
  1.4613 +				AddExpectedPointerEvent(TPointerEvent::EButton1Up, ptrPos, 0, 0, ptrNum);
  1.4614 +				}
  1.4615 +			}
  1.4616 +			break;
  1.4617 +		default:
  1.4618 +			ResetFlushStopAS();
  1.4619 +			break;
  1.4620 +		}
  1.4621 +	
  1.4622 +	LogEventsAdded();
  1.4623 +	}
  1.4624 +
  1.4625 +// Logs number of events added to test buffer for comaparison
  1.4626 +void CTMultiPtrEventTest::LogEventsAdded()
  1.4627 +	{
  1.4628 +	TLogMessageText logText1;
  1.4629 +	_LIT(KEventsAdded, "Events added to buffer = %d");
  1.4630 +	logText1.AppendFormat(KEventsAdded, iMultiPtrEventClient->EventBuffer()->EventsRemaining());
  1.4631 +	LOG_MESSAGE(logText1);	
  1.4632 +	}
  1.4633 +
  1.4634 +// If any of the Tests fails, bring the wserv in a consistent state for other test to run, 
  1.4635 +// stop ActiveScheduler and display some logs where the fail occured.
  1.4636 +void CTMultiPtrEventTest::Failed()
  1.4637 +	{
  1.4638 +	switch (iTest->iState)
  1.4639 +		{
  1.4640 +		case 2:		// Anim tests
  1.4641 +			DestroyAnimDllAndAnim();
  1.4642 +			break;
  1.4643 +		case 3:		// MultiClient tests
  1.4644 +			if (iMultiPtrEventClient->EventBuffer()->NestedLoopState())
  1.4645 +				{
  1.4646 +				iSecMultiPtrEventClient->EventBuffer()->SetNestedLoopState(EFalse);
  1.4647 +				CActiveScheduler::Stop();
  1.4648 +				}
  1.4649 +			break;
  1.4650 +		case 4:		//PtrClick tests
  1.4651 +			if (iPtrPluginLoaded)
  1.4652 +				{
  1.4653 +				iPtrPluginLoaded = EFalse;
  1.4654 +				iClick.Unload();
  1.4655 +				iClick.Close();
  1.4656 +				}
  1.4657 +			if (iHeap)
  1.4658 +				{
  1.4659 +				iHeap->Close();
  1.4660 +				iHeap = NULL;
  1.4661 +				iChunk.Close();
  1.4662 +				}
  1.4663 +			break;
  1.4664 +		case 5:		//Screen mode tests
  1.4665 +			SetDefaultScreenMode();
  1.4666 +			break;
  1.4667 +		case 11:
  1.4668 +			iMultiPtrEventClient->DeleteGroupBlankWin();
  1.4669 +			break;
  1.4670 +		case 12:	//Emulation tests, iEventSet is incremented in main switch case.
  1.4671 +			switch (iEventSet)
  1.4672 +				{
  1.4673 +				case 9:
  1.4674 +					DeleteGroupWin();
  1.4675 +					break;
  1.4676 +				case 10:
  1.4677 +					DestroyAnimDllAndAnim();
  1.4678 +					break;
  1.4679 +				case 11:
  1.4680 +				case 12:
  1.4681 +					iMultiPtrEventClient->ParentWin()->BaseWin()->FreePointerMoveBuffer();
  1.4682 +					iMultiPtrEventClient->ParentWin()->BaseWin()->DisablePointerMoveBuffer();
  1.4683 +					break;
  1.4684 +				case 14:
  1.4685 +				case 15:
  1.4686 +					iMultiPtrEventClient->iWs.SetPointerCursorArea(iOrigPtrCursorArea);
  1.4687 +					break;
  1.4688 +				default:
  1.4689 +					break;
  1.4690 +				}
  1.4691 +			break;
  1.4692 +		case 15:
  1.4693 +			if (iEventSet > 1)
  1.4694 +				{
  1.4695 +				DeleteGroupWinForCapturing();
  1.4696 +				}
  1.4697 +			break;
  1.4698 +		case 13:
  1.4699 +		case 16:
  1.4700 +			SetThresholdValues(KMaxTInt, KMinTInt, KMaxTInt, KMinTInt);
  1.4701 +			break;
  1.4702 +		default:
  1.4703 +			break;
  1.4704 +		}
  1.4705 +	
  1.4706 +	if (iActiveSchedulerStarted)
  1.4707 +		{
  1.4708 +		iActiveSchedulerStarted = EFalse;
  1.4709 +		CActiveScheduler::Stop();
  1.4710 +		}
  1.4711 +	
  1.4712 +	// Display the test case number, subtest case number and number of events left in the buffer which can be used to
  1.4713 +	// find out which event actually caused the failure when any test fails
  1.4714 +	TLogMessageText logText1;
  1.4715 +	_LIT(KEventsAdded, "Test case number %d Sub test case number %d Events remaining in the buffer %d \n");
  1.4716 +	logText1.AppendFormat(KEventsAdded, iTest->iState, iEventSet, iMultiPtrEventClient->EventBuffer()->EventsRemaining());
  1.4717 +	LOG_MESSAGE(logText1);
  1.4718 +	RDebug::Printf("Test case number %d Sub test case number %d Events remaining in the buffer %d \n", iTest->iState, iEventSet, iMultiPtrEventClient->EventBuffer()->EventsRemaining());
  1.4719 +	
  1.4720 +	iFailed=ETrue;
  1.4721 +	}
  1.4722 +
  1.4723 +// This function is called by TestExecute Framework, through which all the testcases are run
  1.4724 +void CTMultiPtrEventTest::RunTestCaseL(TInt /*aCurTestCase*/)
  1.4725 +	{
  1.4726 +	_LIT(KTest0, "MultiPointerEvents with Pressure and Proximity");
  1.4727 +	_LIT(KTest1, "Purging Of MultiPointerEvents");
  1.4728 +	_LIT(KTest2, "MultiPointerEvents for Anims");
  1.4729 +	_LIT(KTest3, "MultiPointerEvents from multi client");
  1.4730 +	_LIT(KTest4, "MultiPointerEvents for pointer click plugin");
  1.4731 +	_LIT(KTest5, "MultiPointerEvents In Different ScreenModes");
  1.4732 +	_LIT(KTest6, "Filtering Of MultiPointerEvents");
  1.4733 +	_LIT(KTest7, "Grabbing Of MultiPointerEvents");
  1.4734 +	_LIT(KTest8, "VirtualKeyboard for Multiple Pointers");
  1.4735 +	_LIT(KTest9, "DoubleClick events for Multiple Pointer");
  1.4736 +	_LIT(KTest10, "OutOfRange & EnterExit for Multiple Pointer");
  1.4737 +	_LIT(KTest11, "Auto foreground for Multiple Pointer");
  1.4738 +	_LIT(KTest12, "Emulation rules for Mulitple Pointers");
  1.4739 +	_LIT(KTest13, "Close proximity and High Pressure events");
  1.4740 +	_LIT(KTest14, "Out of bound value testing");
  1.4741 +	_LIT(KTest15, "Capturing Of MultiPointerEvents");
  1.4742 +	_LIT(KTest16, "Negative testing for Proximity and Pressure events");
  1.4743 +	_LIT(KTest17, "PointerRepeatEvent for Multiple Pointers");
  1.4744 +	
  1.4745 +	if (!TestBase()->ConfigurationSupportsPointerEventTesting())
  1.4746 +	    {
  1.4747 +	    INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing"));
  1.4748 +	    TestComplete();
  1.4749 +	    return;
  1.4750 +	    }
  1.4751 +	
  1.4752 +	switch(iTest->iState)
  1.4753 +		{
  1.4754 +	case 0:
  1.4755 +		iTest->LogSubTest(KTest0);
  1.4756 +		RunTestsL();
  1.4757 +		break;
  1.4758 +	case 1:
  1.4759 +		iTest->LogSubTest(KTest1);
  1.4760 +		RunTestsL();
  1.4761 +		break;
  1.4762 +	case 2:
  1.4763 +		iTest->LogSubTest(KTest2);
  1.4764 +		RunTestsL();
  1.4765 +		break;
  1.4766 +	case 3:
  1.4767 +		iTest->LogSubTest(KTest3);
  1.4768 +		RunTestsL();
  1.4769 +		break;
  1.4770 +	case 4:
  1.4771 +		iTest->LogSubTest(KTest4);
  1.4772 +		RunTestsL();
  1.4773 +		break;
  1.4774 +	case 5:
  1.4775 +		iTest->LogSubTest(KTest5);
  1.4776 +		RunTestsL();
  1.4777 +		break;
  1.4778 +	case 6:
  1.4779 +		iTest->LogSubTest(KTest6);
  1.4780 +		RunTestsL();
  1.4781 +		break;	
  1.4782 +	case 7:
  1.4783 +		iTest->LogSubTest(KTest7);
  1.4784 +		RunTestsL();
  1.4785 +		break;	
  1.4786 +	case 8:
  1.4787 +		iTest->LogSubTest(KTest8);
  1.4788 +		RunTestsL();
  1.4789 +		break;
  1.4790 +	case 9:
  1.4791 +		iTest->LogSubTest(KTest9);
  1.4792 +		RunTestsL();
  1.4793 +		break;
  1.4794 +	case 10:
  1.4795 +		iTest->LogSubTest(KTest10);
  1.4796 +		RunTestsL();
  1.4797 +		break;
  1.4798 +	case 11:
  1.4799 +		iTest->LogSubTest(KTest11);
  1.4800 +		RunTestsL();
  1.4801 +		break;
  1.4802 +	case 12:
  1.4803 +		iTest->LogSubTest(KTest12);
  1.4804 +		RunTestsL();
  1.4805 +		break;
  1.4806 +	case 13:
  1.4807 +		iTest->LogSubTest(KTest13);
  1.4808 +		RunTestsL();
  1.4809 +		break;
  1.4810 +	case 14:
  1.4811 +		iTest->LogSubTest(KTest14);
  1.4812 +		RunTestsL();
  1.4813 +		break;
  1.4814 +	case 15:
  1.4815 +		iTest->LogSubTest(KTest15);
  1.4816 +		RunTestsL();
  1.4817 +		break;
  1.4818 +	case 16:
  1.4819 +		iTest->LogSubTest(KTest16);
  1.4820 +		RunTestsL();
  1.4821 +		break;	
  1.4822 +	case 17:
  1.4823 +		iTest->LogSubTest(KTest17);
  1.4824 +		RunTestsL();
  1.4825 +		break;	
  1.4826 +	case 18:
  1.4827 +		// Keep this code in last case statement for main test completion 
  1.4828 +		TestComplete();
  1.4829 +		break;
  1.4830 +	default:
  1.4831 +		AutoPanic(EAutoPanicWrongTest);
  1.4832 +		}
  1.4833 +
  1.4834 +	// 
  1.4835 +	if (iFailed)
  1.4836 +		{
  1.4837 +		TEST(EFalse);
  1.4838 +		iFailed=EFalse;
  1.4839 +		}
  1.4840 +	++iTest->iState;
  1.4841 +	}
  1.4842 +
  1.4843 +// Macro which is used for construction of CTMultiPtrEventTestStep object
  1.4844 +// and also used to call CreateTestL() which creates CTMultiPtrEventTest and CTestBase objects
  1.4845 +__WS_CONSTRUCT_STEP__(MultiPtrEventTest)