windowing/windowserver/test/tman/TMAN.CPP
changeset 103 2717213c588a
parent 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tman/TMAN.CPP	Tue Jun 22 15:21:29 2010 +0300
@@ -0,0 +1,490 @@
+// Copyright (c) 1995-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:
+// Manual window server tests
+// Note: Wherever possible tests should be put into the TAUTO automatic test
+// code test should only go here when manual operation is essential
+// 
+//
+
+#include <e32std.h>
+#include "W32STD.H"
+#include <e32svr.h>
+#include "TMAN.H"
+
+#define LOG_TESTS
+
+class ErrorDialog : public CTDialog
+	{
+public:
+	ErrorDialog(CTestBase *aTest);
+	void ButtonPressL(TInt aButton);
+private:
+	CTestBase *iTest;
+	};
+
+class TestWindowGroup : public CTWindowGroup
+	{
+public:
+	TestWindowGroup(CTClient *aClient);
+	void ConstructL();
+	void KeyL(const TKeyEvent &aKey,const TTime &aTime);
+	void KeyDownL(const TKeyEvent &aKey,const TTime &aTime);
+	void KeyUpL(const TKeyEvent &aKey,const TTime &aTime);
+	};
+
+class CTManScheduler : public CActiveScheduler
+	{
+public:
+	void SetClient(TestClient *aClient);
+	void Error(TInt anError) const;
+private:
+	void doErrorL(TInt anError) const;
+private:
+	TestClient *iClient;
+	};
+
+typedef CTestBase *(*CTestBaseCreate)();
+
+GLREF_C CTestBase *CreateScreenModeTest();
+GLREF_C CTestBase *CreateScaleTest();
+GLREF_C CTestBase *CreateTextTest();
+GLREF_C CTestBase *CreateDummyTest();
+GLREF_C CTestBase *CreateMultiConTest();
+GLREF_C CTestBase *CreateMultiCaptureKeyTest();
+GLREF_C CTestBase *CreateHotKeyTest();
+GLREF_C CTestBase *CreatePointerTest();
+GLREF_C CTestBase *CreatePointerCaptureTest();
+GLREF_C CTestBase *CreatePointerBufferTest();
+GLREF_C CTestBase *CreateModifiersChangedTest();
+GLREF_C CTestBase *CreatePointerKeyTest();
+GLREF_C CTestBase *CreatePasswordTest();
+GLREF_C CTestBase *CreatePointerCursorTest();
+GLREF_C CTestBase *CreateScreenModeTimes();
+
+// Tests that have not been converted to tauto yet
+CTestBaseCreate CreateTestClass[]={
+	CreateScreenModeTimes,
+	CreatePointerCursorTest,
+	CreatePointerTest,			//Mostly converted
+	CreatePointerKeyTest,		//Mostly converted
+	CreateModifiersChangedTest,		//Partially Conerted
+	CreatePointerBufferTest,
+	CreateTextTest,
+	CreateScaleTest,
+	CreateDummyTest,
+	};
+
+LogWindow *LogWin;
+
+void TManPanic(TInt aPanic)
+	{
+	User::Panic(_L("Auto"),aPanic);
+	}
+
+//
+// Log window, logs testing //
+//
+
+LogWindow::LogWindow() : CTWin()
+	{
+	}
+
+void LogWindow::ConstructL(CTWinBase &parent)
+	{
+	CTWin::ConstructL(parent);
+	iTitleHeight=iFont->HeightInPixels()+4;
+	}
+
+void LogWindow::Draw()
+	{
+	iGc->SetPenColor(TRgb::Gray16(8));
+	iGc->SetPenColor(TRgb::Gray16(0));
+	DrawBorder();
+	iGc->DrawLine(TPoint(0,iTitleHeight),TPoint(iSize.iWidth,iTitleHeight));
+	iGc->DrawText(iTestTitle, TPoint((iSize.iWidth-iFont->TextWidthInPixels(iTestTitle))/2,iFont->AscentInPixels()+2));
+	}
+
+void LogWindow::LogTest(TDesC &aTitle,TInt aNum)
+	{
+	iTestTitle.Format(TRefByValue<const TDesC>(_L("Test %d,%S")),aNum,&aTitle);
+	iWin.Invalidate();
+	Client()->iWs.Flush();
+	}
+
+//
+// Test window, simple window used to do test graphics in //
+//
+TestWindow::TestWindow() : CTWin()
+	{
+	}
+
+void TestWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	iBorderWin=new(ELeave) BorderWindow();
+	iBorderWin->SetUpL(pos,size,parent,aGc);
+	CTWin::ConstructExtLD(*iBorderWin,TPoint(2,2),TSize(size.iWidth-4,size.iHeight-4));
+	Activate();
+	AssignGC(aGc);
+	}
+
+void TestWindow::Draw()
+	{
+	iGc->Clear();
+	}
+
+//
+BorderWindow::BorderWindow() : CTWin()
+	{
+	}
+
+void BorderWindow::ConstructL(CTWinBase &parent)
+	{
+	CTWin::ConstructL(parent);
+	}
+
+void BorderWindow::Draw()
+	{
+	iGc->SetBrushColor(TRgb::Gray16(0));
+	iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	iGc->SetPenStyle(CGraphicsContext::ENullPen);
+	iGc->DrawRect(TRect(Size()));
+	}
+
+//
+
+TestWindowGroup::TestWindowGroup(CTClient *aClient) : CTWindowGroup(aClient)
+	{
+	}
+
+void TestWindowGroup::ConstructL()
+	{
+	CTWindowGroup::ConstructL();
+	GroupWin()->EnableScreenChangeEvents();
+	}
+
+void TestWindowGroup::KeyDownL(const TKeyEvent &aKey,const TTime &aTime)
+	{
+	if (iCurWin)
+		iCurWin->KeyDownL(aKey,aTime);
+	}
+
+void TestWindowGroup::KeyUpL(const TKeyEvent &aKey,const TTime &aTime)
+	{
+	if (iCurWin)
+		iCurWin->KeyUpL(aKey,aTime);
+	}
+
+void TestWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &aTime)
+	{
+	if (aKey.iModifiers&EModifierFunc)
+		{
+		switch(aKey.iCode)
+			{
+			case 'f':
+				((TestClient *)Client())->Driver()->iTest->TriggerFail();
+				break;
+			}
+		}
+	else if (iCurWin)
+		iCurWin->WinKeyL(aKey,aTime);
+	}
+
+//
+
+TestClient::TestClient()
+	{
+	}
+
+void TestClient::ConstructL()
+	{
+	CTClient::ConstructL();
+
+	iGroup=new(ELeave) TestWindowGroup(this);
+	iGroup->ConstructL();
+
+	TSize screenSize=iGroup->Size();
+	TInt winWidth=(screenSize.iWidth/3)-10;
+	TInt winHeight=screenSize.iHeight-10;
+	LogWin=new(ELeave) LogWindow();
+	LogWin->SetUpL(TPoint(5+winWidth*2,5),TSize(winWidth,winHeight),iGroup,*iGc);
+	iDriver=new(ELeave) TestDriver(this);
+	}
+
+TestClient::~TestClient()
+	{
+	delete iDriver;
+	}
+
+TestDriver *TestClient::Driver()
+	{
+	return(iDriver);
+	}
+
+//
+// Error dialog //
+//
+
+ErrorDialog::ErrorDialog(CTestBase *aTest) : CTDialog(), iTest(aTest)
+	{}
+
+void ErrorDialog::ButtonPressL(TInt aButton)
+	{
+	switch(aButton)
+		{
+		case 0:
+			{
+			CTestBase *test=iTest;
+			CTDialog::Delete(this);
+			if (test)
+				test->Driver()->DestroyTest();
+			CActiveScheduler::Stop();
+			User::Leave(0);		// Signals RunL not to do another request
+			}
+			break;
+		case 1:
+			CTestBase *test=iTest;
+			CTDialog::Delete(this);
+			if (test)
+				{
+				test->Driver()->TestComplete();
+				test->Driver()->DestroyTest();
+				}
+			break;
+		}
+	}
+
+//
+// TestDriver, drives the test code //
+//
+
+TestDriver::TestDriver(TestClient *aClient) : CActive(-10), iClient(aClient)
+	{
+	CActiveScheduler::Add(this);
+	Request();
+	}
+
+TestClient *TestDriver::Client()
+	{
+	return(iClient);
+	}
+
+TestDriver::~TestDriver()
+	{
+	Cancel();
+	DestroyTest();
+	}
+
+void TestDriver::DoCancel()
+	{
+	TRequestStatus *pStat= &iStatus;
+	RThread().RequestComplete(pStat,KErrCancel);
+	}
+
+void TestDriver::Request()
+	{
+	TRequestStatus *pStat= &iStatus;
+	RThread().RequestComplete(pStat,KErrNone);
+	SetActive();
+	}
+
+void TestDriver::RunL()
+	{
+	iTest=(*CreateTestClass[iTestNum])();
+	iTest->StartTest(iTestNum,this);
+	iTest->ConstructL();
+	}
+
+void TestDriver::TestComplete()
+	{
+	iTestNum++;
+	if (iTestNum==sizeof(CreateTestClass)/sizeof(CreateTestClass[0]))
+		{
+		DisplayDialog(_L("Tests complete"),_L(""),_L(""));
+		CActiveScheduler::Stop();
+		}
+	else
+		Request();
+	}
+
+void TestDriver::DestroyTest()
+	{
+	delete iTest;
+	iTest=NULL;
+	}
+
+// CTestBase //
+
+CTestBase::CTestBase(const TDesC &aTitle) : CActive(-10)
+	{
+	CActiveScheduler::Add(this);
+	iTitle.Copy(aTitle);
+	}
+
+CTestBase::~CTestBase()
+	{
+	User::Free(iBuf1);
+	User::Free(iBuf2);
+	Cancel();
+	}
+
+void CTestBase::DoCancel()
+	{
+	TRequestStatus *pStat= &iStatus;
+	RThread().RequestComplete(pStat,KErrCancel);
+	}
+
+void CTestBase::Request()
+	{
+	TRequestStatus *pStat= &iStatus;
+	RThread().RequestComplete(pStat,KErrNone);
+	SetActive();
+	}
+
+void CTestBase::TriggerFail()
+	{
+	iFail=ETrue;
+	}
+
+TestClient *CTestBase::Client()
+	{
+	return(iDriver->Client());
+	}
+
+void CTestBase::LogLeave(TInt aErr)
+	{
+#if defined(LOG_TESTS)
+	TLogMessageText buf;
+	_LIT(KLeave,"MAN Left with error code %d in sub-test %d: ");
+	buf.AppendFormat(KLeave,aErr,iSubTestNum);
+	buf.Append(iSubTitle);
+	Client()->LogMessage(buf);
+#else
+	aErr=KErrNone;		//To stop a warning
+#endif
+	}
+
+void CTestBase::RunL()
+	{
+	TInt ret=EInvalid;
+	TRAPD(err,ret=DoTestL());
+	if (err!=KErrNone)
+		{
+		LogLeave(err);
+		if (err!=ETestFailed)
+			{
+			User::Leave(err);
+			}
+		}
+	else if (ret==EFinished)
+		{
+		iDriver->TestComplete();
+		iDriver->DestroyTest();
+		}
+	else if (ret==ENext)
+		Request();
+	}
+
+void CTestBase::StartTest(TInt aNum, TestDriver *aDriver)
+	{
+	iDriver=aDriver;
+	iTestNum=aNum;
+	LogWin->LogTest(iTitle,aNum);
+#if defined(LOG_TESTS)
+	TLogMessageText buf;
+	_LIT(ManNewTest,"MAN New Test %d: ");
+	buf.AppendFormat(ManNewTest,aNum);
+	buf.Append(iTitle);
+	Client()->LogMessage(buf);
+#endif
+	Request();
+	}
+
+void CTestBase::LogSubTest(const TDesC &aSubTitle,TInt aNum)
+	{
+	iSubTestNum=aNum;
+	iSubTitle=aSubTitle;
+#if defined(LOG_TESTS)
+	TLogMessageText buf;
+	_LIT(ManSubTest,"MAN SubTest %d: ");
+	buf.AppendFormat(ManSubTest,iSubTestNum);
+	buf.Append(iSubTitle);
+	Client()->LogMessage(buf);
+#endif
+	}
+
+void CTestBase::AbortL()
+	{
+	TestDriver *driver=iDriver;			
+	iDriver->DestroyTest();
+	driver->TestComplete();
+	User::Leave(ETestFailed);
+	}
+
+void CTestBase::TestL(TInt aCondition)
+	{
+	if (!aCondition || iFail)
+		{
+		iFail=EFalse;
+  		ErrorDialog *dialog=new ErrorDialog(this);
+		if (dialog)
+			{
+			dialog->SetTitle(_L("Test failed"));
+			dialog->SetNumButtons(2);
+			dialog->SetButtonText(0,_L("Abort all tests"));
+			dialog->SetButtonText(1,_L("Continue other tests"));
+			dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
+			dialog->Display();
+			}
+		User::Leave(ETestFailed);
+		}
+	}
+
+void CTManScheduler::SetClient(TestClient *aClient)
+	{
+	iClient=aClient;
+	}
+
+void CTManScheduler::Error(TInt aError) const
+	{
+	TRAP_IGNORE(doErrorL(aError));
+	CActiveScheduler::Stop();
+	}
+
+void CTManScheduler::doErrorL(TInt aError) const
+	{
+	CTDialog *dialog=new(ELeave) CTDialog();
+	if (dialog)
+		{
+		TWindowTitle title;
+		title.Format(TRefByValue<const TDesC>(_L("Error %d")),aError);
+		dialog->SetTitle(title);
+		dialog->SetNumButtons(1);
+		dialog->SetButtonText(0,_L("Abort tests"));
+		dialog->ConstructLD(*iClient->iGroup,*iClient->iGc);
+		dialog->Display();
+		}
+	}
+
+//
+
+GLDEF_C CTClient *CreateClientL()
+	{
+	return(new(ELeave) TestClient());
+	}
+
+
+GLDEF_C TInt E32Main()
+{
+return(TestLibStartUp(CreateClientL));
+}