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