windowing/windowserver/tauto/TMULTCON.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/TMULTCON.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,478 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Test multiple connections to the window server
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "TMULTCON.H"
+
+const TInt EMaxSubState=3;
+
+//#define LOGGING on		//Uncomment this line to get extra logging
+
+_LIT(ClickOnMe,"Click on me");
+_LIT(KError,"ERROR");
+
+
+CTMultiCon::CTMultiCon(CTestStep* aStep) : CTWsGraphicsBase(aStep)
+	{
+	}
+
+CTMultiCon::~CTMultiCon()
+	{
+	delete iConn1;
+	delete iConn2;
+	delete iConn3;
+	delete iTimeOut;
+	}
+
+void CTMultiCon::EndAutoForegroundTest()
+	{
+#if defined(LOGGING)
+	_LIT(KLog,"EndAutoForegroundTest  SubState %d");
+	LOG_MESSAGE2(KLog,iSubState);
+#endif
+	iConn1->iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+	iConn2->iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+	iConn3->iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+	CActiveScheduler::Stop();
+	}
+
+void CTMultiCon::ConstructL()
+	{
+	iTimeOut=new(ELeave) CTimeOut();
+	iTimeOut->ConstructL();
+	TheClient->iWs.SetPointerCursorArea(iTest->iNormalPointerCursorArea);
+	iScreenSize=TSize(TheClient->iScreen->SizeInPixels());
+	iConn3=new(ELeave) CMcConnectionDef(this);
+	iConn3->ConstructL();
+	iConn2=new(ELeave) CMcConnection(this);
+	iConn2->ConstructL();
+	iConn1=new(ELeave) CMcConnectionAf(this);
+	iConn1->ConstructL();
+	iTest->SimulateKeyDownUp(EStdKeyLeftCtrl);
+	iTest->SimulateKeyDownUp(EStdKeyRightCtrl);
+	TInt mods=TheClient->iWs.GetModifierState();
+	_LIT(KLog,"Initial Modifiers state 0x%x (ideally should be zero)");
+	LOG_MESSAGE2(KLog,mods);
+	}
+
+TInt CTMultiCon::TimeOut(TAny* aTest)		//static
+	{
+	static_cast<CTMultiCon*>(aTest)->TimeOut();
+	return(KErrNone);
+	}
+
+void CTMultiCon::TimeOut()
+	{
+	TLogMessageText buf;
+	_LIT(KMultiConTimeOut,"TIMEOUT: Multiple Conection Test, %d, %S");
+	buf.AppendFormat(KMultiConTimeOut,iTest->iState,&iTest->iSubTitle);
+	TheClient->LogMessage(buf);
+	++iTimeOutCount;
+	EndAutoForegroundTest();
+	}
+
+
+//
+// CMcConnection //
+//
+
+CMcConnectionBase::CMcConnectionBase(CTMultiCon *aTest) : iTest(aTest)
+	{
+	}
+
+CMcConnectionBase::~CMcConnectionBase()
+	{
+	CTWin::Delete(iWin);
+	delete iGc;
+	}
+
+void CMcConnectionBase::SubStateChanged()
+	{
+	iWin->Invalidate();
+	iWs.Flush();
+	}
+
+void CMcConnectionBase::ConstructL()
+	{
+	CTClient::SetScreenNumber(iTest->ScreenNumber());
+	CTClient::ConstructL();
+	User::LeaveIfError(iScreen->CreateContext(iGc));
+	}
+
+CMcConnection::CMcConnection(CTMultiCon *aTest) : CMcConnectionBase(aTest)
+	{
+	}
+
+void CMcConnection::ConstructL()
+	{
+	CMcConnectionBase::ConstructL();
+	iGroup=new(ELeave) CTWindowGroup(this);
+	iGroup->ConstructL();
+	TSize screenSize=iGroup->Size();
+	TInt winWidth=screenSize.iWidth/3;
+	TInt winHeight=screenSize.iHeight/2-10;
+	iGroup->GroupWin()->AutoForeground(EFalse);
+	CMcWindow *win=new(ELeave) CMcWindow(iTest);
+	win->SetUpL(TPoint(5,5),TSize(winWidth,winHeight),iGroup,*iGc);
+	iWin=win;
+	iWs.Flush();
+	}
+
+CMcConnectionAf::CMcConnectionAf(CTMultiCon *aTest) : CMcConnectionBase(aTest)
+	{
+	}
+
+void CMcConnectionAf::ConstructL()
+	{
+	CMcConnectionBase::ConstructL();
+	iGroup=new(ELeave) CMcWindowGroupAf(this);
+	iGroup->ConstructL();
+	TSize screenSize=iGroup->Size();
+	TInt winWidth=screenSize.iWidth/3;
+	TInt winHeight=screenSize.iHeight/2-10;
+	iGroup->GroupWin()->AutoForeground(ETrue);
+	CMcWindowAf *win=new(ELeave) CMcWindowAf(iTest);
+	win->SetUpL(TPoint(winWidth,5),TSize(winWidth,winHeight),iGroup,*iGc);
+	iWin=win;
+	iWs.Flush();
+	}
+
+void CMcConnectionAf::KeyL(const TKeyEvent &aKey)
+	{
+#if defined(LOGGING)
+	_LIT(KLog1,"KeyL  SS=%d (0)  GpWinOrdPos=%d (0)  Code=%d (32)");
+	_LIT(KLog2," '%c'");
+	TLogMessageText buf;
+	buf.Format(KLog1,iTest->SubState(),iGroup->GroupWin()->OrdinalPosition(),aKey.iCode);
+	if (aKey.iCode>0)
+		buf.AppendFormat(KLog2,aKey.iCode);
+	iTest->LOG_MESSAGE(buf);
+#endif
+	switch(aKey.iCode)
+		{
+		case ' ':
+			if (iTest->SubState()==0)
+				{
+				iTest->TEST(iGroup->GroupWin()->OrdinalPosition()==0);
+				iTest->IncSubState();
+				}
+			break;
+		case EKeyEscape:
+			iTest->EndAutoForegroundTest();
+			break;
+		}
+	}
+
+CMcConnectionDef::CMcConnectionDef(CTMultiCon *aTest) : CMcConnectionBase(aTest)
+	{
+	}
+
+void CMcConnectionDef::ConstructL()
+	{
+	CMcConnectionBase::ConstructL();
+	iGroup=new(ELeave) CTWindowGroup(this);
+	iGroup->ConstructL();
+	iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+	TSize screenSize=iGroup->Size();
+	TInt winWidth=screenSize.iWidth/3-10;
+	TInt winHeight=(screenSize.iHeight/2)-10;
+	CMcWindowDef *win=new(ELeave) CMcWindowDef(iTest);
+	win->SetUpL(TPoint(5+winWidth/2,screenSize.iHeight/2),TSize(winWidth,winHeight),iGroup,*iGc);
+	iWin=win;
+	iWs.Flush();
+	}
+
+//
+// CMcWindow, base class //
+//
+
+CMcWindowBase::CMcWindowBase(CTMultiCon *aTest) : CTWin(), iTest(aTest)
+	{
+	}
+
+void CMcWindowBase::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	ConstructExtLD(*parent,pos,size);
+	iWin.SetBackgroundColor(iBack);
+	Activate();
+	AssignGC(aGc);
+	}
+
+//
+// CMcWindow, window used to test multiple connections //
+//
+
+CMcWindow::CMcWindow(CTMultiCon *aTest) : CMcWindowBase(aTest)
+	{
+	iBack=TRgb::Gray256(221);
+	}
+
+void CMcWindow::PointerL(const TPointerEvent &pointer,const TTime &)
+	{
+#if defined(LOGGING)
+	_LIT(KLog,"Pointer  SS=%d (1)  Type=%d (%d)  GpWinOrdPos=%d (1)");
+	iTest->LOG_MESSAGE5(KLog,iTest->SubState(),pointer.iType,TPointerEvent::EButton1Down,Client()->iGroup->GroupWin()->OrdinalPosition());
+#endif
+	if (pointer.iType==TPointerEvent::EButton1Down)
+		{
+		switch(iTest->SubState())
+			{
+			case 1:
+				iTest->TEST(Client()->iGroup->GroupWin()->OrdinalPosition()==1);
+				iTest->IncSubState();
+				break;
+			}
+		}
+	}
+
+void CMcWindow::Draw()
+	{
+	iGc->Clear();
+	TBuf<0x40> buf;
+	switch(iTest->SubState())
+		{
+		case 1:
+			buf.Copy(ClickOnMe);
+			break;
+		case 0:
+		case 2:
+		case 3:
+			buf.Copy(KNullDesC);
+			break;
+		default:
+			buf.Copy(KError);
+		}
+	iGc->DrawText(buf, TPoint(10,20));
+	}
+
+//
+// CMcWindowAf, Auto foreground version of CMcWindow //
+//
+
+CMcWindowAf::CMcWindowAf(CTMultiCon *aTest) : CMcWindowBase(aTest)
+	{
+	iBack=TRgb::Gray256(150);
+	}
+
+void CMcWindowAf::PointerL(const TPointerEvent &pointer,const TTime &)
+	{
+#if defined(LOGGING)
+	_LIT(KLog,"PointerL  SS=%d (2)  Type=%d (%d)  GpWinOrdPos=%d (0)");
+	iTest->LOG_MESSAGE5(KLog,iTest->SubState(),pointer.iType,TPointerEvent::EButton1Down,Client()->iGroup->GroupWin()->OrdinalPosition());
+#endif
+	if (pointer.iType==TPointerEvent::EButton1Down)
+		{
+		switch(iTest->SubState())
+			{
+			case 2:
+				iTest->TEST(Client()->iGroup->GroupWin()->OrdinalPosition()==0);
+				iTest->IncSubState();
+				break;
+			}
+		}
+	}
+
+void CMcWindowAf::Draw()
+	{
+	_LIT(PressSpace,"Press <Space>");
+	iGc->Clear();
+	TBuf<0x40> buf;
+	switch(iTest->SubState())
+		{
+		case 1:
+		case 3:
+			break;
+		case 0:
+			buf.Copy(PressSpace);
+			break;
+		case 2:
+			buf.Copy(ClickOnMe);
+			break;
+		default:
+			buf.Copy(KError);
+		}
+	iGc->DrawText(buf, TPoint(10,20));
+	}
+
+//
+
+CMcWindowGroupAf::CMcWindowGroupAf(CTClient *aClient) : CTWindowGroup(aClient)
+	{}
+
+void CMcWindowGroupAf::KeyL(const TKeyEvent &aKey, const TTime &)
+	{
+	((CMcConnectionAf *)iClient)->KeyL(aKey);
+	}
+
+//
+// CMcWindowDef, Default auto foreground version of CMcWindow //
+//
+
+CMcWindowDef::CMcWindowDef(CTMultiCon *aTest) : CMcWindowBase(aTest)
+	{
+	iBack=TRgb::Gray256(236);
+	}
+
+void CMcWindowDef::PointerL(const TPointerEvent &pointer,const TTime &)
+	{
+#if defined(LOGGING)
+	_LIT(KLog,"PointerL  SS=%d (3)  Type=%d (%d)  GpWinOrdPos=%d (0)");
+	iTest->LOG_MESSAGE5(KLog,iTest->SubState(),pointer.iType,TPointerEvent::EButton1Down,Client()->iGroup->GroupWin()->OrdinalPosition());
+#endif
+	if (pointer.iType==TPointerEvent::EButton1Down)
+		{
+		switch(iTest->SubState())
+			{
+			case 3:
+				iTest->TEST(Client()->iGroup->GroupWin()->OrdinalPosition()==0);
+				iTest->IncSubState();
+				break;
+			}
+		}
+	}
+
+void CMcWindowDef::Draw()
+	{
+	iGc->Clear();
+	TBuf<0x40> buf;
+	switch(iTest->SubState())
+		{
+		case 0:
+		case 1:
+		case 2:
+			break;
+		case 3:
+			buf.Copy(ClickOnMe);
+			break;
+		default:
+			buf.Copy(KError);
+		}
+	iGc->DrawText(buf, TPoint(10,20));
+	}
+
+//
+
+TInt CTMultiCon::SubState() const
+	{
+	return(iSubState);
+	}
+
+void CTMultiCon::IncSubState()
+	{
+	if (iSubState==EMaxSubState)
+		EndAutoForegroundTest();
+	else
+		{
+		iSubState++;
+	#if defined(LOGGING)
+		_LIT(KLog,"New SubState %d");
+		LOG_MESSAGE2(KLog,iSubState);
+	#endif
+		iConn1->SubStateChanged();
+		iConn2->SubStateChanged();
+		iConn3->SubStateChanged();
+		TheClient->WaitForRedrawsToFinish();
+		SendEvents();
+		}
+	}
+
+void CTMultiCon::SendEvents()
+	{
+#if defined(LOGGING)
+	_LIT(KLog,"Sending event for substate %d");
+	LOG_MESSAGE2(KLog,iSubState);
+#endif
+
+	switch (iSubState)
+		{
+	case 0:
+		iTest->SimulateKeyDownUp(EStdKeySpace);
+		break;
+	case 1:
+		iTest->SimulatePointerDownUp(iScreenSize.iWidth/6+5,iScreenSize.iHeight/4);
+		break;
+	case 2:
+		iTest->SimulatePointerDownUp(iScreenSize.iWidth/2,iScreenSize.iHeight/4);
+		break;
+	case 3:
+		iTest->SimulatePointerDownUp(iScreenSize.iWidth/3,3*iScreenSize.iHeight/4-5);
+		break;
+	default:
+		TEST(EFalse);
+		}
+	TheClient->iWs.Flush();
+	}
+
+void CTMultiCon::RunTestCaseL(TInt /*aCurTestCase*/)
+	{
+	_LIT(KTestMultiCon1,"MultiCon 1");
+	_LIT(KTimeOut,"Test Timed Out after %dsecs.  SubState=%d");
+	((CTMultiConStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	
+	if (!TestBase()->ConfigurationSupportsPointerEventTesting())
+	    {
+	    INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing"));
+	    TestComplete();
+	    return;
+	    }
+    
+	switch(++iTest->iState)
+		{
+/**
+
+  @SYMTestCaseID GRAPHICS-WSERV-0289
+  
+  @SYMDEF             DEF081259
+ 
+  @SYMTestCaseDesc Test multiple connections to the window server
+    
+  @SYMTestPriority High
+ 
+  @SYMTestStatus Implemented
+ 
+  @SYMTestActions Make mutiple connections to the window server and check
+  				  that the connections are made corectly
+  
+  @SYMTestExpectedResults The connections are made correctly
+ 
+*/		
+		case 1:
+			((CTMultiConStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0289"));
+			iTest->LogSubTest(KTestMultiCon1);
+			iTimeOut->Start(KTimeOutAfter,TCallBack(CTMultiCon::TimeOut,this));
+			SendEvents();
+			CActiveScheduler::Start();
+			iTimeOut->Cancel();
+			TEST(iTimeOutCount==0);
+			if (iTimeOutCount!=0)
+				LOG_MESSAGE3(KTimeOut,KTimeOutAfter/1000000,iSubState);
+			break;
+		default:
+			((CTMultiConStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			((CTMultiConStep*)iStep)->CloseTMSGraphicsStep();
+			TestComplete();
+			break;
+		}
+	((CTMultiConStep*)iStep)->RecordTestResultL();
+	}
+
+__WS_CONSTRUCT_STEP__(MultiCon)