--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/twsgraphic/TWsGraphicTest.CPP Tue Jun 22 15:21:29 2010 +0300
@@ -0,0 +1,1610 @@
+// 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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <w32stdgraphic.h>
+#include <imageconversion.h>
+#include "testbase.h"
+#include "testbase.h"
+
+// Bitmap to load for tests
+#define MY_TEST_BITMAP _L("Z:\\WSTEST\\MYTEST.MBM")
+
+// Animation to load for tests
+_LIT(KSymBallFile, "Z:\\WSTEST\\symball.gif");
+
+// Executables for different sharing of graphic tests
+_LIT(KTestExe1, "TWSGRAPHICSHARETEST.exe");
+_LIT(KTestExe2, "TWSGRAPHICSHAREGLOBALTEST.exe");
+_LIT(KTestExe3, "TWSGRAPHICUNSHAREGLOBALTEST.exe");
+_LIT(KTestExe4, "TWSGRAPHICSHARESECURETEST.exe");
+_LIT(KTestExe5, "TWSGRAPHICUNSHARESECURETEST.exe");
+
+// Graphic is shared or not in executeable
+_LIT(KShare, " true");
+_LIT(KNoShare, " false");
+
+TUid KUidTestAnimation = {0x87654321};
+const TInt KDummyGraphicId = 99;
+const TInt KMaxLogLength = 256;
+const TInt KAnimationRunTime = 5000000; // 5 seconds max time to run a single animation loop
+
+// Animation loader
+class CIclLoader: public CActive
+ {
+public:
+ CIclLoader();
+ ~CIclLoader();
+ void ConstructL(const TDesC& aFileName, TBool aUseUID, TBool aReplace);
+ const TWsGraphicId GetId();
+ inline TInt FrameCount() const {return iTotalFrames;};
+ inline TBool Ok() const {return !iFailed;};
+protected:
+ void RunL();
+ TInt RunError(TInt aError);
+ void DoCancel();
+private:
+ void TestL(TInt aCondition);
+ CImageDecoder* iDecoder;
+ CWsGraphicBitmapAnimation* iTestAnimation;
+ TLogMessageText iTestLog;
+ TBool iUseUID;
+ TBool iReplace;
+ RPointerArray<CWsGraphicBitmapAnimation::CFrame> iFrames;
+ TInt iTotalFrames;
+ void NextL();
+ RFs iFs;
+ TBool iFailed;
+ };
+
+CIclLoader::CIclLoader():
+ CActive(CActive::EPriorityLow)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CIclLoader::~CIclLoader()
+ {
+ if (iTestAnimation)
+ {
+ delete iTestAnimation;
+ iTestAnimation = NULL;
+ }
+ if (iDecoder)
+ {
+ delete iDecoder;
+ iDecoder = NULL;
+ }
+ iFrames.ResetAndDestroy();
+ iFs.Close();
+ }
+
+const TWsGraphicId CIclLoader::GetId()
+ {
+ if (iTestAnimation)
+ {
+ return iTestAnimation->Id();
+ }
+ else
+ {
+ TWsGraphicId id(KDummyGraphicId);
+ return id;
+ }
+ }
+
+void CIclLoader::TestL(TInt aCondition)
+ {
+ if(!aCondition)
+ {
+ RWsSession rWs;
+ User::LeaveIfError(rWs.Connect());
+ TBuf<KMaxLogLength> buf;
+ _LIT(Fail,"AUTO Failed in WsGraphics Test : CIclLoader");
+ buf.Append(Fail);
+ buf.Append(iTestLog);
+ rWs.LogMessage(buf);
+ rWs.Flush();
+ rWs.Close();
+ User::Leave(KErrGeneral);
+ }
+ }
+
+void CIclLoader::ConstructL(const TDesC& aFileName, TBool aUseUID,TBool aReplace)
+ {
+ iUseUID = aUseUID;
+ iReplace = aReplace;
+
+ User::LeaveIfError(iFs.Connect());
+
+ iDecoder = CImageDecoder::FileNewL(iFs,aFileName);
+ if(!iDecoder->IsImageHeaderProcessingComplete())
+ {
+ User::Leave(KErrGeneral);
+ }
+ NextL();
+ }
+
+void CIclLoader::NextL()
+ {
+ // Load a frame from the animation
+ if (iDecoder && (iDecoder->FrameCount() > iFrames.Count()))
+ {
+ const TFrameInfo& info = iDecoder->FrameInfo(iFrames.Count());
+ CWsGraphicBitmapAnimation::CFrame* frame = CWsGraphicBitmapAnimation::CFrame::NewL();
+ CleanupStack::PushL(frame);
+ iFrames.AppendL(frame);
+ CleanupStack::Pop(frame);
+ frame->SetFrameInfo(info);
+ TFrameInfo copiedInfo = frame->FrameInfo();
+ TestL(info.iFlags==copiedInfo.iFlags);
+
+ TSize bmpSize(info.iFrameCoordsInPixels.Size());
+ CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+ frame->SetBitmap(bitmap); //takes ownership
+ User::LeaveIfError(bitmap->Create(bmpSize,info.iFrameDisplayMode));
+
+ TDisplayMode maskDispMode;
+ CFbsBitmap* mask = new(ELeave) CFbsBitmap;
+ frame->SetMask(mask); //takes ownership
+ if((TFrameInfo::EAlphaChannel|TFrameInfo::ETransparencyPossible) & info.iFlags)
+ {
+ maskDispMode = EGray256;
+ }
+ else
+ {
+ maskDispMode = EGray2;
+ }
+
+ User::LeaveIfError(mask->Create(info.iFrameCoordsInPixels.Size(),maskDispMode));
+ iDecoder->Convert(&iStatus,*bitmap,*mask,iFrames.Count()-1);
+
+ SetActive();
+ }
+
+ // if a frame loaded
+ else if(iFrames.Count())
+ {
+ _LIT_SECURE_ID(KTestSecId,0x12345678);
+
+ // The extra code around the NewL is checking that no heap failures occur when
+ // creating the CWsGraphicBitmapAnimation
+ TInt failRate = 1;
+ const TInt KMaxIteration = 1000;
+ for (;failRate < KMaxIteration; failRate++)
+ {
+ __UHEAP_RESET;
+ __UHEAP_SETFAIL(RHeap::EDeterministic,failRate);
+ __UHEAP_MARK;
+
+ TInt err = KErrGeneral;
+ if (iUseUID)
+ {// creating animation using UID
+ TRAP(err, iTestAnimation = CWsGraphicBitmapAnimation::NewL(KUidTestAnimation,iFrames.Array()););
+ }
+ else
+ {// creating using transient ID allocated by wserv
+ TRAP(err, iTestAnimation = CWsGraphicBitmapAnimation::NewL(iFrames.Array()););
+ }
+
+ TestL((err==KErrNone || err==KErrNoMemory));
+
+ if (err != KErrNone)
+ {
+ __UHEAP_MARKEND;
+ TestL(iTestAnimation == NULL);
+ }
+ else
+ {
+ break;
+ }
+ }
+ __UHEAP_RESET;
+ TestL(iTestAnimation != NULL);
+ TestL(failRate > 1); //Ensure the udeb version of euser.dll is available (i.e. that the rom was build with the -D_DEBUG option)
+ RDebug::Printf("TWSGraphicTest.CPP: Heapfailure loop completed after %d allocs.", failRate-1);
+
+ // if testing that a created animation can be replaced
+ if (iReplace)
+ {
+ // replace the animation just created with another
+ TWsGraphicId testId = iTestAnimation->Id();
+ TInt testInt = testId.Id();
+
+ CWsGraphicBitmapAnimation* testReplacement = CWsGraphicBitmapAnimation::NewL(testId,iFrames.Array());
+
+ delete iTestAnimation;
+
+ iTestAnimation = testReplacement;
+
+ TestL(iTestAnimation->Id().Id()==testInt);
+ }
+
+ delete iDecoder;
+ iDecoder = NULL;
+ iTotalFrames = iFrames.Count();
+ iFrames.ResetAndDestroy();
+
+ // test that the animation methods can be used without error
+ TestL(iTestAnimation->ShareGlobally()==KErrNone);
+ TestL(iTestAnimation->UnShareGlobally()==KErrNone);
+ TestL(iTestAnimation->Share(KTestSecId)==KErrNone);
+ TestL(iTestAnimation->UnShare(KTestSecId)==KErrNone);
+ TestL(iTestAnimation->UnShare(KTestSecId)==KErrNotFound);
+ }
+ }
+
+void CIclLoader::RunL()
+ {
+ if (iStatus == KErrNone)
+ {
+ NextL();
+ }
+ else
+ {
+ TestL(EFalse); // kill the test
+ }
+ }
+
+TInt CIclLoader::RunError(TInt aError)
+ {
+ RDebug::Printf("CIclLoader::RunError, aError %d", aError);
+ iFailed = ETrue;
+ return KErrNone;
+ }
+
+void CIclLoader::DoCancel()
+ {
+ if(iDecoder)
+ {
+ iDecoder->Cancel();
+ }
+ }
+
+// Class for testing CWsGraphics
+class CActiveWait;
+class CRedrawAO;
+class CWsGraphicBase : public CBase
+ {
+public:
+ CWsGraphicBase();
+ CWsGraphicBase(TInt aScreenNumber);
+ ~CWsGraphicBase();
+ void ConstructL();
+ void DoTestL(TInt aTestNo);
+ void RedrawMe(TRect aRedrawRect, TInt aFrame);
+
+ enum TTestCases
+ {
+ ETestCreateGraphicUID,
+ ETestCreateGraphicID,
+ ETestUpdateGraphic,
+ ETestDeleteGraphic,
+ ETestDrawInvalideBitmapID,
+ ETestDrawGraphic,
+ ETestDrawGraphicID,
+ ETestDrawGraphicCompare,
+ ETestDrawGraphicSessionHandle,
+ ETestDrawAnimatedGraphicUID,
+ ETestDrawAnimatedGraphicID,
+ ETestCreateMsgGraphicMsgBuf,
+ ETestDrawReplaceGraphicID,
+ ETestDrawInvalidAnimationID,
+ ETestDrawSharedGraphic,
+ // additional cases to be added here, before ETestMaxNumberOfTests
+ ETestMaxNumberOfTests
+ };
+
+private :
+ void PrepGc();
+ void RetireGc();
+ void RunAnimation(TInt aFrameCount);
+ void LaunchNewProcessL(const TDesC& aExecutable, TBool aShare);
+ inline void TestForIdenticalBitmaps(){Test(iScreen->RectCompare(iPosition1,iPosition2));};
+ inline void TestForDifferentBitmaps(){Test(!iScreen->RectCompare(iPosition1,iPosition2));};
+ void Test(TInt aCondition);
+ void DoTestCreateGraphicUidL();
+ void DoTestCreateGraphicIdL();
+ void DoTestUpdateGraphicL();
+ void DoTestDrawSharedGraphicL();
+ void DoTestDeleteGraphicL();
+ void DoTestDrawGraphicL();
+ void DoTestDrawGraphicIDL();
+ void DoTestDrawGraphicCompareL();
+ void DoTestDrawAnimatedGraphicUIDL();
+ void DoTestDrawAnimatedGraphicIDL();
+ void DoTestDrawGraphicSessionHandleL();
+ void DoTestCreateMsgGraphicMsgBufL();
+ void DoTestDrawReplaceGraphicIDL();
+ void DoTestDrawInvalidBitmapIDL();
+ void DoTestDrawInvalidAnimationIDL();
+private :
+ TInt iScreenNumber;
+ CWindowGc *iGc;
+ RWsSession iWs;
+ RWindowGroup *iGroupWin;
+ CWsScreenDevice *iScreen;
+ RWindow *iWin;
+ TLogMessageText iTestLog;
+ TRect iPosition1;
+ TRect iPosition2;
+ CActiveWait* iTimer;
+ CRedrawAO* iRedrawListener;
+ TWsGraphicId iAnimId;
+ TWsGraphicAnimation iAnimData;
+ };
+
+//
+// class CRedrawAO
+// request & listen for redraw events from wserv
+// if a redraw event is received, notify the observing class
+//
+class CRedrawAO : public CActive
+ {
+public:
+ static CRedrawAO* NewL(RWsSession* aWs);
+ ~CRedrawAO();
+ // from CActive:
+ void RunL();
+ void DoCancel();
+ TInt RunError(TInt aError);
+ void RequestRedraw();
+ inline void SetFrameCount(TInt aCount){iFrameCount = aCount;};
+ inline TInt GetFrameCount() const {return iFrameCount;};
+private:
+ CRedrawAO(RWsSession* aWs);
+ void ConstructL();
+private:
+ RWsSession* iWs;
+ TInt iFrameCount;
+ };
+
+CRedrawAO* CRedrawAO::NewL(RWsSession* aWs)
+ {
+ CRedrawAO* self = new (ELeave) CRedrawAO(aWs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CRedrawAO::CRedrawAO(RWsSession* aWs):
+CActive(CActive::EPriorityHigh), iWs(aWs)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CRedrawAO::~CRedrawAO()
+ {
+ // cleanup
+ Cancel();
+ }
+
+void CRedrawAO::ConstructL()
+ {
+ // nothing to construct
+ }
+
+void CRedrawAO::RunL()
+ {
+ // leave if status is not ok. RunError will process this result
+ User::LeaveIfError(iStatus.Int());
+ TWsRedrawEvent redraw;
+ iWs->GetRedraw(redraw);
+ TUint redrawHandle = redraw.Handle();
+ if (redrawHandle == ENullWsHandle)
+ {
+ User::Leave(KErrBadHandle); // sanity check the client handle isn't a dummy
+ }
+ else if (redrawHandle)
+ {
+ --iFrameCount;
+ (reinterpret_cast<CWsGraphicBase *>(redrawHandle))->RedrawMe(redraw.Rect(), iFrameCount); // handle the redraw signal
+ }
+
+ if (iFrameCount > 0)
+ {
+ RequestRedraw();
+ }
+ }
+
+TInt CRedrawAO::RunError(TInt aError)
+ {
+ if (aError != KErrBadHandle)
+ {
+ RequestRedraw();
+ }
+ return KErrNone;
+ }
+
+void CRedrawAO::DoCancel()
+ {
+ // kill all outstanding asynch. wserv requests
+ iWs->RedrawReadyCancel();
+ iFrameCount = KErrNone;
+ }
+
+void CRedrawAO::RequestRedraw()
+ {
+ if (!IsActive())
+ {
+ iWs->RedrawReady(&iStatus);
+ SetActive();
+ }
+ }
+
+//
+
+class CActiveWait : public CActive
+ {
+public:
+ static CActiveWait* NewL();
+ ~CActiveWait();
+ void Wait(TInt aDelay);
+ // From CActive:
+ void RunL();
+ void DoCancel();
+ TInt RunError(TInt aError);
+protected:
+ CActiveWait();
+ void ConstructL();
+protected:
+ RTimer iTimer;
+ TTime iFromTime;
+ };
+
+CActiveWait* CActiveWait::NewL()
+ {
+ CActiveWait* self = new (ELeave) CActiveWait;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CActiveWait::ConstructL()
+ {
+ User::LeaveIfError(iTimer.CreateLocal());
+ CActiveScheduler::Add(this);
+ }
+
+CActiveWait::CActiveWait() : CActive(CActive::EPriorityStandard)
+ {
+ iFromTime.HomeTime();
+ }
+
+CActiveWait::~CActiveWait()
+ {
+ Cancel();
+ iTimer.Close();
+ }
+
+void CActiveWait::DoCancel()
+ {
+ iTimer.Cancel();
+ CActiveScheduler::Stop();
+ }
+
+void CActiveWait::RunL()
+ {
+ CActiveScheduler::Stop();
+ }
+
+TInt CActiveWait::RunError(TInt aError)
+ {
+ return aError; // exists so a break point can be placed on it.
+ }
+
+void CActiveWait::Wait(TInt aDelay)
+
+
+ {
+ iTimer.After(iStatus, aDelay);
+ SetActive();
+ CActiveScheduler::Start();
+ }
+
+//
+
+CWsGraphicBase::CWsGraphicBase(TInt aScreenNumber) : iScreenNumber(aScreenNumber), iAnimId(KDummyGraphicId)
+ {
+ }
+
+CWsGraphicBase::~CWsGraphicBase()
+ {
+ iWin->Close();
+ delete iWin;
+ delete iScreen;
+ delete iGc;
+ delete iGroupWin;
+ iWs.Close();
+ if (iTimer)
+ {
+ delete iTimer;
+ iTimer = NULL;
+ }
+ if (iRedrawListener)
+ {
+ delete iRedrawListener;
+ iRedrawListener = NULL;
+ }
+ }
+
+void CWsGraphicBase::ConstructL()
+ {
+ User::LeaveIfError(iWs.Connect());
+ iScreen=new(ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(iScreen->Construct(iScreenNumber));
+
+ TSize screenSize = iScreen->SizeInPixels();
+ iPosition1.SetRect(0,0,screenSize.iWidth/2,screenSize.iHeight);
+ iPosition2.SetRect(screenSize.iWidth/2,0,screenSize.iWidth,screenSize.iHeight);
+
+ iTimer = CActiveWait::NewL();
+ iRedrawListener = CRedrawAO::NewL(&iWs);
+
+ iGc=new(ELeave) CWindowGc(iScreen);
+ User::LeaveIfError(iGc->Construct());
+ iGroupWin=new(ELeave) RWindowGroup(iWs);
+ iGroupWin->Construct(1);
+
+ iWin=new(ELeave) RWindow(iWs);
+ iWin->Construct(*iGroupWin, (TUint32)this);
+ iWin->EnableRedrawStore(EFalse); // disable the redraw store for these tests
+ iWin->SetRequiredDisplayMode(EColor256);
+ iWin->SetExtent(TPoint(0,0),iScreen->SizeInPixels());
+ iWin->Activate();
+ iWin->BeginRedraw();
+ iWin->EndRedraw();
+ iWs.Flush();
+ }
+
+// To test whether sharing of graphics works a new process has to be launched.
+// The argument is set whether the graphic should be shared or not.
+void CWsGraphicBase::LaunchNewProcessL(const TDesC& aExecutable, TBool aShare)
+ {
+ TBuf<128> args;
+ RProcess pr;
+ TRequestStatus status;
+
+ if (aShare)
+ {
+ args.Append(KShare);
+ }
+ else
+ {
+ args.Append(KNoShare);
+ }
+
+ User::LeaveIfError(pr.Create(aExecutable,args));
+ pr.Logon(status);
+ pr.Resume();
+ User::WaitForRequest(status);
+ pr.Close();
+
+ if (status != KErrNone)
+ {
+ User::Leave(status.Int());
+ }
+ }
+
+//
+// CWsGraphicBase::PrepGc
+// activate a gc & clear the two rects
+//
+void CWsGraphicBase::PrepGc()
+ {
+ iGc->Activate(*iWin);
+ iWin->Invalidate();
+ iWin->BeginRedraw();
+ iGc->Clear(iPosition1);
+ iGc->Clear(iPosition2);
+ iWs.Flush();
+ }
+
+//
+// CWsGraphicBase::RetireGc
+// deactivate a gc & flush any outstanding RWindow requests
+void CWsGraphicBase::RetireGc()
+ {
+ iGc->Deactivate();
+ iWin->EndRedraw();
+ iWs.Flush();
+ }
+
+//
+// CWsGraphicBase::RedrawMe
+// called from the redraw listener AO, triggered by a redraw event
+// Invalidates the area requiring a redraw &
+// initiates a redraw of the CWsGraphicBitmapAnimation's window
+//
+void CWsGraphicBase::RedrawMe(TRect aRedrawRect, TInt aFrame)
+ {
+ // do draw with next frame
+ if (iAnimData.IsPlaying())
+ {
+ iGc->Activate(*iWin);
+ iWin->Invalidate(aRedrawRect);
+ iWin->BeginRedraw();
+ iWs.Flush();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,iAnimData.Pckg());
+ iGc->Deactivate();
+ iWin->EndRedraw();
+ iWs.Flush();
+
+ // check for last frame
+ if (aFrame == 0)
+ {
+ iTimer->Cancel();
+ }
+ }
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0001
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Create Globally and Locally Shared Graphic Bitmaps from UIDs.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions First test that TWsGraphicIds can be created from UIDs. Then create CWsGraphicBitmap objects through
+ CWsGraphicBitmap::NewL, passing a UID from a TWsGraphicId. Two different objects are created
+ 1. Globally shared available to all applications
+ 2. Locally shared available to selected clients
+
+ @SYMTestExpectedResults The CWsGraphicBitmap objects are created and no errors are reported.
+ */
+void CWsGraphicBase::DoTestCreateGraphicUidL()
+ {
+ iTestLog.Append(_L("CreateGraphicUid"));
+
+ _LIT_SECURE_ID(KTestSecId,0x12345678);
+
+ // Test the creation of TWsGraphicIds from UIDs
+ TUid uid1 = {0x10000001};
+ TUid uid2 = {0x10000002};
+
+ TWsGraphicId twsGraphicId1(uid1);
+ Test(twsGraphicId1.Uid()==uid1);
+
+ TWsGraphicId twsGraphicId2(uid2);
+ Test(twsGraphicId2.Uid()==uid2);
+
+ TWsGraphicId twsGraphicId3(twsGraphicId2);
+ Test(twsGraphicId3.Uid()==uid2);
+
+ TWsGraphicId twsGraphicId4(1);
+ twsGraphicId4.Set(uid1);
+ Test(twsGraphicId4.Uid()==uid1);
+
+ // Create globally shared CWsGraphicBitmap
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ TSize screenSize = iScreen->SizeInPixels();
+ bitmap1.Create(screenSize,iScreen->DisplayMode());
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(twsGraphicId1.Uid(), &bitmap1,&mask1);
+ Test(bTest->IsActive());
+
+ TWsGraphicId tid1 = bTest->Id();
+ Test(tid1.Uid()==uid1);
+
+ Test(bTest->ShareGlobally()==KErrNone);
+
+ // Create local shared CWsGraphicBitmap
+ CFbsBitmap bitmap2;
+ CFbsBitmap mask2;
+
+ bitmap2.Create(screenSize,iScreen->DisplayMode());
+ mask2.Create(bitmap2.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest2 = CWsGraphicBitmap::NewL(twsGraphicId2.Uid(), &bitmap2,&mask2);
+
+ TWsGraphicId tid2 = bTest2->Id();
+ Test(tid2.Uid()==uid2);
+
+ Test(bTest2->Share(KTestSecId)==KErrNone);
+
+ // Test the unsharing of the CWsGraphicBitmaps
+ Test(bTest->UnShareGlobally()==KErrNone);
+ Test(bTest2->UnShare(KTestSecId)==KErrNone);
+ Test(bTest2->UnShare(KTestSecId)==KErrNotFound);
+
+ delete bTest;
+ delete bTest2;
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0002
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Create Globally and Locally Shared Graphic Bitmaps.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions First test that TWsGraphicIds can be created from IDs. Then create CWsGraphicBitmap objects through
+ CWsGraphicBitmap::NewL. Two different objects are created
+ 1. Globally shared available to all applications
+ 2. Locally shared available to selected clients
+
+ @SYMTestExpectedResults The CWsGraphicBitmap objects are created and no errors are reported.
+ */
+void CWsGraphicBase::DoTestCreateGraphicIdL()
+ {
+ iTestLog.Append(_L("CreateGraphicId"));
+
+ _LIT_SECURE_ID(KTestSecId,0x12345678);
+
+ // Test creating TWsGraphicIds from ids first
+ TUid uid1 = {0x10000001};
+
+ TWsGraphicId twsGraphicId1(uid1);
+
+ twsGraphicId1.Set(9);
+ Test(twsGraphicId1.Id()==9);
+
+ TWsGraphicId twsGraphicId2(twsGraphicId1);
+ Test(twsGraphicId2.Id()==9);
+
+ TWsGraphicId twsGraphicId3(7);
+ Test(twsGraphicId3.Id()==7);
+
+ // Create globally shared CWsGraphicBitmap
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ TSize screenSize = iScreen->SizeInPixels();
+ bitmap1.Create(screenSize,iScreen->DisplayMode());
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+ Test(bTest->IsActive());
+
+ TWsGraphicId tid1 = bTest->Id();
+
+ Test(bTest->ShareGlobally()==KErrNone);
+
+ // Create local shared CWsGraphicBitmap
+ CFbsBitmap bitmap2;
+ CFbsBitmap mask2;
+
+ bitmap2.Create(screenSize,iScreen->DisplayMode());
+ mask2.Create(bitmap2.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest2 = CWsGraphicBitmap::NewL(&bitmap2,&mask2);
+
+ TWsGraphicId tid2 = bTest2->Id();
+
+ Test(bTest2->Share(KTestSecId)==KErrNone);
+
+ // Test the unsharing of the CWsGraphicBitmaps
+ Test(bTest->UnShareGlobally()==KErrNone);
+ Test(bTest2->UnShare(KTestSecId)==KErrNone);
+ Test(bTest2->UnShare(KTestSecId)==KErrNotFound);
+
+ delete bTest2;
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0003
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Update an existing graphic bitmap with new data.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test calls CWsGraphicBitmap::NewL method with new data passed to the CWsGraphicBitmap object.
+
+
+ @SYMTestExpectedResults The CWsGraphicBitmap object is updated with no errors reported.
+ */
+void CWsGraphicBase::DoTestUpdateGraphicL()
+ {
+ iTestLog.Append(_L("UpdateGraphic"));
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+ CFbsBitmap bitmap2;
+ CFbsBitmap mask2;
+
+ TSize screenSize = iScreen->SizeInPixels();
+ bitmap1.Create(screenSize,iScreen->DisplayMode());
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphic* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+
+ bitmap2.Create(screenSize,iScreen->DisplayMode());
+ mask2.Create(bitmap2.SizeInPixels(),iScreen->DisplayMode());
+
+ TWsGraphicId tid1 = bTest->Id();
+ TInt testInt = tid1.Id();
+
+ CWsGraphic* testReplacement = CWsGraphicBitmap::NewL(tid1, &bitmap2,&mask2);
+
+ delete bTest;
+ bTest = testReplacement;
+
+ Test(bTest->Id().Id()==testInt);
+
+ delete bTest;
+ }
+
+
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0004
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Try to delete an existing graphic.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app calls CWsGraphic::Destroy() method,
+
+ @SYMTestExpectedResults The CWsGraphicBitmap object is removed from the Window Server with no
+ errors reported
+ */
+void CWsGraphicBase::DoTestDeleteGraphicL()
+ {
+ iTestLog.Append(_L("DeleteGraphic"));
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ TSize screenSize = iScreen->SizeInPixels();
+ bitmap1.Create(screenSize,iScreen->DisplayMode());
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphic* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+
+ bTest->Destroy();
+
+ Test(!bTest->IsActive());
+
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0005
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check a bitmap is not drawn if the bitmap and mask it uses are invalid
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates a valid and invalid bitmap and attempts to draw them
+
+ @SYMTestExpectedResults The valid bitmap is drawn but the invalid bitmap is not drawn
+ */
+void CWsGraphicBase::DoTestDrawInvalidBitmapIDL()
+ {
+ iTestLog.Append(_L("DrawInvalidBitmapID"));
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+ CFbsBitmap *bitmap2 = NULL;
+ CFbsBitmap *mask2 = NULL;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ // valid bitmap
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+
+ // invalid bitmap
+ CWsGraphicBitmap* bTest2 = CWsGraphicBitmap::NewL(bitmap2,mask2);
+
+ PrepGc();
+ iGc->DrawWsGraphic(bTest->Id(),iPosition1);
+ iGc->DrawWsGraphic(bTest2->Id(),iPosition2);
+ RetireGc();
+
+ // compare the graphic in both positions, should only be graphic in position 1
+ TestForDifferentBitmaps();
+
+ delete bTest2;
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0006
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Draw a graphic within a rectangle on the screen, then try to draw with a non-existant graphic
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app calls CWindowGC::DrawWsGraphic() method using the TWGraphicId object, to draw within a rectangle on the screen
+
+ @SYMTestExpectedResults The graphic is drawn on the screen with no errors reported. Drawing with a non-existant graphic causes
+ nothing to be drawn and no error reported
+ */
+void CWsGraphicBase::DoTestDrawGraphicL()
+ {
+ iTestLog.Append(_L("DrawGraphic"));
+
+ _LIT8(KTestData,"HelloWorld");
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+
+ PrepGc();
+ iGc->DrawWsGraphic(bTest->Id(),iPosition1,KTestData);
+ TWsGraphicId twsGraphicId1(KDummyGraphicId); // create unrecognised wsbitmap id & attempt to draw it
+ iGc->DrawWsGraphic(twsGraphicId1,iPosition2,KTestData);
+ RetireGc();
+
+ // compare the graphic in both positions, should only be graphic in position 1
+ TestForDifferentBitmaps();
+
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0007
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Draw a graphic using a transient ID within a rectangle on the screen
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app calls CWindowGC::DrawWsGraphic() using a TWsGraphic object, to draw within
+ a rectangle on the screen
+
+ @SYMTestExpectedResults The graphic is drawn.
+ */
+void CWsGraphicBase::DoTestDrawGraphicIDL()
+ {
+ iTestLog.Append(_L("DrawGraphicID"));
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+
+ PrepGc();
+ iGc->DrawWsGraphic(bTest->Id(),iPosition1);
+ RetireGc();
+
+ // compare the graphic in both positions, should only be graphic in position 1
+ TestForDifferentBitmaps();
+
+ delete bTest;
+ }
+
+
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0008
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Draw a graphic in two different rectangles on the screen and compare them
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app calls CWindowGC::DrawWsGraphic() using the TWsGraphic object, to draw a known bitmap
+ rectangle on the screen twice in different places. The bitmaps are then compared.
+
+ @SYMTestExpectedResults The two bitmaps are identical
+ */
+void CWsGraphicBase::DoTestDrawGraphicCompareL()
+ {
+ iTestLog.Append(_L("DrawGraphicCompare"));
+
+ _LIT8(KTestData,"HelloWorld");
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ CFbsBitmap bitmap2;
+ CFbsBitmap mask2;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ User::LeaveIfError(bitmap2.Load(MY_TEST_BITMAP,0));
+ mask2.Create(bitmap2.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+ CWsGraphicBitmap* bTest2 = CWsGraphicBitmap::NewL(&bitmap2,&mask2);
+
+ PrepGc();
+ //draw the graphic in the two different rectangles
+ iGc->DrawWsGraphic(bTest->Id(),iPosition1,KTestData);
+ iGc->DrawWsGraphic(bTest2->Id(),iPosition2,KTestData);
+ RetireGc();
+
+ // compare the graphic in both positions. Contents of each rect should be identical
+ TestForIdenticalBitmaps();
+
+ delete bTest2;
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0009
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Draw a global and local graphic in two different rectangles on the screen and compare them
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app calls CWindowGC::DrawGraphic() using the TWsGraphic object, to draw a known
+ global and local bitmap rectangle on the screen twice in different places. The bitmaps are then compared.
+
+ @SYMTestExpectedResults The two bitmaps are identical
+ */
+void CWsGraphicBase::DoTestDrawGraphicSessionHandleL()
+ {
+ iTestLog.Append(_L("DrawGraphicSessionHandle"));
+ _LIT_SECURE_ID(KTestSecId,0x12345678);
+
+ // test TWsGraphicControlState first
+ _LIT8(KTestData,"HelloWorld");
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ CFbsBitmap bitmap2;
+ CFbsBitmap mask2;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ User::LeaveIfError(bitmap2.Load(MY_TEST_BITMAP,0));
+ mask2.Create(bitmap2.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(&bitmap1,&mask1);
+ CWsGraphicBitmap* bTest2 = CWsGraphicBitmap::NewL(&bitmap2,&mask2);
+
+ Test(bTest->ShareGlobally()==KErrNone);
+ Test(bTest2->Share(KTestSecId)==KErrNone);
+
+ PrepGc();
+ iGc->DrawWsGraphic(bTest->Id(),iPosition1,KTestData);
+ iGc->DrawWsGraphic(bTest2->Id(),iPosition2,KTestData);
+ RetireGc();
+
+ // compare the graphic in both positions. Contents of each rect should be identical
+ TestForIdenticalBitmaps();
+
+ delete bTest2;
+ delete bTest;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0010
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check an animation can be constructed using a UID, manipulated and then drawn
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates CWsGraphicBitmapAnimation object via a UID and then draws the object to the screen
+
+ @SYMTestExpectedResults The object is drawn
+ */
+void CWsGraphicBase::DoTestDrawAnimatedGraphicUIDL()
+ {
+ iTestLog.Append(_L("DrawAnimatedGraphicUID"));
+
+ // test TWsGraphicAnimation first
+ iAnimData.Play(EFalse);
+
+ // load the animation via a UID
+ CIclLoader* iclLoader;
+ iclLoader = new(ELeave) CIclLoader();
+ iclLoader->ConstructL(KSymBallFile,ETrue,EFalse); // this is actually an asynchronous operation, so we give it a chance to execute below
+
+ while (iclLoader->Ok() && iclLoader->GetId().Id() == KDummyGraphicId)
+ {
+ iTimer->Wait(1000);
+ }
+
+ Test(iclLoader->Ok()); // fail test if iclLoder experienced problems
+
+ iAnimId = iclLoader->GetId();
+
+ // animation is ready to be drawn. draw to the 1st position only
+ PrepGc();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,iAnimData.Pckg());
+ RetireGc();
+
+ // run the animation
+ RunAnimation(iclLoader->FrameCount());
+
+ // compare the graphic in both positions.
+ TestForDifferentBitmaps();
+
+ iTimer->Cancel();
+ iclLoader->Cancel();
+ delete iclLoader;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0011
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check an animation can be constructed using an ID, manipulated and then drawn
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates CWsGraphicBitmapAnimation object via an ID and then draws the object to the screen
+
+ @SYMTestExpectedResults The object is drawn
+ */
+void CWsGraphicBase::DoTestDrawAnimatedGraphicIDL()
+ {
+ iTestLog.Append(_L("DrawAnimatedGraphicID"));
+ iAnimData.Play(ETrue);
+ iAnimData.Play(ETrue);
+ Test(iAnimData.Loops());
+ iAnimData.Pause();
+ Test(!iAnimData.IsPlaying());
+ Test(iAnimData.IsPaused());
+ iAnimData.Pause();
+ Test(iAnimData.Loops());
+ iAnimData.Play(EFalse);
+ Test(!iAnimData.Loops());
+ Test(!iAnimData.IsStopping());
+ Test(!iAnimData.IsStopped());
+
+ // load the animation via an ID
+ CIclLoader* iclLoader;
+ iclLoader = new(ELeave) CIclLoader();
+ iclLoader->ConstructL(KSymBallFile,EFalse,EFalse);
+
+ while (iclLoader->GetId().Id() == KDummyGraphicId)
+ {
+ iTimer->Wait(1000);
+ }
+ iAnimId = iclLoader->GetId();
+
+ PrepGc();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,iAnimData.Pckg());
+ RetireGc();
+
+ // run the animation
+ RunAnimation(iclLoader->FrameCount());
+
+ // compare the graphic in both positions
+ TestForDifferentBitmaps();
+
+ iAnimData.Stop(ETrue);
+ Test(iAnimData.IsStopped());
+ iAnimData.Pause();
+ iAnimData.Play(EFalse);
+ iAnimData.Stop(EFalse);
+ Test(!iAnimData.IsStopped());
+
+ iTimer->Cancel();
+ iclLoader->Cancel();
+ delete iclLoader;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0012
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check an animation can be constructed and then replaced, manipulated and then drawn
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates CWsGraphicBitmapAnimation object, the replaces it, and then draws the object
+ to the screen
+
+ @SYMTestExpectedResults The object is drawn
+ */
+void CWsGraphicBase::DoTestDrawReplaceGraphicIDL()
+ {
+ // test TWsGraphicControlStateTimed first
+ iTestLog.Append(_L("DrawAnimatedGraphicID"));
+ _LIT8(KTestData,"HelloWorld");
+ iAnimData.Stop(ETrue);
+
+ // load and replace the animation
+ CIclLoader* iclLoader;
+ iclLoader = new(ELeave) CIclLoader();
+ iclLoader->ConstructL(KSymBallFile,false,true);
+
+ while (iclLoader->GetId().Id() == KDummyGraphicId)
+ {
+ iTimer->Wait(1000);
+ }
+ iAnimId = iclLoader->GetId();
+
+ // draw the animation in two positions
+ PrepGc();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,KTestData);
+ RetireGc();
+
+ // run the animation
+ RunAnimation(iclLoader->FrameCount());
+
+ // compare the graphic in both positions
+ // Expect identical, as the command buffer used in position1 animation is invalid, therefore never drawn
+ TestForIdenticalBitmaps();
+
+ iTimer->Cancel();
+ iclLoader->Cancel();
+ delete iclLoader;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0013
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check the creation and manipulation of an RWsGraphicMsgBuf object
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Creates and manipulates an RWsGraphicMsgBuf object
+
+ @SYMTestExpectedResults RWsGraphicMsgBuf functions correctly
+ */
+void CWsGraphicBase::DoTestCreateMsgGraphicMsgBufL()
+ {
+ iTestLog.Append(_L("CreateMsgGraphicMsgBuf"));
+
+ _LIT(KNebraska,"Nebraska");
+ _LIT8(KTesting,"Testing");
+ RWsGraphicMsgBuf msgBuf;
+ msgBuf.CleanupClosePushL();
+ msgBuf.Append(TUid::Uid(0x12345670),KTesting());
+ msgBuf.Append(TUid::Uid(0x12345671),KNebraska());
+ msgBuf.Append(TUid::Uid(0x12345670),KTesting());
+
+ Test(TUid::Uid(0x12345670)==msgBuf.TypeId(0));
+
+ msgBuf.Remove(0);
+ const TInt count = msgBuf.Count();
+ Test(count == 2);
+
+ iAnimData.Play(ETrue);
+ msgBuf.Append(iAnimData);
+ Test(msgBuf.Count() == 3);
+
+ CleanupStack::Pop();
+
+ // load the animation via a UID
+ CIclLoader* iclLoader;
+ iclLoader = new(ELeave) CIclLoader();
+ iclLoader->ConstructL(KSymBallFile,true,false);
+
+ while (iclLoader->GetId().Id() == KDummyGraphicId)
+ {
+ iTimer->Wait(1000);
+ }
+ iAnimId = iclLoader->GetId();
+
+ PrepGc();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,msgBuf.Pckg());
+ RetireGc();
+
+ // run the animation
+ RunAnimation(iclLoader->FrameCount());
+
+ // compare the graphic in both positions
+ TestForDifferentBitmaps();
+
+ iTimer->Cancel();
+ iclLoader->Cancel();
+ delete iclLoader;
+ msgBuf.Close();
+ }
+
+
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0014
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check an animation is not drawn if the command buffer it uses is invalid
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates CWsGraphicBitmapAnimation object then draws the animation using
+ a valid and invalid command buffer
+
+ @SYMTestExpectedResults The animation is drawn while using the valid command buffer but not drawn
+ when the command buffer is invalid
+ */
+void CWsGraphicBase::DoTestDrawInvalidAnimationIDL()
+ {
+ // test TWsGraphicControlStateTimed first, a valid command buffer
+ iTestLog.Append(_L("DrawInvalidAnimationID"));
+ iAnimData.Play(ETrue);
+
+ // invalid command buffer
+ _LIT8(KTestData2,"12345678");
+
+ // load and replace the animation
+ CIclLoader* iclLoader;
+ iclLoader = new(ELeave) CIclLoader();
+ iclLoader->ConstructL(KSymBallFile,false,false);
+
+ while (iclLoader->GetId().Id() == KDummyGraphicId)
+ {
+ iTimer->Wait(1000);
+ }
+ iAnimId = iclLoader->GetId();
+
+ PrepGc();
+ iGc->DrawWsGraphic(iAnimId,iPosition1,iAnimData.Pckg());
+ iGc->DrawWsGraphic(iAnimId,iPosition2,KTestData2);
+ RetireGc();
+
+ // run the animation
+ RunAnimation(iclLoader->FrameCount());
+
+ // compare the graphic in both positions
+ TestForDifferentBitmaps();
+
+ iAnimData.Stop(ETrue);
+ iTimer->Cancel();
+ iclLoader->Cancel();
+ delete iclLoader;
+ }
+
+ /**
+ @SYMTestCaseID GRAPHICS-WSERV-0015
+
+ @SYMPREQ PREQ1246
+
+ @SYMTestCaseDesc Check the sharing of graphics with other clients.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test app creates CWsGraphicBitmap object an then tests the sharing of the object with
+ different clients
+
+ @SYMTestExpectedResults The CWsGraphicBitmap object is shared correctly
+ */
+void CWsGraphicBase::DoTestDrawSharedGraphicL()
+ {
+ iTestLog.Append(_L("DrawSharedGraphic"));
+ _LIT_SECURE_ID(KTestSecId,0x10003a4b);
+
+ TUid uid1 = {0x12000021};
+ TWsGraphicId twsGraphicId1(uid1);
+
+ CFbsBitmap bitmap1;
+ CFbsBitmap mask1;
+
+ User::LeaveIfError(bitmap1.Load(MY_TEST_BITMAP,0));
+ mask1.Create(bitmap1.SizeInPixels(),iScreen->DisplayMode());
+
+ CWsGraphicBitmap* bTest = CWsGraphicBitmap::NewL(twsGraphicId1.Uid(), &bitmap1,&mask1);
+
+ // Try to draw the graphic in an client. Should fail as graphic is not shared
+ TRAPD(err, LaunchNewProcessL(KTestExe1, EFalse));
+ Test(err == KErrNone);
+
+ // Share the graphic globally and try to draw the graphic in an client. Should pass
+ Test(bTest->ShareGlobally()==KErrNone);
+ TRAP(err, LaunchNewProcessL(KTestExe2, ETrue));
+ Test(err == KErrNone);
+
+ // Unshare the graphic globally and try to draw the graphic in an client. Should fail
+ Test(bTest->UnShareGlobally()==KErrNone);
+ TRAP(err, LaunchNewProcessL(KTestExe3, EFalse));
+ Test(err == KErrNone);
+
+ // Share the graphic to a client and try to draw the graphic in the client. Should pass
+ Test(bTest->Share(KTestSecId)==KErrNone);
+ TRAP(err, LaunchNewProcessL(KTestExe4, ETrue));
+ Test(err == KErrNone);
+
+ // Unshare the graphic to a client and try to draw the graphic in the client. Should fail
+ Test(bTest->UnShare(KTestSecId)==KErrNone);
+ TRAP(err, LaunchNewProcessL(KTestExe5, EFalse));
+ Test(err == KErrNone);
+
+ delete bTest;
+ }
+
+
+void CWsGraphicBase::DoTestL(TInt aTestNo)
+ {
+ switch (aTestNo)
+ {
+ case ETestCreateGraphicUID:
+ DoTestCreateGraphicUidL();
+ break;
+ case ETestCreateGraphicID:
+ DoTestCreateGraphicIdL();
+ break;
+ case ETestUpdateGraphic:
+ DoTestUpdateGraphicL();
+ break;
+ case ETestDeleteGraphic:
+ DoTestDeleteGraphicL();
+ break;
+ case ETestDrawInvalideBitmapID:
+ DoTestDrawInvalidBitmapIDL();
+ break;
+ case ETestDrawGraphic:
+ DoTestDrawGraphicL();
+ break;
+ case ETestDrawGraphicID:
+ DoTestDrawGraphicIDL();
+ break;
+ case ETestDrawGraphicCompare:
+ DoTestDrawGraphicCompareL();
+ break;
+ case ETestDrawGraphicSessionHandle:
+ DoTestDrawGraphicSessionHandleL();
+ break;
+#ifdef _DEBUG
+ // These tests require debug-only API to simulate OOM. Running
+ // the tests in non-debug environments invalidates the tests.
+ case ETestDrawAnimatedGraphicUID:
+ DoTestDrawAnimatedGraphicUIDL();
+ break;
+ case ETestDrawAnimatedGraphicID:
+ DoTestDrawAnimatedGraphicIDL();
+ break;
+ case ETestCreateMsgGraphicMsgBuf:
+ DoTestCreateMsgGraphicMsgBufL();
+ break;
+ case ETestDrawReplaceGraphicID:
+ DoTestDrawReplaceGraphicIDL();
+ break;
+ case ETestDrawInvalidAnimationID:
+ DoTestDrawInvalidAnimationIDL();
+ break;
+#endif
+ case ETestDrawSharedGraphic:
+ DoTestDrawSharedGraphicL();
+ break;
+ }
+ RDebug::Print(iTestLog);
+ iTestLog.Delete(0,256);
+ }
+
+// writes out to WSERV.log if error
+void CWsGraphicBase::Test(TInt aCondition)
+ {
+ if(!aCondition)
+ {
+ TBuf<KMaxLogLength> buf;
+ _LIT(Fail,"AUTO Failed in WsGraphics Test : ");
+ buf.Append(Fail);
+ buf.Append(iTestLog);
+ RDebug::Print(buf);
+ RProcess().Terminate(KErrGeneral);
+ }
+ }
+
+//
+// CWsGraphicBase::RunAnimation
+// Redraw event listener is launched & the
+// animation is given a total of KAnimationRunTime (25 seconds) to run a single loop
+//
+void CWsGraphicBase::RunAnimation(TInt aFrameCount)
+ {
+ --aFrameCount; // account for the fact the initial frame is already displayed
+ iRedrawListener->SetFrameCount(aFrameCount);
+ iRedrawListener->RequestRedraw();
+ iTimer->Wait(KAnimationRunTime);
+ if (iAnimData.IsPlaying())
+ {
+ iAnimData.Stop(ETrue);
+ }
+ iRedrawListener->Cancel();
+ iAnimData.Stop(EFalse);
+ Test(iRedrawListener->GetFrameCount() == 0); // ensure the animation ran through until last frame
+ }
+
+void MainL()
+ {
+ TInt testCount = KErrNone;
+
+ //Read the argument from the command line for current screen number
+ TBuf<256> commandLine;
+ User::CommandLine(commandLine);
+ TLex lex(commandLine);
+ lex.NextToken();
+ lex.SkipSpace();
+ TInt screenNumber=(TInt)lex.Get();
+
+ CActiveScheduler* activeScheduler=new(ELeave) CActiveScheduler;
+ CActiveScheduler::Install(activeScheduler);
+ CleanupStack::PushL(activeScheduler);
+
+ CWsGraphicBase testBase(screenNumber);
+ testBase.ConstructL();
+
+ // run through all the tests
+ while (testCount < CWsGraphicBase::ETestMaxNumberOfTests)
+ {
+ testBase.DoTestL(testCount);
+ testCount++;
+ }
+
+ CleanupStack::PopAndDestroy(activeScheduler);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ CTrapCleanup* cleanUpStack=CTrapCleanup::New();
+ if(cleanUpStack==NULL)
+ {
+ return KErrNoMemory;
+ }
+ TRAPD(err, MainL());
+ delete cleanUpStack;
+ return(err);
+ }