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: // Automatically test the window server sl@0: // sl@0: // sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "../tlib/testbase.h" sl@0: #include sl@0: #include "AUTO.H" sl@0: sl@0: LOCAL_D const TUint KPanicThreadHeapSize=0x8000; sl@0: sl@0: GLREF_C TInt ProcPriTestOtherProcess(TAny *aScreenNumber); sl@0: GLREF_C TInt ProcToKill(TAny *aScreenNumber); sl@0: GLREF_C TInt ProcDirect(TAny *aScreenNumber); sl@0: GLREF_C TInt ProcMultiDisplay(TAny *aScreenNumber); sl@0: sl@0: _LIT(Priority,"ProcPriTest"); sl@0: _LIT(ToKill,"ProcToKill"); sl@0: _LIT(Direct,"ProcDirect"); sl@0: _LIT(MultiDisplay,"ProcMultiDisplay"); sl@0: sl@0: CProcess::TInitialFunction CProcess::iFunctions[]= sl@0: { sl@0: TInitialFunction(Priority,ProcPriTestOtherProcess), sl@0: TInitialFunction(ToKill,ProcToKill), sl@0: TInitialFunction(Direct,ProcDirect), sl@0: TInitialFunction(MultiDisplay,ProcMultiDisplay) sl@0: }; sl@0: sl@0: GLDEF_D TestWindow *BaseWin; sl@0: GLDEF_D TestWindow *TestWin; sl@0: GLDEF_D TestClient *TheClient=NULL; sl@0: GLDEF_D CWindowGc *TheGc; sl@0: TInt CTestBase::iMaxGrays=0; sl@0: TInt CTestBase::iScreenNo=0; sl@0: TInt CTestBase::iMaxColors=0; sl@0: TInt CTestBase::iNumberTestsPass=0; sl@0: TInt CTestBase::iNumberTests=0; sl@0: TRect CTestBase::iNormalPointerCursorArea; sl@0: TPartialRedrawType CTestBase::iRedrawType=EPartialRedraw_Unknown; sl@0: TInt CTestBase::iNumberOfGrpWndsOnPrimaryScreenWithZeroPriority = 0; sl@0: TInt CTestDriver::iTestNum=0; sl@0: sl@0: GLDEF_D TInt TheTestResult=ETestPassed; // start with passed to anticipate empty test table sl@0: sl@0: const TInt KBorderWinWidth = 5; sl@0: sl@0: _LIT(Auto,"AUTO "); sl@0: sl@0: TInt64 TTestRects::iSeed=0; sl@0: TRect TTestRects::iList[]={ sl@0: // 0-5 sl@0: TRect(2,2,2,2), sl@0: TRect(2,2,2,2), sl@0: TRect(2,2,2,2), sl@0: TRect(2,2,2,2), sl@0: TRect(2,2,2,2), sl@0: // 5-13 sl@0: TRect(0,0,0,0), sl@0: TRect(2,0,2,0), sl@0: TRect(4,0,4,0), sl@0: TRect(0,2,0,2), sl@0: TRect(2,2,2,2), sl@0: TRect(4,2,4,2), sl@0: TRect(0,4,0,4), sl@0: TRect(2,4,2,4), sl@0: TRect(4,4,4,4), sl@0: // 13-22 sl@0: TRect(0,0,1,1), sl@0: TRect(1,0,3,1), sl@0: TRect(3,0,4,1), sl@0: TRect(0,1,1,3), sl@0: TRect(1,1,3,3), sl@0: TRect(3,1,4,3), sl@0: TRect(0,3,1,4), sl@0: TRect(1,3,3,4), sl@0: TRect(3,3,4,4), sl@0: // 23-31 sl@0: TRect(0,0,2,0), sl@0: TRect(2,0,4,0), sl@0: TRect(0,0,4,0), sl@0: TRect(0,2,2,2), sl@0: TRect(2,2,4,2), sl@0: TRect(0,2,4,2), sl@0: TRect(0,4,2,4), sl@0: TRect(2,4,4,4), sl@0: TRect(0,4,4,4), sl@0: // 32-40 sl@0: TRect(0,0,0,2), sl@0: TRect(0,2,0,4), sl@0: TRect(0,0,0,4), sl@0: TRect(2,0,2,2), sl@0: TRect(2,2,2,4), sl@0: TRect(2,0,2,4), sl@0: TRect(4,0,4,2), sl@0: TRect(4,2,4,4), sl@0: TRect(4,0,4,4), sl@0: // 41-44 sl@0: TRect(0,0,2,2), sl@0: TRect(2,0,4,2), sl@0: TRect(0,2,2,4), sl@0: TRect(2,2,4,4), sl@0: // 45-48 sl@0: TRect(0,0,3,3), sl@0: TRect(1,0,4,3), sl@0: TRect(0,1,3,4), sl@0: TRect(1,1,4,4), sl@0: // 49 sl@0: TRect(0,0,4,4), sl@0: // 40-53 sl@0: TRect(1,2,2,2), sl@0: TRect(2,2,3,2), sl@0: TRect(2,1,2,2), sl@0: TRect(2,2,3,2), sl@0: // 54-59 sl@0: TRect(1,2,3,2), sl@0: TRect(2,1,2,3), sl@0: TRect(1,1,2,2), sl@0: TRect(1,2,2,3), sl@0: TRect(2,2,3,3), sl@0: TRect(2,1,3,2), sl@0: // 60-63 sl@0: TRect(1,1,3,2), sl@0: TRect(1,1,2,3), sl@0: TRect(1,2,3,3), sl@0: TRect(2,1,3,3)}; sl@0: sl@0: #if defined(__WINS__) sl@0: void FindNonMatchingPixelL(TPoint aPt1,TPoint aPt2,TSize aSize) sl@0: // This function is purely for use when debugging to find the first non-matching pixel sl@0: // when a check of two on screen rects has failed. sl@0: { sl@0: HBufC8* buf1=HBufC8::NewMaxLC(2*aSize.iWidth); sl@0: HBufC8* buf2=HBufC8::NewMaxLC(2*aSize.iWidth); sl@0: TPtr8 ptr1=buf1->Des(); sl@0: TPtr8 ptr2=buf2->Des(); sl@0: TInt row=0; sl@0: TBool ret = true; sl@0: for (;rowiScreen->GetScanLine(ptr1,aPt1,aSize.iWidth,EColor64K); sl@0: TheClient->iScreen->GetScanLine(ptr2,aPt2,aSize.iWidth,EColor64K); sl@0: if (ptr1!=ptr2) sl@0: break; sl@0: ++aPt1.iY; sl@0: ++aPt2.iY; sl@0: } sl@0: TRgb color1,color2; sl@0: if (rowiScreen->GetPixel(color1,aPt1); sl@0: TheClient->iScreen->GetPixel(color2,aPt2); sl@0: if (color1!=color2) sl@0: { // Break here to find first pixel that didn't match. sl@0: TBuf<256> buf; sl@0: _LIT(KFindNonMatchingPixelFmt,"First non matching pixel (%d,%d)"); sl@0: buf.Format(KFindNonMatchingPixelFmt,col,row); sl@0: TheClient->iWs.LogMessage(buf); sl@0: break; sl@0: sl@0: } sl@0: ++aPt1.iX; sl@0: ++aPt2.iX; sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(2); sl@0: } sl@0: sl@0: void FindNonMatchingPixel(TPoint aPt1,TPoint aPt2,TSize aSize) sl@0: { sl@0: TRAPD(ignore,FindNonMatchingPixelL(aPt1,aPt2,aSize)); sl@0: } sl@0: #endif sl@0: sl@0: void AutoPanic(TInt aPanic) sl@0: { sl@0: User::Panic(_L("Auto"),aPanic); sl@0: } sl@0: sl@0: void CleanUpWindow(TAny *aWindow) sl@0: { sl@0: ((RWindowTreeNode *)aWindow)->Close(); sl@0: } sl@0: sl@0: void PushWindowL(RWindowTreeNode *aWindow) sl@0: { sl@0: CleanupStack::PushL(TCleanupItem(CleanUpWindow,aWindow)); sl@0: } sl@0: sl@0: sl@0: TBool OpacityAndAlphaSupportedL() sl@0: { sl@0: // If opacity is not implemented, EFalse will be returned sl@0: if(TransparencySupportedL()!=KErrNone) sl@0: return EFalse; sl@0: sl@0: const TRgb KTransparencyColor(0,0,0); sl@0: RWindow winb(TheClient->iWs); sl@0: CleanupClosePushL(winb); sl@0: RWindow wint(TheClient->iWs); sl@0: CleanupClosePushL(wint); sl@0: User::LeaveIfError(winb.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle)); sl@0: User::LeaveIfError(wint.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle)); sl@0: winb.SetExtent(TPoint(0,0), TSize(50,50)); sl@0: wint.SetExtent(TPoint(0,0), TSize(50,50)); sl@0: winb.SetRequiredDisplayMode(EColor256); sl@0: wint.SetRequiredDisplayMode(EColor256); sl@0: wint.SetTransparencyFactor(KTransparencyColor); sl@0: winb.SetBackgroundColor(TRgb(0,0,255)); sl@0: wint.SetBackgroundColor(TRgb(255,0,0)); sl@0: winb.Activate(); sl@0: wint.Activate(); sl@0: sl@0: wint.BeginRedraw(); sl@0: TheClient->iGc->Activate(wint); sl@0: TheClient->iGc->SetOpaque(ETrue); sl@0: TheClient->iGc->SetPenStyle(CGraphicsContext::ENullPen); sl@0: TheClient->iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: TheClient->iGc->SetBrushColor(TRgb(0,255,0)); sl@0: TheClient->iGc->DrawRect(TRect(TPoint(0,0), TSize(50,50))); sl@0: TheClient->iGc->SetOpaque(EFalse); sl@0: TheClient->iGc->Deactivate(); sl@0: wint.EndRedraw(); sl@0: TheClient->Flush(); sl@0: sl@0: // The window should be all green, if opacity is working, or all blue if it isn't. sl@0: // If the window has any other colour, then something has broken. sl@0: TRgb color; sl@0: TheClient->iScreen->GetPixel(color,TPoint(25,25)); sl@0: if (color.Red()>0 || ((color.Green()==0) == (color.Blue()==0))) sl@0: User::Leave(KErrGeneral); sl@0: TBool ret=(color.Green()>0); sl@0: sl@0: CleanupStack::PopAndDestroy(2,&winb); // wint sl@0: return ret; sl@0: } sl@0: sl@0: TInt TransparencySupportedL() sl@0: { sl@0: // Creates a window and enables alpha transparency, if this feature sl@0: // is not enabled, KErrNotSupported will be returned sl@0: RWindow win(TheClient->iWs); sl@0: User::LeaveIfError(win.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle)); sl@0: win.SetExtent(TPoint(0,0), TSize(50,50)); sl@0: TInt ret=win.SetTransparencyAlphaChannel(); sl@0: win.Close(); sl@0: return ret; sl@0: } sl@0: sl@0: TInt CheckScalingSupportedOrNot() sl@0: { sl@0: TBool scalingSupported=EFalse; sl@0: TSizeMode originalModeData=TheClient->iScreen->GetCurrentScreenModeAttributes(); sl@0: TSizeMode tempData=originalModeData; sl@0: tempData.iScreenScale=TSize(2,2); sl@0: TheClient->iScreen->SetCurrentScreenModeAttributes(tempData); sl@0: TSize scale=TheClient->iScreen->GetCurrentScreenModeScale(); sl@0: if (scale.iWidth==2 && scale.iHeight==2) sl@0: { sl@0: scalingSupported=ETrue; sl@0: } sl@0: TheClient->iScreen->SetCurrentScreenModeAttributes(originalModeData); sl@0: TheClient->Flush(); sl@0: return scalingSupported; sl@0: } sl@0: sl@0: TBool CheckNonZeroOriginsSupportedOrNot() sl@0: { sl@0: TBool nonZeroOriginsSupported=EFalse; sl@0: TSizeMode sizeMode1=TheClient->iScreen->GetCurrentScreenModeAttributes(); sl@0: TSizeMode sizeMode2=sizeMode1; sl@0: sizeMode2.iOrigin=TPoint(30,30); sl@0: TheClient->iScreen->SetCurrentScreenModeAttributes(sizeMode2); sl@0: TPoint origin=TheClient->iScreen->GetCurrentScreenModeScaledOrigin(); sl@0: if (origin.iX==30 && origin.iY==30) sl@0: { sl@0: nonZeroOriginsSupported=ETrue; sl@0: } sl@0: TheClient->iScreen->SetCurrentScreenModeAttributes(sizeMode1); sl@0: TheClient->Flush(); sl@0: return nonZeroOriginsSupported; sl@0: } sl@0: sl@0: TPoint PhysicalToLogical(TPoint aPhysicalPtMinusOrigin,TSize aScale) sl@0: { sl@0: TPoint logicalPt(aPhysicalPtMinusOrigin); sl@0: if (aScale.iWidth!=1) sl@0: { sl@0: logicalPt.iX=(logicalPt.iX>= 0 ? logicalPt.iX/aScale.iWidth : (logicalPt.iX-(aScale.iWidth-1))/aScale.iWidth); sl@0: } sl@0: if (aScale.iHeight!=1) sl@0: { sl@0: logicalPt.iY=(logicalPt.iY>= 0 ? logicalPt.iY/aScale.iHeight : (logicalPt.iY-(aScale.iHeight-1))/aScale.iHeight); sl@0: } sl@0: return logicalPt; sl@0: } sl@0: sl@0: // sl@0: // Log window, logs testing // sl@0: // sl@0: sl@0: LogWindow::LogWindow() : CTWin(), iTestTitle(KNullDesC), iSubTitle(KNullDesC), iMessage(KNullDesC) 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::DrawSubTitle() sl@0: { sl@0: iGc->DrawText(iSubTitle, TRect(2,iTitleHeight*2,iSize.iWidth-2,iTitleHeight*3),iFont->AscentInPixels(), CGraphicsContext::ECenter); sl@0: } sl@0: sl@0: void LogWindow::DrawMessage() sl@0: { sl@0: iGc->DrawText(iMessage, TRect(1,iTitleHeight*4,iSize.iWidth-2,iTitleHeight*5),iFont->AscentInPixels(), CGraphicsContext::ECenter); 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: DrawSubTitle(); sl@0: DrawMessage(); sl@0: } sl@0: sl@0: /** sl@0: This function is not used at the moment but I leave it in in case I need it when I improve the logging in sl@0: the log window. sl@0: */ sl@0: void LogWindow::LogTest(const TDesC &aTitle,TInt aNum) sl@0: { sl@0: _LIT(Test,"Test %d,%S"); sl@0: iTestTitle.Format(Test,aNum,&aTitle); sl@0: TLogMessageText buf; sl@0: _LIT(AutoNewTest,"AUTO New Test: "); sl@0: buf.Append(AutoNewTest); sl@0: buf.Append(iTestTitle); sl@0: TheClient->LogMessage(buf); sl@0: iMessage.Zero(); sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: /** sl@0: This function is not used at the moment but I leave it in in case I need it when I improve the logging in sl@0: the log window. sl@0: */ sl@0: const TDesC& LogWindow::LogSubTest(const TDesC &aTitle,TInt aNum) sl@0: { sl@0: _LIT(SubTest,"Sub-Test[%d], %S"); sl@0: iSubTitle.Format(SubTest,aNum,&aTitle); sl@0: TLogMessageText buf; sl@0: buf.Append(Auto); sl@0: buf.Append(iSubTitle); sl@0: TheClient->LogMessage(buf); sl@0: iMessage.Zero(); sl@0: iGc->Activate(iWin); sl@0: iGc->UseFont((CFont *)iFont); sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: DrawSubTitle(); sl@0: DrawMessage(); sl@0: iGc->Deactivate(); sl@0: TheClient->iWs.Flush(); sl@0: return iSubTitle; sl@0: } sl@0: sl@0: const TDesC& LogWindow::LogMessage(TBool aLog,const TDesC& aText,TInt aNum) sl@0: { sl@0: if (aNum!=EDummyValue) sl@0: { sl@0: _LIT(StringInt,"%S %d"); sl@0: iMessage.Format(StringInt,&aText,aNum); sl@0: } sl@0: else sl@0: { sl@0: _LIT(String,"%S"); sl@0: iMessage.Format(String,&aText); sl@0: } sl@0: iGc->Activate(iWin); sl@0: iGc->UseFont((CFont *)iFont); sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: DrawMessage(); sl@0: iGc->Deactivate(); sl@0: if (aLog) sl@0: { sl@0: TLogMessageText buf; sl@0: buf.Append(Auto); sl@0: buf.Append(iMessage); sl@0: TheClient->LogMessage(buf); sl@0: } sl@0: TheClient->iWs.Flush(); sl@0: return iMessage; sl@0: } 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: TestWindow::~TestWindow() sl@0: { sl@0: delete iBorderWin; sl@0: } sl@0: sl@0: void TestWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) sl@0: { sl@0: iBorderWin=new(ELeave) CBorderWindow(); sl@0: iBorderWin->SetUpL(pos,size,parent,aGc); sl@0: TRAPD(err, CTWin::ConstructL(*iBorderWin)); sl@0: if (err==KErrNone) sl@0: { sl@0: SetExt(TPoint(2,2),TSize(size.iWidth-4,size.iHeight-4)); sl@0: if (err==KErrNone) sl@0: { sl@0: Activate(); sl@0: AssignGC(aGc); sl@0: return; sl@0: } sl@0: } sl@0: delete this; sl@0: User::Leave(err); sl@0: } sl@0: sl@0: void TestWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: } sl@0: sl@0: void TestWindow::ClearWin() sl@0: { sl@0: TheGc->Activate(*Win()); sl@0: TheGc->Clear(); sl@0: TheGc->Deactivate(); sl@0: } sl@0: sl@0: void TestWindow::SetBorderExt(TPoint aPos, TSize aSize) sl@0: { sl@0: iBorderWin->SetExt(aPos, aSize); sl@0: } sl@0: sl@0: CBorderWindow* TestWindow::GetBorderWin() sl@0: { sl@0: return iBorderWin; sl@0: } sl@0: // sl@0: CBorderWindow::CBorderWindow() : CTWin() sl@0: { sl@0: } sl@0: sl@0: void CBorderWindow::ConstructL(CTWinBase &parent) sl@0: { sl@0: CTWin::ConstructL(parent); sl@0: } sl@0: sl@0: void CBorderWindow::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::BecomeOwning() sl@0: { sl@0: iGroupWin.DefaultOwningWindow(); 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: TheClient->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: 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: // sl@0: sl@0: TestClient::TestClient() 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: iScreen->GetScreenSizeModeList(&iScreenModes); sl@0: iScreen->SetScreenMode(iScreenModes[0]); sl@0: TSize screenSize=iScreen->SizeInPixels(); sl@0: sl@0: TInt winWidth=(screenSize.iWidth/3)-10; sl@0: TInt winHeight=screenSize.iHeight-10; sl@0: iStdLogWindow=new(ELeave) LogWindow(); sl@0: iStdLogWindow->SetUpL(TPoint(5,5),TSize(winWidth,winHeight),iGroup,*iGc); sl@0: BaseWin=new(ELeave) TestWindow(); sl@0: BaseWin->SetUpL(TPoint(screenSize.iWidth/3+5,5),TSize(winWidth,winHeight),iGroup,*iGc); sl@0: TestWin=new(ELeave) TestWindow(); sl@0: TestWin->SetUpL(TPoint(screenSize.iWidth/3*2+5,5),TSize(winWidth,winHeight),iGroup,*iGc); sl@0: sl@0: iDriver = CTestDriver::CreateL(iScreenNumber); // virtual constructor sl@0: sl@0: TheGc=new(ELeave) CWindowGc(iScreen); sl@0: User::LeaveIfError(TheGc->Construct()); sl@0: sl@0: _LIT(KTestLog,"WSERV Auto Test Log"); sl@0: LogMessage(KTestLog()); sl@0: LogAvailableScreenModeL(); sl@0: sl@0: //This class was designed to be created once and reused by all the tests, now it is created for each test, sl@0: //this needs to be changed back so tests like the following are only done once. sl@0: TestWsSetBufferSizeL(); sl@0: TestWsSetMaxBufferSizeL(); sl@0: } sl@0: sl@0: inline CTestDriver* TestClient::Driver() sl@0: { sl@0: return iDriver; sl@0: } sl@0: sl@0: TBool TestClient::WaitForEvent() sl@0: { sl@0: if (iEventHandler->iStatus!=KRequestPending) sl@0: return ETrue; sl@0: else if (iRedrawEventHandler->iStatus!=KRequestPending) sl@0: return EFalse; sl@0: User::WaitForRequest(iEventHandler->iStatus,iRedrawEventHandler->iStatus); sl@0: TRequestStatus* status=&iEventHandler->iStatus; sl@0: TBool ret=ETrue; sl@0: if (iEventHandler->iStatus==KRequestPending) sl@0: { sl@0: status=&iRedrawEventHandler->iStatus; sl@0: ret=EFalse; sl@0: } sl@0: TInt reason=status->Int(); sl@0: *status=KRequestPending; sl@0: User::RequestComplete(status,reason); sl@0: return ret; sl@0: } sl@0: sl@0: TBool TestClient::IsEventWaiting() sl@0: { sl@0: return (iEventHandler->iStatus!=KRequestPending || iRedrawEventHandler->iStatus!=KRequestPending); sl@0: } sl@0: sl@0: TestClient::~TestClient() sl@0: { sl@0: iScreenModes.Close(); sl@0: delete iDriver; sl@0: delete TheGc; sl@0: delete iStdLogWindow; sl@0: delete BaseWin; sl@0: delete TestWin; sl@0: } sl@0: sl@0: void TestClient::LogAvailableScreenModeL() sl@0: { sl@0: _LIT(KColorModes,"Color Modes: "); sl@0: _LIT(KComma,", "); sl@0: _LIT(KColor,"Color"); sl@0: _LIT(KGrey,"Grey"); sl@0: CArrayFixFlat* modeList=new(ELeave) CArrayFixFlat(15); sl@0: iWs.GetColorModeList(modeList); sl@0: TLogMessageText buf,buf2; sl@0: buf.Append(KColorModes); sl@0: TDisplayMode mode; sl@0: TInt ii=0; sl@0: FOREVER sl@0: { sl@0: mode=STATIC_CAST(TDisplayMode,(*modeList)[ii]); sl@0: buf.AppendNum((*modeList)[ii]); sl@0: buf2.Append(TDisplayModeUtils::IsDisplayModeColor(mode)?KColor():KGrey()); sl@0: buf2.AppendNum(TDisplayModeUtils::NumDisplayModeColors(mode)); sl@0: if (mode==EColor16MU) sl@0: buf2.Append('U'); sl@0: if (++ii==modeList->Count()) sl@0: break; sl@0: buf.Append(KComma); sl@0: buf2.Append(KComma); sl@0: } sl@0: LogMessage(buf); sl@0: LogMessage(buf2); sl@0: delete modeList; sl@0: } sl@0: sl@0: void TestClient::TestWsSetBufferSizeL() sl@0: { sl@0: RWsSession ws; sl@0: User::LeaveIfError(ws.Connect()); sl@0: ws.SetBufferSizeL(256); // default buffer size 640 sl@0: ws.SetBufferSizeL(0x8000); // 16K is max buffer size sl@0: ws.SetBufferSizeL(0x4000); sl@0: ws.Close(); sl@0: } sl@0: sl@0: void TestClient::TestWsSetMaxBufferSizeL() sl@0: { sl@0: RWsSession ws; sl@0: User::LeaveIfError(ws.Connect()); sl@0: // allow buffer to grow bigger than the default 640 bytes sl@0: const TInt KBigMessageSize = 800; sl@0: ws.SetMaxBufferSizeL(KBigMessageSize + 8); // big message + command header length sl@0: sl@0: // send the big message to the wserv sl@0: TBuf8 bigMessage; sl@0: sl@0: // LogMessage needs a pointer to a TInt with the message size at the start of the buffer sl@0: const TInt szLength = sizeof(TInt); sl@0: TInt length = KBigMessageSize - szLength; // length in Unicode characters sl@0: bigMessage.Append((TUint8*) &length, szLength); sl@0: sl@0: _LIT(KLetterA, "a"); sl@0: do sl@0: { sl@0: bigMessage.Append((TUint8*) KLetterA().Ptr(), 2); sl@0: } sl@0: while (bigMessage.Length() < KBigMessageSize); sl@0: sl@0: // send to Wserv, note that the message is too long to be logged sl@0: ws.TestWrite(ws.WsHandle(), EWsClOpLogMessage, bigMessage.Ptr(), KBigMessageSize); sl@0: ws.Flush(); sl@0: sl@0: ws.Close(); sl@0: } sl@0: sl@0: void TestClient::SetTestClientScreenMode(TInt aMode) sl@0: { sl@0: iScreen->SetAppScreenMode(aMode); sl@0: iScreen->SetScreenMode(aMode); sl@0: UpdateTestClientScreenMode(); sl@0: } sl@0: sl@0: void TestClient::UpdateTestClientScreenMode() sl@0: { sl@0: TSize screenSize=iScreen->SizeInPixels(); sl@0: sl@0: // Sets new positions and dimensions for the three window and their controlling border windows sl@0: sl@0: if (screenSize.iHeight > screenSize.iWidth) // Portrait mode sl@0: { sl@0: TInt winWidth=screenSize.iWidth - (KBorderWinWidth * 2); sl@0: TInt winHeight=(screenSize.iHeight/3) - (KBorderWinWidth * 2); sl@0: sl@0: iStdLogWindow->SetExt(TPoint(KBorderWinWidth,KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: BaseWin->SetBorderExt(TPoint(KBorderWinWidth,screenSize.iHeight/3+KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: BaseWin->SetExt(TPoint(2,2),TSize(winWidth - (KBorderWinWidth - 1),winHeight - (KBorderWinWidth - 1))); sl@0: TestWin->SetBorderExt(TPoint(KBorderWinWidth,screenSize.iHeight/3*2+KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: TestWin->SetExt(TPoint(2,2),TSize(winWidth - (KBorderWinWidth - 1),winHeight - (KBorderWinWidth - 1))); sl@0: } sl@0: else // Landscape modes sl@0: { sl@0: TInt winWidth=(screenSize.iWidth/3) - (KBorderWinWidth * 2); sl@0: TInt winHeight=screenSize.iHeight - (KBorderWinWidth * 2); sl@0: sl@0: iStdLogWindow->SetExt(TPoint(KBorderWinWidth,KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: BaseWin->SetBorderExt(TPoint(screenSize.iWidth/3 + KBorderWinWidth,KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: BaseWin->SetExt(TPoint(2,2),TSize(winWidth - (KBorderWinWidth - 1),winHeight - (KBorderWinWidth - 1))); sl@0: TestWin->SetBorderExt(TPoint(screenSize.iWidth/3*2+KBorderWinWidth,KBorderWinWidth),TSize(winWidth,winHeight)); sl@0: TestWin->SetExt(TPoint(2,2),TSize(winWidth - (KBorderWinWidth - 1),winHeight - (KBorderWinWidth - 1))); sl@0: } sl@0: sl@0: // Remove shading artefacts from window resizing operations sl@0: TestWin->Win()->Invalidate(); sl@0: TestWin->Win()->BeginRedraw(); sl@0: TestWin->ClearWin(); sl@0: TestWin->Win()->EndRedraw(); sl@0: sl@0: BaseWin->Win()->Invalidate(); sl@0: BaseWin->Win()->BeginRedraw(); sl@0: BaseWin->ClearWin(); sl@0: BaseWin->Win()->EndRedraw(); sl@0: sl@0: TheClient->iWs.Flush(); sl@0: } sl@0: sl@0: sl@0: // sl@0: // TestDriver, drives the test code // sl@0: // sl@0: CTestDriver* CTestDriver::CreateL(TInt aScreenNumber) sl@0: { sl@0: CTestDriver* self = NULL; sl@0: if (aScreenNumber==KDefaultScreen) sl@0: self = new (ELeave) CTestDriverPrimary(aScreenNumber); sl@0: else sl@0: self = new (ELeave) CTestDriverSecondary(aScreenNumber); sl@0: sl@0: return self; sl@0: } sl@0: sl@0: CTestDriver::CTestDriver(TInt aScreenNumber) sl@0: : iScreenNumber(aScreenNumber) sl@0: { sl@0: iStartTime.HomeTime(); sl@0: HAL::Get(HALData::EDisplayNumberOfScreens, iNumberOfScreens); sl@0: } sl@0: sl@0: CTestDriver::~CTestDriver() sl@0: { sl@0: } sl@0: sl@0: void CTestDriver::DestroyTest() sl@0: { sl@0: delete iTest; sl@0: iTest=NULL; sl@0: } sl@0: sl@0: void CTestDriver::TestComplete2() sl@0: { sl@0: ++iTestNum; sl@0: if (iTestNum==iTestSize) sl@0: { sl@0: TBuf<64> timeBuf; sl@0: TTime endTime; sl@0: endTime.HomeTime(); sl@0: TTimeIntervalMicroSeconds elapseTime=endTime.MicroSecondsFrom(iStartTime); sl@0: TInt64 elapseTime2=elapseTime.Int64()/1000; sl@0: TUint diffi = I64LOW(elapseTime2); sl@0: _LIT(TestPass,"PASSED"); sl@0: _LIT(TestFail,"FAILED"); sl@0: TInt noOfTests=CTestBase::iNumberTests; sl@0: TInt noOfTestsPass=CTestBase::iNumberTestsPass; sl@0: _LIT(TimeBuf,"Elapse Time %d:%02d.%03d %S"); sl@0: timeBuf.Format(TimeBuf,diffi/60000,(diffi/1000)%60,diffi%1000000,&(noOfTests==noOfTestsPass?TestPass:TestFail)); sl@0: TBuf<60> testReport; sl@0: _LIT(Checks,"Checks"); sl@0: _LIT(Fails,"Fails"); sl@0: _LIT(TestReport,"Tests:%d %S:%d"); sl@0: TInt testNumber=(noOfTests==noOfTestsPass? noOfTestsPass : noOfTests-noOfTestsPass); sl@0: testReport.Format(TestReport,iTestNum,&(noOfTests==noOfTestsPass?Checks():Fails()),testNumber); sl@0: if (noOfTests!=noOfTestsPass) sl@0: { sl@0: _LIT(NumTests,"/%d"); sl@0: testReport.AppendFormat(NumTests,noOfTests); sl@0: } sl@0: sl@0: TBuf<60> logTestReport; sl@0: _LIT(LogReport," %S:%d/%d"); sl@0: logTestReport.Format(LogReport,&Checks,noOfTestsPass,noOfTests); sl@0: TLogMessageText buf; sl@0: _LIT(Finished,"AUTO Testing Complete, "); sl@0: buf.Append(Finished); sl@0: buf.Append(timeBuf); sl@0: buf.Append(logTestReport); sl@0: TheClient->LogMessage(buf); sl@0: sl@0: TheTestResult = noOfTests==noOfTestsPass? ETestPassed : ETestFailed; sl@0: DoDisplayDialog(timeBuf,testReport); sl@0: } sl@0: } sl@0: sl@0: // sl@0: // Test driver for primary screen (has digitiser/pointer) sl@0: // sl@0: CTestDriverPrimary::CTestDriverPrimary(TInt aScreenNumber) : CTestDriver(aScreenNumber) sl@0: { sl@0: TInt i; sl@0: TInt numOfEntries = 1; sl@0: for (i=0; i1); sl@0: if (aTl>aBr) sl@0: { sl@0: TInt tmp=aBr; sl@0: aBr=aTl; sl@0: aTl=tmp; sl@0: } sl@0: } sl@0: sl@0: TRect TTestRects::operator[](TInt aIndex) sl@0: { sl@0: TRect rect; sl@0: if (aIndexiTl.iX==pRect->iBr.iX) sl@0: RectCoordPair(rect.iTl.iX,rect.iBr.iX,pRect->iTl.iX,iSize.iWidth); sl@0: else sl@0: { sl@0: rect.iTl.iX=RectCoord(pRect->iTl.iX,iSize.iWidth); sl@0: rect.iBr.iX=RectCoord(pRect->iBr.iX,iSize.iWidth); sl@0: } sl@0: if (pRect->iTl.iY==pRect->iBr.iY) sl@0: RectCoordPair(rect.iTl.iY,rect.iBr.iY,pRect->iTl.iY,iSize.iHeight); sl@0: else sl@0: { sl@0: rect.iTl.iY=RectCoord(pRect->iTl.iX,iSize.iHeight); sl@0: rect.iBr.iY=RectCoord(pRect->iBr.iX,iSize.iHeight); sl@0: } sl@0: } sl@0: else if (aIndexConstructL(aHandle, aSizeInPixels, aDispMode); sl@0: return self; sl@0: } sl@0: sl@0: void CBitmap::ConstructL(TInt aHandle,const TSize& aSizeInPixels,TDisplayMode aDispMode) sl@0: { sl@0: iBitmap=new(ELeave) CFbsBitmap(); sl@0: if (aHandle==0) sl@0: { sl@0: User::LeaveIfError(iBitmap->Create(aSizeInPixels,aDispMode)); sl@0: } sl@0: else sl@0: { sl@0: User::LeaveIfError(iBitmap->Duplicate(aHandle)); sl@0: } sl@0: iDevice=CFbsBitmapDevice::NewL(iBitmap); sl@0: User::LeaveIfError(iDevice->CreateContext(iGc)); sl@0: } sl@0: sl@0: CBitmap::~CBitmap() sl@0: { sl@0: delete iGc; sl@0: delete iDevice; sl@0: delete iBitmap; sl@0: } sl@0: sl@0: sl@0: // CTestBase // sl@0: sl@0: CTestBase::CTestBase(const TDesC& aTitle,CTWsGraphicsBase* aTestBase) sl@0: { sl@0: iTestBase=aTestBase; sl@0: iTitle.Copy(aTitle); sl@0: sl@0: iScreenNo = iTestBase->GetScreenFromIni(); sl@0: sl@0: TheClient=new(ELeave) TestClient(); sl@0: sl@0: if (CTestBase::iScreenNo == 1) sl@0: { sl@0: TheClient->SetScreenNumber(1); sl@0: iScreenNumber = 1; sl@0: } sl@0: else sl@0: { sl@0: TheClient->SetScreenNumber(0); sl@0: iScreenNumber = 0; sl@0: } sl@0: sl@0: if (iScreenNumber == 1) sl@0: { sl@0: iMinWin = new(ELeave) CMinWin(iScreenNumber); sl@0: iMinWin->ConstructL(); sl@0: } sl@0: sl@0: iTestNum=CTestDriver::iTestNum; sl@0: TheClient->ConstructL(); sl@0: TheClient->StdLogWindow().LogTest(iTitle,iTestNum); sl@0: iDriver=TheClient->Driver(); sl@0: sl@0: if (CTestBase::iScreenNo == 1) sl@0: { sl@0: TheClient->iWs.SetFocusScreen(1); sl@0: } sl@0: else sl@0: { sl@0: TheClient->iWs.SetFocusScreen(0); sl@0: } sl@0: sl@0: iTestRects.Construct(*BaseWin->Win()); sl@0: iStdTestWindowSize=BaseWin->Size(); sl@0: iRedrawType=EPartialRedraw_Unknown; // Reset between tests sl@0: if (iMaxGrays+iMaxColors==0) sl@0: { sl@0: TheClient->iWs.GetDefModeMaxNumColors(iMaxColors,iMaxGrays); sl@0: iNormalPointerCursorArea=TheClient->iWs.PointerCursorArea(); sl@0: } sl@0: } sl@0: sl@0: CTestBase::~CTestBase() sl@0: { sl@0: delete iMinWin; sl@0: delete TheClient; sl@0: } sl@0: sl@0: void CTestBase::CloseAllPanicWindows() sl@0: { sl@0: TInt idFocus = TheClient->iWs.GetFocusWindowGroup(); sl@0: TWsEvent event; sl@0: event.SetType(EEventKey); sl@0: TKeyEvent *keyEvent = event.Key(); sl@0: keyEvent->iCode = EKeyEscape; sl@0: keyEvent->iScanCode = EStdKeyEscape; sl@0: keyEvent->iModifiers = 0; sl@0: TInt theLimit = 50; sl@0: while(idFocus != NULL && (theLimit-- > 0)) sl@0: { sl@0: TheClient->iWs.SendEventToAllWindowGroups(event); sl@0: idFocus = TheClient->iWs.GetFocusWindowGroup(); sl@0: } sl@0: } sl@0: sl@0: /** sl@0: Returns the size of the standard test windows. sl@0: @see iStdTestWindowSize sl@0: */ sl@0: const TSize& CTestBase::StdTestWindowSize() sl@0: { sl@0: return iStdTestWindowSize; sl@0: } sl@0: sl@0: /** Returns the number of greys available in the richest grey mode */ sl@0: TInt CTestBase::MaxGrays() const sl@0: { sl@0: return iMaxGrays; sl@0: } sl@0: sl@0: /** Returns the number of colours available in the richest supported colour mode. */ sl@0: TInt CTestBase::MaxColors() const sl@0: { sl@0: return iMaxColors; sl@0: } sl@0: sl@0: void CTestBase::TriggerFail() sl@0: { sl@0: iFail=ETrue; sl@0: } sl@0: sl@0: void CTestBase::LogLeave(TInt aErr) sl@0: { sl@0: TLogMessageText buf; sl@0: _LIT(Leave,"AUTO Left with error code %d in "); sl@0: buf.AppendFormat(Leave,aErr); sl@0: buf.Append(iSubTitle); sl@0: TheClient->LogMessage(buf); sl@0: } sl@0: sl@0: void CTestBase::LogSubTest(const TDesC &aSubTitle) sl@0: { sl@0: Driver()->iSubTestNum++; sl@0: iSubTitle=aSubTitle; sl@0: iTestBase->Logger().Write(TheClient->StdLogWindow().LogSubTest(aSubTitle,iState)); sl@0: } sl@0: sl@0: void CTestBase::LogMessage(TInt aValue) sl@0: { sl@0: _LIT(WinID,"Win Id:"); sl@0: TheClient->StdLogWindow().LogMessage(EFalse,WinID,aValue); sl@0: } sl@0: sl@0: void CTestBase::LogSubState(TInt aSubState) sl@0: { sl@0: _LIT(SubTest,"SubState"); sl@0: iTestBase->Logger().Write(TheClient->StdLogWindow().LogMessage(ETrue,SubTest,aSubState)); sl@0: } sl@0: sl@0: TBool DoCheckRectRWin(RWindowBase &aWin1,RWindowBase &aWin2,const TRect &aRect) sl@0: { sl@0: TRect rect1(aRect); sl@0: TRect rect2(aRect); sl@0: rect1.Move(aWin1.InquireOffset(*TheClient->iGroup->WinTreeNode())); sl@0: rect2.Move(aWin2.InquireOffset(*TheClient->iGroup->WinTreeNode())); sl@0: TBool match=TheClient->iScreen->RectCompare(rect1,rect2); sl@0: #if defined(__WINS__) sl@0: if (!match) sl@0: FindNonMatchingPixel(rect1.iTl,rect2.iTl,aRect.Size()); sl@0: #endif sl@0: return match; sl@0: } sl@0: sl@0: TBool DoCheckRectRWin(RWindowBase &aWin1,RWindowBase &aWin2,const TRect &aRect, TUint aFlags) sl@0: { sl@0: TRect rect1(aRect); sl@0: TRect rect2(aRect); sl@0: rect1.Move(aWin1.InquireOffset(*TheClient->iGroup->WinTreeNode())); sl@0: rect2.Move(aWin2.InquireOffset(*TheClient->iGroup->WinTreeNode())); sl@0: TBool match=TheClient->iScreen->RectCompare(rect1,rect2, aFlags); sl@0: #if defined(__WINS__) sl@0: if (!match) sl@0: FindNonMatchingPixel(rect1.iTl,rect2.iTl,aRect.Size()); sl@0: #endif sl@0: return match; sl@0: } sl@0: sl@0: TBool DoCheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2,const TRect &aRect) sl@0: { sl@0: return DoCheckRectRWin(*aWin1->BaseWin(), *aWin2->BaseWin(), aRect); sl@0: } sl@0: sl@0: TBool DoCheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2) sl@0: { sl@0: TSize winSize=aWin1->Size(); sl@0: TRect rect1(aWin1->BaseWin()->InquireOffset(*TheClient->iGroup->WinTreeNode()),winSize); sl@0: TRect rect2(aWin2->BaseWin()->InquireOffset(*TheClient->iGroup->WinTreeNode()),winSize); sl@0: return TheClient->iScreen->RectCompare(rect1,rect2); sl@0: } sl@0: sl@0: TBool DoCheckRect(CTBaseWin *aWin1, CTBaseWin *aWin2, const TRect &aRect, TUint aFlags) sl@0: { sl@0: return DoCheckRectRWin(*aWin1->BaseWin(), *aWin2->BaseWin(), aRect, aFlags); sl@0: } sl@0: sl@0: sl@0: /** sl@0: Compares the contents of 2 rectangular areas of the screen. sl@0: sl@0: @param aPos1 The top left corner of the first rectangle. sl@0: @param aPos2 The top left corner of the second rectangle. sl@0: @param aSize The size of the rectangles sl@0: @return ETrue if the 2 areas have the same content, EFalse otherwise. sl@0: */ sl@0: TBool DoCheckRect(TPoint aPos1,TPoint aPos2,TSize aSize) sl@0: { sl@0: return TheClient->iScreen->RectCompare(TRect(aPos1,aSize),TRect(aPos2,aSize)); sl@0: } sl@0: sl@0: void CTestBase::DrawTestBackground(TBool aInvertColors, const TSize &aSize, TInt aGrays/*=16*/) sl@0: // sl@0: // Draws a standard test background with a mix of colors (shades). sl@0: // This is mainly used to test for graphic functions writing outside the intended area. sl@0: // sl@0: // This code assumes an TheGc is already active on the window to use. sl@0: // sl@0: { sl@0: TheGc->SetBrushColor(TRgb::Gray256(255)); sl@0: TInt step=5; sl@0: TInt col=0; sl@0: TInt colorInc=(aGrays>9 ? 17 : 85); sl@0: TheGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: TheGc->SetPenStyle(CGraphicsContext::ENullPen); sl@0: for(TInt row=0;rowSetBrushColor(TRgb::Gray256(aInvertColors ? 255-col:col)); sl@0: TheGc->DrawRect(TRect(0,row,aSize.iWidth,row+step)); sl@0: col=col+colorInc; sl@0: if (col>255) sl@0: col=0; sl@0: } sl@0: } sl@0: sl@0: void CTestBase::AbortL() sl@0: { sl@0: CTestDriver* driver=iDriver; sl@0: iDriver->DestroyTest(); sl@0: driver->TestComplete2(); sl@0: User::Leave(ETestFailed); sl@0: } sl@0: sl@0: /*CTWsGraphicsBase*/ sl@0: sl@0: CTWsGraphicsBase::CTWsGraphicsBase(CTestStep* aStep) : CTGraphicsBase(aStep) sl@0: { sl@0: } sl@0: sl@0: CTWsGraphicsBase::~CTWsGraphicsBase() sl@0: { sl@0: delete iTest; sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CreateTestBaseL(CTTMSGraphicsStep* aTmsStep) sl@0: { sl@0: __ASSERT_ALWAYS(iTest==NULL,AutoPanic(EAutoPanicRecalledCreateTestBaseL)); sl@0: iTest=new(ELeave) CTestBase(iStep->TestStepName(),this); sl@0: iTmsStep = aTmsStep; sl@0: } sl@0: /** sl@0: Gets the Screen Number from an .ini file supplied to the RUN_TEST_STEP. Screen number should sl@0: be put under the section [useScreen] as screen=0 or screen=1. sl@0: sl@0: @return Screen number Defined in .ini file, otherwise 0. sl@0: */ sl@0: TInt CTWsGraphicsBase::GetScreenFromIni() const sl@0: { sl@0: _LIT(KUseScreenSection, "useScreen"); sl@0: _LIT(KScreen, "screen"); sl@0: sl@0: TInt screen = 0; sl@0: TBool configAvailable = iStep->GetIntFromConfig(KUseScreenSection, KScreen, screen); sl@0: if(configAvailable) sl@0: { sl@0: return screen; sl@0: } sl@0: else sl@0: { sl@0: return 0; sl@0: } sl@0: } sl@0: sl@0: void CTWsGraphicsBase::TestComplete() sl@0: { sl@0: _LIT(KTestComplete,"Test complete"); sl@0: INFO_PRINTF1(KTestComplete); sl@0: CTGraphicsBase::TestComplete(); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::LogMessage(const TText8* aFile,TInt aLine,TRefByValue aFmt,...) sl@0: { sl@0: TLogMessageText buf; sl@0: VA_LIST list; sl@0: VA_START(list,aFmt); sl@0: buf.AppendFormatList(aFmt,list); sl@0: TheClient->LogMessage(buf); sl@0: Logger().LogExtra(aFile,aLine,ESevrInfo,buf); sl@0: VA_END(list); sl@0: } sl@0: sl@0: TBool CTWsGraphicsBase::CheckRetValue(TBool aPass, const TDesC *aErrorMsg, const TDesC &aErrorFunction) sl@0: { sl@0: if (!aPass && aErrorMsg) sl@0: { sl@0: LOG_MESSAGE3(_L("%S %S failed"),aErrorMsg,&aErrorFunction); sl@0: iTmsStep->MQCTest(EFalse,((TText8*)__FILE__),__LINE__); sl@0: } sl@0: iStep->TEST(aPass); sl@0: return aPass; sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CompareWindowsSoftFailWinscw(const TText8* aFile, TInt aLine) sl@0: { sl@0: if (!DoCheckRect(BaseWin, TestWin, BaseWin->Size())) sl@0: { sl@0: #ifdef __WINS__ sl@0: _LIT(KMessage,"ERROR: Test Failed but is ignored on WINSCW"); sl@0: Logger().LogExtra(aFile, aLine, ESevrErr, KMessage); sl@0: #else // __WINS__ sl@0: iStep->TEST(EFalse); sl@0: _LIT(KMessage,"ERROR: Test Failed"); sl@0: Logger().LogExtra(aFile, aLine, ESevrErr, KMessage); sl@0: #endif // __WINS__ sl@0: } sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRect(TPoint aPos1,TPoint aPos2,TSize aSize, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(DoCheckRect(aPos1,aPos2,aSize),aErrorMsg,_L("CheckRect()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRect(TPoint aPos1,TPoint aPos2,TSize aSize, const TDesC &aErrorMsg) sl@0: { sl@0: CheckRect(aPos1,aPos2,aSize,&aErrorMsg); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(TPoint aPos1,TPoint aPos2,TSize aSize, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(!DoCheckRect(aPos1,aPos2,aSize),aErrorMsg,_L("CheckRectNoMatch()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(TPoint aPos1,TPoint aPos2,TSize aSize, const TDesC &aErrorMsg) sl@0: { sl@0: CheckRectNoMatch(aPos1,aPos2,aSize,&aErrorMsg); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(DoCheckRect(aWin1,aWin2),aErrorMsg,_L("CheckRect()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2, const TDesC &aErrorMsg) sl@0: { sl@0: CheckRect(aWin1,aWin2,&aErrorMsg); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(CTBaseWin *aWin1,CTBaseWin *aWin2, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(!DoCheckRect(aWin1,aWin2),aErrorMsg,_L("CheckRectNoMatch()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(CTBaseWin *aWin1,CTBaseWin *aWin2, const TDesC &aErrorMsg) sl@0: { sl@0: CheckRectNoMatch(aWin1,aWin2,&aErrorMsg); sl@0: } sl@0: sl@0: TBool CTWsGraphicsBase::CheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2,const TRect &aRect, const TDesC *aErrorMsg) sl@0: { sl@0: return CheckRetValue(DoCheckRect(aWin1,aWin2,aRect),aErrorMsg,_L("CheckRect()")); sl@0: } sl@0: sl@0: TBool CTWsGraphicsBase::CheckRect(CTBaseWin *aWin1,CTBaseWin *aWin2,const TRect &aRect, const TDesC &aErrorMsg) sl@0: { sl@0: return CheckRect(aWin1,aWin2,aRect,&aErrorMsg); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(CTBaseWin *aWin1,CTBaseWin *aWin2,const TRect &aRect, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(!DoCheckRect(aWin1,aWin2,aRect),aErrorMsg,_L("CheckRectNoMatch()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CheckRectNoMatch(CTBaseWin *aWin1,CTBaseWin *aWin2,const TRect &aRect, const TDesC &aErrorMsg) sl@0: { sl@0: CheckRectNoMatch(aWin1,aWin2,aRect,&aErrorMsg); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CompareWindows(const TRect &aRect, const TDesC *aErrorMsg) sl@0: { sl@0: CheckRetValue(DoCheckRect(BaseWin,TestWin,aRect),aErrorMsg,_L("CompareWindows()")); sl@0: } sl@0: sl@0: TBool CTWsGraphicsBase::CompareWindows(const TDesC *aErrorMsg) sl@0: { sl@0: return CheckRetValue(DoCheckRect(BaseWin,TestWin,TRect(BaseWin->Size())),aErrorMsg,_L("CompareWindows()")); sl@0: } sl@0: sl@0: void CTWsGraphicsBase::CompareWindows(const TRect &aRect, const TDesC &aErrorMsg) sl@0: { sl@0: CompareWindows(aRect,&aErrorMsg); sl@0: } sl@0: sl@0: TBool CTWsGraphicsBase::CompareWindows(const TDesC &aErrorMsg) sl@0: { sl@0: return CompareWindows(&aErrorMsg); sl@0: } sl@0: sl@0: /** sl@0: Returns the size of the standard test windows. sl@0: sl@0: Several tests use 3 windows : one is a log window, one is a reference window sl@0: and one is the actual output of the test. All these windows have the same width which is roughly sl@0: 1/3 of the screen. They also have the same height which is roughly equal to the screen height. sl@0: */ sl@0: const TSize& CTWsGraphicsBase::StdTestWindowSize() sl@0: { sl@0: return iTest->StdTestWindowSize(); sl@0: } sl@0: sl@0: /** Returns the number of greys available in the richest grey mode */ sl@0: TInt CTWsGraphicsBase::MaxGrays() const sl@0: { sl@0: return iTest->MaxGrays(); sl@0: } sl@0: sl@0: /** Returns the number of colours available in the richest supported colour mode. */ sl@0: TInt CTWsGraphicsBase::MaxColors() const sl@0: { sl@0: return iTest->MaxColors(); sl@0: } sl@0: sl@0: // sl@0: // Panic testing // sl@0: // sl@0: sl@0: LOCAL_C TInt PanicThreadFunc(TAny *aPtr) sl@0: { sl@0: CTrapCleanup* CleanUpStack=CTrapCleanup::New(); sl@0: SPanicParams *ptr=(SPanicParams *)aPtr; sl@0: TInt ret; sl@0: TRAP(ret,ret=(*ptr->func)(ptr->num,ptr->ptr)); sl@0: delete CleanUpStack; sl@0: if (ret==EWsExitReasonBad) sl@0: AutoPanic(EAutoPanicPanicFailed); sl@0: return(ret); sl@0: } sl@0: sl@0: TInt CTestBase::LaunchPanicThread(RThread &aThread, SPanicParams *aPtr) sl@0: { sl@0: TBuf<32> threadName; sl@0: threadName.Format(TRefByValue(_L("AutoPanicThread%d")),iThreadNumber++); sl@0: return(aThread.Create(threadName,PanicThreadFunc,KDefaultStackSize,KPanicThreadHeapSize,KPanicThreadHeapSize,aPtr,EOwnerThread)); sl@0: } sl@0: sl@0: TInt CTestBase::TestPanicL(SPanicParams *aPtr, TInt aExitReason, const TDesC &aCategory, TBool* aTestFinished) sl@0: { sl@0: RThread thread; sl@0: TRequestStatus stat; sl@0: TInt err=LaunchPanicThread(thread, aPtr); sl@0: if (err==KErrAlreadyExists) sl@0: { sl@0: // wait for kernel to clear up old threads sl@0: // and have several attempts at starting the thread sl@0: // if unsuccessful the first time sl@0: for (TInt i=0;i<3;i++) sl@0: { sl@0: User::After(TTimeIntervalMicroSeconds32(100000)); //0.1 secs sl@0: err=LaunchPanicThread(thread, aPtr); sl@0: if (err!=KErrAlreadyExists) sl@0: break; sl@0: } sl@0: } sl@0: User::LeaveIfError(err); sl@0: thread.Logon(stat); sl@0: User::SetJustInTime(EFalse); sl@0: thread.Resume(); sl@0: User::WaitForRequest(stat); sl@0: User::SetJustInTime(ETrue); sl@0: sl@0: TBool testFinished=EFalse; sl@0: TBool testPassed=ETrue; sl@0: if (thread.ExitType()==EExitKill) sl@0: { sl@0: User::LeaveIfError(thread.ExitReason()); sl@0: if(thread.ExitReason()!=EWsExitReasonFinished) sl@0: { sl@0: testPassed=EFalse; sl@0: } sl@0: testFinished=ETrue; // Finish tests sl@0: } sl@0: else sl@0: { sl@0: if ((thread.ExitCategory().Compare(aCategory)!=0) sl@0: || (aExitReason!=EWservNoPanic && thread.ExitReason()!=aExitReason) sl@0: || (thread.ExitType()!=EExitPanic)) sl@0: { sl@0: testPassed=EFalse; sl@0: } sl@0: } sl@0: sl@0: if(aTestFinished) sl@0: *aTestFinished=testFinished; sl@0: thread.Close(); sl@0: return(testPassed); sl@0: } sl@0: sl@0: TInt CTestBase::TestWsPanicL(TPanicFunction aFunction, TClientPanic aExitReason, TInt aInt, TAny *aPtr, TBool* aTestFinished) sl@0: { sl@0: return TestPanicL(aFunction,aExitReason,aInt,aPtr,KWSERV, aTestFinished); sl@0: } sl@0: sl@0: TInt CTestBase::TestW32PanicL(TPanicFunction aFunction, TW32Panic aExitReason, TInt aInt, TAny *aPtr, TBool* aTestFinished) sl@0: { sl@0: return TestPanicL(aFunction,aExitReason,aInt,aPtr,KW32,aTestFinished); sl@0: } sl@0: sl@0: TInt CTestBase::TestWservPanicL(TPanicFunction aFunction, TWservPanic aExitReason, TInt aInt, TAny *aPtr) sl@0: { sl@0: _LIT(KWSERV1,"Wserv Internal Panic"); sl@0: return TestPanicL(aFunction,aExitReason,aInt,aPtr,KWSERV1); sl@0: } sl@0: sl@0: TInt CTestBase::TestPanicL(TPanicFunction aFunction, TInt aExitReason, TInt aInt, TAny *aPtr, const TDesC &aCategory, TBool* aTestFinished) sl@0: { sl@0: SPanicParams params; sl@0: params.num=aInt; sl@0: params.func=aFunction; sl@0: params.ptr=aPtr; sl@0: return TestPanicL(¶ms, aExitReason, aCategory, aTestFinished); sl@0: } sl@0: sl@0: TBool CTestBase::IsFullRomL() sl@0: { sl@0: TBool isFullRom = EFalse; sl@0: _LIT(KWinName,"EikonServer"); sl@0: TInt numWinGroups=TheClient->iWs.NumWindowGroups(); sl@0: CArrayFixFlat* list=new(ELeave) CArrayFixFlat(numWinGroups); sl@0: TheClient->iWs.WindowGroupList(list); sl@0: numWinGroups=list->Count(); // Just in case it changed between originally getting it and getting the actual list sl@0: TBuf<64> name; sl@0: TInt ii; sl@0: for(ii=0;iiiWs.GetWindowGroupNameFromIdentifier((*list)[ii],name); sl@0: #ifndef DISABLE_FAIL_DIALOG sl@0: TInt ordinalPos=0; sl@0: ordinalPos+=ordinalPos; //To stop a warning sl@0: ordinalPos= sl@0: #endif sl@0: TheClient->iWs.GetWindowGroupOrdinalPriority((*list)[ii]); sl@0: if (name==KWinName) sl@0: { sl@0: isFullRom = ETrue; sl@0: break; sl@0: } sl@0: } sl@0: delete list; sl@0: return isFullRom; sl@0: } sl@0: sl@0: void CTestBase::DelayIfFullRomL() sl@0: { sl@0: if (IsFullRomL()) sl@0: User::After(400000); sl@0: } sl@0: sl@0: TPartialRedrawType CTestBase::RedrawStoreTypeL() sl@0: { sl@0: /* if (iRedrawType==EPartialRedraw_Unknown) sl@0: { sl@0: const TRgb KRed=TRgb(255,0,0); sl@0: const TRgb KGreen=TRgb(0,255,0); sl@0: const TRgb KBlue=TRgb(0,0,255); sl@0: CWsScreenDevice* scrDev=TheClient->iScreen; sl@0: TSize winSize=scrDev->SizeInPixels(); sl@0: CBlankWindow* win=new(ELeave) CBlankWindow(KRed); //Window will be red if WSERV just draws in background color sl@0: CleanupStack::PushL(win); sl@0: TDisplayMode mode=EColor256; sl@0: win->SetUpL(TPoint(),winSize,TheClient->iGroup,*TheClient->iGc,&mode); //Window is activated sl@0: win->RealDraw(ETrue); sl@0: win->SetColor(KGreen); sl@0: CBlankWindow* win2=new(ELeave) CBlankWindow(KRed); sl@0: CleanupStack::PushL(win2); sl@0: win2->SetUpL(TPoint(),winSize,TheClient->iGroup,*TheClient->iGc,&mode); //New Window completely obscures other window sl@0: win2->RealDraw(ETrue); sl@0: win->CTWin::DrawNow(); //Window will be green if drawn from stored commands sl@0: win2->CTWin::DrawNow(); sl@0: win2->SetVisible(EFalse); sl@0: TRgb col; sl@0: scrDev->GetPixel(col,TPoint(5,5)); //Pixel will be red if storing off by default and green otherwise sl@0: if (col==KRed) sl@0: { sl@0: win->Win()->EnableRedrawStore(ETrue); sl@0: win->CTWin::DrawNow(); //Create stored commands sl@0: } sl@0: else sl@0: __ASSERT_ALWAYS(col==KGreen,AutoPanic(EAutoPanicRedrawStoring)); sl@0: win->SetColor(KBlue); sl@0: TRect redrawRect(TSize(10,10)); sl@0: win->Invalidate(redrawRect); sl@0: win->Win()->BeginRedraw(redrawRect); sl@0: win->DrawNow(redrawRect); //Top left of Window will be blue if it draws itself sl@0: win->Win()->EndRedraw(); sl@0: win2->SetVisible(ETrue); sl@0: win2->SetVisible(EFalse); sl@0: scrDev->GetPixel(col,TPoint(5,5)); //Pixel will be red if stored commands were lost sl@0: iRedrawType=EPartialRedraw_None; sl@0: if (col!=KRed) sl@0: { sl@0: __ASSERT_ALWAYS(col==KBlue,AutoPanic(EAutoPanicRedrawStoring)); sl@0: TheClient->WaitForRedrawsToFinish(); sl@0: win2->SetVisible(ETrue); sl@0: win2->SetVisible(EFalse); sl@0: scrDev->GetPixel(col,TPoint(15,15)); //Pixel will be blue if partial redraw triggers full redraw sl@0: iRedrawType=EPartialRedraw_PreserveStoredCmds; sl@0: if (col!=KBlue) sl@0: { sl@0: __ASSERT_ALWAYS(col==KGreen,AutoPanic(EAutoPanicRedrawStoring)); sl@0: iRedrawType=EPartialRedraw_FullRedrawSupport; sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(2,win); sl@0: } sl@0: return iRedrawType;*/ sl@0: return EPartialRedraw_FullRedrawSupport; sl@0: } sl@0: sl@0: void CTestBase::SetUpMember(TSpriteMember &aMember) sl@0: { sl@0: aMember.iMaskBitmap=NULL; sl@0: aMember.iInvertMask=EFalse; sl@0: aMember.iDrawMode=CGraphicsContext::EDrawModePEN; sl@0: aMember.iOffset=TPoint(); sl@0: aMember.iInterval=TTimeIntervalMicroSeconds32(0); sl@0: } sl@0: sl@0: void CTestBase::SimulateKeyDownUpWithModifiers(TInt aScanCode,TUint aModifiers) sl@0: { sl@0: if (aModifiers&EModifierAlt) sl@0: SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftFunc); sl@0: if (aModifiers&EModifierCtrl) sl@0: SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftCtrl); sl@0: if (aModifiers&EModifierShift) sl@0: SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftShift); sl@0: SimulateKeyDownUp(aScanCode); sl@0: if (aModifiers&EModifierShift) sl@0: SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftShift); sl@0: if (aModifiers&EModifierCtrl) sl@0: SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftCtrl); sl@0: if (aModifiers&EModifierAlt) sl@0: SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftFunc); sl@0: } sl@0: sl@0: void CTestBase::SimulateKeyDownUp(TInt aScanCode) sl@0: { sl@0: __ASSERT_DEBUG(aScanCode<'a' || aScanCode>'z',AutoPanic(EAutoPanicScanCapital)); sl@0: SimulateKey(TRawEvent::EKeyDown,aScanCode); sl@0: SimulateKey(TRawEvent::EKeyUp,aScanCode); sl@0: } sl@0: sl@0: void CTestBase::SimulatePointerDownUp(TInt aX, TInt aY) sl@0: { sl@0: SimulatePointer(TRawEvent::EButton1Down,aX,aY); sl@0: SimulatePointer(TRawEvent::EButton1Up,aX,aY); sl@0: } sl@0: sl@0: void CTestBase::SimulateKey(TRawEvent::TType aType, TInt aScanCode) sl@0: { sl@0: TRawEvent rawEvent; sl@0: rawEvent.Set(aType,aScanCode); sl@0: TheClient->iWs.SimulateRawEvent(rawEvent); sl@0: } sl@0: sl@0: /** sl@0: * Determine if the configuration supports pointer event testing. sl@0: * sl@0: * There are certain circumstances where we want to skip pointer event sl@0: * testing because we are simulating pointer events, and don't want to sl@0: * simulate a pointer event from an impossible co-ordinate. We'd rather sl@0: * just identify that there is no point in doing the test and skip over sl@0: * to the next test case. sl@0: * sl@0: * In particular, when a ROM configured with a digitiser is deployed on a sl@0: * Naviengine, with hardware configuration DIP switches which say that there sl@0: * is an external screen connected, then no touch pad is active. sl@0: * The base port under these conditions returns a digitiser area (0,0,0,0) sl@0: * sl@0: * @return ETrue if the configuration supports pointer event testing, otherwise sl@0: * return EFalse. sl@0: */ sl@0: TBool CTestBase::ConfigurationSupportsPointerEventTesting() const sl@0: { sl@0: if (iNormalPointerCursorArea.IsEmpty()) sl@0: { sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: sl@0: void CTestBase::SimulatePointer(TRawEvent::TType aType, TInt aX, TInt aY) sl@0: { sl@0: __ASSERT_DEBUG(ConfigurationSupportsPointerEventTesting(), AutoPanic(EAutoPanicNoDigitiser)); sl@0: sl@0: sl@0: #ifdef WSERV_TAUTO_LOG_POINTER_EVENTS sl@0: TLogMessageText buf; sl@0: _LIT(KLog,"SimulatePointer Type=%d Pos=(%d,%d)"); sl@0: buf.Format(KLog,aType,aX,aY); sl@0: TheClient->LogMessage(buf); sl@0: #endif sl@0: sl@0: TRawEvent rawEvent; sl@0: rawEvent.Set(aType,aX,aY); sl@0: TheClient->iWs.SimulateRawEvent(rawEvent); sl@0: } sl@0: sl@0: void CTestBase::SimulateEvent(TRawEvent::TType aType) sl@0: { sl@0: TRawEvent rawEvent; sl@0: rawEvent.Set(aType); sl@0: TheClient->iWs.SimulateRawEvent(rawEvent); sl@0: } sl@0: sl@0: void CTestBase::LogColors(const CBitmapDevice& aDevice,TPoint aBasePoint, TPoint aStartPoint, TPoint aEndPoint) sl@0: { sl@0: _LIT(KPixel,"Pixel(%d,%d) R=%d G=%d B=%d"); sl@0: TLogMessageText buf; sl@0: TBuf8<2560> screen; sl@0: const TRgb* pixel; sl@0: if (aStartPoint.iX==aEndPoint.iX) sl@0: ++aEndPoint.iX; sl@0: if (aStartPoint.iY==aEndPoint.iY) sl@0: ++aEndPoint.iY; sl@0: TInt width=aEndPoint.iX-aStartPoint.iX; sl@0: TInt xx,yy; sl@0: for (yy=aStartPoint.iY;yyRed(),pixel->Green(),pixel->Blue()); sl@0: //RDebug::Print(buf); sl@0: TheClient->iWs.LogMessage(buf); sl@0: } sl@0: } sl@0: TheClient->iWs.Flush(); sl@0: } sl@0: sl@0: void CTestBase::LogColors4(const CBitmapDevice& aDevice,TPoint aStartPoint,TInt aLen) sl@0: { sl@0: _LIT(KValue,"Pixel(%d,%d) Byte %d, Value %d"); sl@0: TLogMessageText buf; sl@0: TBuf8<2560> screen; sl@0: aDevice.GetScanLine(screen,aStartPoint,aLen,EGray4); sl@0: TInt len=(aLen+3)/4; sl@0: TInt ii; sl@0: for (ii=0;iiiWs.LogMessage(buf); sl@0: } sl@0: } sl@0: sl@0: void CTestBase::UpdateTestResults(TInt aNoOfTest, TInt aNoOfTestPass) sl@0: { sl@0: iNumberTests+=aNoOfTest; sl@0: iNumberTestsPass+=aNoOfTestPass; sl@0: } sl@0: sl@0: TInt CTestBase::SaveScreen(const TDesC& aFileName) sl@0: { sl@0: return SaveScreen(aFileName,TheClient->iScreen->SizeInPixels(),TheClient->iScreen->DisplayMode()); sl@0: } sl@0: sl@0: TInt CTestBase::SaveScreen(const TDesC& aFileName,const TSize& aScreenSize,TDisplayMode aColorDepth) sl@0: { sl@0: TRAPD(err,SaveScreenL(aFileName,aScreenSize,aColorDepth)); sl@0: return err; sl@0: } sl@0: sl@0: void CTestBase::SaveScreenL(const TDesC& aFileName,const TSize& aScreenSize,TDisplayMode aColorDepth) sl@0: { sl@0: CBitmap* copyOfScreen=CBitmap::NewLC(aScreenSize,aColorDepth); sl@0: CFbsScreenDevice* scrDevice=CFbsScreenDevice::NewL(iScreenNumber,aColorDepth); sl@0: CleanupStack::PushL(scrDevice); sl@0: CFbsBitGc* gc; sl@0: User::LeaveIfError(scrDevice->CreateContext(gc)); sl@0: CleanupStack::PushL(gc); sl@0: copyOfScreen->Gc().BitBlt(TPoint(),*gc); sl@0: User::LeaveIfError(copyOfScreen->Bitmap().Save(aFileName)); sl@0: CleanupStack::PopAndDestroy(3,copyOfScreen); sl@0: } sl@0: sl@0: sl@0: /*CProcess*/ sl@0: _LIT(KScreenTag,"Screen"); sl@0: sl@0: void CProcess::GetProcArg(const TWinCommand& aParam,TBufArg& aProcArg) sl@0: { sl@0: TInt pos = aParam.Find(KScreenTag); sl@0: if (pos!=KErrNotFound) sl@0: aProcArg = aParam.Left(pos-1); sl@0: else sl@0: aProcArg = aParam; sl@0: } sl@0: sl@0: void CProcess::GetScreenArg(const TWinCommand& aParam, TInt& aScreenArg) sl@0: { sl@0: TInt pos = aParam.Find(KScreenTag); sl@0: if (pos!=KErrNotFound) sl@0: { sl@0: TBufArg secondArg(aParam.Right(aParam.Length()-pos)); sl@0: if (secondArg.Length()>6) sl@0: { sl@0: TBuf<1> digit(secondArg.Mid(6,1)); sl@0: TLex lex(digit); sl@0: lex.Val(aScreenArg); sl@0: } sl@0: } sl@0: } sl@0: sl@0: TInt CProcess::Start(const TWinCommand& aParam) sl@0: { sl@0: // parse command line aParam to retrieve value of sl@0: // screen number if it is specified sl@0: // sl@0: // command line format: [screen] sl@0: // sl@0: TBufArg procArg(_L("")); sl@0: TInt screenArg = KDefaultScreen; sl@0: sl@0: GetProcArg(aParam, procArg); sl@0: GetScreenArg(aParam, screenArg); sl@0: sl@0: TInt ii; sl@0: for(ii=0;iiConstructL(aFunctionNo,aScreenNumber); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CProcess* CProcess::NewTL(TInt aFunctionNo,TInt aScreenNumber,TRequestStatus* aStatus /*=NULL*/) sl@0: { sl@0: CProcess* self=new(ELeave) CProcess(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructTL(aFunctionNo,aScreenNumber,aStatus); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CProcess* CProcess::NewThreadL(const TDesC& aName,TThreadFunction aFunction,TThreadStartUp* aPtr sl@0: ,TRequestStatus* aStatus) sl@0: { sl@0: CProcess* self=new(ELeave) CProcess(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aName,aFunction,aPtr,aStatus); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CProcess* CProcess::NewThreadRendezvousL(const TDesC& aName,TThreadFunction aFunction,TThreadStartUp* aPtr ,TRequestStatus* aLogonStatus,TRequestStatus& aRendesvouzStatus) sl@0: { sl@0: CProcess* self=new(ELeave) CProcess(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructRendezvousL(aName,aFunction,aPtr,aLogonStatus,aRendesvouzStatus); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CProcess* CProcess::NewThreadRendezvousL(const TDesC& aName,TThreadStartUp* aPtr,TRequestStatus& aRendesvouzStatus) sl@0: { sl@0: return NewThreadRendezvousL(aName,ThreadInit,aPtr,NULL,aRendesvouzStatus); sl@0: } sl@0: sl@0: CProcess* CProcess::NewThreadL(const TDesC& aName,TThreadStartUp* aPtr) sl@0: { sl@0: return NewThreadL(aName,ThreadInit,aPtr,NULL); sl@0: } sl@0: sl@0: CProcess* CProcess::NewSimpleThreadL(const TDesC& aName,TThreadStartUp* aPtr,TRequestStatus* aStatus/*=NULL*/) sl@0: { sl@0: return NewThreadL(aName,SimpleThreadInit,aPtr,aStatus); sl@0: } sl@0: sl@0: _LIT(KSpace," "); sl@0: _LIT(KScreenFormat,"%d"); sl@0: sl@0: void CProcess::ConstructL(TInt aFunctionNo,TInt aScreenNumber/*=KDefaultScreen*/) sl@0: { sl@0: Close(); sl@0: // add screen number into command line param sl@0: // format: [screen] sl@0: // sl@0: TBuf<100> commandLine; sl@0: sl@0: commandLine = iFunctions[aFunctionNo].iParam; sl@0: commandLine.Append(KSpace); sl@0: commandLine.Append(KScreenTag); sl@0: commandLine.AppendFormat(KScreenFormat,aScreenNumber); sl@0: User::LeaveIfError(iOther.Create(RProcess().FileName(),commandLine)); sl@0: iCreated|=eOtherCreated; sl@0: iOther.Resume(); sl@0: } sl@0: sl@0: void CProcess::ConstructTL(TInt aFunctionNo,TInt aScreenNumber/*=KDefaultScreen*/,TRequestStatus* aStatus) sl@0: { sl@0: Close(); sl@0: TUint flag=eThreadCreated; sl@0: TInt err=iThread.Create(iFunctions[aFunctionNo].iParam,iFunctions[aFunctionNo].iFunction sl@0: ,KDefaultStackSize,KOtherProcHeapSize,KOtherProcHeapSize,(TAny*)aScreenNumber,EOwnerThread); sl@0: User::LeaveIfError(err); sl@0: iCreated|=flag; sl@0: if (aStatus) sl@0: Logon(*aStatus); sl@0: iThread.Resume(); sl@0: } sl@0: sl@0: sl@0: void CProcess::ConstructL(const TDesC& aName,TThreadFunction aFunction,TThreadStartUp* aPtr,TRequestStatus* aStatus) sl@0: { sl@0: Close(); sl@0: User::LeaveIfError(iThread.Create(aName,aFunction,KDefaultStackSize,KOtherProcHeapSize,KOtherProcHeapSize,aPtr,EOwnerThread)); sl@0: iCreated|=eThreadCreated; sl@0: if (aStatus) sl@0: Logon(*aStatus); sl@0: iThread.Resume(); sl@0: } sl@0: sl@0: void CProcess::ConstructRendezvousL(const TDesC& aName,TThreadFunction aFunction,TThreadStartUp* aPtr,TRequestStatus* aLogonStatus,TRequestStatus& aRendezvousStatus) sl@0: { sl@0: Close(); sl@0: User::LeaveIfError(iThread.Create(aName,aFunction,KDefaultStackSize,KOtherProcHeapSize,KOtherProcHeapSize,aPtr,EOwnerThread)); sl@0: iCreated|=eThreadCreated; sl@0: if (aLogonStatus) sl@0: Logon(*aLogonStatus); sl@0: sl@0: iThread.Rendezvous(aRendezvousStatus); sl@0: iThread.Resume(); sl@0: } sl@0: sl@0: void CProcess::Logon(TRequestStatus& aStatus) const sl@0: { sl@0: if (iCreated&eThreadCreated) sl@0: iThread.Logon(aStatus); sl@0: else sl@0: { sl@0: iOther.Logon(aStatus); sl@0: } sl@0: } sl@0: sl@0: void CProcess::Terminate(TInt aReason) sl@0: { sl@0: if (iCreated&eThreadCreated) sl@0: iThread.Terminate(aReason); sl@0: else sl@0: { sl@0: iOther.Terminate(aReason); sl@0: } sl@0: Close(); sl@0: } sl@0: sl@0: void CProcess::Close() sl@0: { sl@0: if (iCreated&eOtherCreated) sl@0: iOther.Close(); sl@0: if (iCreated&eThreadCreated) sl@0: iThread.Close(); sl@0: iCreated=0; sl@0: } sl@0: sl@0: CProcess::~CProcess() sl@0: { sl@0: Close(); sl@0: } sl@0: sl@0: TBool CProcess::StillAlive() sl@0: { sl@0: if (iCreated&eOtherCreated) sl@0: return iOther.ExitType()==EExitPending; sl@0: return iThread.ExitType()==EExitPending; sl@0: } sl@0: sl@0: void CProcess::LeaveIfDied() //Can Leave sl@0: { sl@0: User::After(200000); //0.2 secs sl@0: if (StillAlive()) sl@0: return; sl@0: if (iCreated&eOtherCreated) sl@0: User::Leave(iOther.ExitReason()); sl@0: User::Leave(iThread.ExitReason()); sl@0: } sl@0: sl@0: const TInt KFirstInstanceId = 1; sl@0: const TInt KOtherInstanceId = 2; sl@0: sl@0: TBool CProcess::ProcessDied(TInt aScreenNo/*=KDefaultScreen*/) sl@0: { sl@0: _LIT(pName,"TAutoServer*"); sl@0: TFindProcess find(pName); sl@0: TFullName name; sl@0: sl@0: TBool found = EFalse; sl@0: TInt instanceId = aScreenNo==KDefaultScreen? KFirstInstanceId : KOtherInstanceId; sl@0: // find the correct instance of the process sl@0: // required in multi display test sl@0: while (!found && find.Next(name)==KErrNone) sl@0: { sl@0: TPtrC scrId = name.Right(1); sl@0: TInt id; sl@0: TLex lex(scrId); sl@0: lex.Val(id); sl@0: if (id==instanceId) sl@0: found = ETrue; sl@0: } sl@0: if (!found) sl@0: return EFalse; sl@0: sl@0: RProcess p; sl@0: p.Open(name); sl@0: if (p.Id()!=RProcess().Id()) sl@0: return EFalse; sl@0: p.Close(); sl@0: return (find.Next(name)!=KErrNone); sl@0: } sl@0: sl@0: TInt CProcess::ThreadInit(TAny *aPtr) sl@0: { sl@0: __UHEAP_MARK; sl@0: TInt err=KErrNone; sl@0: CTrapCleanup* CleanUpStack=CTrapCleanup::New(); sl@0: if (CleanUpStack==NULL) sl@0: err=KErrNoMemory; sl@0: else sl@0: { sl@0: TRAP(err,InitialiseL(STATIC_CAST(TThreadStartUp*,aPtr))) sl@0: delete CleanUpStack; sl@0: } sl@0: __UHEAP_MARKEND; sl@0: return(err); sl@0: } sl@0: sl@0: void CProcess::InitialiseL(TThreadStartUp* aPtr) sl@0: { sl@0: CActiveScheduler* activeScheduler=new(ELeave) CActiveScheduler; sl@0: CActiveScheduler::Install(activeScheduler); sl@0: CleanupStack::PushL(activeScheduler); sl@0: aPtr->iInitFunction(aPtr->iParam); sl@0: CActiveScheduler::Start(); sl@0: CleanupStack::PopAndDestroy(activeScheduler); sl@0: } sl@0: sl@0: TInt CProcess::SimpleThreadInit(TAny *aPtr) sl@0: { sl@0: __UHEAP_MARK; sl@0: TInt err=KErrNone; sl@0: CTrapCleanup* CleanUpStack=CTrapCleanup::New(); sl@0: if (CleanUpStack==NULL) sl@0: err=KErrNoMemory; sl@0: else sl@0: { sl@0: TThreadStartUp* ptr=STATIC_CAST(TThreadStartUp*,aPtr); sl@0: ptr->iInitFunction(ptr->iParam); sl@0: delete CleanUpStack; sl@0: } sl@0: __UHEAP_MARKEND; sl@0: return(err); sl@0: } sl@0: sl@0: /*CMinWin*/ sl@0: sl@0: CMinWin::CMinWin(TInt aScreenNo): iScreenNo(aScreenNo) sl@0: {} sl@0: sl@0: void CMinWin::ConstructL() sl@0: { sl@0: User::LeaveIfError(iWs.Connect()); sl@0: iScr=new(ELeave) CWsScreenDevice(iWs); sl@0: User::LeaveIfError(iScr->Construct(iScreenNo)); sl@0: iGroup=RWindowGroup(iWs); sl@0: User::LeaveIfError(iGroup.Construct(8970+iScreenNo,ETrue)); sl@0: iWin=RWindow(iWs); sl@0: User::LeaveIfError(iWin.Construct((RWindowTreeNode)iGroup,(TUint32)this)); sl@0: iRect=TSize(10,10); sl@0: iWin.SetExtent(TPoint(0,0),iRect.Size()); sl@0: iWin.SetRequiredDisplayMode(EColor256); sl@0: iWin.SetBackgroundColor(KRgbGreen); sl@0: iWin.Activate(); sl@0: iGc=new(ELeave) CWindowGc(iScr); sl@0: User::LeaveIfError(iGc->Construct()); sl@0: sl@0: Draw(iRect); sl@0: iWs.Flush(); sl@0: } sl@0: sl@0: CMinWin::~CMinWin() sl@0: { sl@0: delete iGc; sl@0: iWin.Close(); sl@0: iGroup.Close(); sl@0: delete iScr; sl@0: iWs.Close(); sl@0: } sl@0: sl@0: void CMinWin::Draw(const TRect& aRect) sl@0: { sl@0: iWin.BeginRedraw(); sl@0: iGc->Activate(iWin); sl@0: iGc->SetPenStyle(CGraphicsContext::ENullPen); sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: iGc->SetBrushColor(KRgbGreen); sl@0: iGc->DrawRect(aRect); sl@0: iGc->Deactivate(); sl@0: iWin.EndRedraw(); sl@0: } sl@0: sl@0: sl@0: /*CTimeOut*/ sl@0: sl@0: void CTimeOut::ConstructL() sl@0: { sl@0: CTimer::ConstructL(); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CTimeOut::Start(TTimeIntervalMicroSeconds32 aInterval,TCallBack aCallBack) sl@0: { sl@0: iCallBack=aCallBack; sl@0: After(aInterval); sl@0: } sl@0: sl@0: void CTimeOut::RunL() sl@0: { sl@0: iCallBack.CallBack(); sl@0: } sl@0: sl@0: /* sl@0: * Simply returns the DisplayMode as a string. Used to display mode details on test results. sl@0: */ sl@0: GLDEF_C TPtrC DisplayModeAsString(TDisplayMode aMode) sl@0: { sl@0: sl@0: TPtrC modeAsString; sl@0: sl@0: switch(aMode) sl@0: { sl@0: case ENone: sl@0: _LIT(KENoneMode,"ENone"); sl@0: modeAsString.Set(KENoneMode); sl@0: break; sl@0: case EGray2: sl@0: _LIT(KEGray2Mode,"EGray2"); sl@0: modeAsString.Set(KEGray2Mode); sl@0: break; sl@0: case EGray4: sl@0: _LIT(KEGray4Mode,"EGray4"); sl@0: modeAsString.Set(KEGray4Mode); sl@0: break; sl@0: case EGray16: sl@0: _LIT(KEGray16Mode,"EGray16"); sl@0: modeAsString.Set(KEGray16Mode); sl@0: break; sl@0: case EGray256: sl@0: _LIT(KEGray256Mode,"EGray256"); sl@0: modeAsString.Set(KEGray256Mode); sl@0: break; sl@0: case EColor16: sl@0: _LIT(KEColor16Mode,"EColor16"); sl@0: modeAsString.Set(KEColor16Mode); sl@0: break; sl@0: case EColor256: sl@0: _LIT(KEColor256Mode,"EColor256"); sl@0: modeAsString.Set(KEColor256Mode); sl@0: break; sl@0: case EColor64K: sl@0: _LIT(KEColor64KMode,"EColor64K"); sl@0: modeAsString.Set(KEColor64KMode); sl@0: break; sl@0: case EColor16M: sl@0: _LIT(KEColor16MMode,"EColor16M"); sl@0: modeAsString.Set(KEColor16MMode); sl@0: break; sl@0: case EColor4K: sl@0: _LIT(KEColor4KMode,"EColor4K"); sl@0: modeAsString.Set(KEColor4KMode); sl@0: break; sl@0: case EColor16MU: sl@0: _LIT(KEColor16MUMode,"EColor16MU"); sl@0: modeAsString.Set(KEColor16MUMode); sl@0: break; sl@0: case EColor16MA: sl@0: _LIT(KEColor16MAMode,"EColor16MA"); sl@0: modeAsString.Set(KEColor16MAMode); sl@0: break; sl@0: case EColor16MAP: sl@0: _LIT(KEColor16MAPMode,"EColor16MAP"); sl@0: modeAsString.Set(KEColor16MAPMode); sl@0: break; sl@0: default: sl@0: _LIT(KUnknownMode,"Unknown"); sl@0: modeAsString.Set(KUnknownMode); sl@0: break; sl@0: } sl@0: sl@0: return modeAsString; sl@0: } sl@0: sl@0: // Check if an area of a bitmap is of a certain color sl@0: GLDEF_C TBool LossyCheckBlankBitmap(const CFbsBitmap& aBitmap, const TRect aArea, const TRgb aCheckColor, TBool aLossyCompare) sl@0: { sl@0: const TReal errorLimit = (aLossyCompare ? 0.05 : 0.00); //Lossy(default) or exact compare? sl@0: sl@0: TBool result = ETrue; sl@0: /* TInt mismatchedPixels = 0; */ // -- Useful for debugging sl@0: TRgb bitmapPix = TRgb(0,0,0,0); //testWin Pixel sl@0: for (TInt x = 0; x < aArea.Size().iWidth; x++) sl@0: { sl@0: for (TInt y = 0; y < aArea.Size().iHeight; y++) sl@0: { sl@0: aBitmap.GetPixel(bitmapPix, TPoint(x,y)); sl@0: sl@0: //Check if there are differeces in color between the bitmap and the test color sl@0: if(((TReal)abs(bitmapPix.Red() - aCheckColor.Red())/255) > errorLimit || sl@0: ((TReal)abs(bitmapPix.Blue() - aCheckColor.Blue())/255) > errorLimit || sl@0: ((TReal)abs(bitmapPix.Green() - aCheckColor.Green())/255) > errorLimit || sl@0: ((TReal)abs(bitmapPix.Alpha() - aCheckColor.Alpha())/255) > errorLimit) sl@0: { sl@0: /* mismatchedPixels++; */ // -- Useful for debugging sl@0: result = EFalse; sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: /* INFO_PRINTF2(_L("Number of different pixels: %i"), mismatchedPixels); */ // -- Useful for debugging sl@0: return result; sl@0: } sl@0: sl@0: // Compare a section of two bitmaps sl@0: GLDEF_C TBool LossyCompareBitmap(const CFbsBitmap& aBitmap1, const CFbsBitmap& aBitmap2, const TRect aCompareRect, TBool aLossyCompare) sl@0: { sl@0: const TReal errorLimit = (aLossyCompare ? 0.05 : 0.00); //Lossy or Exact compare? sl@0: sl@0: TBool result = ETrue; sl@0: sl@0: if (aBitmap1.DisplayMode() != aBitmap2.DisplayMode()) sl@0: { sl@0: RDebug::Printf(" DisplayMode difference %d, %d", aBitmap1.DisplayMode(), aBitmap2.DisplayMode()); sl@0: } sl@0: sl@0: TRgb bitmap1Pix = TRgb(0,0,0,0); sl@0: TRgb bitmap2Pix = TRgb(0,0,0,0); sl@0: for (TInt x = 0; x < aCompareRect.Size().iWidth; x++) sl@0: { sl@0: for (TInt y = 0; y < aCompareRect.Size().iHeight; y++) sl@0: { sl@0: aBitmap1.GetPixel(bitmap1Pix, TPoint(x,y)); sl@0: aBitmap2.GetPixel(bitmap2Pix, TPoint(x,y)); sl@0: sl@0: //Check if there are differences between the colors of the two bitmaps sl@0: if(((TReal)abs(bitmap1Pix.Red() - bitmap2Pix.Red())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Blue() - bitmap2Pix.Blue())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Green() - bitmap2Pix.Green())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Alpha() - bitmap2Pix.Alpha())/255) > errorLimit) sl@0: { sl@0: /* sl@0: * There was a difference so return without checking the rest of the sl@0: * bitmap. If you are seeing Lossy compare errors, and want to diagnose sl@0: * further, consider switching over to using a recording version of this sl@0: * function, LossyCompareBitmapRecord() sl@0: */ sl@0: result = EFalse; sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: return result; sl@0: } sl@0: sl@0: /** sl@0: * Compare two bitmaps, optionally a lossy comparison, recording any differences and saving bitmaps sl@0: * sl@0: * @param aBitmap1 Bitmap being checked sl@0: * @param aBitmap2 Reference Bitmap sl@0: * @param aCompareRect Area of bitmap to compare sl@0: * @param aLossyCompare ETrue means use a lossy compare strategy, else do an exact compare sl@0: * @param aPixelsDifferent Returned value representing the number of pixels which are different sl@0: * @param aLogger Facility for logging to be reported by this function sl@0: * @return ETrue if the bitmaps are the same (or similar). sl@0: * Otherwise EFalse, with logging reporting the differences, and bitmaps saved in c:\logs\ sl@0: * @pre c:\logs directory must exist sl@0: */ sl@0: GLDEF_C TBool LossyCompareBitmapRecord(CFbsBitmap& aBitmap1, CFbsBitmap& aBitmap2, const TRect aCompareRect, TBool aLossyCompare, TInt& aPixelsDifferent, CTestExecuteLogger& aLogger) sl@0: { sl@0: const TReal errorLimit = (aLossyCompare ? 0.05 : 0.00); //Lossy or Exact compare? sl@0: sl@0: TBool result = ETrue; sl@0: TInt mismatchedPixels = 0; sl@0: TRgb bitmap1Pix = TRgb(0,0,0,0); sl@0: TRgb bitmap2Pix = TRgb(0,0,0,0); sl@0: if (aBitmap1.DisplayMode() != aBitmap2.DisplayMode()) sl@0: { sl@0: aLogger.LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, sl@0: _L(" DisplayMode difference %d, %d"), aBitmap1.DisplayMode(), aBitmap2.DisplayMode()); sl@0: } sl@0: for (TInt x = 0; x < aCompareRect.Size().iWidth; x++) sl@0: { sl@0: for (TInt y = 0; y < aCompareRect.Size().iHeight; y++) sl@0: { sl@0: aBitmap1.GetPixel(bitmap1Pix, TPoint(x,y)); sl@0: aBitmap2.GetPixel(bitmap2Pix, TPoint(x,y)); sl@0: sl@0: //Check if there are differences between the colors of the two bitmaps sl@0: if(((TReal)abs(bitmap1Pix.Red() - bitmap2Pix.Red())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Blue() - bitmap2Pix.Blue())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Green() - bitmap2Pix.Green())/255) > errorLimit || sl@0: ((TReal)abs(bitmap1Pix.Alpha() - bitmap2Pix.Alpha())/255) > errorLimit) sl@0: { sl@0: mismatchedPixels++; sl@0: sl@0: aLogger.LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, sl@0: _L(" Pixel difference %d,%d: %d"),x,y, bitmap1Pix.Difference(bitmap2Pix)); sl@0: result = EFalse; sl@0: // we loop around again to pick up all the differences sl@0: } sl@0: } sl@0: } sl@0: aPixelsDifferent = mismatchedPixels; sl@0: sl@0: /* sl@0: * When the bitmaps are different, we store them locally in c:\\logs in sl@0: * timestamped files. Save() is a non-const method; this is why aBitmap1 sl@0: * and aBitmap2 are non-const. Saving can fail, perhaps because we have sl@0: * exceeded storage limits. sl@0: */ sl@0: if (!result) sl@0: { sl@0: TTime now; sl@0: now.UniversalTime(); sl@0: TInt timestamp = I64INT(now.Int64() & 0x7fffffffu); sl@0: timestamp/=1000; // a millisecond resolution is easier to track sl@0: TFileName mbmFileSrc; sl@0: mbmFileSrc.Format (_L("c:\\logs\\%d_LossyCompareBitmap1.mbm"), timestamp); sl@0: TFileName mbmFileDst; sl@0: mbmFileDst.Format (_L("c:\\logs\\%d_LossyCompareBitmap2.mbm"), timestamp); sl@0: TInt saveResult1; sl@0: TInt saveResult2; sl@0: saveResult1 = aBitmap1.Save(mbmFileSrc); sl@0: saveResult2 = aBitmap2.Save(mbmFileDst); sl@0: if (saveResult1 == KErrNone && saveResult2 == KErrNone) sl@0: { sl@0: aLogger.LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, sl@0: _L(" Bitmaps are different: see %S, %S"), &mbmFileSrc, &mbmFileDst); sl@0: } sl@0: else sl@0: { sl@0: aLogger.LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, sl@0: _L(" Bitmaps are different, but could not save files into c:\\logs : %d %d"), saveResult1, saveResult2); sl@0: } sl@0: } sl@0: sl@0: return result; sl@0: } sl@0: sl@0: // Check if an area of a screen is of a certain color sl@0: GLDEF_C TBool LossyCheckBlankWindow(const CWsScreenDevice& aScreen, CFbsBitmap& aBitmap, const TRect aArea, const TRgb aCheckColor) sl@0: { sl@0: aScreen.CopyScreenToBitmap(&aBitmap, aArea); sl@0: return LossyCheckBlankBitmap(aBitmap, aArea, aCheckColor); sl@0: } sl@0: sl@0: // Compare a section of two windows on the screen sl@0: GLDEF_C TBool LossyCompareWindow(const CWsScreenDevice& aScreen, CFbsBitmap& aBitmap1, CFbsBitmap& aBitmap2, const TRect aCompareRect) sl@0: { sl@0: aScreen.CopyScreenToBitmap(&aBitmap1, aCompareRect); sl@0: aScreen.CopyScreenToBitmap(&aBitmap2, aCompareRect); sl@0: return LossyCompareBitmap(aBitmap1, aBitmap2, aCompareRect); sl@0: } sl@0: