windowing/windowserver/tauto/TSPRITE.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/TSPRITE.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,996 @@
+// Copyright (c) 1996-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 "TSPRITE.H"
+
+CTTSprite::CTTSprite(CTestStep* aStep):
+	CTWsGraphicsBase(aStep)
+	{
+	INFO_PRINTF1(_L("Testing TSprite functions"));
+	}
+
+void CTTSprite::SetUpMember(TSpriteMember &aMember)
+	{
+	aMember.iMaskBitmap=NULL;
+	aMember.iInvertMask=EFalse;
+	aMember.iDrawMode=CGraphicsContext::EDrawModePEN;
+	aMember.iOffset=TPoint();
+	aMember.iInterval=TTimeIntervalMicroSeconds32(0);
+	aMember.iBitmap=&iBitmap;
+	}
+
+void CTTSprite::SetUpPointerCursorL(RWsPointerCursor &aCursor, RWsSession &aSession)
+	{
+	aCursor=RWsPointerCursor(aSession);
+	TSpriteMember member;
+	SetUpMember(member);
+	User::LeaveIfError(aCursor.Construct(0));
+	User::LeaveIfError(aCursor.AppendMember(member));
+	User::LeaveIfError(aCursor.Activate());
+	}
+
+void CTTSprite::SetUpSpriteL(RWsSprite &aSprite, RWsSession &aSession, RWindowTreeNode &aWindow,TInt aFlags/*=0*/)
+	{
+	aSprite=RWsSprite(aSession);
+	User::LeaveIfError(aSprite.Construct(aWindow,TPoint(),aFlags));
+	TSpriteMember member;
+	SetUpMember(member);
+	User::LeaveIfError(aSprite.AppendMember(member));
+	User::LeaveIfError(aSprite.Activate());
+	}
+
+void CTTSprite::ConstructL()
+	{
+  	User::LeaveIfError(iBitmap.Load(TEST_BITMAP_NAME,0));
+	}
+	
+CTTSprite::~CTTSprite()
+	{
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0018
+
+@SYMDEF  			DEF081259
+
+@SYMTestCaseDesc    General cursor tests involving a sprite
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Carries out cursor and window tests before updating
+					a cursor's member with a sprite
+
+@SYMTestExpectedResults When the cursor member is update returns KErrArgument
+*/
+
+void CTTSprite::GeneralTestsL()
+	{
+//
+// Close cursor while still active on a window
+//
+	
+	RWindow win(TheClient->iWs);
+	win.Construct(*TheClient->iGroup->GroupWin(),1);
+	win.Activate();
+	SetUpPointerCursorL(iCursor1,TheClient->iWs);
+	win.SetCustomPointerCursor(iCursor1);
+	iCursor1.Close();
+//
+// Close window while cursor active on it
+//
+	SetUpPointerCursorL(iCursor1,TheClient->iWs);
+	win.SetCustomPointerCursor(iCursor1);
+	win.Close();
+	iCursor1.Close();
+	
+//
+// Close session with:
+// An open cursor active on a window & A closed cursor active on another window
+//
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+	// use correct screen
+	//
+	ws.SetFocusScreen(iTest->iScreenNumber);
+	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws);
+	CleanupStack::PushL(screen);
+	User::LeaveIfError(screen->Construct(0));
+
+	RWindowGroup group(ws);
+	User::LeaveIfError(group.Construct(123));
+	group.EnableReceiptOfFocus(EFalse);	// Stop auto group switching on close
+	RWindow win2(ws);
+	User::LeaveIfError(win2.Construct(group, 1));
+	win2.Activate();
+	RWindow win3(ws);
+	User::LeaveIfError(win3.Construct(group, 2));
+	win3.Activate();
+//
+	SetUpPointerCursorL(iCursor1,ws);
+	SetUpPointerCursorL(iCursor2,ws);
+	win2.SetCustomPointerCursor(iCursor1);
+	win3.SetCustomPointerCursor(iCursor2);
+//
+	TSpriteMember member;
+	member.iBitmap=member.iMaskBitmap=NULL;
+	TInt err = iCursor1.UpdateMember(9999,member);
+	TEST(err==KErrArgument);
+	if (err!=KErrArgument)
+		INFO_PRINTF3(_L("iCursor1.UpdateMember(9999,member) return value  - Expected: %d, Actual: %d"), KErrArgument, err);
+
+	iCursor1.Close();
+
+	CleanupStack::PopAndDestroy(screen);	
+	ws.Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0019
+
+@SYMDEF  			DEF081259
+
+@SYMTestCaseDesc    Construct a sprite in a group window
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates a sprite in a group window
+
+@SYMTestExpectedResults The sprite is created without error
+*/
+void CTTSprite::GroupWindowSpritesL()
+	{
+	RWsSprite sprite1;
+	RWsSprite sprite2;
+	SetUpSpriteL(sprite1,TheClient->iWs,*TheClient->iGroup->GroupWin());
+	SetUpSpriteL(sprite2,TheClient->iWs,*TheClient->iGroup->GroupWin());
+	TheClient->iWs.Flush();
+	sprite2.Close();
+	sprite1.Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0020
+
+@SYMDEF  			DEF081259
+
+@SYMTestCaseDesc    Constructs a number of different sprites in different windows
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Creates many sprites in three different windows and the checks
+					the sprites can be manipulated
+
+@SYMTestExpectedResults The sprite are created and manipulated without error
+*/
+#define NUM_SPRITES 8
+void CTTSprite::LotsSpritesL()
+	{
+	CTBlankWindow* win=new(ELeave) CTBlankWindow();
+	CTBlankWindow* win2=new(ELeave) CTBlankWindow();
+	TSize size(100,120);
+	win->ConstructL(*TheClient->iGroup);
+	win2->ConstructL(*win);
+	win2->SetExt(TPoint(100,100),size);
+	win2->SetColor(TRgb::Gray4(2));
+	RWindowBase window=*win->BaseWin();
+	RWindowBase window2=*win2->BaseWin();
+	window.Activate();
+	window2.Activate();
+	RWsSprite sprite[NUM_SPRITES];
+	TInt ii;
+	//TheClient->iWs.SetAutoFlush(ETrue);
+	for (ii=0;ii<NUM_SPRITES;ii++)
+		SetUpSpriteL(sprite[ii],TheClient->iWs,window);
+	sprite[4].Close();
+	sprite[2].SetPosition(TPoint(20,20));
+	sprite[0].Close();
+	win2->SetExt(TPoint(80,100),size);
+	sprite[6].SetPosition(TPoint(60,120));
+	sprite[7].Close();
+	sprite[5].SetPosition(TPoint(100,120));
+	sprite[3].Close();
+	SetUpSpriteL(sprite[7],TheClient->iWs,window);
+	sprite[7].SetPosition(TPoint(80,150));
+	sprite[1].Close();
+	win2->SetExt(TPoint(60,110),size);
+	sprite[5].SetPosition(TPoint(50,40));
+	sprite[7].Close();
+	SetUpSpriteL(sprite[0],TheClient->iWs,window);
+	sprite[0].SetPosition(TPoint(55,65));
+	sprite[6].Close();
+	win2->SetExt(TPoint(40,90),size);
+	sprite[2].SetPosition(TPoint(80,45));
+	sprite[5].Close();
+	sprite[0].SetPosition(TPoint(90,60));
+	sprite[2].Close();
+	SetUpSpriteL(sprite[2],TheClient->iWs,window);
+	sprite[2].SetPosition(TPoint(70,80));
+	sprite[0].Close();
+	win2->SetExt(TPoint(20,80),size);
+	sprite[2].SetPosition(TPoint(600,200));
+	sprite[2].Close();
+	SetUpSpriteL(sprite[0],TheClient->iWs,window2,ESpriteFlash);
+	sprite[0].SetPosition(TPoint(0,25));
+	SetUpSpriteL(sprite[1],TheClient->iWs,window2,ESpriteFlash);
+	SetUpSpriteL(sprite[2],TheClient->iWs,window2,ESpriteFlash);
+	sprite[2].SetPosition(TPoint(25,0));
+	win2->SetExt(TPoint(40,70),size);
+	CTBlankWindow* win3=new(ELeave) CTBlankWindow();
+	win3->ConstructL(*TheClient->iGroup);
+	win3->SetExt(TPoint(30,60),TSize(30,30));
+	win3->SetColor(TRgb::Gray4(1));
+	win3->BaseWin()->SetShadowHeight(10);
+	win3->BaseWin()->Activate();
+	User::After(1000000);		//1 sec so sprites has time to flash
+	delete win2;
+	delete win;
+	delete win3;
+	sprite[0].Close();
+	sprite[1].Close();
+	sprite[2].Close();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0021
+
+@SYMDEF  			DEF081259
+
+@SYMTestCaseDesc    General PointerCursor Tests
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Exercise the different pointercursor methods of a Window Server Session
+
+@SYMTestExpectedResults The methods are called without error
+*/
+void CTTSprite::GeneralPointerCursor()
+	{
+	if (!TestBase()->ConfigurationSupportsPointerEventTesting())
+	    {
+	    INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing"));
+	    return;
+	    }
+	TInt currentSMode=TheClient->iScreen->CurrentScreenMode();
+	TInt altSMode=-1;
+	if (TheClient->iScreen->NumScreenModes()>1)
+		altSMode=(currentSMode==1?0:1);
+	RWsSession &ws=TheClient->iWs;
+	TRect rect=ws.PointerCursorArea();
+	TRect testRect1(TPoint(rect.iBr.iX/4,rect.iBr.iY/4),TSize(rect.Width()/2,rect.Height()/2));
+	TRect testRect2(TPoint(rect.iBr.iX/3,rect.iBr.iY/3),TSize(2*rect.Width()/3,2*rect.Height()/3));
+	ws.SetPointerCursorArea(testRect1);
+	TEST(ws.PointerCursorArea()==testRect1);
+	TEST(ws.PointerCursorArea(currentSMode)==testRect1);
+	ws.SetPointerCursorArea(currentSMode,testRect2);
+	TEST(ws.PointerCursorArea()==testRect2);
+	TEST(ws.PointerCursorArea(currentSMode)==testRect2);
+	ws.SetPointerCursorArea(rect);
+	TEST(ws.PointerCursorArea()==rect);
+	
+	if (altSMode>=0)
+		{
+		rect=ws.PointerCursorArea(altSMode);
+		testRect1.iTl.iX=rect.iBr.iX/4;
+		testRect1.iTl.iY=rect.iBr.iY/4;
+		testRect1.SetWidth(rect.Width()/2);
+		testRect1.SetHeight(rect.Height()/2);
+		ws.SetPointerCursorArea(altSMode,testRect1);
+		TEST(ws.PointerCursorArea(altSMode)==testRect1);
+		ws.SetPointerCursorArea(altSMode,rect);
+		TEST(ws.PointerCursorArea(altSMode)==rect);
+		}
+	TPointerCursorMode currentMode=ws.PointerCursorMode();
+	TInt ii;
+	TInt err1;
+	for(ii=EPointerCursorFirstMode;ii<=EPointerCursorLastMode;ii++)
+		{	
+		ws.SetPointerCursorMode(STATIC_CAST(TPointerCursorMode,ii));
+		err1 = ws.PointerCursorMode();
+		TEST(ii==err1);
+		if (ii!=err1)
+			INFO_PRINTF3(_L("ws.PointerCursorMode() return value  - Expected: %d, Actual: %d"), ii, err1);		
+		}
+	ws.SetPointerCursorMode(currentMode);
+	TEST(currentMode==ws.PointerCursorMode());
+	TPoint point1(10,12);
+	TPoint point2(24,20);
+	ws.PointerCursorPosition();
+	ws.SetPointerCursorPosition(point1);
+	TEST(ws.PointerCursorPosition()==point1);
+	ws.SetPointerCursorPosition(point2);
+	TEST(ws.PointerCursorPosition()==point2);
+	}
+
+
+/**
+@SYMTestCaseID      GRAPHICS-WSERV-0498
+
+@SYMDEF             PDEF137614 - Propagation to TB92
+
+@SYMTestCaseDesc    Test activating a pointer cursor
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Construct and activate a pointer cursor. 
+                    Check it is visible.
+                    Deactivate it
+                    Check it is removed
+                    
+
+@SYMTestExpectedResults 
+                    The pointer cursor bitmp should be visible when activated and removed when deactivated.
+*/
+
+void CTTSprite::PointerCursorVisibleL()
+    {
+    if (!TestBase()->ConfigurationSupportsPointerEventTesting())
+        {
+        INFO_PRINTF1(_L("Test skipped because config does not support pointer event testing"));
+        return;
+        }
+    
+    // The pointer events need time to have an affect on the wserv
+    static const TInt eventPropagationDelay = 100 * 1000; // 100 ms
+    
+    TInt screenNumber = TheClient->iScreen->GetScreenNumber();
+    
+    if(screenNumber != 0) // pointer events only supported on emulator screen 0
+        {
+        LOG_MESSAGE(_L("Pointer Cursor Visible only runs on screen 0"));
+        return;
+        }
+    
+    // set up objects used in test
+    // 50x50 red rectangle colour 24
+    CFbsBitmap bitmap;
+    User::LeaveIfError(bitmap.Load(TEST_BITMAP_NAME, 8));
+    
+    TSize bmSize = bitmap.SizeInPixels();
+    TPoint bmSample = TPoint(bmSize.iWidth / 2, bmSize.iHeight / 2);
+    TRgb bmColour;
+    bitmap.GetPixel(bmColour, bmSample);
+    TEST(bmColour == KRgbRed);
+
+    // single window, size of screen
+    RWindow win(TheClient->iWs);
+    User::LeaveIfError(win.Construct(*TheClient->iGroup->GroupWin(),1));
+    win.Activate();
+
+    // setup cursor mode
+    TheClient->iWs.SetPointerCursorMode(EPointerCursorWindow);
+    
+    // setup cursor to contain single 50x50 red bitmap
+    RWsPointerCursor iCursor1 = RWsPointerCursor(TheClient->iWs);
+    TSpriteMember member;
+    SetUpMember(member);
+    member.iBitmap=&bitmap;
+    User::LeaveIfError(iCursor1.Construct(0));
+    User::LeaveIfError(iCursor1.AppendMember(member));
+    User::LeaveIfError(iCursor1.Activate());
+    win.SetCustomPointerCursor(iCursor1);
+    iCursor1.UpdateMember(0);
+
+    // draw a green rect, size of screen as defined background and wait till it is rendered
+    win.BeginRedraw();
+    TheGc->Activate(win);
+    TheGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+    TheGc->SetBrushColor(KRgbGreen);
+    TSize wSize = win.Size();
+    TheGc->DrawRect(TRect(TPoint(0,0), wSize));
+    TheGc->Deactivate();
+    win.EndRedraw();
+    TheClient->iWs.Finish();
+    
+    // #### do test ####
+    // define locations of simulated pointer events and sample positions of where we expect to see the cursor
+    // The cursor will be moved and a check will be made to see if this has actually happened
+    
+    TPoint pos1(wSize.iWidth / 2, wSize.iHeight / 2); // top left of cursor at centre screen
+    TPoint sample1(pos1 + bmSample); // centre of sprite at pos1
+    TPoint pos2 = pos1 - bmSize; // bottom right of cursor at centre screen
+    TPoint sample2 = pos2 + bmSample;  // centre of sprite at pos2
+
+    TRgb pixel;
+    
+    // check initial state of screen at both sample positions
+    TheClient->iScreen->GetPixel(pixel, sample1);
+    TEST(pixel == KRgbGreen);
+
+    TheClient->iScreen->GetPixel(pixel, sample2);
+    TEST(pixel == KRgbGreen);
+    
+    TRawEvent e; // to simulate pointer events
+
+    // simulate button 1 down event at pos1
+    e.Set(TRawEvent::EButton1Down, pos1.iX, pos1.iY);
+    e.SetDeviceNumber(screenNumber);
+    UserSvr::AddEvent(e);
+
+    User::After(eventPropagationDelay);
+    
+    // check red cursor visible on top of background
+    TheClient->iScreen->GetPixel(pixel, sample1);
+    TEST(pixel == KRgbRed);
+    
+    // simulate button 1 up event
+    e.Set(TRawEvent::EButton1Up, pos1.iX, pos1.iY);
+    UserSvr::AddEvent(e);
+    User::After(eventPropagationDelay);
+    
+    // Move cursor away to pos2 
+    e.Set(TRawEvent::EButton1Down, pos2.iX, pos2.iY);
+    e.SetDeviceNumber(screenNumber);
+    UserSvr::AddEvent(e);
+    
+    User::After(eventPropagationDelay);
+    
+    // check cursor has left this position ...
+    TheClient->iScreen->GetPixel(pixel, sample1);
+    TEST(pixel == KRgbGreen);
+    // and arrived at the correct place
+    TheClient->iScreen->GetPixel(pixel, sample2);
+    TEST(pixel == KRgbRed);
+
+    // simulate button 1 up event
+    e.Set(TRawEvent::EButton1Up, pos2.iX, pos2.iY);
+    UserSvr::AddEvent(e);
+    User::After(eventPropagationDelay);
+    
+    // remove the cursor
+    win.ClearPointerCursor();
+    User::After(eventPropagationDelay);
+    
+    // check it has gone
+    TheClient->iScreen->GetPixel(pixel, sample2);
+    TEST(pixel == KRgbGreen);
+    
+    // #### clean up ####
+    iCursor1.Close();
+    win.Close();
+    }
+
+
+/**
+	@SYMTestCaseID GRAPHICS-CODEBASE-WSERV-0053-0001
+  
+	@SYMPREQ PGM027
+  
+	@SYMTestCaseDesc Tests RWsPointerCursor::UpdateMember APIs. 
+   
+	@SYMTestPriority 1 
+  
+	@SYMTestStatus Implemented
+   
+	@SYMTestActions This test calls RWsPointerCursor::UpdateMember
+		
+	@SYMTestExpectedResults Should run properly with out any Panics.
+
+  */
+void CTTSprite::SpriteUpdateMemberTestsL()
+	{
+	RWsPointerCursor iCursor1;
+	
+	CFbsBitmap bitmap;
+	bitmap.Load(TEST_BITMAP_NAME,0);
+		
+	RWindow win(TheClient->iWs);
+	win.Construct(*TheClient->iGroup->GroupWin(),1);
+	win.Activate();
+
+	iCursor1=RWsPointerCursor(TheClient->iWs);
+	TSpriteMember member;
+	SetUpMember(member);
+	member.iBitmap=&bitmap;
+	User::LeaveIfError(iCursor1.Construct(0));
+	User::LeaveIfError(iCursor1.AppendMember(member));
+	User::LeaveIfError(iCursor1.Activate());
+	win.SetCustomPointerCursor(iCursor1);
+	iCursor1.UpdateMember(0);
+	
+	RWsPointerCursor iCursor2;
+	bitmap.Load(TEST_NEW_BITMAP_NAME,0);
+	iCursor2=RWsPointerCursor(TheClient->iWs);
+	User::LeaveIfError(iCursor2.Construct(0));
+	User::LeaveIfError(iCursor2.AppendMember(member));
+	User::LeaveIfError(iCursor2.Activate());
+	win.SetCustomPointerCursor(iCursor2);
+	iCursor2.UpdateMember(1);
+	
+	iCursor1.Close();
+	iCursor2.Close();
+	win.Close();
+	}
+
+/**
+	@SYMTestCaseID GRAPHICS-CODEBASE-WSERV-0054-0001
+  
+	@SYMPREQ PGM027
+  
+	@SYMTestCaseDesc Negative Tests RWsSpriteBase::UpdateMember API. 
+   
+	@SYMTestPriority 1 
+  
+	@SYMTestStatus Implemented
+   
+	@SYMTestActions This test calls RWsPointerCursor::UpdateMember
+		
+	@SYMTestExpectedResults Should run properly with out any Panics.
+
+ */
+void CTTSprite::SpriteUpdateMemberNegTestsL()
+	{
+	RWsPointerCursor iCursor1;
+	
+	CFbsBitmap bitmap;
+	bitmap.Load(TEST_BITMAP_NAME,0);
+		
+	RWindow win(TheClient->iWs);
+	win.Construct(*TheClient->iGroup->GroupWin(),1);
+	win.Activate();
+
+	iCursor1=RWsPointerCursor(TheClient->iWs);
+	TSpriteMember member;
+	SetUpMember(member);
+	member.iBitmap=&bitmap;
+	User::LeaveIfError(iCursor1.Construct(0));
+	User::LeaveIfError(iCursor1.AppendMember(member));
+	User::LeaveIfError(iCursor1.Activate());
+	win.SetCustomPointerCursor(iCursor1);
+	iCursor1.UpdateMember(-100);
+	
+	RWsPointerCursor iCursor2;
+	bitmap.Load(TEST_NEW_BITMAP_NAME,0);
+	iCursor2=RWsPointerCursor(TheClient->iWs);
+	User::LeaveIfError(iCursor2.Construct(0));
+	User::LeaveIfError(iCursor2.AppendMember(member));
+	User::LeaveIfError(iCursor2.Activate());
+	win.SetCustomPointerCursor(iCursor2);
+	iCursor2.UpdateMember(10000);
+	
+	iCursor1.Close();
+	iCursor2.Close();
+	win.Close();
+	}
+
+/**
+	@SYMTestCaseID GRAPHICS-CODEBASE-WSERV-0055-0001
+  
+	@SYMPREQ PGM027
+  
+	@SYMTestCaseDesc Tests FindWindowGroupIdentifier API. 
+   
+	@SYMTestPriority 1 
+  
+	@SYMTestStatus Implemented
+   
+	@SYMTestActions Create windows session and call FindWindowGroupIdentifier \n
+	with different thread Id's both with valid thread ids and in valid thread id's.
+	
+	@SYMTestExpectedResults Should run properly.
+
+ */	
+void CTTSprite::FindWindowGroupThreadTestsL()	
+	{
+	RThread proc;
+	TInt ident;
+	TUint64 id=proc.Id();
+	RWsSession ws1;
+	User::LeaveIfError(ws1.Connect());
+	CleanupClosePushL(ws1);
+	//Positive test for FindWindowGroupIdentifier
+	ident=ws1.FindWindowGroupIdentifier(0,id);
+	TEST(ws1.SetWindowGroupOrdinalPosition(ident,0)==KErrNone);
+	TEST(ws1.SetWindowGroupOrdinalPosition(ident,1)==KErrNone);
+	//Negative test for FindWindowGroupIdentifier
+    TInt ret=ws1.FindWindowGroupIdentifier(0,id+200);
+	TEST(ret==KErrNotFound);
+	#if defined __WINS__ || defined __WINSCW__
+	ret=ws1.FindWindowGroupIdentifier(0,-200);
+	TEST(ret==KErrNotFound);
+	#endif//defined __WINS__ || defined __WINSCW__
+	CleanupStack::PopAndDestroy(1, &ws1);
+	ws1.Close();
+	}	
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0462
+
+@SYMDEF  			PDEF114190
+
+@SYMTestCaseDesc    Test sprite list cleanup when a window is deleted in low memory conditions
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Have a loop which increases the number of allocations in the server thread before failure;
+					Within the loop:
+					1) Create a parent window and a child window of the parent;
+					2) Create a sprite on the child window; 
+					3) Delete the parent window only, but not the child window; 
+					4) Create a testWindow and do redraw on this window; 
+					5) Do redraw on the testWindow. This testWindow's redraw will force checking the sprite list. 
+					This would panic the client thread due to this defect because the sprite on the orphaned 
+					window (which is the previous child window) is still in the sprite list;
+					6) Delete all the windows involved.
+
+@SYMTestExpectedResults The sprite should be disabled when a window is deleted;
+						The client thread should not be panic'd.
+						The test should pass.
+*/
+void CTTSprite::SpriteOnWindowOrphanedTestsL()
+	{
+	TInt handles = 344;
+	TInt loop = 0;
+	TInt allocFailRate = 0;
+	TInt err = KErrNone;
+
+	CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Create(TSize(500, 500), EColor16MU));
+	TSpriteMember spritemember;
+	spritemember.iBitmap = bitmap;
+	spritemember.iMaskBitmap = NULL;	
+	
+	RWindowGroup group(TheClient->iWs);
+	RWindow parent1(TheClient->iWs);
+	RWindow child1(TheClient->iWs);
+	RWindow testWindow(TheClient->iWs);
+	RWsSprite sprite(TheClient->iWs);
+	
+	while (loop < 5)
+		{
+		TRect mainRect(TPoint(0,0), TSize(500,500));
+		err = group.Construct(++handles, EFalse);	
+		if (err == KErrNone)
+			{
+			TheClient->iWs.HeapSetFail(RHeap::EDeterministic, allocFailRate);
+
+			//Create parent 1
+			err = parent1.Construct(group,++handles);
+			if (err == KErrNone)
+				{
+				parent1.SetExtent(mainRect.iTl, mainRect.Size());
+				parent1.EnableRedrawStore(ETrue);
+				parent1.Activate();
+				}			
+			}
+		
+		//Create child 1
+		if (err == KErrNone)
+			{
+			TRect childRect(TPoint (10, 10), TSize (200, 150));
+			err = child1.Construct(parent1,++handles);
+			if (err == KErrNone)
+				{
+				child1.SetExtent(childRect.iTl, childRect.Size());
+				child1.SetBackgroundColor(TRgb(128,100,255,20));
+				child1.Activate();
+				}
+			}
+		
+		//Add sprite to child 1
+		if (err == KErrNone) 
+			{
+			err = sprite.Construct(child1,TPoint(10,10), 0);
+			if (err == KErrNone)
+				{
+				err = sprite.AppendMember(spritemember);
+				if (err == KErrNone)
+					err = sprite.Activate();	
+				}
+			}
+
+		//Only delete parent 1, but not child 1	
+		parent1.Close();		
+
+		if (err == KErrNone) 
+			{
+			TRect testRect(TPoint(10, 30), TSize(200, 150));
+			//Create testWindow
+			err = testWindow.Construct(group,++handles);
+			if (err == KErrNone)
+				{
+				testWindow.SetExtent(testRect.iTl, testRect.Size());
+				testWindow.SetBackgroundColor(TRgb(128,100,255,20));
+				testWindow.EnableRedrawStore(ETrue);
+				testWindow.Activate();
+				testWindow.BeginRedraw();
+				testWindow.EndRedraw();	
+				TheClient->Flush();			
+				}
+			}
+		TheClient->iWs.HeapSetFail(RAllocator::ENone, 0);
+
+		sprite.Close();
+		child1.Close();
+		testWindow.Close();
+		group.Close();		
+		++allocFailRate;
+		loop = (err == KErrNone) ? loop + 1 : 0;
+		}
+	CleanupStack::PopAndDestroy(bitmap);
+	}
+void CTTSprite::ResizeMemberL()
+	{
+#ifndef __WINS__
+	CTBlankWindow* win=new(ELeave) CTBlankWindow();
+	CleanupStack::PushL(win);
+	win->ConstructL(*TheClient->iGroup);
+	win->SetExt(TPoint(),TSize(640,240));
+	RWindowBase& window=*win->BaseWin();
+	window.Activate();
+	RWsSprite sprite(TheClient->iWs);
+	CleanupClosePushL(sprite);
+	User::LeaveIfError(sprite.Construct(window,TPoint(),0));
+	TSpriteMember member;
+	member.iMaskBitmap=NULL;
+	member.iInvertMask=EFalse;
+	member.iDrawMode=CGraphicsContext::EDrawModePEN;
+	member.iOffset=TPoint();
+	member.iInterval=TTimeIntervalMicroSeconds32(250000);
+	member.iBitmap=&iBitmap;
+	User::LeaveIfError(sprite.AppendMember(member));
+	User::LeaveIfError(sprite.AppendMember(member));
+	User::LeaveIfError(sprite.Activate());
+	User::After(1000000); // // Interval is 1 sec.
+	User::LeaveIfError(iBitmap.Resize(iBitmap.SizeInPixels() + TSize(100,100)));
+	User::After(1000000);  // Interval is 1 sec.
+	CleanupStack::PopAndDestroy(&sprite);
+	CleanupStack::PopAndDestroy(win);
+#endif // __WINS__
+	}
+
+
+void CTTSprite::SetUpSpriteL(RWsSprite &aSprite, RWindowTreeNode &aWindow,TPoint aPoint, TSpriteMember aMember, TInt aFlags/*=0*/)
+	{
+	User::LeaveIfError(aSprite.Construct(aWindow,aPoint,aFlags));
+	User::LeaveIfError(aSprite.AppendMember(aMember));
+	User::LeaveIfError(aSprite.Activate());
+	}
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-00-0001
+
+@SYMDEF  			PDEF117721
+
+@SYMTestCaseDesc    Test Screenrotation does not cause panic by sprite with NULL bitmap and NULL maskbitmap
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Defines two sprites and one with Null iBitmap and Null iMaskBitmap, then rotate the screen to 90 degrees
+
+@SYMTestExpectedResults the screen rotation will not cause wserv a panic
+*/
+void CTTSprite::RotateNullSpriteL()
+	{
+	if (TheClient->iScreen->NumScreenModes() < 2)
+		{
+		LOG_MESSAGE(_L("WARNING: Unable to rotate screen"));
+		return;
+		}
+// Sprite Members		
+	TSpriteMember spriteMember1,spriteMember2;
+	SetUpMember(spriteMember1);
+	SetUpMember(spriteMember2);
+	spriteMember2.iBitmap = NULL;
+	
+// Create windows
+	RWindowGroup group(TheClient->iWs);
+	User::LeaveIfError(group.Construct(ENullWsHandle,EFalse));	//Creates a Group Window
+	CleanupClosePushL(group);
+	RBlankWindow win(TheClient->iWs);
+	User::LeaveIfError(win.Construct(group,ENullWsHandle));	//Creates a Blank Window
+	CleanupClosePushL(win);
+	win.SetVisible(ETrue);
+	win.SetColor(TRgb::Gray4(2));
+	win.Activate();
+	TheClient->Flush();
+	
+// Create Sprites
+	RWsSprite sprite1(TheClient->iWs);
+	CleanupClosePushL(sprite1);
+	SetUpSpriteL(sprite1, win,TPoint(20,70),spriteMember1,0);
+	RWsSprite sprite2(TheClient->iWs);
+	CleanupClosePushL(sprite2);
+	SetUpSpriteL(sprite2, win,TPoint(80,130),spriteMember2,0);
+	RWsSprite sprite3(TheClient->iWs);
+	CleanupClosePushL(sprite3);
+	SetUpSpriteL(sprite3, win,TPoint(2800,2130),spriteMember1,0);
+	TheClient->Flush();
+
+// Get the original screen mode	
+	CWsScreenDevice* device = TheClient->iScreen;
+	TInt originalScreenMode = device->CurrentScreenMode();
+	TPixelsTwipsAndRotation originalModeSettings;
+	device->GetScreenModeSizeAndRotation(originalScreenMode,originalModeSettings);
+
+// Rotate screens	
+	TPixelsAndRotation pixelsAndRotation;
+	device->SetScreenMode( 1 );
+	device->GetDefaultScreenSizeAndRotation(pixelsAndRotation);
+	device->SetCurrentRotations(1,pixelsAndRotation.iRotation);
+	device->SetScreenSizeAndRotation(pixelsAndRotation);
+	User::After(1000000);
+	
+	CleanupStack::PopAndDestroy(5,&group);
+//	Restore the original screen mode	
+	device->SetScreenMode(originalScreenMode);
+	device->SetCurrentRotations(originalScreenMode,originalModeSettings.iRotation);
+	device->SetScreenSizeAndRotation(originalModeSettings);
+	TheClient->Flush();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-GCE-0700
+
+@SYMDEF  			DEF123129
+
+@SYMTestCaseDesc    Test activating a sprite twice does not cause the system to hang
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Construct a sprite and add a member to it. Activate twice.
+
+@SYMTestExpectedResults The test should terminate smoothly and it should not hang the system.
+*/
+void CTTSprite::DoubleActivateL()
+	{
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect());
+	CleanupClosePushL(ws);
+	
+	RWindowGroup group(ws);
+	User::LeaveIfError(group.Construct(890, EFalse));
+	CleanupClosePushL(group);
+	
+	RWsSprite sprite = RWsSprite(ws);
+	User::LeaveIfError(sprite.Construct(group,TPoint(),0));
+	CleanupClosePushL(sprite);
+	CFbsBitmap* bitmap=new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Create(TSize(10,12),EColor256));
+	TSpriteMember member;
+	member.iMaskBitmap=NULL;
+	member.iInvertMask=EFalse;
+	member.iDrawMode=CGraphicsContext::EDrawModePEN;
+	member.iOffset=TPoint();
+	member.iInterval=TTimeIntervalMicroSeconds32(0);
+	member.iBitmap=bitmap;
+	User::LeaveIfError(sprite.AppendMember(member));
+	User::LeaveIfError(sprite.Activate());
+	User::LeaveIfError(sprite.Activate());
+	
+	sprite.Close();
+	CleanupStack::PopAndDestroy(4, &ws);
+	
+	group.Close();
+	ws.Close();
+	}
+
+void CTTSprite::RunTestCaseL(TInt /*aCurTestCase*/)
+	{	
+	_LIT(KTest1, "General Tests");
+	_LIT(KTest2, "Group Window Sprites Tests");
+	_LIT(KTest3, "Lots Sprites Tests");
+	_LIT(KTest4, "General Pointer Cursor Tests");
+    _LIT(KTest5, "Pointer Cursor Visible Tests");
+    _LIT(KTest6, "Update member tests");
+    _LIT(KTest7, "Negative tests for Update member");
+    _LIT(KTest8, "Window Group with Thread");
+    _LIT(KTest9, "Resize Sprite Member Tests");
+    _LIT(KTest10, "Rotate a NULL sprite");
+    _LIT(KTest11, "Sprite On Window Orphaned Tests");
+    _LIT(KTest12, "Sprite Double Activation Test");
+	
+	((CTTSpriteStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(++iTest->iState)
+		{
+	case 1:		
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0018"));
+		TheClient->iWs.SetFocusScreen(0);
+		iTest->LogSubTest(KTest1);
+		GeneralTestsL();
+		break;
+	case 2:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0019"));
+		iTest->LogSubTest(KTest2);
+		GroupWindowSpritesL();
+		break;
+	case 3:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0020"));
+		iTest->LogSubTest(KTest3);
+		LotsSpritesL();
+		break;
+	case 4:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0021"));
+		iTest->LogSubTest(KTest4);
+		GeneralPointerCursor();
+		break;
+    case 5:
+        ((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0498"));
+        iTest->LogSubTest(KTest5);
+        TRAPD(err, PointerCursorVisibleL());
+        TEST(err == KErrNone);
+        break;
+	case 6:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-CODEBASE-WSERV-0053-0001"));
+		iTest->LogSubTest(KTest6);
+		TRAP(err, SpriteUpdateMemberTestsL());
+		TEST(err == KErrNone);
+		break;
+	case 7:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-CODEBASE-WSERV-0054-0001"));
+		iTest->LogSubTest(KTest7);
+		TRAP(err, SpriteUpdateMemberNegTestsL());
+		TEST(err == KErrNone);
+		break;
+	case 8:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-CODEBASE-WSERV-0055-0001"));
+		iTest->LogSubTest(KTest8);
+		TRAP(err, FindWindowGroupThreadTestsL());
+		TEST(err == KErrNone);
+		break;
+	case 9:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0526"));
+		iTest->LogSubTest(KTest9);
+		ResizeMemberL();
+		break;
+	case 10:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-00-0001"));
+		iTest->LogSubTest(KTest10);
+		RotateNullSpriteL();
+		break;
+	case 11:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0462"));
+		iTest->LogSubTest(KTest11);
+		SpriteOnWindowOrphanedTestsL();
+		break;
+	case 12:
+		((CTTSpriteStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-GCE-0700"));
+		iTest->LogSubTest(KTest12);
+		DoubleActivateL();
+		break;
+	default:
+		((CTTSpriteStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTTSpriteStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+		}
+	((CTTSpriteStep*)iStep)->RecordTestResultL();
+	}
+
+//--------------
+__WS_CONSTRUCT_STEP__(TSprite)
+