lafagnosticuifoundation/bmpanimation/tef/TAutoAnStep.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/bmpanimation/tef/TAutoAnStep.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,537 @@
+// Copyright (c) 2006-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:
+// Extended existing test for UIKON GT0143 Typhoon Work Series 60 Changes
+// UIKON GT0143 Typhoon Work Series 60 Changes
+// REQ815.1: Add a new op-code EBitmapAnimCommandStartAnimationAndKeepLastFrame
+// Added a new class RTestBitmapAnim, which inherits from RBitmapAnim and
+// calls CommandReply with the new op-code
+// Added a new test BmpAnimTest::TestStartAnimationAndKeepLastFrameL to 
+// use RTestBitmapAnim
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <s32mem.h>
+#include <w32std.h>
+#include <fbs.h>
+#include <tautoan.mbg>
+
+#include <bmpansrv.h>
+#include "bmpanpan.h"
+#include "TAutoAnStep.h"
+
+TInt PanicTestThread(TAny* aOption);
+
+enum TPanicOption
+	{
+	EFirst,
+	ENegativeFrameInterval,
+	EUnknownPanicOption,	
+	ELast
+	};
+
+_LIT(KDefaultBitmapPath,"z:\\resource\\apps\\Tautoan\\Tautoan.mbm");
+
+const TInt KValueForSixFrames = 600;//Total time for 6 frames
+
+const TInt KNegativeFrameInterval = -100;
+
+//
+// CWsClient
+//
+
+CWsClient::CWsClient()
+	{
+	}
+
+void CWsClient::ConstructL()
+	{
+	User::LeaveIfError(iWs.Connect());
+	iGroup=RWindowGroup(iWs);
+	User::LeaveIfError(iGroup.Construct(2));
+	}
+
+CWsClient::~CWsClient()
+	{
+	iGroup.Close();
+	iWs.Close();
+	}
+
+//
+// RTestBitmapAnim
+//
+RTestBitmapAnim::RTestBitmapAnim(RAnimDll& aAnimDll)
+	:RBitmapAnim(aAnimDll)
+	{
+	}
+
+void RTestBitmapAnim::StartAndKeepLastFrameL()
+	{
+	CommandReply(EBitmapAnimCommandStartAnimationAndKeepLastFrame);
+	}
+
+//
+// BmpAnimTest
+//
+
+CBitmapAnimClientData* CTAutoAnStep::CreateClientDataL()
+	{
+	CBitmapAnimClientData* clientData = CBitmapAnimClientData::NewL();
+	CleanupStack::PushL(clientData);
+
+	CFbsBitmap* bitmap=new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Load(KDefaultBitmapPath, EMbmTautoanTextured));
+	CFbsBitmap* mask = NULL;
+	
+	CBitmapFrameData* frameData = CBitmapFrameData::NewL(bitmap, mask);
+	CleanupStack::Pop();	// backgroundbitmap
+
+
+	clientData->SetBackgroundFrame(frameData);
+	
+	TPoint position(10, 10);
+	TInt milliSeconds = 100;
+	TInt count = 6;
+	for(TInt index=0; index<count; index++)
+		{
+		 bitmap=new(ELeave) CFbsBitmap;
+		 CleanupStack::PushL(bitmap);
+		 User::LeaveIfError(bitmap->Load(KDefaultBitmapPath, EMbmTautoanRedball));
+		 mask=new(ELeave) CFbsBitmap;
+		 CleanupStack::PushL(mask);
+		 User::LeaveIfError(mask->Load(KDefaultBitmapPath, EMbmTautoanRedballm));
+
+		 frameData = CBitmapFrameData::NewL(bitmap, mask, milliSeconds, position);
+		 frameData->SetBitmapsOwnedExternally(EFalse);
+		 CleanupStack::PushL(frameData);
+		 CleanupStack::Pop(2);	// bitmap, mask
+		 clientData->AppendFrameL(frameData);
+		 CleanupStack::Pop();
+		}
+	CleanupStack::Pop();
+	return clientData;
+	}
+
+void CTAutoAnStep::Test1L(CTestingData* aTestingData)
+	{
+	__UHEAP_MARK;
+	RWindow window = aTestingData->iWindow;
+	RBitmapAnim animation = aTestingData->iAnimation;
+	CBitmapAnimClientData* clientData = NULL;
+
+	TRAPD(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	clientData->SetPlayMode(CBitmapAnimClientData::EPlay);
+	clientData->SetFrameInterval(0);
+	clientData->SetFlash(EFalse);
+	TestWindowConstructL(animation,window,clientData);
+
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	clientData->ResetFrameArray();
+	TestWindowConstructL(animation,window,clientData);
+		
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	TInt count = clientData->FrameArray().Count();
+	TInt index=0;
+	for(index=0; index<count; index++)
+		{
+		  CBitmapFrameData* frameData = clientData->FrameArray().At(index);
+		  frameData->SetInterval(-1);
+		}
+	TestWindowConstructL(animation,window,clientData);
+
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	count = clientData->FrameArray().Count();
+	CBitmapFrameData* frameData = NULL;
+	for(index=0; index<count; index++)
+		{
+		  frameData = clientData->FrameArray().At(index);
+		  frameData->SetPosition(TPoint(0, 0));
+		}
+	TestWindowConstructL(animation,window,clientData);
+
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	clientData->SetBackgroundFrame(NULL);
+	TestWindowConstructL(animation,window,clientData);
+
+	//testing setbitmapOwnedExternally()	
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	frameData->SetBitmapsOwnedExternally(EFalse);
+	TBool val = frameData->BitmapsOwnedExternally();
+	TEST(val == EFalse);
+	INFO_PRINTF1(_L("Test BitmapOwnedExternally Passed"));
+	TestWindowConstructL(animation,window,clientData);
+
+	//testing ResetFrameArray()
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	count = clientData->FrameArray().Count();
+	for(index=0; index<count; index++)
+		{
+		  CBitmapFrameData* frameData = clientData->FrameArray().At(index);
+		  frameData->SetInterval(-1);
+		}
+	clientData->ResetFrameArray();
+	val = clientData->FrameArray().Count();
+	TEST(val == 0);
+	TestWindowConstructL(animation,window,clientData);
+	
+	//TESTING SetPositionL() -greater than screen size//
+	TSize area = window.Size();
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	TRAP(error,animation.SetPositionL(TPoint(area.iWidth+10,area.iHeight+10)));
+	TEST(error == KErrNone);
+	TestWindowConstructL(animation,window,clientData);
+	
+	//SetPositionL() - negative value
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	TRAP(error, animation.SetPositionL(TPoint(-10,-10)));
+	TEST(error == KErrNone);
+	TestWindowConstructL(animation,window,clientData);
+		
+	//DurationInMilliSeconds()...6 frames...100ms each
+	TRAP(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	TInt timeinmillisec = clientData->DurationInMilliSeconds();
+	TEST(timeinmillisec == KValueForSixFrames);
+	TestWindowConstructL(animation,window,clientData);
+	
+	RFbsSession::Disconnect();
+	__UHEAP_MARKEND;
+	RFbsSession::Connect();
+	}
+
+
+void CTAutoAnStep::TestWindowConstructL(RBitmapAnim& animation,RWindow& window,CBitmapAnimClientData* clientData)
+	{
+	TRAPD(error, animation.ConstructL(window));
+	TEST(error == KErrNone);
+	TRAP(error, animation.SetBitmapAnimDataL(*clientData));
+	TEST(error == KErrNone);
+	TRAP(error, animation.StartL());
+	TEST(error == KErrNone);
+	User::After(1000000);
+	TRAP(error, animation.StopL());
+	TEST(error == KErrNone);
+	delete clientData;	
+	}
+
+
+void CTAutoAnStep::Test2L(CTestingData* aTestingData)
+	{
+	__UHEAP_MARK;
+	RWindow window = aTestingData->iWindow;
+	RBitmapAnim animation = aTestingData->iAnimation;
+
+	CBitmapAnimClientData* clientData = NULL;
+	TRAPD(error, clientData = CTAutoAnStep::CreateClientDataL());
+	TEST(error == KErrNone);
+	TRAP(error, animation.ConstructL(window));
+	TEST(error == KErrNone);		
+	TRAP(error, animation.StartL());
+	TEST(error == KErrNone);
+	User::After(1000000);
+	TRAP(error, animation.StopL());
+	TEST(error == KErrNone);
+	INFO_PRINTF1(_L("Executing Test2L"));
+
+	TRAP(error, animation.SetBitmapAnimDataL(*clientData));
+	TEST(error == KErrNone);
+	
+	TRAP(error, animation.DisplayFrameL(3));
+	TEST(error == KErrNone);
+	
+	TRAP(error, animation.SetFrameIntervalL(200000));
+	TEST(error == KErrNone);
+		
+	TRAP(error, animation.SetNumberOfCyclesL(1));
+	TEST(error == KErrNone);
+	
+	TRAP(error, animation.SetPlayModeL(CBitmapAnimClientData::ECycle));
+	TEST(error == KErrNone);
+		
+	TRAP(error, animation.SetPositionL(TPoint(20,20)));
+	TEST(error == KErrNone);
+
+	TRAP(error, animation.SetNumberOfCyclesL(-1));
+	TEST(error == KErrNone);
+			
+	TRAP(error, animation.SetPlayModeL(CBitmapAnimClientData::EBounce));
+	TRAP(error, animation.SetNumberOfCyclesL(1));
+	TEST(error == KErrNone);
+		
+	TRAP(error,animation.DisplayFrameL(-1));
+	TEST(error == KErrOverflow);
+	
+	
+	delete clientData;
+	RFbsSession::Disconnect();
+	__UHEAP_MARKEND;
+	RFbsSession::Connect();
+	
+	}
+
+
+void CTAutoAnStep::CreatedAndCloseAnimationsL(CTestingData* aTestingData)
+	{
+	__UHEAP_MARK;
+	RAnimDll animDll = aTestingData->iAnimDll;
+	RWindow window = aTestingData->iWindow;
+	RBitmapAnim animation = aTestingData->iAnimation;
+	animation.ConstructL(window);
+
+	RBitmapAnim tempAnimation(animDll);
+	tempAnimation.Close();
+	RBitmapAnim tempAnimation1(animDll);
+	RBitmapAnim tempAnimation2(animDll);
+	tempAnimation2.ConstructL(window);
+
+	RBitmapAnim tempAnimation3(animDll);
+	tempAnimation3.ConstructL(window);
+
+	RBitmapAnim tempAnimation4(animDll);
+	tempAnimation4.ConstructL(window);
+
+	RBitmapAnim tempAnimation5(animDll);
+	tempAnimation5.ConstructL(window);
+
+	tempAnimation2.StartL();
+
+	tempAnimation2.Close();
+	tempAnimation1.Close();
+	tempAnimation3.Close();
+	tempAnimation4.Close();
+	tempAnimation5.Close();
+	__UHEAP_MARKEND;
+	}
+
+/**
+   @SYMTestCaseID		UIF-BMPANIM-0001
+   @SYMDEF				DEF085516
+   @SYMTestCaseDesc 	It tests the behaviour of the API SetFrameInterval( ) for negative time.   				
+   @SYMTestPriority 	High
+   @SYMTestStatus 		Implemented
+   @SYMTestActions 		Set time to the frames present in the clientData,through the SetFrameInterval() API of CBitmapAnimClientData.
+   						Pass a negative value as parameter to the API.
+   @SYMTestExpectedResults  	It should  panic in debug mode with Panic EAnimationClientPanicFrameIntervalNegative and in release mode it should not panic.
+  
+ */
+
+void CTAutoAnStep::TestNegativeFrameIntervalL()
+	{
+#ifdef _DEBUG//only in debug mode, the following code is used
+	RThread thrd;
+	TRequestStatus stat;
+	TInt ret=thrd.Create(_L("ptt"),PanicTestThread,KDefaultStackSize,0x2000,0x20000,(TAny*)ENegativeFrameInterval);
+	User::LeaveIfError(ret);
+	thrd.SetPriority(EPriorityMuchMore);
+	thrd.Logon(stat);
+	User::SetJustInTime(EFalse);
+	thrd.Resume();
+	User::WaitForRequest(stat);
+	TEST(thrd.ExitType()==EExitPanic); 
+	TEST(thrd.ExitReason()==EAnimationClientPanicFrameIntervalNegative);
+	INFO_PRINTF2(_L("TestNegativeFrameIntervalL panic=%d"), thrd.ExitReason());
+	thrd.Close();
+	User::SetJustInTime(ETrue);
+	INFO_PRINTF1(_L("TestNegativeFrameIntervalL test case finished in udeb mode"));
+#else//only in urel mode , the following code is called
+	CBitmapAnimClientData* clientData = CBitmapAnimClientData::NewL();
+	CleanupStack::PushL(clientData);
+
+	CFbsBitmap* bitmap=new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Load(KDefaultBitmapPath, EMbmTautoanTextured));
+	CFbsBitmap* mask = NULL;
+	
+	CBitmapFrameData* frameData = CBitmapFrameData::NewL(bitmap, mask);
+	CleanupStack::Pop();	// backgroundbitmap
+
+	clientData->SetBackgroundFrame(frameData);
+	clientData->SetFrameInterval(KNegativeFrameInterval);
+	TInt count = 3;
+	for(TInt index=0; index<count; index++)
+		{
+		bitmap=new(ELeave) CFbsBitmap;
+		CleanupStack::PushL(bitmap);
+		User::LeaveIfError(bitmap->Load(KDefaultBitmapPath, EMbmTautoanRedball));
+		mask=new(ELeave) CFbsBitmap;
+		CleanupStack::PushL(mask);
+		User::LeaveIfError(mask->Load(KDefaultBitmapPath, EMbmTautoanRedballm));
+
+		frameData = CBitmapFrameData::NewL(bitmap, mask);
+		frameData->SetBitmapsOwnedExternally(EFalse);
+		CleanupStack::PushL(frameData);
+		CleanupStack::Pop(2);	// bitmap, mask
+		clientData->AppendFrameL(frameData);
+		CleanupStack::Pop();
+		}
+	CleanupStack::Pop();
+	TEST(clientData->FrameIntervalInMilliSeconds() == KNegativeFrameInterval);
+	delete clientData;	
+	INFO_PRINTF1(_L("TestNegativeFrameIntervalL test case finished in urel mode"));
+#endif	
+	}
+	
+//The following thread should panic under debug mode
+TInt PanicTestThread(TAny* aOption)
+	{
+	CTrapCleanup::New();
+	RFbsSession::Connect();
+	
+	const TInt option = TInt(aOption);
+	switch (option)
+		{
+		case ENegativeFrameInterval:
+			{
+			CBitmapAnimClientData* clientData=NULL;
+			TRAPD(ret,clientData=CBitmapAnimClientData::NewL());
+			if(ret!=KErrNone)
+				User::Panic(_L(" TAutoAnStep Failed"),ret);
+			clientData->SetFrameInterval(KNegativeFrameInterval);	//The negative time is the reason for panic
+			delete clientData;
+			}
+		default:
+			User::Panic(_L("TAutoAnStep error"), EUnknownPanicOption);
+		}
+	
+	return KErrNone;
+	}
+
+
+	
+void CTAutoAnStep::TestStartAnimationAndKeepLastFrameL(CTestingData* aTestingData)
+	{
+	__UHEAP_MARK;
+	RWindow window = aTestingData->iWindow;
+	RTestBitmapAnim animation(aTestingData->iAnimDll);
+	animation.ConstructL(window);
+	animation.StartAndKeepLastFrameL();
+	animation.StopL();
+	animation.Close();
+	__UHEAP_MARKEND;
+	}
+
+void CTAutoAnStep::ExcuteTestCodeL()
+	{
+	__UHEAP_MARK;
+// Make Ws client
+	INFO_PRINTF1(_L("Connecting to Windows Server"));
+	CWsClient* client = new (ELeave) CWsClient;	// allocate new client
+	CleanupStack::PushL(client);				// push, just in case
+	client->ConstructL();						// construct and run
+	CleanupStack::Pop();						// client
+
+//
+// Creates and deletes to bitmaps in order to allocate KDefaultBitmapPath in the cache for FBserv
+// This is necessary to check for memory leaks.
+	CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+	INFO_PRINTF1(_L("Trying to Load Bitmap"));
+	User::LeaveIfError(bitmap->Load(KDefaultBitmapPath, EMbmTautoanRedball));
+	CFbsBitmap* mask = new(ELeave) CFbsBitmap;
+	User::LeaveIfError(mask->Load(KDefaultBitmapPath, EMbmTautoanRedballm));
+	delete bitmap;
+	delete mask;
+//
+
+// Create an animation.
+	RWsSession wsSession = client->WindowSession();
+	RAnimDll animDll(wsSession);
+	User::LeaveIfError(animDll.Load(_L("BmpAnSrv.DLL")));
+
+	RWindow window(wsSession);
+	RWindowGroup windowGroup = client->WindowGroup();
+	window.Construct(windowGroup, 123);
+
+	RBitmapAnim animation(animDll);
+
+// Create the packaging object
+	CTestingData testingData(animDll, animation, window);
+
+// Start tests
+
+	INFO_PRINTF1(_L("Test 1: Create/Run/Stop an animation."));
+	TRAPD(err,CTAutoAnStep::Test1L(&testingData));
+	TEST(err==KErrNone);
+
+	INFO_PRINTF1(_L("Test 2: Changes Attribute when running"));
+	TRAP(err,CTAutoAnStep::Test2L(&testingData));
+	TEST(err==KErrNone);
+
+	INFO_PRINTF1(_L("Test 3: Create/Close many animations"));
+	TRAP(err,CTAutoAnStep::CreatedAndCloseAnimationsL(&testingData));
+	TEST(err==KErrNone);
+	
+	SetTestStepID(_L("UIF-BMPANIM-0001"));
+	INFO_PRINTF1(_L("Test 4: Set Negative frameinterval"));
+	TRAP(err,CTAutoAnStep::TestNegativeFrameIntervalL());
+	TEST(err==KErrNone);
+	RecordTestResultL();
+	CloseTMSGraphicsStep();
+
+	// Series60 Specific Test
+	INFO_PRINTF1(_L("Test 5: Start Animation and Keep Last Frame"));
+	TRAP(err,CTAutoAnStep::TestStartAnimationAndKeepLastFrameL(&testingData));
+	TEST(err==KErrNone);
+
+	animation.Close();
+	animDll.Close();
+	delete client;
+	__UHEAP_MARKEND;
+	}
+
+CTAutoAnStep::~CTAutoAnStep()
+/**
+   Destructor
+ */
+	{
+	}
+
+CTAutoAnStep::CTAutoAnStep()
+/**
+   Constructor
+ */
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KTAutoAnStep);
+	}
+
+
+TVerdict CTAutoAnStep::doTestStepL()
+	{
+	 INFO_PRINTF1(_L("Test Started"));
+
+     __UHEAP_MARK;
+	 TRAPD(error, ExcuteTestCodeL());				// more initialization, then excute test
+     __ASSERT_ALWAYS(!error, User::Panic(_L("TAUTOAN"), error));
+     __UHEAP_MARKEND;
+	
+	 INFO_PRINTF1(_L("Test Finished"));
+
+	 return TestStepResult();
+	}
+