graphicsresourceservices/graphicsresource/test/tsgimagegeneric.cpp
author Gareth Stockwell <gareth.stockwell@accenture.com>
Fri, 22 Oct 2010 11:38:29 +0100
branchbug235_bringup_0
changeset 206 c170e304623f
parent 0 5d03bc08d59c
permissions -rw-r--r--
Modifed eglbringuptest to compile against S^3 SDK; added a pkg file The S^3 SDK lacks libopenvgu.lib. Since this test app does not require that library, it is simply removed from the .mmp file.

// Copyright (c) 2007-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 "tsgimagegeneric.h"
#include <hal.h>
#include <e32math.h>

CTSgImageGeneric::CTSgImageGeneric()
	{
	INFO_PRINTF1(_L("Graphics resource component test - RSgImage Generic Tests.\r\n"));
	}

CTSgImageGeneric::~CTSgImageGeneric()
	{
	TInt count = iTestImages.Count();
	for(TInt i=0; i<count; ++i)
		{
		iTestImages[i].Close();
		}	
	iTestImages.Reset();
	}

/** 
Overrides of base class pure virtual
Our implementation only gets called if the base class doTestStepPreambleL() did
not leave. That being the case, the current test result value will be EPass.
@leave Gets system wide error code
@return TVerdict code
*/
TVerdict CTSgImageGeneric::doTestStepL()
	{
	SetTestStepID(_L("GRAPHICS-RESOURCE-0003"));
	INFO_PRINTF1(_L("Getting pixel formats supported on all platforms.\r\n"));
	TestGetPixelFormatsL();
	RecordTestResultL();	

	SetTestStepID(_L("GRAPHICS-RESOURCE-0004"));
	INFO_PRINTF1(_L("Create an uninitialised image.\r\n"));
	TestCreateImageUninitializedL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0005"));
	INFO_PRINTF1(_L("Create an image from a block of memory.\r\n"));
	TestCreateImageL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0006"));
	INFO_PRINTF1(_L("Create an image from an existing image.\r\n"));
	TestCreateImageFromExistingImageL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0007"));
	INFO_PRINTF1(_L("Getting information about the image.\r\n"));
	TestGetImageInfoL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0008"));
	INFO_PRINTF1(_L("Retrieving drawable id of an image.\r\n"));
	TestGetImageDrawableIdL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0009"));
	INFO_PRINTF1(_L("Mapping and unmapping an image from its creator process.\r\n"));
	TestMapImageL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0010"));
	INFO_PRINTF1(_L("Opening a handle to an image in both the current process and another process.\r\n"));
	TestOpenImageL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0011"));
	INFO_PRINTF1(_L("Opening a handle to an image with an open mode.\r\n"));
	TestOpenImageInternalL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0044"));
	INFO_PRINTF1(_L("Getting the available interfaces from an image.\r\n"));	
	TestGetInterfaceL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0024"));
	INFO_PRINTF1(_L("Getting supported pixel formats with invalid parameters.\r\n"));
	TestGetPixelFormatsInvalidL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0025"));
	INFO_PRINTF1(_L("Opening an image with different invalid parameters.\r\n"));
	TestOpenImageInvalidL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0026"));
	INFO_PRINTF1(_L("Closing the handle to an image object multiple times.\r\n"));
	TestCloseImageManyTimesL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0027"));
	INFO_PRINTF1(_L("Closing the handle to an image object without opening it.\r\n"));
	TestCloseImageWithoutOpenL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0028"));
	INFO_PRINTF1(_L("Creating an image with various invalid parameters.\r\n"));
	TestCreateImageInvalidL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0039"));
	INFO_PRINTF1(_L("Getting information about an invalid image.\r\n"));
	TestGetInfoInvalidImageL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0030"));
	INFO_PRINTF1(_L("Mapping an image under various invalid conditions. \r\n"));
	TestMapImageInvalidL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0031"));
	INFO_PRINTF1(_L("Unmapping an image under various invalid conditions.\r\n"));
	TestUnmapImageInvalidL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0048"));
	INFO_PRINTF1(_L("RSgImage generic stress test.\r\n"));
	TestStress1L();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0049"));
	INFO_PRINTF1(_L("RSgImage generic multi-thread stress test.\r\n"));
	TestStress2L();
	RecordTestResultL();

#ifdef _DEBUG
/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0095
*/
	SetTestStepID(_L("GRAPHICS-RESOURCE-0095"));
	INFO_PRINTF1(_L("RSgImage generic Out of memory test.\r\n"));
	TestOOM();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0052"));
	INFO_PRINTF1(_L("RSgImage generic panic test - GetInterface() with invalid image handle\r\n"));
	TestPanicImageGetInterfaceInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0052"));
	INFO_PRINTF1(_L("RSgImage generic panic test - GetInterface() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageGetInterfaceNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0053"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Close() with invalid image handle\r\n"));
	TestPanicImageCloseInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0054"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Close() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageCloseNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0055"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Id() with invalid image handle\r\n"));
	TestPanicImageIdInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0056"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Id() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageIdNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0057"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Create() with invalid image handle\r\n"));
	TestPanicImageCreateInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0058"));
	INFO_PRINTF1(_L("RSgImage generic panic test - GetInfo() with invalid image handle\r\n"));
	TestPanicImageGetInfoInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0059"));
	INFO_PRINTF1(_L("RSgImage generic panic test - GetInfo() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageGetInfoNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0060"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapReadOnly() with invalid image handle\r\n"));
	TestPanicImageMapReadOnlyInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0061"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapReadOnly() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageMapReadOnlyNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0062"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapWriteOnly() with invalid image handle\r\n"));
	TestPanicImageMapWriteOnlyInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0063"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapWriteOnly() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageMapWriteOnlyNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0064"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapReadWrite() with invalid image handle\r\n"));
	TestPanicImageMapReadWriteInvalidHandleL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0065"));
	INFO_PRINTF1(_L("RSgImage generic panic test - MapReadWrite() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageMapReadWriteNoDriverL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0066"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Unmap() with invalid image handle\r\n"));
	TestPanicImageUnmapInvalidHandleL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0067"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Unmap() with non null image handle and uninitialised driver\r\n"));
	TestPanicImageUnmapNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0082"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Open() with an uninitialised driver\r\n"));
	TestPanicImageOpenNoDriver1L();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0093"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Open() with a mode flag with an uninitialised driver\r\n"));
	TestPanicImageOpenNoDriver2L();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0083"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Create() from memory with an uninitialised driver\r\n"));
	TestPanicImageCreateNoDriver1L();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0084"));
	INFO_PRINTF1(_L("RSgImage generic panic test - Create() from existing image with an uninitialised driver\r\n"));
	TestPanicImageCreateNoDriver2L();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0085"));
	INFO_PRINTF1(_L("RSgImage generic panic test - GetPixelFormats() with an uninitialised driver\r\n"));	
	TestPanicImageGetPixelFormatsNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0088"));
	INFO_PRINTF1(_L("RSgImage generic panic test - DrawableType() with an uninitialised driver\r\n"));	
	TestPanicImageDrawableTypeNoDriverL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0089"));
	INFO_PRINTF1(_L("RSgImage generic panic test - DrawableType() with invalid image handle\r\n"));	
	TestPanicImageDrawableTypeInvalidHandleL();
	RecordTestResultL();
#else
	INFO_PRINTF1(_L("Warning: Skipping the panic tests in release build. \r\n"));
#endif	
	return TestStepResult();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0003
@SYMTestCaseDesc		Gets supported pixel formats on all platforms.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::GetPixelFormats(const TSgImageInfo&, TUidPixelFormat*, TInt&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure all the available pixel formats are returned 
						in the array and the actual number of pixel formats in
						the input/output aCount parameter.
@SYMTestActions			Initialise the graphics resource component. Construct a
						TSgImageInfo object and Initialise the member variables.
						Construct a TInt array of size\n
						\t 1. NULL\n						
						\t 2. greater than the number of supported pixel formats\n
						\t 3. equal to the number of supported pixel formats\n
						\t 4. less than the number of supported pixel formats
@SYMTestExpectedResults	The function must return\n
						\t 1. KErrNone\n
						\t 2. KErrNone\n
						\t 3. KErrNone\n
						\t 4. KErrOverFlow\n
						The supported pixel formats are populated into the array
						and aCount stores the actual number of supported pixel formats.
						The returned pixel formats should cover the pixel formats
						in the image compatibility table that works on all platforms.
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestGetPixelFormatsL()
	{
	TestOpenDriverL();
	TSgImageInfo info;
	info.iSizeInPixels = TSize(10, 10);
	info.iCpuAccess = ESgCpuAccessNone;
	info.iUsage = ESgUsageDirectGdiSource;
	info.iShareable = EFalse;
	info.iScreenId = 0;
		
	TInt numPixelFormats = 0;
	//NULL array
	CheckErrorL(KErrNone, RSgImage::GetPixelFormats(info, NULL, numPixelFormats), (TText8*)__FILE__, __LINE__);
	TEST(numPixelFormats > 1);
	
	//array length bigger than available pixel formats
	TInt count = numPixelFormats + 10;
	TUidPixelFormat* pixelFormatArray = new(ELeave) TUidPixelFormat[count];
	CleanupArrayDeletePushL(pixelFormatArray);
	CheckErrorL(KErrNone, RSgImage::GetPixelFormats(info, pixelFormatArray, count), (TText8*)__FILE__, __LINE__);
	TEST(count == numPixelFormats);
	
	info.iScreenId = -1;
	CheckErrorL(KErrNone, RSgImage::GetPixelFormats(info, pixelFormatArray, count), (TText8*)__FILE__, __LINE__);
	TEST(count == numPixelFormats);
	
	info.iScreenId = 0;	
	CleanupStack::PopAndDestroy(pixelFormatArray);
	//array length is equal to the supported pixel formats
	count = numPixelFormats;
	pixelFormatArray = new(ELeave) TUidPixelFormat[count];
	CleanupArrayDeletePushL(pixelFormatArray);
	
	CheckErrorL(KErrNone, RSgImage::GetPixelFormats(info, pixelFormatArray, count), (TText8*)__FILE__, __LINE__);
	TEST(count == numPixelFormats);
	
	CleanupStack::PopAndDestroy(pixelFormatArray);
	//array length is smaller than the supported pixel formats
	count = numPixelFormats - 1;
	pixelFormatArray = new(ELeave) TUidPixelFormat[count];
	CleanupArrayDeletePushL(pixelFormatArray);
	TEST(KErrOverflow == RSgImage::GetPixelFormats(info, pixelFormatArray, count));
	TEST(count == numPixelFormats);
	CleanupStack::PopAndDestroy(pixelFormatArray);
	
	//check all the pixel formats returned are in the common compatibility guarantees table
	TestGetPixelFormatCompatibilityGuaranteesL();
	
	//reset the array used by the GetPixelFormats function to prevent memory leaks
	info.iCpuAccess = ESgCpuAccessReadWrite;
	info.iScreenId = 100;
	TEST(KErrNone == RSgImage::GetPixelFormats(info, NULL, count));
	TEST(count == 0);
	
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0004
@SYMTestCaseDesc		Creates an uninitialised image.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n 
						RSgImage::IsNull()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure an uninitialised image can be created.
@SYMTestActions			Initialise the graphics resource component. Construct well-defined 
						TSgImageInfo objects that work on all platforms. Create an image 
						with a NULL base address for each of the TSgImageInfo object.
@SYMTestExpectedResults	The function should return KErrNone in all cases. The created images
						are uninitialised.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestCreateImageUninitializedL()
	{	
	TestOpenDriverL();
	TSgImageInfo info;
	info.iSizeInPixels = TSize(100, 100);
	info.iUsage = ESgUsageDirectGdiTarget;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	
	RSgImage image;	
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}


/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0005
@SYMTestCaseDesc		Creates an image from a block of memory.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n 
						RSgImage::IsNull()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure images can be created from a block of memory.
@SYMTestActions			Initialise the graphics resource component. Construct well-defined 
						TSgImageInfo objects that work on all platforms. Create a block of
						memory with or without initialised data. Then create an image with 
						the starting address of that memory.
@SYMTestExpectedResults	The function should return KErrNone in all cases. The user data starting
						at address aDataAddress will be populated into the new image.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestCreateImageL()
	{	
	TestOpenDriverL();
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iUsage = ESgUsageDirectGdiSource;
	info.iShareable = ETrue;
	
	RSgImage image;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	CleanupStack::PopAndDestroy();	
#ifdef __WINS__	
	//create an image with usage set to screen source
	TSize screenSize;
	if(HAL::Get(info.iScreenId, HALData::EDisplayXPixels, screenSize.iWidth) == KErrNone
		&& HAL::Get(info.iScreenId, HALData::EDisplayYPixels, screenSize.iHeight) == KErrNone)
		{
		info.iUsage = ESgUsageScreenSource;
		info.iScreenId = KSgScreenIdMain;
		info.iSizeInPixels = TSize(screenSize.iWidth, screenSize.iHeight);
		CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
		CleanupClosePushL(image);
		CleanupStack::PopAndDestroy();
		
		info.iSizeInPixels = TSize(screenSize.iHeight, screenSize.iWidth);
		CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
		CleanupClosePushL(image);
		CleanupStack::PopAndDestroy();
		}
#endif	
	//create an image with some user attributes
	TSgUserAttribute testAttributes[] = {{0x00008888, 1}, {0x00009999, 2}};
	info.iUserAttributes = testAttributes;
	info.iUserAttributeCount = 2;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	CleanupStack::PopAndDestroy();
	
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0006
@SYMTestCaseDesc		Creates an image from an existing image.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9192
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const RSgImage&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure images can be created from existing images.
@SYMTestActions			Initialise the graphics resource component. Create an image. Create another
						image with the attributes of this image as the TSgImageInfo.
@SYMTestExpectedResults	The function should return KErrNone. The new image should be identical to
						the old one. 
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestCreateImageFromExistingImageL()
	{
	RSgImage image1;
	RSgImage image2;
	TSgImageInfo info;
	
	TestOpenDriverL();		
	CreateImageL(image1);
	CleanupClosePushL(image1);
	TEST(KErrNone == image1.GetInfo(info));
	CheckErrorL(KErrNone, image2.Create(info, image1), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image2);
	TSgImageInfo info2;
	TEST(KErrNone == image2.GetInfo(info2));
	TEST(CompareInfos(info, info2));
	CleanupStack::PopAndDestroy(2);
	TestCloseDriver();
	}


/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0007
@SYMTestCaseDesc		Calls GetInfo on an image.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::GetInfo(TSgImageInfo&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure the information about the image is correct.
@SYMTestActions			Initialise the graphics resource component. Construct a TSgImageInfo object
						and Initialise all the member variables. Create images without and with
						user attributes. Call GetInfo() and compare the resulting TSgImageInfo objects 
						with the previous ones.
@SYMTestExpectedResults	The function should return KErrNone. Information about the image object
						is stored in the aInfo parameter. The retrieved TSgImageInfo objects should be 
						identical to the original ones.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestGetImageInfoL()
	{
	TestOpenDriverL();
	TSgImageInfo info;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iSizeInPixels = TSize(100, 100);
	info.iUsage = ESgUsageDirectGdiTarget;
	
	RSgImage image;
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	
	TSgImageInfo info2;
	TEST(KErrNone == image.GetInfo(info2));
	TEST(CompareInfos(info, info2));
	CleanupStack::PopAndDestroy();
	
	//get info of image with user attributes
	TSgUserAttribute testAttributes[] = {{0x00008888, 1}, {0x00009999, 2}};
	info.iUserAttributes = testAttributes;
	info.iUserAttributeCount = 2;
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	TSgImageInfo info3;
	TSgUserAttribute testAttributes2[2];
	testAttributes2[0].iUid = TUid::Uid(0x00008888);
	testAttributes2[1].iUid = TUid::Uid(0x00009999);
	info3.iUserAttributes = testAttributes2;
	info3.iUserAttributeCount = 2;
	TEST(KErrNone == image.GetInfo(info3));
	TEST(CompareInfos(info, info3));	
	CleanupStack::PopAndDestroy();
	
	info.iShareable = ETrue;
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	TEST(KErrNone == image.GetInfo(info3));
	TEST(CompareInfos(info, info3));
	CleanupStack::PopAndDestroy();
	
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0008
@SYMTestCaseDesc		Retrieves drawable id and drawable type of an image.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Id()\n
						RSgImage::DrawableType()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure the globally unique drawable id of the image can be retrieved.
@SYMTestActions			Initialise the graphics resource component. Create an image. Call
						Id() to retrieve its drawable id.
@SYMTestExpectedResults	A valid drawable id should be successfully returned.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestGetImageDrawableIdL()
	{	
	RSgImage image;
	TEST(KNullUid == image.DrawableType());
	TSgDrawableId id = image.Id();
	TEST(id == KSgNullDrawableId);
	TestOpenDriverL();	
	CreateImageL(image);
	CleanupClosePushL(image);
	id = image.Id();
	TEST(id != KSgNullDrawableId);	
	TEST(KSgImageTypeUid == image.DrawableType());

	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0009
@SYMTestCaseDesc		Maps and unmaps an image from its creator process.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::MapReadOnly(const TAny*&, TInt&) const\n
 						RSgImage::MapWriteOnly(TAny*&, TInt&)\n 
						RSgImage::MapReadWrite(TAny*&, TInt&)\n 
						RSgImage::Unmap()
						by its creator process.
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure an image can be successfully mapped and unmapped
@SYMTestActions			Initialise the graphics resource component. Create mappable images
						with different TSgImageInfo values. Call different map functions the Unmap()
						function on each of them.
@SYMTestExpectedResults	All the functions should return KErrNone.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestMapImageL()
	{
	TestOpenDriverL();
	RSgImage image;
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iUsage = ESgUsageDirectGdiSource;
	info.iCpuAccess = ESgCpuAccessReadOnly;
	
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	
	//test MapReadOnly
	const TAny* dataAddress;
	TInt dataStride;	
	TInt mapResult = image.MapReadOnly(dataAddress, dataStride);
	TEST(KErrNone == mapResult);
	if(KErrNone == mapResult)
		{
		for (TInt y = 0; y < 8; ++y)
			for (TInt x = 0; x < 8; ++x)
				{
				TUint16 pixelValue = *(TUint16*)PtrAdd(dataAddress, sizeof(TUint16) * x + dataStride * y);
				if (pixelValue != 0x7E0)
					{
					TEST(EFalse);
					break;
					}
				}
		}
	TEST(KErrNone == image.Unmap());
	CleanupStack::PopAndDestroy(&image);
	
	//test MapWriteOnly
	TAny* dataAddress1;
	
	info.iCpuAccess = ESgCpuAccessWriteOnly;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	mapResult = image.MapWriteOnly(dataAddress1, dataStride);
	TEST(KErrNone == mapResult);
	//change the second line to red
	if(KErrNone == mapResult)
		{
		for(TInt x = 0; x < 8; ++x)
			{
			*(TUint16*)PtrAdd(dataAddress1, sizeof(TUint16) * x + dataStride * 1) = 0xF800;
			}
		}
	TEST(KErrNone == image.Unmap());
	
	//check if the modification is successful	
	//create another image from the existing one and map it as read only
	info.iCpuAccess = ESgCpuAccessReadOnly;
	RSgImage image1;
	CheckErrorL(KErrNone, image1.Create(info, image), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image1);
	mapResult = image1.MapReadOnly(dataAddress, dataStride);
	TEST(mapResult == KErrNone);
	if(mapResult == KErrNone)
		{
		for(TInt x = 0; x < 8; ++x)
			{
			TUint16 pixelValue = *(TUint16*)PtrAdd(dataAddress, sizeof(TUint16) * x + dataStride * 1);
			if(pixelValue != 0xF800)
				{
				TEST(EFalse);
				break;
				}
			}
		}
	
	TEST(KErrNone == image1.Unmap());
	CleanupStack::PopAndDestroy(2, &image);
	
	//test MapReadWrite
	info.iCpuAccess = ESgCpuAccessReadWrite;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	mapResult = image.MapReadWrite(dataAddress1, dataStride);
	TEST(KErrNone == mapResult);
	
	if(KErrNone == mapResult)
		{
		//modify the image, set first line to blue
		for(TInt x = 0; x < 8; ++x)
			{
			*(TUint16*)PtrAdd(dataAddress1, sizeof(TUint16) * x) = 0x1F;
			}
		
		//check the modification
		for(TInt x = 0; x < 8; ++x)
			{
			TUint16 pixelValue = *(TUint16*)PtrAdd(dataAddress1, sizeof(TUint16) * x);
			if(pixelValue != 0x1F)
				{
				TEST(EFalse);
				break;
				}
			}
		}
	
	TEST(KErrNone == image.Unmap());	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0010
@SYMTestCaseDesc		Opens a handle to an image in both the current process and another process.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Open(const TSgDrawableId&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure image can be opened in both a second thread in the current 
						process and another process.
@SYMTestActions			Initialise the graphics resource component. Create a shareable image and
						a non-shareable image. Open() the image in the second thread in the current 
						process and in another process.
						Check various image attributes.
@SYMTestExpectedResults	The function must return KErrNone in both cases.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestOpenImageL()
	{	
	TestOpenDriverL();
	
	//shareable image
	RSgImage image1;
	TSgImageInfo info1;
	info1.iSizeInPixels = TSize(8, 8);
	info1.iUsage = ESgUsageDirectGdiSource;
	info1.iPixelFormat = EUidPixelFormatRGB_565;
	info1.iCpuAccess = ESgCpuAccessReadWrite;
	info1.iShareable = ETrue;
	CheckErrorL(KErrNone, image1.Create(info1, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image1);
	
	//non-shareable image
	RSgImage image2;
	TSgImageInfo info2;
	info2.iSizeInPixels = TSize(8, 8);
	info2.iUsage = ESgUsageDirectGdiSource;
	info2.iPixelFormat = EUidPixelFormatRGB_565;
	info2.iCpuAccess = ESgCpuAccessReadWrite;
	info2.iShareable = EFalse;	
	CheckErrorL(KErrNone, image2.Create(info2, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image2);
	
	const TSgDrawableId id1 = image1.Id();
	const TSgDrawableId id2 = image2.Id();	
	
	//opening image in the current thread
	RSgImage image3;
	TEST(KErrNone == image3.Open(id1));
	image3.Close();
	TEST(KErrNone == image3.Open(id2));
	image3.Close();
	
	//opening image in a second thread in the current process
	TSgresTestInfo threadInfo = {id1, info1, 0, ESgresSecondThreadOpenImage};
	TInt testResult = CreateSecondThreadAndDoTestL(threadInfo);	
	// Test the results from the second thread
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);
	TEST(testResult & EFifthTestPassed);
	
	threadInfo.iDrawableId = id2;
	threadInfo.iImageInfo = info2;
	testResult = CreateSecondThreadAndDoTestL(threadInfo);	
	// Test the results from the second thread
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);
	TEST(testResult & EFifthTestPassed);
		
	//opening image in a second process	
	TSgresTestInfo processInfo = {id1, info1, 0, ESgresSecondProcessOpenImage};
	testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo);	
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);	
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);

	CleanupStack::PopAndDestroy(2, &image1);
	TestCloseDriver();
	}

class MFake
	{
public:
	enum { EInterfaceUid = 0x88888888 };
	};

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0011
@SYMTestCaseDesc		Opens a handle to an image with mode flags.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Open(const TSgDrawableId&, TUint32)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure image can be opened with mode flags.
@SYMTestActions			Initialise the graphics resource component. Create an image and
						call Open() on the image with flag ESgDoNotRestrictUsage. Call
						GetInfo() on the opened image and check the usage bit. Declare another
						image object and call Open() on it with the Id of the previously
						opened handle and without mode flags. Call GetInfo() on this image
						and check the usage bit.
@SYMTestExpectedResults	Both infos should contain all the possible usages supported by
 						the underlying implementation.						
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestOpenImageInternalL()
	{
	TestOpenDriverL();
	
	//shareable image
	RSgImage shareableImage;
	TSgImageInfo shareableInfo;
	shareableInfo.iSizeInPixels = TSize(8, 8);
	shareableInfo.iUsage = ESgUsageDirectGdiSource;
	shareableInfo.iPixelFormat = EUidPixelFormatRGB_565;
	shareableInfo.iCpuAccess = ESgCpuAccessReadWrite;
	shareableInfo.iShareable = ETrue;	
	CheckErrorL(KErrNone, shareableImage.Create(shareableInfo, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(shareableImage);
		
	RSgImage image1;
	CheckErrorL(KErrNone, image1.Open(shareableImage.Id(), ESgDoNotRestrictUsage), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image1);
	TSgImageInfo info1;
	image1.GetInfo(info1);	
	TEST(ESgUsageDirectGdiSource | info1.iUsage);
	TEST(ESgUsageCompositionSource | info1.iUsage);
	TEST(ESgUsageOpenGlesTexture2D | info1.iUsage);
	TEST(ESgUsageOpenGles2Texture2D | info1.iUsage);
	TEST(ESgUsageOpenVgImage | info1.iUsage);
	
	RSgImage image2;
	CheckErrorL(KErrNone, image2.Open(image1.Id()), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image2);
	TSgImageInfo info2;
	image2.GetInfo(info2);
	TEST(ESgUsageDirectGdiSource | info2.iUsage);
	TEST(ESgUsageCompositionSource | info2.iUsage);
	TEST(ESgUsageOpenGlesTexture2D | info2.iUsage);
	TEST(ESgUsageOpenGles2Texture2D | info2.iUsage);
	TEST(ESgUsageOpenVgImage | info2.iUsage);
	
	//non-shareable image
	RSgImage nonshareableImage;
	TSgImageInfo nonshareableInfo;
	nonshareableInfo.iSizeInPixels = TSize(8, 8);
	nonshareableInfo.iUsage = ESgUsageDirectGdiSource;
	nonshareableInfo.iPixelFormat = EUidPixelFormatRGB_565;
	nonshareableInfo.iCpuAccess = ESgCpuAccessReadWrite;
	nonshareableInfo.iShareable = EFalse;	
	CheckErrorL(KErrNone, nonshareableImage.Create(nonshareableInfo, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(nonshareableImage);
	
	RSgImage image3;
	CheckErrorL(KErrNone, image3.Open(nonshareableImage.Id(), ESgDoNotRestrictUsage), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image3);
	TSgImageInfo info3;
	image3.GetInfo(info3);	
	TEST(ESgUsageDirectGdiSource | info3.iUsage);
	TEST(ESgUsageCompositionSource | info3.iUsage);
	TEST(ESgUsageOpenGlesTexture2D | info3.iUsage);
	TEST(ESgUsageOpenGles2Texture2D | info3.iUsage);
	TEST(ESgUsageOpenVgImage | info3.iUsage);
	
	RSgImage image4;
	CheckErrorL(KErrNone, image4.Open(image3.Id()), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image4);
	TSgImageInfo info4;
	image4.GetInfo(info4);
	TEST(ESgUsageDirectGdiSource | info4.iUsage);
	TEST(ESgUsageCompositionSource | info4.iUsage);
	TEST(ESgUsageOpenGlesTexture2D | info4.iUsage);
	TEST(ESgUsageOpenGles2Texture2D | info4.iUsage);
	TEST(ESgUsageOpenVgImage | info4.iUsage);
	
	CleanupStack::PopAndDestroy(6, &shareableImage);
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0044
@SYMTestCaseDesc		Gets the interfaces implemented by CSgImageImpl class.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n 
						RSgImage::GetInterface()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure the extension interfaces supported by RSgImage can be
						returned. 
@SYMTestActions			Initialise the graphics resource component. Create an image. Call
						GetInterface() to return the MSgImage_Sw and MSgImage_Chunk interfaces.
						Perform various operations on the interfaces. Declare a fake interface
						MFake and call GetInterface() on the image handle.
@SYMTestExpectedResults	The operations on the MSgImage_Sw and MSgImage_Chunk interfaces should
						succeed. Trying to get the MFake interface should return KErrExtensionNotSupported.
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestGetInterfaceL()
	{
	TestOpenDriverL();
	
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iUsage = ESgUsageDirectGdiSource;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iCpuAccess = ESgCpuAccessReadWrite;
	info.iShareable = ETrue;
	
	RSgImage image;	
	MSgImage_Sw* swInterface = NULL;
	TEST(KErrBadHandle == image.GetInterface(swInterface));
	
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	
	// check TSgDrawableId is not NULL
	TSgDrawableId id = image.Id();
	TEST(KSgNullDrawableId != id);
	
	TAny* dataAddress1 = NULL;
	TInt dataStride1 = 0;
	TInt result1 = image.GetInterface(swInterface);
	TEST(KErrNone == result1);
	if(KErrNone == result1)
		{		
		// Fill the image with 0xF0
		TInt sizeInBytes = 8 * 8 * 2;
		TESTL(swInterface->BeginDataAccess(ESgCpuAccessNone) == KErrArgument);
		TEST(swInterface->BeginDataAccess(ESgCpuAccessWriteOnly) == KErrNone);
		dataAddress1 = swInterface->DataAddress();
		dataStride1 = swInterface->DataStride();
		Mem::Fill(dataAddress1, sizeInBytes, 0xF0);
		TEST(swInterface->EndDataAccess() == KErrNone);
		
		//Map the image as read only and check if the previous operation is successful
		const TAny* dataAddressRead;
		TInt dataStride2;	
		TInt mapResult = image.MapReadOnly(dataAddressRead, dataStride2);
		TEST(KErrNone == mapResult);
		TEST(dataAddress1 == dataAddressRead);
		TEST(dataStride1 == dataStride2);
		if(KErrNone == mapResult)
			{
			for (TInt y = 0; y < 8; ++y)
				for (TInt x = 0; x < 8; ++x)
					{
					TUint16 pixelValue = *(TUint16*)PtrAdd(dataAddressRead, sizeof(TUint16) * x + dataStride2 * y);
					if (pixelValue != 0xF0F0)
						{
						TEST(EFalse);
						break;
						}
					}
			}
		TEST(KErrNone == image.Unmap());
		}
	
	MSgImage_Chunk* smChunk = NULL;
	TInt result2 = image.GetInterface(smChunk);
	TEST(KErrNone == result2);
	if(KErrNone == result2)
		{
		TAny* address = PtrAdd(smChunk->DataChunk().Base(), smChunk->DataOffset());
		TInt datastride = smChunk->DataStride();
		if(KErrNone == result1)
			{
			TEST(address == dataAddress1);
			TEST(datastride == dataStride1);
			}
		}
	
	//fake interface
	MFake* smFake = NULL;
	TEST(KErrExtensionNotSupported == image.GetInterface(smFake));
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0024
@SYMTestCaseDesc		Gets supported pixel formats with invalid parameters.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::GetPixelFormats(const TSgImageInfo&, TUidPixelFormat*, TInt&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure the correct error messages are returned when user tries to
						call GetPixelFormats() with invalid parameters.
@SYMTestActions			Initialise the graphics resource component. Call RSgImage::GetPixelFormats with:\n
						\t 1. invalid TSgImageInfo object, it could be any combinations of the following:\n
						\t \t negative width or height\n
						\t \t mutability incompatible with the specified CPU access and usage\n
						\t \t screen id < -1\n
						\t \t usage flag ESgUsageScreenSource with screen id -1\n
						\t 2. invalid aCount
@SYMTestExpectedResults	The function should return KErrArgument in both cases.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestGetPixelFormatsInvalidL()
	{
	TSgImageInfo info1;
	TInt count = 0;
	
	TestOpenDriverL();
	//negative width
	info1.iSizeInPixels = TSize(-100, 100);
	TEST(KErrArgument == RSgImage::GetPixelFormats(info1, NULL, count));
	
	//negative height
	TSgImageInfo info2;
	info2.iSizeInPixels = TSize(100, -100);
	TEST(KErrArgument == RSgImage::GetPixelFormats(info2, NULL, count));
	
	//invalid or non-existent screen id
	TSgImageInfo info5;
	info5.iSizeInPixels = TSize(8, 8);
	info5.iUsage = ESgUsageScreenSource;
	info5.iCpuAccess = ESgCpuAccessReadWrite;
	info5.iScreenId = -2;
	TEST(KErrArgument == RSgImage::GetPixelFormats(info5, NULL, count));
	info5.iScreenId = 100;
	TEST(KErrNone == RSgImage::GetPixelFormats(info5, NULL, count));
	TEST(count == 0);
	
	//usage flag ESgUsageScreenSource with screen id -1
	TSgImageInfo info6;
	info6.iSizeInPixels = TSize(8, 8);
	info6.iScreenId = -1;
	info6.iUsage = ESgUsageScreenSource;
	TEST(KErrArgument == RSgImage::GetPixelFormats(info6, NULL, count));
	
	//negative aCount
	TSgImageInfo info7;
	info7.iCpuAccess = ESgCpuAccessNone;
	info7.iShareable = EFalse;
	info7.iSizeInPixels = TSize(10, 10);
	CheckErrorL(KErrNone, RSgImage::GetPixelFormats(info7, NULL, count), (TText8*)__FILE__, __LINE__);
	
	if(count > 0)
		{
		TUidPixelFormat* pixelFormatArray = new(ELeave) TUidPixelFormat[count];
		if(!pixelFormatArray)
			{
			User::Leave(KErrNoMemory);
			}
		CleanupStack::PushL(pixelFormatArray);
		count = -100;
		TEST(KErrArgument == RSgImage::GetPixelFormats(info7, pixelFormatArray, count));
		
		CleanupStack::PopAndDestroy(pixelFormatArray);
		}
	
	//reset the array used by the GetPixelFormats function to prevent memory leaks
	TSgImageInfo info8;
	info8.iSizeInPixels = TSize(10, 10);
	info8.iCpuAccess = ESgCpuAccessReadWrite;
	info8.iUsage = ESgUsageDirectGdiSource;
	info8.iShareable = EFalse;
	info8.iScreenId = 100;
	TEST(KErrNone == RSgImage::GetPixelFormats(info8, NULL, count));
	TEST(count == 0);
	
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0025
@SYMTestCaseDesc		Opens an image with different invalid parameters.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Open(const TSgDrawableId&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check correct error messages are returned when opening image with 
						different invalid parameters.
@SYMTestActions			Initialise the graphics resource component. Construct an RSgImage object. 
						Call the Open() function in both the current process and another process with:\n
						\t 1. a non-null RSgImage handle\n
						\t 2. null drawable id\n
						\t 3. fake drawable id\n
						\t 4. a non-sharable RSgImage handle
						Do the same tests in a second thread and a second process.
@SYMTestExpectedResults	The function should return:\n
						\t 1. KErrInUse\n
						\t 2. KErrArgument\n
						\t 3. KErrNotFound\n
						\t 4. KErrNone in the same process and KErrPermissionDenied or KErrNotFound in the second process
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestOpenImageInvalidL()
	{	
	TestOpenDriverL();
	//create a non-sharable image
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iUsage = ESgUsageDirectGdiTarget;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iShareable = EFalse;
	
	RSgImage image;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	const TSgDrawableId id = image.Id();
	
	//same thread
	//  non-empty handle
	RSgImage image1;
	CreateImageL(image1);
	CleanupClosePushL(image1);
	TEST(KErrInUse == image1.Open(id));
	image1.Close();
	
	//  null drawable id
	CheckErrorL(KErrArgument, image1.Open(KSgNullDrawableId), (TText8*)__FILE__, __LINE__);
	image1.Close();
	
	//  non-existing drawable id
	TSgDrawableId fakeid = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
	CheckErrorL(KErrNotFound, image1.Open(fakeid), (TText8*)__FILE__, __LINE__);
	image1.Close();
	
	//  open a non-sharable image
	TEST(KErrNone == image1.Open(id));
	image1.Close();
	
	//different thread in the same process
	TSgresTestInfo threadInfo = {id, info, 0, ESgresSecondThreadOpenImageInvalid};
	TInt testResult = CreateSecondThreadAndDoTestL(threadInfo);
	User::LeaveIfError(testResult);
	// Test the results from the second thread
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);
	TEST(testResult & EFifthTestPassed);
	
	//different process	
	TSgresTestInfo processInfo = {id, info, 0, ESgresSecondProcessOpenImageInvalid};
	testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo);	
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);	
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);	
	TEST(testResult & EFifthTestPassed);
		
	CleanupStack::PopAndDestroy(2);
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0026
@SYMTestCaseDesc		Closes an image multiple times.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Close()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check calling Close() multiple times after Open() does not cause
						errors or panics.
@SYMTestActions			Initialise the graphics resource component. Create an image and then
						call Close() three times on it.
@SYMTestExpectedResults	The function should not cause any errors or panics.
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestCloseImageManyTimesL()
	{
	TestOpenDriverL();
	RSgImage image;
	CreateImageL(image);
	
	image.Close();
	image.Close();
	image.Close();
	
	TestCloseDriver();
	}


/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0027
@SYMTestCaseDesc		Closes an image object without opening it.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Close ()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check Close() does nothing if the image is not already opened.
@SYMTestActions			Initialise the graphics resource component. Declare an RSgImage object and
						call Close() on it.
@SYMTestExpectedResults	The function should not cause any errors or panics.
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestCloseImageWithoutOpenL()
	{	
	TestOpenDriverL();
	RSgImage image;
	image.Close();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0028
@SYMTestCaseDesc		Creates an image with various invalid parameters.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9192
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n 
						RSgImage::Create(const TSgImageInfo, const RSgImage&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check the function returns the correct error messages when the parameters
						are invalid.
@SYMTestActions			Initialise the graphics resource component. Construct a TSgImageInfo object 
						and Initialise the all the member variables with random values. Call the appropriate 
						Create() function with:\n
						\t 1. invalid TSgImageInfo\n
						\t 2. unsupported TSgImageInfo\n
						\t 3. the creating RSgImage handle is not null\n
						\t 4. the aSgImage handle is null\n
						\t 5. the size and pixel format in TSgImageInfo is not the same as that of aSgImage\n
						\t 6. number of iUserAttributes is more than KMaxHint (8)\n
@SYMTestExpectedResults	The function should return\n
						\t 1. KErrArgument\n
						\t 2. KErrNotSupported\n
						\t 3. KErrInUse\n
						\t 4. KErrArgument\n
						\t 5. KErrNotSupported\n
						\t 6. KErrOverflow\n
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestCreateImageInvalidL()
	{
	TestOpenDriverL();
	RSgImage image;
	
	//invalid info 1 - invalid size
	TSgImageInfo info1;
	info1.iSizeInPixels = TSize(-100, 100);
	TEST(KErrArgument == image.Create(info1, NULL, 0));
	
	//invalid info 2 - const image with writable cpu access flag
	info1.iUsage = ESgUsageDirectGdiSource;
	info1.iCpuAccess = ESgCpuAccessReadWrite;
	TEST(KErrArgument == image.Create(info1, NULL, 0));
	
	//invalid info 3 - the image is used as a screen source but screen id is set to -1
	info1.iUsage = ESgUsageScreenSource;
	info1.iScreenId = KSgScreenIdAny;
	TEST(KErrArgument == image.Create(info1, NULL, 0));
	
	//invalid info 4 - incorrect user attribute count
	info1.iScreenId = KSgScreenIdMain;
	TSgUserAttribute KTestAttributes[] = {{0x00008888, 1}, {0x00009999, 2}};
	info1.iUserAttributes = KTestAttributes;
	info1.iUserAttributeCount = 0;
	TEST(KErrArgument == image.Create(info1, NULL, 0));
	
	//unsupported info 1 - unsupported pixel format
	TSgImageInfo info2;
	info2.iSizeInPixels = TSize(10, 10);
	info2.iUsage = ESgUsageDirectGdiTarget;
	info2.iPixelFormat = EUidPixelFormatAP_88;
	TEST(KErrNotSupported == image.Create(info2, NULL, 0));

	//unsupported info 2 - usage set to screen source and size is not the same as screen size
	info2.iUsage = ESgUsageScreenSource|ESgUsageDirectGdiTarget;
	info2.iSizeInPixels = TSize(9999, 8888);
	TEST(KErrNotSupported == image.Create(info2, NULL, 0));

#ifdef __WINS__
	TSize screenSize;
	if(HAL::Get(info2.iScreenId, HALData::EDisplayXPixels, screenSize.iWidth) == KErrNone
		&& HAL::Get(info2.iScreenId, HALData::EDisplayYPixels, screenSize.iHeight) == KErrNone)
		{
		info2.iUsage = ESgUsageScreenSource;
		info2.iScreenId = KSgScreenIdMain;
		info2.iCpuAccess = ESgCpuAccessReadWrite;
		info2.iSizeInPixels = TSize(screenSize.iWidth + 10, screenSize.iHeight);
		TEST(KErrNotSupported == image.Create(info2, NULL, 0));
		
		info2.iSizeInPixels = TSize(screenSize.iWidth, screenSize.iHeight + 10);
		TEST(KErrNotSupported == image.Create(info2, NULL, 0));
		
		info2.iSizeInPixels = TSize(screenSize.iHeight, screenSize.iWidth + 10);
		TEST(KErrNotSupported == image.Create(info2, NULL, 0));
		}	
#endif
	
	//non-null handle
	CreateImageL(image);
	CleanupClosePushL(image);
	TSgImageInfo info3;
	info3.iSizeInPixels = TSize(8, 8);
	info3.iUsage = ESgUsageDirectGdiSource;
	info3.iPixelFormat = EUidPixelFormatRGB_565;
	info3.iCpuAccess = ESgCpuAccessReadWrite;
	TInt ret = image.Create(info3, NULL, 0);	
	TEST(KErrInUse == ret);
	
	//non-null handle: create from an existing image
	RSgImage image1;
	CreateImageL(image1);
	CleanupClosePushL(image1);
	TEST(KErrInUse == image1.Create(info3, image));
	CleanupStack::PopAndDestroy();
	
	//null existing image handle
	RSgImage image2;
	TEST(image2.IsNull());
	TEST(KErrArgument == image1.Create(info3, image2));
		
	//the size and pixel format in TSgImageInfo is not the same as that of aSgImage
	TSgImageInfo info4;
	info4.iSizeInPixels = TSize(100, 100);
	info4.iUsage = ESgUsageDirectGdiSource;
	info4.iCpuAccess = ESgCpuAccessReadWrite;
	TEST(KErrNotSupported == image1.Create(info4, image));
	
	info4.iSizeInPixels = info3.iSizeInPixels;
	info4.iPixelFormat = EUidPixelFormatXRGB_8888;
	TEST(KErrNotSupported == image1.Create(info4, image));
	
	//number of iUserAttributes more than KMaxHint(8)
	TSgImageInfo info5;
	info5.iSizeInPixels = TSize(100, 100);
	info5.iPixelFormat = EUidPixelFormatRGB_565;
	info5.iCpuAccess = ESgCpuAccessNone;
	info5.iUsage = ESgUsageDirectGdiTarget;
	info5.iShareable = ETrue;
	TSgUserAttribute testAttributes[] = {{0x00008888, 1}, {0x00009999, 2}};
	info5.iUserAttributes = testAttributes;
	info5.iUserAttributeCount = 100;	
	CheckErrorL(KErrOverflow, image1.Create(info5, NULL, 0), (TText8*)__FILE__, __LINE__);
	
	CleanupStack::PopAndDestroy(&image);
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0039
@SYMTestCaseDesc		Calls GetInfo() on an invalid image.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::GetInfo(TSgImageInfo&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check the correct error is returned when the client tries to get 
						information on an invalid image.
@SYMTestActions			Initialise the graphics resource component. Call GetInfo on an image:\n
						\t 1. that is not initialised\n
						\t 2. TSgImageInfo has different user attributes Ids from the existing Ids.
@SYMTestExpectedResults	The function should return:\n
						\t 1. KErrBadHandle\n
						\t 2. KErrNotFound or KErrArgument
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestGetInfoInvalidImageL()
	{
	TestOpenDriverL();	
	RSgImage image;
	TSgImageInfo info;
	
	//uninitialised image
	TEST(KErrBadHandle == image.GetInfo(info));
	
	//TSgImageInfo has different user attributes Ids from the existing Ids.
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iSizeInPixels = TSize(100, 100);
	info.iUsage = ESgUsageDirectGdiTarget;
	TSgUserAttribute testAttributes[] = {{0x00008888, 1}, {0x00009999, 2}};
	info.iUserAttributes = testAttributes;
	info.iUserAttributeCount = 2;
	CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	TSgImageInfo info2;
	TSgUserAttribute testAttributes2[1];
	info2.iUserAttributes = testAttributes2;
	info2.iUserAttributes[0].iUid = TUid::Uid(0x11111111);
	info2.iUserAttributeCount = 1;
	TInt result = image.GetInfo(info2);
	TEST(KErrNotFound == result || KErrArgument == result);
	TEST(!CompareInfos(info, info2));
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0030
@SYMTestCaseDesc		Maps an image under various invalid conditions. 
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::MapReadOnly(const TAny*&, TInt&) const\n 
						RSgImage::MapWriteOnly(TAny*&, TInt&)\n 
						RSgImage::MapReadWrite(TAny*&, TInt&)
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check the correct error messages are returned when different map
						functions are called under various invalid conditions.
@SYMTestActions			Initialise the graphics resource component. \n
						\t 1. call any map function on an uninitialised RSgImage\n
						\t 2. call any map function twice\n
						\t 3. call MapReadOnly() on an RSgImage created without CPU access
						flag ESgCpuAccessReadOnly or ESgCpuAccessReadWrite\n
						\t 4. call MapWriteOnly() on an RSgImage created without CPU access
						flag ESgCpuAccessWriteOnly or ESgCpuAccessReadWrite\n
						\t 5. call MapReadWrite() on an RSgImage created without CPU access
						flag ESgCpuAccessReadWrite\n
						\t 6. call any map function in a second process
@SYMTestExpectedResults	The function should return:\n
						\t 1. KErrBadHandle\n
						\t 2. KErrInUse\n
						\t 3. KErrAccessDenied\n
						\t 4. KErrAccessDenied\n
						\t 5. KErrAccessDenied\n
						\t 6. KErrPermissionDenied
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestMapImageInvalidL()
	{
	TestOpenDriverL();
	RSgImage image;
	const TAny* dataAddressRead;
	TAny* dataAddressWrite;
	TInt dataStride;
	
	//an uninitialised image
	TEST(KErrBadHandle == image.MapReadOnly(dataAddressRead, dataStride));
	TEST(KErrBadHandle == image.MapWriteOnly(dataAddressWrite, dataStride));
	TEST(KErrBadHandle == image.MapReadWrite(dataAddressWrite, dataStride));
	
	//map twice
	RSgImage image1;
	CreateImageL(image1);
	CleanupClosePushL(image1);
	TEST(KErrNone == image1.MapReadOnly(dataAddressRead, dataStride));
	TEST(KErrInUse == image1.MapReadOnly(dataAddressRead, dataStride));
	TEST(KErrNone == image1.Unmap());
	
	TEST(KErrNone == image1.MapWriteOnly(dataAddressWrite, dataStride));
	TEST(KErrInUse == image1.MapWriteOnly(dataAddressWrite, dataStride));
	TEST(KErrNone == image1.Unmap());
	
	TEST(KErrNone == image1.MapReadWrite(dataAddressWrite, dataStride));
	TEST(KErrInUse == image1.MapReadWrite(dataAddressWrite, dataStride));
	TEST(KErrNone == image1.Unmap());
	
	CleanupStack::PopAndDestroy();	
	
	//  Initialise image
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iUsage = ESgUsageDirectGdiSource;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iCpuAccess = ESgCpuAccessReadWrite;
	info.iShareable = ETrue;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	TEST(KErrNone == image.MapReadWrite(dataAddressWrite, dataStride)); //first time should pass
	TEST(KErrInUse == image.MapReadWrite(dataAddressWrite, dataStride)); //second time should fail
	TEST(KErrNone == image.Unmap());
	image.Close();
	
	//call MapReadOnly() on an RSgImage created without CPU access
	//flag ESgCpuAccessReadOnly or ESgCpuAccessReadWrite
	info.iCpuAccess = ESgCpuAccessNone;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapReadOnly(dataAddressRead, dataStride));
	image.Close();
	
	info.iCpuAccess = ESgCpuAccessWriteOnly;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapReadOnly(dataAddressRead, dataStride));
	image.Close();
	
	//call MapWriteOnly() on an RSgImage created without CPU access
	//flag ESgCpuAccessWriteOnly or ESgCpuAccessReadWrite
	info.iCpuAccess = ESgCpuAccessNone;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapWriteOnly(dataAddressWrite, dataStride));
	image.Close();
	
	info.iCpuAccess = ESgCpuAccessReadOnly;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapWriteOnly(dataAddressWrite, dataStride));
	image.Close();
	
	//call MapReadWrite() on an RSgImage created without CPU access
	//flag ESgCpuAccessReadWrite
	info.iCpuAccess = ESgCpuAccessNone;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapReadWrite(dataAddressWrite, dataStride));
	image.Close();
	
	info.iCpuAccess = ESgCpuAccessReadOnly;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapReadWrite(dataAddressWrite, dataStride));
	image.Close();
	
	info.iCpuAccess = ESgCpuAccessWriteOnly;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	TEST(KErrAccessDenied == image.MapReadWrite(dataAddressWrite, dataStride));
	image.Close();
	
	info.iCpuAccess = ESgCpuAccessReadWrite;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	
	//call map in a second thread in the current process - should succeed
	TSgresTestInfo threadInfo = {image.Id(), info, 0, ESgresSecondThreadMapImage};	
	TInt testResult = CreateSecondThreadAndDoTestL(threadInfo);
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);
	TEST(testResult & EFifthTestPassed);
	TEST(testResult & ESixthTestPassed);
	TEST(testResult & ESeventhTestPassed);
	
	//call map in a non-owner process
	TSgresTestInfo processInfo = {image.Id(), info, 0, ESgresSecondProcessMapImage};
	testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo);	
	User::LeaveIfError(testResult);	
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	TEST(testResult & EThirdTestPassed);
	TEST(testResult & EFourthTestPassed);
	TEST(testResult & EFifthTestPassed);
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0031
@SYMTestCaseDesc		Unmaps an image under various invalid conditions.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::MapReadOnly(const TAny*&, TInt&) const\n 
						RSgImage::MapWriteOnly(TAny*&, TInt&)\n 
						RSgImage::MapReadWrite(TAny*&, TInt&)\n 
						RSgImage::Unmap()
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To check the correct error messages are returned when the Unmap()
						function is called under various invalid conditions.
@SYMTestActions			Initialise the graphics resource component.\n
						\t 1. call Unmap() on an uninitialised image object\n
						\t 2. create an image with CPU access flag ESgCpuAccessNone and then unmap it\n
						\t 3. call Unmap() on an image that was not mapped.\n
						\t 4. call Unmap() on a mapped image in a second thread in the same process.\n
						\t 5. call Unmap() on an image in a non-owner process
@SYMTestExpectedResults	The function should return:\n
						\t 1. KErrBadHandle\n
						\t 2. KErrGeneral\n
						\t 3. KErrGeneral\n
						\t 4. KErrNone\n
						\t 5. KErrGeneral
@SYMTestStatus			Implemented 
 */	
void CTSgImageGeneric::TestUnmapImageInvalidL()
	{
	TestOpenDriverL();
	RSgImage image;
	
	//unitialized image
	TEST(KErrBadHandle == image.Unmap());
	
	//create an image
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iUsage = ESgUsageDirectGdiSource;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iShareable = ETrue;
	info.iCpuAccess = ESgCpuAccessReadWrite;
	const TAny* dataAddressRead;
	TInt dataStride;
	CheckErrorL(KErrNone, image.Create(info, KImageData, 16), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	
	//call on an unmapped image
	TEST(KErrGeneral == image.Unmap());
	
	//map in the current thread and try to unmap in another thread in the current process
	//should fail	
	TEST(KErrNone == image.MapReadOnly(dataAddressRead, dataStride));	
	TSgDrawableId id = image.Id();
	TSgImageInfo imageinfo;
	image.GetInfo(imageinfo);
	
	TSgresTestInfo threadInfo = {id, imageinfo, 0, ESgresSecondThreadUnmapImage};
	TInt testResult = CreateSecondThreadAndDoTestL(threadInfo);
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);
	TEST(testResult & ESecondTestPassed);
	
	//image should already be unmapped
	TEST(KErrGeneral == image.Unmap());
	
	//map in the current thread and try to unmap in another process
	//should fail
	TEST(KErrNone == image.MapReadOnly(dataAddressRead, dataStride));	
	TSgresTestInfo processInfo = {id, imageinfo, 0, ESgresSecondProcessUnmapImage};
	testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo);	
	User::LeaveIfError(testResult);
	TEST(testResult & EFirstTestPassed);	
	TEST(testResult & ESecondTestPassed);
	
	//image should still be mapped
	TEST(KErrNone == image.Unmap());
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0048
@SYMTestCaseDesc		RSgImage stress tests
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n
						RSgImage::Close() 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure creating and destroying RSgImage multiple times work well.
@SYMTestActions			Create images 1000 times but only store KMaxImagesInArray of them 
						at one time in an RArray. When a new image is to be added to the 
						array, a random image from the array is removed.
@SYMTestExpectedResults	There should be no panics or leaves.
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestStress1L()
	{
	TestOpenDriverL();
	TSgImageInfo info;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	info.iSizeInPixels = TSize(100, 100);
	info.iUsage = ESgUsageDirectGdiTarget;
	
	TInt KMaxImagesInArray =40;
	TInt64 seed = 0;
	for (TInt count = 1000; count > 0; --count)
		{
		RSgImage image;
		CheckErrorL(KErrNone, image.Create(info, NULL, 0), (TText8*)__FILE__, __LINE__);
		CleanupClosePushL(image);
		iTestImages.AppendL(image);
		CleanupStack::Pop();
		if (iTestImages.Count() >= KMaxImagesInArray)
			{
			TInt i = Math::Rand(seed) % KMaxImagesInArray;
			iTestImages[i].Close();
			iTestImages.Remove(i);
			}
		}
	TInt count = iTestImages.Count();
	for(TInt i=0; i<count; ++i)
		{
		iTestImages[i].Close();
		}	
	iTestImages.Reset();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0049
@SYMTestCaseDesc		RSgImage multiple threads open and close stress tests
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9224 
@SYMREQ					REQ9233  
@SYMREQ					REQ9234
@SYMFssID				RSgImage::Open(const TSgDrawableId&)\n
						RSgImage::Close() 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure opening and destroying RSgImage multiple times and randomly
						in other threads work well.
@SYMTestActions			Create an image in the main thread. In a loop of 1000 times, randomly select
						one of the five threads and either open or close the image depending on the 
						state of the thread.
@SYMTestExpectedResults	There should be no panics or leaves.
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestStress2L()
	{
	TestOpenDriverL();
	RSgImage image;
	CreateImageL(image);
	CleanupClosePushL(image);
	const TSgDrawableId id = image.Id();
	
	TSgImageInfo info;
	TEST(KErrNone == image.GetInfo(info));
	TSgresTestInfo threadInfo = {id, info, 0, ESgresMultipleThreadStressTest, EFalse};
	
	//create a semaphore
	RSemaphore sem;
	User::LeaveIfError(sem.CreateGlobal(KSecondThreadSemaphore, 0, EOwnerThread));
	CleanupClosePushL(sem);
	
	//create threads
	const TInt KNoOfThreads = 5;
	RArray<RThread> threads;
	_LIT(KMultipleThreadName, "Multiple Threads Stress Test Thread ");
	for (TInt i = 0; i < KNoOfThreads; ++i)
		{
		TBuf<50> threadName(KMultipleThreadName);
		threadName.AppendNum(i);
		RThread thread;
		User::LeaveIfError(thread.Create(threadName, SecondThreadStart, KDefaultStackSize, &User::Heap(), &threadInfo));
		thread.SetPriority(EPriorityLess);
		threads.AppendL(thread);
		}
	// run threads
	for (TInt i = 0; i < KNoOfThreads; ++i)
		{
		threads[i].Resume();
		}
	// wait for the threads to terminate processing
	for (TInt i = 0; i < KNoOfThreads; ++i)
		{
		sem.Wait();
		}
	for (TInt i = 0; i < KNoOfThreads; ++i)
		{
		threads[i].Close();
		}
	CleanupStack::PopAndDestroy(2); // image, sem
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0051
@SYMTestCaseDesc		Calls RSgImage::GetInterface() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::GetInterface(TUid, TAny*&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling GetInterface() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call GetInterface() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageGetInterfaceInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageGetInterfaceInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageGetInterfaceInvalidHandleLThread");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 2, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0052
@SYMTestCaseDesc		Calls RSgImage::GetInterface() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::GetInterface(TUid, TAny*&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling GetInterface() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call GetInterface() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageGetInterfaceNoDriverL()
	{	
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageGetInterfaceNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageGetInterfaceNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0053
@SYMTestCaseDesc		Calls RSgImage::Close() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Close()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Close() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call Close() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageCloseInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageCloseInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageCloseInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 2, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0054
@SYMTestCaseDesc		Calls RSgImage::Close() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Close()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Close() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call Close() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageCloseNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageCloseNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageCloseNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0055
@SYMTestCaseDesc		Calls RSgImage::Id() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Id()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Id() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call Id() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageIdInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageIdInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageIdInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 2, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0056
@SYMTestCaseDesc		Calls RSgImage::Id() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Id()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Id() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call Id() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageIdNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageIdNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageIdNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0057
@SYMTestCaseDesc		Calls RSgImage::Create() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9192
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const RSgImage&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Create() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call Create() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageCreateInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageCreateInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageCreateInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0058
@SYMTestCaseDesc		Calls RSgImage::GetInfo() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::GetInfo(TSgImageInfo&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling GetInfo() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call GetInfo() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageGetInfoInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageGetInfoInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageGetInfoInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0059
@SYMTestCaseDesc		Calls RSgImage::GetInfo() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				SgImage::GetInfo(TSgImageInfo&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling GetInfo() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call GetInfo() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageGetInfoNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageGetInfoNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageGetInfoNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0060
@SYMTestCaseDesc		Calls RSgImage::MapReadOnly with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapReadOnly(const TAny*&, TInt&) const\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapReadOnly() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call MapReadOnly() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapReadOnlyInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapReadOnlyInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapReadOnlyInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0061
@SYMTestCaseDesc		Calls RSgImage::MapReadOnly with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapReadOnly(const TAny*&, TInt&) const\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapReadOnly() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call MapReadOnly() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapReadOnlyNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapReadOnlyNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapReadOnlyNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0062
@SYMTestCaseDesc		Calls RSgImage::MapWriteOnly() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapWriteOnly(TAny*&, TInt&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapWriteOnly() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call MapWriteOnly() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapWriteOnlyInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapWriteOnlyInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapWriteOnlyInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0063
@SYMTestCaseDesc		Calls RSgImage::MapWriteOnly() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapWriteOnly(TAny*&, TInt&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapWriteOnly() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call MapWriteOnly() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapWriteOnlyNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapWriteOnlyNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapWriteOnlyNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0064
@SYMTestCaseDesc		Calls RSgImage::MapReadWrite() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapReadWrite(TAny*&, TInt&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapReadWrite() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call MapReadWrite() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapReadWriteInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapReadWriteInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapReadWriteInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0065
@SYMTestCaseDesc		Calls RSgImage::MapReadWrite() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::MapReadWrite(TAny*&, TInt&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling MapReadWrite() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call MapReadWrite() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageMapReadWriteNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageMapReadWriteNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageMapReadWriteNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0066
@SYMTestCaseDesc		Calls RSgImage::Unmap() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMREQ					REQ9193
@SYMFssID				RSgImage::Unmap()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Unmap() with an invalid image handle will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Call Unmap() on the second
						handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageUnmapInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageUnmapInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageUnmapInvalidHandleL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 3, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0067
@SYMTestCaseDesc		Calls RSgImage::Unmap() with a non-null handle and an uninitialised driver
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Unmap()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling Unmap() with a non-null handle and an uninitialised driver will cause a panic.
@SYMTestActions			Initialise the graphics resource component and create an image in a second thread. 
						Declare another image and assign it to the current image handle. Close the current
						image so the second image handle becomes invalid. Close the graphics resource driver.
						Call Unmap() on the second handle.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageUnmapNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageUnmapNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestImageUnmapNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0082
@SYMTestCaseDesc		Calls RSgImage::Open() when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Open(const TSgDrawableId&, TUint32)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::Open() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::Open() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageOpenNoDriver1L()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageOpenNoDriver1, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageOpenNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0083
@SYMTestCaseDesc		Creates an image from memory when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const TAny*, TInt)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::Create() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::Open() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageCreateNoDriver1L()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageCreateNoDriver1, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageCreateNoDriver1L");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0084
@SYMTestCaseDesc		Creates an image from an existing image when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Create(const TSgImageInfo&, const RSgImage&)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::Create() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::Open() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageCreateNoDriver2L()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageCreateNoDriver2, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageCreateNoDriver2L");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0085
@SYMTestCaseDesc		Calls RSgImage::GetPixelFormats() when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::GetPixelFormats(const TSgImageInfo&, TUidPixelFormat*, TInt&) \n
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::GetPixelFormats() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::GetPixelFormats() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageGetPixelFormatsNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageGetPixelFormatsNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageGetPixelFormatsNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0093
@SYMTestCaseDesc		Calls RSgImage::Open() with mode flags when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::Open(const TSgDrawableId&, TUint32)\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::Open() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::Open() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageOpenNoDriver2L()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageOpenNoDriver2, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageOpenNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0088
@SYMTestCaseDesc		Calls RSgImage::DrawableType() when the driver was not initialised.
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::DrawableType()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::DrawableType() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::DrawableType() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 5 (ESgPanicNoDriver).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageDrawableTypeNoDriverL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageDrawableTypeInvalidHandle, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageOpenNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 2, exitCategoryName, KTestName);
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0089
@SYMTestCaseDesc		Calls RSgImage::DrawableType() with an invalid image handle
@SYMPREQ				PREQ39
@SYMREQ					REQ8809
@SYMREQ					REQ9175
@SYMFssID				RSgImage::DrawableType()\n 
@SYMTestPriority		Critical
@SYMTestType			Unit Test
@SYMTestPurpose			To ensure calling RSgImage::DrawableType() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgImage::DrawableType() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES SGRES 2(ESgPanicBadDrawableHandle).
@SYMTestStatus			Implemented 
 */
void CTSgImageGeneric::TestPanicImageDrawableTypeInvalidHandleL()
	{
	TSgImageInfo info;
	TSgresTestInfo threadInfo = {KSgNullDrawableId, info, 0, ESgresSecondThreadPanicImageDrawableTypeNoDriver, ETrue};
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicImageOpenNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 5, exitCategoryName, KTestName);
	}

void CTSgImageGeneric::DoMemoryTestsL()
	{
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetPixelFormatsL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCreateImageUninitializedL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCreateImageL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCreateImageFromExistingImageL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetImageInfoL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetImageDrawableIdL(); 
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestMapImageL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestOpenImageL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetInterfaceL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetPixelFormatsInvalidL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestOpenImageInvalidL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCloseImageManyTimesL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCloseImageWithoutOpenL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestCreateImageInvalidL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestGetInfoInvalidImageL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestMapImageInvalidL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	
	__UHEAP_MARK; SgDriver::AllocMarkStart();
	TestUnmapImageInvalidL();
	__UHEAP_MARKEND; SgDriver::AllocMarkEnd(0);
	}