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)