windowing/windowserver/tauto/TGWHANDLE.CPP
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// GWHANDLE.CPP
// Test group window handle functions
// 
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include "TGWHANDLE.H"


CTGwHandle::CTGwHandle(CTestStep* aStep):
	CTWsGraphicsBase(aStep)
	{
	}

void CTGwHandle::ConstructL()
	{
	}

CTGwHandle::~CTGwHandle()
	{
	}

TInt CTGwHandle::NumberOfWndGroupsWithZeroPriority(TInt aScreenNumber)
	{
	__ASSERT_ALWAYS(aScreenNumber <= 1, User::Invariant());
	return TheClient->iWs.NumWindowGroups(aScreenNumber,0);
	}

void CTGwHandle::GetGwListL(CArrayFixFlat<TInt> *aWindowHandles)
	{
	User::LeaveIfError(TheClient->iWs.WindowGroupList(aWindowHandles));
	}

void CTGwHandle::GetGwListL(CArrayFixFlat<TInt> *aWindowHandles, TInt aScreenNumber)
	{
	User::LeaveIfError(TheClient->iWs.WindowGroupList(aWindowHandles, aScreenNumber));
	}

void CTGwHandle::GetGwListL(TInt aPriority, CArrayFixFlat<TInt> *aWindowHandles)
	{
	User::LeaveIfError(TheClient->iWs.WindowGroupList(aPriority,aWindowHandles));
	}

void CTGwHandle::GetGwListL(RArray<RWsSession::TWindowGroupChainInfo>* aWindowHandles)
	{
	User::LeaveIfError(TheClient->iWs.WindowGroupList(aWindowHandles));
	}

void CTGwHandle::GetGwListL(TInt aPriority, RArray<RWsSession::TWindowGroupChainInfo>* aWindowHandles)
	{
	User::LeaveIfError(TheClient->iWs.WindowGroupList(aPriority, aWindowHandles));
	}

void CTGwHandle::GwNamesL()
	{
	enum {EConnectHandle1=123456};
	enum {EWindowGroupHandle1=234567};
	enum {EWindowGroupHandle2=666666};
//
	TInt foreground;
	User::LeaveIfError(foreground=TheClient->iWs.GetFocusWindowGroup());
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen);
	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));

	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(EWindowGroupHandle1));
	gw1.SetOwningWindowGroup(foreground);
	RWindowGroup gw2(ws1);
	User::LeaveIfError(gw2.Construct(EWindowGroupHandle2));
	gw2.SetOwningWindowGroup(foreground);
//
	TBuf<8> getName;
//
// Check default name is simply a null string
//
	TInt retVal = gw1.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("gw1.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==_L(""));
	if (getName!=_L(""))
		INFO_PRINTF3(_L("getName==_L() - Expected: %d, Actual: %d"), ETrue, EFalse);
//
	TBuf<8> name1(_L("A_Name1"));
	TBuf<8> name2(_L("A_Name2"));
//
	retVal = gw1.SetName(name1);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("gw1.SetName(name1) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw2.SetName(name2);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.SetName(name2) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw1.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw1.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==name1);
	if (getName!=name1)
		INFO_PRINTF3(_L("getName==name1 - Expected: %d, Actual: %d"), ETrue, EFalse);
//
	retVal = gw2.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==name2);
	if (getName!=name2)
		INFO_PRINTF3(_L("getName==name2 - Expected: %d, Actual: %d"), ETrue, EFalse);

//
// A few weird characters in the name should work fine
//
	retVal = gw2.SetName(_L("xx*"));
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.SetName(_L(xx*)) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw2.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==_L("xx*"));
	if (getName!=_L("xx*"))
		INFO_PRINTF3(_L("getName==_L(xx*) - Expected: %d, Actual: %d"), ETrue, EFalse);

//
	retVal = gw2.SetName(_L(":"));
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.SetName(_L(:)) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw2.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("(gw2.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==_L(":"));
	if (getName!=_L(":"))
		INFO_PRINTF3(_L("getName==_L(:) - Expected: %d, Actual: %d"), ETrue, EFalse);

//
// Setting the name back to a null name
//
	retVal = gw2.SetName(_L(""));
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("gw2.SetName(_L()) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw2.Name(getName);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("gw2.Name(getName) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(getName==_L(""));
	if (getName!=_L(""))
		INFO_PRINTF3(_L("getName==_L() - Expected: %d, Actual: %d"), ETrue, EFalse);

//
// Getting a name into a too short buffer should fill thew whole buffer from the left hand part
// of the window name and return KErrOverflow
//
	gw2.SetName(name2);
	TBuf<4> shortBuf;
	retVal = gw2.Name(shortBuf);
	TEST(retVal==KErrOverflow);
	if (retVal!=KErrOverflow)
		INFO_PRINTF3(_L("gw2.Name(shortBuf) return value - Expected: %d, Actual: %d"), KErrOverflow, retVal);

	TEST(shortBuf==name2.Left(4));
	if (shortBuf!=name2.Left(4))
		INFO_PRINTF3(_L("shortBuf==name2.Left(4) - Expected: %d, Actual: %d"), ETrue, EFalse);

//
// passing a 0 length TPtr pointing to NULL should be safe, simply returning KErrOverflow
//
	TPtr nullPtr(NULL,0);
	retVal = gw2.Name(nullPtr);
	TEST(retVal==KErrOverflow);
	if (retVal!=KErrOverflow)
		INFO_PRINTF3(_L("gw2.Name(nullPtr) return value - Expected: %d, Actual: %d"), KErrOverflow, retVal);

	TEST(nullPtr==_L(""));
	if (nullPtr!=_L(""))
		INFO_PRINTF3(_L("nullPtr==_L() - Expected: %d, Actual: %d"), ETrue, EFalse);

//
// Getting a null name into a null descriptor
//
	gw2.SetName(_L(""));
	TPtr nullPtr2(NULL,0);
	retVal = gw2.Name(nullPtr);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("gw2.Name(nullPtr) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	TEST(nullPtr2==_L(""));
	if (nullPtr2!=_L(""))
		INFO_PRINTF3(_L("nullPtr2==_L() - Expected: %d, Actual: %d"), ETrue, EFalse);
//
	gw1.Close();
	gw2.Close();
	CleanupStack::PopAndDestroy(screen);
	ws1.Close();
	}

void CTGwHandle::GwIdentifierTestL()
	{
	enum {EWindowGroupHandle1=234567};
	enum {EWindowGroupHandle2=666666};
	enum {EWindowGroupHandle3=999};
//
	CArrayFixFlat<TInt>* windowHandles=new(ELeave) CArrayFixFlat<TInt>(5);
	CleanupStack::PushL(windowHandles);
	GetGwListL(0, windowHandles);
	TInt retVal = TheClient->iWs.GetFocusWindowGroup();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("TheClient->iWs.GetFocusWindowGroup() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);

//
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());
	CleanupClosePushL(ws1);

	// assign to the correct screen
	CWsScreenDevice* screen1 = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen1);
	User::LeaveIfError(screen1->Construct(iTest->iScreenNumber));

	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(EWindowGroupHandle1));
	gw1.SetOwningWindowGroup((*windowHandles)[0]);
	RWsSession ws2;
	User::LeaveIfError(ws2.Connect());
	CleanupClosePushL(ws2);

	// assign to the correct screen
	CWsScreenDevice* screen2 = new (ELeave) CWsScreenDevice(ws2);
	CleanupStack::PushL(screen2);
	User::LeaveIfError(screen2->Construct(iTest->iScreenNumber));

	RWindowGroup gw2(ws2);
	User::LeaveIfError(gw2.Construct(EWindowGroupHandle2));
//
	GetGwListL(0, windowHandles);
//

	retVal = gw2.Identifier();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("gw2.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]);
	TEST(retVal==EWindowGroupHandle2);
	if (retVal!=EWindowGroupHandle2)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle2, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]);
	TEST(retVal==EWindowGroupHandle1);
	if (retVal!=EWindowGroupHandle1)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle1, retVal);
//
	retVal = TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[1]);
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), 0, retVal);

	retVal = TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[0]);
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), 0, retVal);

//
	TThreadId threadId;
	TheClient->iWs.GetWindowGroupClientThreadId((*windowHandles)[0],threadId);

	TUint64 ret = RThread().Id();
	TEST(ret==threadId);
	if (ret!=threadId)
		INFO_PRINTF3(_L("RThread().Id() return value - Expected: %d, Actual: %d"), (TInt)threadId, (TInt)ret);

	TheClient->iWs.GetWindowGroupClientThreadId((*windowHandles)[1],threadId);

	TUint64 retVal2 = RThread().Id();
	TEST(retVal2==threadId);
	if (retVal2!=threadId)
		INFO_PRINTF3(_L("RThread().Id() return value - Expected: %d, Actual: %d"), (TInt)threadId, (TInt)retVal2);
//
	retVal = gw1.OrdinalPosition();
	TEST(retVal==1);
	if (retVal!=1)
		INFO_PRINTF3(_L("gw1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);

	retVal = gw2.OrdinalPosition();
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("gw2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);

	retVal = TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[1],0);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[1],0) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw1.OrdinalPosition();
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("gw1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);

	retVal = gw2.OrdinalPosition();
	TEST(retVal==1);
	if (retVal!=1)
		INFO_PRINTF3(_L("gw2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);
//
	retVal = TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[1],1);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[1],1) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	retVal = gw1.OrdinalPosition();
	TEST(retVal==1);
	if (retVal!=1)
		INFO_PRINTF3(_L("gw1.OrdinalPosition() return value - Expected: %d, Actual: %d"), 1, retVal);

	retVal = gw2.OrdinalPosition();
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("gw2.OrdinalPosition() return value - Expected: %d, Actual: %d"), 0, retVal);

	retVal = TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[0],1);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
		INFO_PRINTF3(_L("TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[0],1) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	GetGwListL(0, windowHandles);
	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]);
	TEST(retVal==EWindowGroupHandle1);
	if (retVal!=EWindowGroupHandle1)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle1, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]);
	TEST(retVal==EWindowGroupHandle2);
	if (retVal!=EWindowGroupHandle2)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle2, retVal);
//
	RWindowGroup gw3(ws2);
	User::LeaveIfError(gw3.Construct(EWindowGroupHandle3));
	gw1.SetOrdinalPosition(0,100000);	// Assume nothing else in the system is higher, else test will fail
	gw3.SetOrdinalPosition(0,100000);
	ws1.Flush();
	ws2.Flush();
//
	GetGwListL(100000, windowHandles);
	retVal = windowHandles->Count();
	TEST(retVal==2);
	if (retVal!=2)
		INFO_PRINTF3(_L("windowHandles->Count() return value - Expected: %d, Actual: %d"), 2, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]);
	TEST(retVal==EWindowGroupHandle3);
	if (retVal!=EWindowGroupHandle3)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle3, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]);
	TEST(retVal==EWindowGroupHandle1);
	if (retVal!=EWindowGroupHandle1)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle1, retVal);

//
	retVal = TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[0]);
	TEST(retVal==100000);
	if (retVal!=100000)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), 100000, retVal);

	retVal = TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[1]);
	TEST(retVal==100000);
	if (retVal!=100000)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupOrdinalPriority((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), 100000, retVal);
//
	GetGwListL(-12453, windowHandles);	// Test 0 count, Assumes no window with priority
	retVal = windowHandles->Count();
	TEST(retVal==0);
	if (retVal!=0)
		INFO_PRINTF3(_L("windowHandles->Count() return value - Expected: %d, Actual: %d"), 0, retVal);

//
	GetGwListL(windowHandles, iTest->iScreenNumber);
	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]);
	TEST(retVal==EWindowGroupHandle3);
	if (retVal!=EWindowGroupHandle3)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[0]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle3, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]);
	TEST(retVal==EWindowGroupHandle1);
	if (retVal!=EWindowGroupHandle1)
		INFO_PRINTF3(_L("TheClient->iWs.GetWindowGroupHandle((*windowHandles)[1]) return value - Expected: %d, Actual: %d"), EWindowGroupHandle1, retVal);
//
// Check passing bad identifiers
//
	retVal = TheClient->iWs.SetWindowGroupOrdinalPosition(-1,0);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("TheClient->iWs.SetWindowGroupOrdinalPosition(-1,0) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

	retVal = TheClient->iWs.GetWindowGroupHandle(-3);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("TTheClient->iWs.GetWindowGroupHandle(-3) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

//
	gw1.Close();
	gw2.Close();
	gw3.Close();
	
	CleanupStack::PopAndDestroy(5, windowHandles);
	}

void CTGwHandle::OwnerToForegroundL()
	{
	enum {EWindowGroupHandle1=234567};
	enum {EWindowGroupHandle2a=666666};
	enum {EWindowGroupHandle2b=666667};
//
	CArrayFixFlat<TInt> *windowHandles=new(ELeave) CArrayFixFlat<TInt>(5);
	CleanupStack::PushL(windowHandles);
	GetGwListL(0, windowHandles);
	TInt oldForeground=(*windowHandles)[0];
//
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());
	CleanupClosePushL(ws1);

	// assign to the correct screen
	CWsScreenDevice* screen1 = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen1);
	User::LeaveIfError(screen1->Construct(iTest->iScreenNumber));

	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(EWindowGroupHandle1));
	CleanupClosePushL(gw1);
	RWsSession ws2;
	User::LeaveIfError(ws2.Connect());
	CleanupClosePushL(ws2);

	// assign to the correct screen
	CWsScreenDevice* screen2 = new (ELeave) CWsScreenDevice(ws2);
	CleanupStack::PushL(screen2);
	User::LeaveIfError(screen2->Construct(iTest->iScreenNumber));

	RWindowGroup gw2a(ws2);
	User::LeaveIfError(gw2a.Construct(EWindowGroupHandle2a));
	CleanupClosePushL(gw2a);
	RWindowGroup gw2b(ws2);
	User::LeaveIfError(gw2b.Construct(EWindowGroupHandle2b));
	CleanupClosePushL(gw2b);
	gw1.SetOrdinalPosition(1);
//
// Turn auto flushing on as we're using multiple connections and it would be easy to forget to flush one
//
	ws1.SetAutoFlush(ETrue);
	ws2.SetAutoFlush(ETrue);
	TheClient->iWs.SetAutoFlush(ETrue);
//
	GetGwListL(0, windowHandles);
//
	TInt  retVal = gw2b.Identifier();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("gw2b.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

	retVal = gw2a.Identifier();
	TEST(retVal==(*windowHandles)[2]);
	if (retVal!=(*windowHandles)[2])
		INFO_PRINTF3(_L("gw2a.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[2], retVal);

	retVal = oldForeground;
	TEST(retVal==(*windowHandles)[3]);
	if (retVal!=(*windowHandles)[3])
		INFO_PRINTF3(_L("oldForeground - Expected: %d, Actual: %d"), (*windowHandles)[3], oldForeground);
//
	CleanupStack::PopAndDestroy(&gw2b);
	GetGwListL(0, windowHandles);

	retVal = gw2a.Identifier();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("gw2a.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);
	// Check 2a jumped over 1 in the ordinal list

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

	retVal = oldForeground;
	TEST(retVal==(*windowHandles)[2]);
	if (retVal!=(*windowHandles)[2])
		INFO_PRINTF3(_L("oldForeground - Expected: %d, Actual: %d"), (*windowHandles)[2], oldForeground);

//
	User::LeaveIfError(gw2b.Construct(EWindowGroupHandle2b));
	CleanupClosePushL(gw2b);
	gw2b.SetOwningWindowGroup(oldForeground);
	CleanupStack::PopAndDestroy(&gw2b);
	GetGwListL(0, windowHandles);
	retVal = oldForeground;
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("oldForeground - Expected: %d, Actual: %d"), (*windowHandles)[0], oldForeground);
	// Check old foreground bought to foreground

	retVal = gw2a.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw2a.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[2]);
	if (retVal!=(*windowHandles)[2])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[2], retVal);

	TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[0],2);
//
	User::LeaveIfError(gw2b.Construct(EWindowGroupHandle2b));
	CleanupClosePushL(gw2b);
	gw2b.SetOwningWindowGroup((*windowHandles)[1]);
	gw2b.SetOrdinalPosition(KOrdinalPositionSwitchToOwningWindow);	// Should bring 2a to foreground
	GetGwListL(0, windowHandles);

	retVal = gw2a.Identifier();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("gw2a.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);

	retVal = gw2b.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw2b.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[2]);
	if (retVal!=(*windowHandles)[2])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[2], retVal);
//
	CleanupStack::PopAndDestroy(&gw2b);
	GetGwListL(0, windowHandles);
	retVal = gw2a.Identifier();
	TEST(retVal==(*windowHandles)[0]);
	if (retVal!=(*windowHandles)[0])
		INFO_PRINTF3(_L("gw2a.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[0], retVal);

	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[1]);
	if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);
//
	CleanupStack::PopAndDestroy(&gw2a);		// Should bring shell to foreground
	GetGwListL(0, windowHandles);

// check whether the shell is on
	TThreadId threadId;
	ws2.GetWindowGroupClientThreadId((*windowHandles)[0],threadId);
	TBool shellRunning=ETrue;

	TFullName shellName;
	// apply to primary screen only where SHELL is running
	TFindThread findThread(iTest->iScreenNumber==KDefaultScreen?_L("WSHELL*::*"):_L("WxSHELL*::*"));
	if(findThread.Next(shellName)==KErrNone)
		{
		RThread shell;
		User::LeaveIfError(shell.Open(shellName));
		TEST(shell.Id()==threadId);
		if (retVal!=(*windowHandles)[1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[1], retVal);

		shell.Close();
		}
	else
		{
		shellRunning=EFalse;
		}


	// Check gw1 second
	retVal = gw1.Identifier();
	TEST(retVal==(*windowHandles)[shellRunning ? 1 : 0]);
	if (retVal!=(*windowHandles)[shellRunning ? 1 : 0])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[shellRunning ? 1 : 0], retVal);

	retVal = oldForeground;
	TEST(retVal==(*windowHandles)[shellRunning ? 2 : 1]);
	if (retVal!=(*windowHandles)[shellRunning ? 2 : 1])
		INFO_PRINTF3(_L("gw1.Identifier() return value - Expected: %d, Actual: %d"), (*windowHandles)[shellRunning ? 2 : 1], retVal);
	// and oldforeground second

//
	CleanupStack::PopAndDestroy(5, &ws1);
//
// Kick shell back into background, 'cause that's where it belongs
//
	TheClient->iWs.SetWindowGroupOrdinalPosition((*windowHandles)[0],-1);
	TheClient->iWs.SetAutoFlush(EFalse);
//
	CleanupStack::PopAndDestroy(windowHandles);
	}

void CTGwHandle::FindWindowGroupIdentifierTestL()
	{
	enum {EWindowGroupHandle1=234567};
	enum {EWindowGroupHandle2=666666};
	enum {EWindowGroupHandle3=123};
	TInt foreground=TheClient->iWs.GetFocusWindowGroup();
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen);
	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));
	CleanupStack::Pop(screen);

	CleanupClosePushL(ws1);
//
	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(EWindowGroupHandle1));
	CleanupClosePushL(gw1);
	gw1.SetOwningWindowGroup(foreground);
	RWindowGroup gw2(ws1);
	User::LeaveIfError(gw2.Construct(EWindowGroupHandle2));
	CleanupClosePushL(gw2);
	gw1.SetOwningWindowGroup(foreground);
	RWindowGroup gw3(ws1);
	User::LeaveIfError(gw3.Construct(EWindowGroupHandle3));
	CleanupClosePushL(gw3);
	gw3.SetOwningWindowGroup(foreground);
//
	TInt id1=gw1.Identifier();
	TInt id2=gw2.Identifier();
	TInt id3=gw3.Identifier();
//
	gw1.SetName(_L("qwerty123abcd"));
	gw2.SetName(_L("123"));
	gw3.SetName(_L("qqqabcdxxx123"));
//
	TInt retVal = ws1.FindWindowGroupIdentifier(0,_L("123"),0);
	TEST(retVal==id2);
	if (retVal!=id2)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(123),0) return value - Expected: %d, Actual: %d"), id2, retVal);

//
	retVal = ws1.FindWindowGroupIdentifier(0,_L("*123*"),0);
	TEST(retVal==id3);
	if (retVal!=id3)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(*123*),0) return value - Expected: %d, Actual: %d"), id3, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id3,_L("*123*"),0);
	TEST(retVal==id2);
	if (retVal!=id2)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id3,_L(*123*),0) return value - Expected: %d, Actual: %d"), id2, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id2,_L("*123*"),0);
	TEST(retVal==id1);
	if (retVal!=id1)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id2,_L(*123*),0) return value - Expected: %d, Actual: %d"), id1, retVal);

//
	retVal = ws1.FindWindowGroupIdentifier(0,_L("*abcd*"),0);
	TEST(retVal==id3);
	if (retVal!=id3)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(*abcd*),0) return value - Expected: %d, Actual: %d"), id3, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id3,_L("*abcd*"),0);
	TEST(retVal==id1);
	if (retVal!=id1)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id3,_L(*abcd*),0)return value - Expected: %d, Actual: %d"), id1, retVal);
//
	retVal = ws1.FindWindowGroupIdentifier(0,_L("*123*"),7);
	TEST(retVal==id3);
	if (retVal!=id3)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(*123*),7)return value - Expected: %d, Actual: %d"), id3, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id3,_L("*123*"),7);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id3,_L(*123*),7) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

	retVal = ws1.FindWindowGroupIdentifier(0,_L("*abc*"),4);
	TEST(retVal==id1);
	if (retVal!=id1)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(*abc*),4) return value - Expected: %d, Actual: %d"), id1, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id1,_L("*abc*"),4);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id1,_L(*abc*),4) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

	retVal = ws1.FindWindowGroupIdentifier(0,_L("xxx*"),7);
	TEST(retVal==id3);
	if (retVal!=id3)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(xxx*),7) return value - Expected: %d, Actual: %d"), id3, retVal);

	retVal = ws1.FindWindowGroupIdentifier(0,_L("xxx*"),8);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(0,_L(xxx*),8) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);
//
	retVal = ws1.FindWindowGroupIdentifier(id1,_L("12"),0);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id1,_L(12),0) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id1,_L("qqq"),0);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id1,_L(qqq),0) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);

	retVal = ws1.FindWindowGroupIdentifier(id1,_L("abcd"),3);
	TEST(retVal==KErrNotFound);
	if (retVal!=KErrNotFound)
		INFO_PRINTF3(_L("ws1.FindWindowGroupIdentifier(id1,_L(abcd),3) return value - Expected: %d, Actual: %d"), KErrNotFound, retVal);
//
	delete screen;
	CleanupStack::PopAndDestroy(4, &ws1);
	}

void CTGwHandle::DefaultOwningWindowL()
	{
	TInt foreground=TheClient->iWs.GetFocusWindowGroup();
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen);
	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));

//
	INFO_PRINTF1(_L("DefaultOwningWindow1"));
	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(1));
	gw1.SetOwningWindowGroup(foreground);
	RWindowGroup gw2(ws1);
	User::LeaveIfError(gw2.Construct(2));
	gw2.SetOwningWindowGroup(foreground);
	RWindowGroup gw3(ws1);
	User::LeaveIfError(gw3.Construct(3));
	gw3.SetOwningWindowGroup(foreground);
	RWindowGroup gw4(ws1);
	User::LeaveIfError(gw4.Construct(4));
	gw4.SetOwningWindowGroup(foreground);
	INFO_PRINTF1(_L(" Created Group Window"));
//
	TInt prevOwningGroup=ws1.GetDefaultOwningWindow();
	gw1.DefaultOwningWindow();
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	gw2.DefaultOwningWindow();
	TEST(gw2.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw2.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw2.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw2.Identifier());

	gw2.Close();
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	gw3.DefaultOwningWindow();
	gw4.DefaultOwningWindow();
	gw3.Close();
	TEST(gw4.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw4.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw4.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw4.Identifier());

	gw4.Close();
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	gw1.Close();
	TEST(prevOwningGroup==ws1.GetDefaultOwningWindow());
	if (prevOwningGroup!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("prevOwningGroup==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), prevOwningGroup);

	INFO_PRINTF1(_L(" Closed Group Window"));

	User::LeaveIfError(gw1.Construct(1));
	gw1.SetOwningWindowGroup(foreground);
	User::LeaveIfError(gw2.Construct(2));
	gw2.SetOwningWindowGroup(foreground);
	User::LeaveIfError(gw3.Construct(3));
	gw3.SetOwningWindowGroup(foreground);
	INFO_PRINTF1(_L(" ReCreated Group Window"));
	gw1.DefaultOwningWindow();
	gw1.DefaultOwningWindow();
 	gw1.Close();
	gw2.DefaultOwningWindow();
	gw2.DefaultOwningWindow();
	gw3.Close();
	gw2.Close();
	INFO_PRINTF1(_L(" Re-Closed Group Window"));

	User::LeaveIfError(gw1.Construct(1));
	gw1.SetOwningWindowGroup(foreground);
	User::LeaveIfError(gw2.Construct(2));
	gw2.SetOwningWindowGroup(foreground);
	User::LeaveIfError(gw3.Construct(3));
	gw3.SetOwningWindowGroup(foreground);
	User::LeaveIfError(gw4.Construct(4));
	gw4.SetOwningWindowGroup(foreground);
	INFO_PRINTF1(_L(" ReCreated Group Window Again"));
	gw1.DefaultOwningWindow();
	gw2.DefaultOwningWindow();
	gw1.DefaultOwningWindow();
 	gw1.Close();
	gw2.Close();
	gw3.DefaultOwningWindow();
	gw4.DefaultOwningWindow();
	gw3.DefaultOwningWindow();
 	gw4.Close();
	gw3.Close();
	INFO_PRINTF1(_L(" Re-Closed Group Window Again"));

	User::LeaveIfError(gw1.Construct(1));
	gw1.DefaultOwningWindow();
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	gw1.DefaultOwningWindow();
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	User::LeaveIfError(gw2.Construct(2));
	TEST(gw1.Identifier()==ws1.GetDefaultOwningWindow());
	if (gw1.Identifier()!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1.Identifier()==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1.Identifier());

	gw2.Close();
	gw1.Close();

	CleanupStack::PopAndDestroy(screen);
	ws1.Close();
	}

void CTGwHandle::DefaultOwningWindow2L()
//This test originally resulted in a crash, while the above test originally resulted in lockups.
	{
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen1 = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen1);
	User::LeaveIfError(screen1->Construct(iTest->iScreenNumber));

	RWsSession ws2;
	User::LeaveIfError(ws2.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen2 = new (ELeave) CWsScreenDevice(ws2);
	CleanupStack::PushL(screen2);
	User::LeaveIfError(screen2->Construct(iTest->iScreenNumber));

//
	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(1));
	RWindowGroup gw2(ws2);
	User::LeaveIfError(gw2.Construct(2));
	RWindowGroup gw3(ws1);
	User::LeaveIfError(gw3.Construct(3));
//
	const TInt gw1Id=gw1.Identifier();
	gw1.DefaultOwningWindow();
	gw2.DefaultOwningWindow();
	/*const TInt gw2Id=*/gw2.Identifier();
	gw1.DefaultOwningWindow();
	TEST(gw1Id==ws1.GetDefaultOwningWindow());
	if (gw1Id!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1Id==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1Id);

	gw3.DefaultOwningWindow();
	gw3.Close();
	TEST(gw1Id==ws1.GetDefaultOwningWindow());
	if (gw1Id!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw1Id==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw1Id);

	gw1.Close();
	TInt gw2Id=gw2.Identifier();
	TEST(gw2Id==ws1.GetDefaultOwningWindow());
	if (gw2Id!=ws1.GetDefaultOwningWindow())
		INFO_PRINTF3(_L("gw2Id==ws1.GetDefaultOwningWindow() - Expected: %d, Actual: %d"), ws1.GetDefaultOwningWindow(), gw2Id);

	gw2.SetOrdinalPosition(0);
	gw2.Close();
	ws2.Flush();
	TRawEvent rawEvent;
	rawEvent.Set(TRawEvent::EKeyDown,32);
	TheClient->iWs.SimulateRawEvent(rawEvent);
	TheClient->iWs.Flush();
//
	CleanupStack::PopAndDestroy(2,screen1);
	ws1.Close();
	ws2.Close();
	}

#define FREQ 500
void CTGwHandle::IdentifierWrapAroundTestL()
	{
	TInt report=-1;
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());

	// assign to the correct screen
	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen);
	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));

	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(1));
	gw1.EnableReceiptOfFocus(EFalse);
	TInt id1=gw1.Identifier();
	RWindowGroup gw2(ws1);
	User::LeaveIfError(gw2.Construct(2));
	gw2.EnableReceiptOfFocus(EFalse);
	TInt id2=gw2.Identifier();
	gw2.Close();	// Allow gw2 id to be re-used
	TInt id3;

	do
		{
		RWindowGroup gw3(ws1);
		User::LeaveIfError(gw3.Construct(2));
		gw3.EnableReceiptOfFocus(EFalse);
		id3=gw3.Identifier();
		if ((id3/FREQ)!=(report/FREQ))	// || id3<=10)
			{
			report=id3;
			iTest->LogMessage(id3);
			}
		TEST(id3!=id1);	// Check id1 is not re-used as the window hasn't been freed yet
		if (id3==id1)
			{
			_LIT(KErr,"Window Group Id Reused!");
			LOG_MESSAGE(KErr);
			}
		gw3.Close();
		} while(id3!=id2);

	CleanupStack::PopAndDestroy(screen);
	ws1.Close();
	}

void GwHandleDestroyWindow(TAny* aWindow)
	{
	static_cast<RWindowTreeNode*>(aWindow)->Destroy();
	}

RWindowGroup* CTGwHandle::CreateWindowGroupLC(RWsSession& aWs,TUint32 aClientHandle,TInt aParentId/*=0*/)
	{
	RWindowGroup* gw=new(ELeave) RWindowGroup(aWs);
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,gw));
	if (aParentId>0)
		{
		User::LeaveIfError(gw->ConstructChildApp(aParentId,aClientHandle,EFalse));
		}
	else
		{
		User::LeaveIfError(gw->Construct(aClientHandle,EFalse));
		}
	return gw;
	}

void CTGwHandle::CreateGroupWindowsLC(RWsSession& aWs)
	{
	for(TInt ii=ENumGroups-1;ii>=0;--ii)
		iGroups[ii]=CreateWindowGroupLC(aWs,ii);
	}

void CTGwHandle::CreateChainedGroupWindowsLC(RWsSession& aWs,TBool aSecondChain)
	{
	TInt parentId=0;
	for(TInt ii=ENumChained-1;ii>=0;--ii)
		{
		iChained[ii]=CreateWindowGroupLC(aWs,ENumGroups+ii,parentId);
		parentId=iChained[ii]->Identifier();
		}
	if(aSecondChain)
		{
		parentId =0;
		for(TInt ii=ENumChained-1;ii>=0;--ii)
			{
			iChained2[ii]=CreateWindowGroupLC(aWs,ENumGroups+ENumGroups+ii,parentId);
			parentId=iChained2[ii]->Identifier();
			}
		}
	}

void CTGwHandle::MoveGroups(RWindowGroup** aGroups,TInt aGp,TInt aNum,TInt aPos,TInt aInc/*=2*/)
	{
	TInt ii;
	for(ii=aNum;ii>0;--ii)
		{
		aGroups[aGp]->SetOrdinalPosition(aPos);
		aGp+=(aInc>0?1:-1);
		aPos+=aInc;
		}
	}

void CTGwHandle::TestGroups(TInt aPos)
	{
	TInt retVal;
	TInt ii = 0;
	for(ii=0;ii<ENumChained;++ii)
		{
		retVal = iChained[ii]->OrdinalPosition();
		TEST(retVal==aPos+ii);
		if (retVal!=aPos+ii)
			INFO_PRINTF3(_L("iChained[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), aPos+ii, retVal);
		}

	for(ii=0;ii<ENumGroups;++ii)
		{
		retVal = iGroups[ii]->OrdinalPosition();
		TInt ret = (ii<aPos?ii:ii+ENumChained);
		TEST(retVal==ret);
		if (retVal!=ret)
			INFO_PRINTF3(_L("iGroups[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), ret, retVal);
		}
	}

void CTGwHandle::TestGroupsBefore(TInt aPos)
	{
	TInt ii;
	TInt retVal;
	if (aPos>0)
		{
		for (ii=0;ii<aPos;++ii)
			{
			retVal = iGroups[ii]->OrdinalPosition();
			TEST(retVal==ii);
			if (retVal!=ii)
				INFO_PRINTF3(_L("iGroups[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), ii, retVal);
			}
		}
	for (ii=0;ii<ENumChained;++ii)
		{
		retVal = iChained[ii]->OrdinalPosition();
		TEST(retVal==aPos+2*ii);
		if (retVal!=aPos+2*ii)
			INFO_PRINTF3(_L("iChained[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), aPos+2*ii, retVal);
		}
	for (ii=0;ii<ENumChained-1;++ii)
		{
		retVal = iGroups[aPos+ii]->OrdinalPosition();
		TEST(retVal==aPos+1+2*ii);
		if (retVal!=aPos+1+2*ii)
			INFO_PRINTF3(_L("iGroups[aPos+ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), aPos+1+2*ii, retVal);
		}
	for (ii=aPos+ENumChained-1;ii<ENumGroups;++ii)
		{
		retVal = iGroups[ii]->OrdinalPosition();
		TEST(retVal==ii+ENumChained);
		if (retVal!=ii+ENumChained)
			INFO_PRINTF3(_L("iGroups[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), ii+ENumChained, retVal);
		}
	}

void CTGwHandle::WindowGroupChaining()
	{
	RWsSession& ws=TheClient->iWs;
	CreateGroupWindowsLC(ws);
	CreateChainedGroupWindowsLC(ws);
	TestGroups(0);
	TInt start,target,moveGp;
	for(moveGp=0;moveGp<ENumChained;++moveGp)
		{
		for(target=0;target<ENumGroups+1;++target)
			{
			for(start=0;start<ENumGroups-ENumChained+2;++start)
				{
				if (target>start+1)
					MoveGroups(iGroups,target-1,target-start-1,ENumChained+target-1,-1);
				if (target<start && start>0)
					MoveGroups(iGroups,0,start,0,1);
				MoveGroups(iGroups,start,ENumChained-1,start+1);
				TestGroupsBefore(start);
				iChained[moveGp]->SetOrdinalPosition(target+moveGp);
				TestGroups(target);
				}
			}
		iChained[0]->SetOrdinalPosition(0);
		TestGroups(0);
		}
	CleanupStack::PopAndDestroy(ENumGroups+ENumChained,iGroups[ENumGroups-1]);
	}

void CTGwHandle::WindowGroupChaining2()
	{
	RWsSession& ws=TheClient->iWs;
	RWindowGroup* chain1=CreateWindowGroupLC(ws,1);
	chain1->SetOrdinalPosition(0,1);
	RWindowGroup* chain2=CreateWindowGroupLC(ws,2,chain1->Identifier());
	TInt retVal = chain2->OrdinalPriority();
	TEST(retVal==1);
	if (retVal!=1)
			INFO_PRINTF3(_L("chain2->OrdinalPriority() return value - Expected: %d, Actual: %d"), 1, retVal);

	chain1->SetOrdinalPosition(0,2);
	retVal = chain2->OrdinalPriority();
	TEST(retVal==2);
	if (retVal!=2)
			INFO_PRINTF3(_L("chain2->OrdinalPriority() return value - Expected: %d, Actual: %d"), 2, retVal);

	chain2->SetOrdinalPosition(0,3);
	retVal = chain1->OrdinalPriority();
	TEST(retVal==3);
	if (retVal!=3)
			INFO_PRINTF3(_L("chain1->OrdinalPriority() return value - Expected: %d, Actual: %d"), 3, retVal);

	CleanupStack::PopAndDestroy(2,chain1);
	
	//Test that two different sessions can't chain window-groups without permisson.
	//Both sessions must use the same screen.
	RWsSession ws2;
	User::LeaveIfError(ws2.Connect());
	CleanupClosePushL(ws2);
	chain1=CreateWindowGroupLC(ws2,1);
	TInt id1=chain1->Identifier();
	
	RWsSession ws3;
	User::LeaveIfError(ws3.Connect());
	CleanupClosePushL(ws3);
	RWindowGroup chain(ws3);
	
	RDebug::Print(KPlatsecBegin);
	retVal = chain.ConstructChildApp(id1,2);
	TEST(retVal==KErrPermissionDenied);
	if (retVal!=KErrPermissionDenied)
			INFO_PRINTF3(_L("chain.ConstructChildApp(id1,2) return value - Expected: %d, Actual: %d"), KErrPermissionDenied, retVal);

	RDebug::Print(KPlatsecEnd);
	chain1->AllowProcessToCreateChildWindowGroups(TUid::Uid(0x10205152));	//Secure ID
	retVal = chain.ConstructChildApp(id1,2);
	TEST(retVal==KErrNone);
	if (retVal!=KErrNone)
			INFO_PRINTF3(_L("chain.ConstructChildApp(id1,2) return value - Expected: %d, Actual: %d"), KErrNone, retVal);

	chain.Close();
	CleanupStack::PopAndDestroy(3,&ws2);
	}

void CTGwHandle::UnchainWindowGroupsL()
	{
	RArray<RWsSession::TWindowGroupChainInfo>* windowHandles=new(ELeave) RArray<RWsSession::TWindowGroupChainInfo>;
	CleanupStack::PushL(windowHandles);
	GetGwListL(0,windowHandles);
	TInt shellWindow=windowHandles->Count();
	//Creating chained window groups.
	CreateChainedGroupWindowsLC(TheClient->iWs);
	GetGwListL(0,windowHandles);
	//Test total window groups in the list
	TInt retVal = windowHandles->Count();
	TEST(retVal==ENumChained+shellWindow);
	if (retVal!=ENumChained+shellWindow)
			INFO_PRINTF3(_L("windowHandles->Count() return value - Expected: %d, Actual: %d"), ENumChained+shellWindow, retVal);
	//Two unchained group windows

	//Test Parent Id
	TInt parentId=0;
	for(TInt ii=ENumChained-1;ii>=0;ii--)
		{
		RWsSession::TWindowGroupChainInfo window;
		window.iId=iChained[ii]->Identifier();
		TInt loc=windowHandles->Find(window);
		TEST(loc!=KErrNotFound);
		if (loc==KErrNotFound)
			INFO_PRINTF3(_L("windowHandles->Find(window) return value - Expected: %d, Actual: %d"), KErrNotFound, loc);

		if(loc!=KErrNotFound)
			{
			TEST((*windowHandles)[loc].iParentId==parentId);
			if ((*windowHandles)[loc].iParentId!=parentId)
				INFO_PRINTF3(_L("(*windowHandles)[loc].iParentId==parentId - Expected: %d, Actual: %d"), parentId, (*windowHandles)[loc].iParentId);

			parentId=window.iId;
			}
		}
	//Test unchaining of chained window groups
	for(TInt count=ENumChained-1;count>=0;count--)
		{
		iChained[count]->Close();
		GetGwListL(0,windowHandles);
		TEST(windowHandles->Count()== count+shellWindow);
		if (windowHandles->Count()!= count+shellWindow)
				INFO_PRINTF3(_L("windowHandles->Count()==count+shellWindow - Expected: %d, Actual: %d"), count+shellWindow, windowHandles->Count());

		}
	CleanupStack::PopAndDestroy(ENumChained,iChained[ENumChained-1]);

	//delete middle windowgroup of chain which should kill all the child windows
	CreateChainedGroupWindowsLC(TheClient->iWs);
	TInt windowPos=2;
	CleanupStack::Pop(2,iChained[1]);	//Pop first 2 items iChained[0] and iChained[1]
	iChained[windowPos]->Close();//Close the 3rd WindowGroup in the chain.should unchain 4 and 5 window group.
	CleanupStack::PopAndDestroy(iChained[windowPos]);
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[1]));
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[0]));
	GetGwListL(0,windowHandles);
	retVal = ChainedWindowCount(windowHandles);
	TEST(retVal==ENumChained-windowPos-1);
	if (retVal!=ENumChained-windowPos-1)
				INFO_PRINTF3(_L("ChainedWindowCount(windowHandles) return value - Expected: %d, Actual: %d"), ENumChained-windowPos-1, retVal);

//	CleanupStack::PopAndDestroy(ENumChained-1,iChained[ENumChained-1]);

	windowPos=3;
	CleanupStack::Pop(2,iChained[1]);
	iChained[windowPos]->Close();//Close the 2nd WindowGroup in the chain.
								//should unchain all .
	CleanupStack::PopAndDestroy(iChained[windowPos]);
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[1]));
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[0]));
	GetGwListL(0,windowHandles);
	retVal = ChainedWindowCount(windowHandles);
	TEST(retVal==ENumChained-windowPos-2);
	if (retVal!=ENumChained-windowPos-2)
				INFO_PRINTF3(_L("ChainedWindowCount(windowHandles) return value - Expected: %d, Actual: %d"), ENumChained-windowPos-2, retVal);

	windowPos=4;
	CleanupStack::Pop(2,iChained[1]);
	iChained[windowPos]->Close();//Closing parent window group in chain. There should be no chain
	CleanupStack::PopAndDestroy(iChained[windowPos]);
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[1]));
	CleanupStack::PushL(TCleanupItem(&GwHandleDestroyWindow,iChained[0]));
	GetGwListL(0,windowHandles);
	retVal = ChainedWindowCount(windowHandles);
	TEST(retVal==ENumChained-windowPos-1);
	if (retVal!=ENumChained-windowPos-1)
				INFO_PRINTF3(_L("ChainedWindowCount(windowHandles) return value - Expected: %d, Actual: %d"), ENumChained-windowPos-1, retVal);

	CleanupStack::PopAndDestroy(ENumChained-3,iChained[ENumChained-4]);
	windowHandles->Close();
	CleanupStack::PopAndDestroy(windowHandles);
	}

TInt CTGwHandle::ChainedWindowCount(RArray<RWsSession::TWindowGroupChainInfo>* aWindowHandles)
	{
	TInt wndGrpCount=0;
	for(TInt ii=0;ii<aWindowHandles->Count();ii++)
		{
		if((*aWindowHandles)[ii].iParentId!=-1)
			wndGrpCount++;
		}
	return wndGrpCount;
	}

void CTGwHandle::TestOrdinalPositionL()
	{
	TInt noOfGroupWnds = NumberOfWndGroupsWithZeroPriority(iTest->iScreenNumber);
	//Creating the chained window groups
	CreateChainedGroupWindowsLC(TheClient->iWs);
	TestOrdinalPos(0);
	//Test the ordinal position of all chained windows by setting the WndPos window
	//to chainPos position
	for(TInt wndPos=0;wndPos<ENumChained;wndPos++)
		{
		for(TInt chainPos=0;chainPos<15;chainPos++)
			{
			iChained[wndPos]->SetOrdinalPosition(chainPos);
			TInt dung = chainPos-wndPos;
			if(dung > noOfGroupWnds)
				{
				dung = noOfGroupWnds;
				}
			dung = Max(dung, 0);
			TestOrdinalPos(chainPos - wndPos > noOfGroupWnds ? noOfGroupWnds : Max(chainPos - wndPos, 0));
			}
		}
	//Test for negative ordinal number
	iChained[0]->SetOrdinalPosition(-2);
	TestOrdinalPos(noOfGroupWnds);
	CleanupStack::PopAndDestroy(ENumChained,iChained[ENumChained-1]);
	}

void CTGwHandle::TestOrdinalPositionNoDebugL()
	{
	TInt noOfGroupWnds = NumberOfWndGroupsWithZeroPriority(iTest->iScreenNumber);
	//Creating the chained window groups
	CreateChainedGroupWindowsLC(TheClient->iWs);
	//Test the ordinal position of all chained windows
	TestOrdinalPosNoDebug(0);
	//Test the ordinal position of all chained windows by setting the WndPos window
	//to chainPos position
	for(TInt wndPos=0;wndPos<ENumChained;wndPos++)
		{
		for(TInt chainPos=0;chainPos<15;chainPos++)
			{
			iChained[wndPos]->SetOrdinalPosition(chainPos);
			TestOrdinalPosNoDebug(chainPos - wndPos > noOfGroupWnds ? noOfGroupWnds : Max(chainPos - wndPos, 0));
			}
		}
	//Test for negative ordinal number
	iChained[0]->SetOrdinalPosition(-2);
	TestOrdinalPosNoDebug(noOfGroupWnds);
	CleanupStack::PopAndDestroy(ENumChained,iChained[ENumChained-1]);
	}

void CTGwHandle::TestOrdinalPos(TInt aPos)
	{
	for(TInt ii=0;ii<ENumChained;ii++)
		{
		TInt iCha = iChained[ii]->OrdinalPosition();
		TEST(iCha==aPos++);
		if (iCha!=aPos-1)
			{
			INFO_PRINTF3(_L("iChained[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), aPos-1, iCha);
			}
		}
	}

void CTGwHandle::TestOrdinalPosNoDebug(TInt aPos)
	{
	for(TInt ii=0;ii<ENumChained;ii++)
		{
		TInt iCha = iChained[ii]->OrdinalPosition();
		TEST(iCha==aPos++);
		if (iCha!=aPos-1)
			INFO_PRINTF3(_L("iChained[ii]->OrdinalPosition() return value - Expected: %d, Actual: %d"), aPos-1, iCha);

		}
	}

void CTGwHandle:: TestclosingclientL()
	{
	RWsSession ws1;
	User::LeaveIfError(ws1.Connect());
	CleanupClosePushL(ws1);

	// assign to the correct screen
	CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws1);
	CleanupStack::PushL(screen);
	User::LeaveIfError(screen->Construct(iTest->iScreenNumber));

	// Creating first Window Group
	RWindowGroup gw1(ws1);
	User::LeaveIfError(gw1.Construct(ENullWsHandle));
	ws1.SetWindowGroupOrdinalPosition(gw1.Identifier(),0);

	// Creating second Window Group
	RWindowGroup gw2(ws1);
	User::LeaveIfError(gw2.Construct(ENullWsHandle));
	gw2.SetOwningWindowGroup(gw1.Identifier());
	gw2.SetOrdinalPosition(1);
	CleanupStack::PopAndDestroy(screen);
	CleanupStack::PopAndDestroy(&ws1);
	}

void CTGwHandle::TestClearingAndSettingChildGroupsL()
	{
	RArray<RWsSession::TWindowGroupChainInfo> windowHandles;
	CleanupClosePushL(windowHandles);
	//Creating a chain of 5 window groups.
	CreateChainedGroupWindowsLC(TheClient->iWs);
	TInt ret=KErrNone;
	// Want to test clearing and setting of window groups for chain lengths of 5 down to 2
	for(TInt jj=ENumChained-1;jj>0;jj--)
		{
		// For each window group in the chain, test clearing and setting a child group
		for(TInt ii=jj;ii>0;ii--)
			{
			RWsSession::TWindowGroupChainInfo window1;
			window1.iId=iChained[ii]->Identifier();
			GetGwListL(0,&windowHandles);
			TInt loc=windowHandles.Find(window1);
			TEST(loc!=KErrNotFound);
			if(loc!=KErrNotFound)
				{
				RWsSession::TWindowGroupChainInfo window2;
				window2.iId=iChained[ii-1]->Identifier();
				loc = windowHandles.Find(window2);
				TEST(loc!=KErrNotFound);
				// First test that the parent of the next window in the chain is the previous in the chain
				if(loc!=KErrNotFound)
					{
					TEST(windowHandles[loc].iParentId==window1.iId);
					}
				// Then clear and test that the parent of the next window in the chain
				// is no longer the previous window in the chain
				ret=iChained[ii]->ClearChildGroup();
				TEST(ret==KErrNone);
				// Try to clear a child group when it's already cleared - should return KErrArgument
				ret=iChained[ii]->ClearChildGroup();
				TEST(ret==KErrArgument);
				GetGwListL(0,&windowHandles);
				loc = windowHandles.Find(window2);
				TEST(loc!=KErrNotFound);
				// Test that it has no parent (0) or is unchained (-1)
				if(loc!=KErrNotFound)
					{
					if(ii==1) // last in chain therefore unchained, should return -1
						TEST(windowHandles[loc].iParentId==-1);
					else // otherwise should return 0 signifying in a chain but with no parent
						TEST(windowHandles[loc].iParentId==0);
					}
				// Reset the former child group as a child to the current group
				ret=iChained[ii]->SetChildGroup(window2.iId);
				TEST(ret==KErrNone);
				// Test that it has now got it's parent back
				GetGwListL(0,&windowHandles);
				loc = windowHandles.Find(window2);
				TEST(loc!=KErrNotFound);
				if(loc!=KErrNotFound)
					{
					TEST(windowHandles[loc].iParentId==window1.iId);
					}
				}
			}
			// Reduce chain length by 1
			ret=iChained[jj]->ClearChildGroup();
			TEST(ret==KErrNone);
		}
	// Try to clear the child group of a window that's not in a queue - returns KErrArgument
	ret=iChained[0]->ClearChildGroup();
	TEST(ret==KErrArgument);
	// Test calling set on a non-existent window group - fictional id, larger than what exists
	ret=iChained[0]->SetChildGroup(9999);
	TEST(ret==KErrArgument);
	// Cleanup
	CleanupStack::PopAndDestroy(ENumChained,iChained[ENumChained-1]);
	CleanupStack::PopAndDestroy(&windowHandles);
	}

void CTGwHandle::TestAgainstLoopsWhenAddingChildGroupsL()
	{
	//Creating two chains of 5 window groups.
	CreateChainedGroupWindowsLC(TheClient->iWs,ETrue);
	TInt ret=KErrNone;
	
	//Try to append any of element of this chain to the lastone (itself included)
	//All these attempts should fail (otherwise a infinite loop will be set up)
	for(TInt ii=ENumChained-1;ii>=0;ii--)
		{
		TInt windowId = iChained[ii]->Identifier();
		// Try to append it to the last one
		ret=iChained[0]->SetChildGroup(windowId);
		TEST(ret==KErrArgument);
		if(ret!=KErrArgument)
			{
			_LIT(KLog,"Error: SetChildGroup with a GpWin belonging to the same queue succeeded, return value :%d");
			LOG_MESSAGE2(KLog,ret);
			}
		}
	//Try to append any elements belonging to another chain to the last one of this chain
	//All these trials should fail (otherwise a infinite loop will be set up)
	//Except for the parent of the second chain.
	for(TInt ii=0;ii<ENumChained;ii++)
		{
		TInt windowId = iChained2[ii]->Identifier();
		// Try to append it to the last one
		ret=iChained[0]->SetChildGroup(windowId);
		if(ii != ENumChained-1)
			{
			TEST(ret==KErrArgument);
			if(ret!=KErrArgument)
				{
				_LIT(KLog,"Error: SetChildGroup with a GpWin which already has a parent succeeded, return value :%d");
				LOG_MESSAGE2(KLog,ret);
				}
			iChained[0]->ClearChildGroup();
			}
		else
			{
			TEST(ret==KErrNone);
			if(ret!=KErrNone)
				{
				_LIT(KLog,"Error: SetChildGroup with a GpWin with no parent failed, return value :%d");
				LOG_MESSAGE2(KLog,ret);
				}
			}
		}
	TInt windowId = iChained2[ENumChained-1]->Identifier();
	ret=iChained[ENumChained-1]->SetChildGroup(windowId);
	TEST(ret==KErrArgument);
	if(ret!=KErrArgument)
		{
		_LIT(KLog,"Error: SetChildGroup successful on a GpWin which already has a child, return value :%d");
		LOG_MESSAGE2(KLog,ret);
		}
	//Now take a window group not belonging to any queue
	//just take the parent's chain and pop it 
	//and try to append it to itself
	ret=iChained[ENumChained-1]->ClearChildGroup();
	TEST(ret==KErrNone);
	ret=iChained[ENumChained-1]->SetChildGroup(iChained[ENumChained-1]->Identifier());
	TEST(ret==KErrArgument);
	if(ret!=KErrArgument)
		{
		_LIT(KLog,"Error: Setting GpWin as a child of itself succeeded, return value :%d");
		LOG_MESSAGE2(KLog,ret);
		}
    CleanupStack::PopAndDestroy(ENumChained+ENumChained,iChained[ENumChained-1]);
	}
void CTGwHandle::RunTestCaseL(TInt /*aCurTestCase*/)
	{
	_LIT(KTest0,"Window group names");
	_LIT(KTest1,"Window group identifiers");
	_LIT(KTest2,"Owner to foreground");
	_LIT(KTest3,"FindWindowGroupIdentifier test");
	_LIT(KTest4,"IdentifierWrapAround test");
	_LIT(KTest5,"DefaultOwningWindow test");
	_LIT(KTest6,"DefaultOwningWindow2 test");
	_LIT(KTest7,"Window Group Chaining");
	_LIT(KTest8,"Window Group Chaining2");
	_LIT(KTest9,"Unchaining window group");
	_LIT(KTest10,"Ordinal Postion Test");
	_LIT(KTest11,"CrashTest on closing client");
	_LIT(KTest12,"Setting and Clearing Child Groups");
	_LIT(KTest13,"No Infinite Loops in Setting Child Groups");
	((CTGwHandleStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(++iTest->iState)
		{
/**

  @SYMTestCaseID GRAPHICS-WSERV-0316

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test setting window group names

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set the name of a window group to different values and check the
  					value is set correctly

  @SYMTestExpectedResults The window group name is set correctly

*/
		case 1:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0316"));
			//iState=9; break;
			iTest->LogSubTest(KTest0);
			GwNamesL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0317

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test setting window group identifiers

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set the identifiers of a window groups. manipulate the window groups and
  					check the identifiers remain correct

  @SYMTestExpectedResults The identifiers are correct for each window group after
  							manipulation

*/
		case 2:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0317"));
			iTest->LogSubTest(KTest1);
			GwIdentifierTestL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0318

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test moving different window groups to the foreground and bringing
  					back the backgorund

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create some window groups and move them in turn to the foreground before
  					restoring the background

  @SYMTestExpectedResults Window groups move to and from the foreground with error

*/
		case 3:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0318"));
			iTest->LogSubTest(KTest2);
			OwnerToForegroundL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0319

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test returning different window groups identifiers by searching
  					on the name

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create some window groups and return their identifiers by searching on
  					their names

  @SYMTestExpectedResults The correct identifiers are returned for each name

*/
		case 4:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0319"));
			iTest->LogSubTest(KTest3);
			FindWindowGroupIdentifierTestL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0320

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that a windows group identifier is not used twice

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Assign a window group identifier to one window group and check
  					the same identifier can not be used for a second group

  @SYMTestExpectedResults Window group identifier can not be reused

*/
		case 5:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0320"));
			iTest->LogSubTest(KTest4);
			IdentifierWrapAroundTestL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0321

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that the default owning window for window groups is set
  					correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set different default owning windows for different window groups.
  					Check the windows have been set correctly.

  @SYMTestExpectedResults The default owning windows for the groups are set correctly

*/
		case 6:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0321"));
			iTest->LogSubTest(KTest5);
			DefaultOwningWindowL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0322

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that the default owning window for window groups is set
  					correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Set different default owning windows for different window groups.
  					Check the windows have been set correctly.

  @SYMTestExpectedResults The default owning windows for the groups are set correctly

*/
		case 7:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0322"));
			iTest->LogSubTest(KTest6);
			DefaultOwningWindow2L();
			TheClient->iGroup->WinTreeNode()->SetOrdinalPosition(0);
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0323

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that window groups can be chained correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create a chain of window groups and check that the chain of groups
  					can be manipluated correctly

  @SYMTestExpectedResults The chain can be manipulated correctly

*/
		case 8:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0323"));
			iTest->LogSubTest(KTest7);
			WindowGroupChaining();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0324

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that window groups can be chained correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create a chain of window groups and check that the chain of groups
  					can be manipluated correctly

  @SYMTestExpectedResults The chain can be manipulated correctly

*/
		case 9:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0324"));
			iTest->LogSubTest(KTest8);
			WindowGroupChaining2();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0325

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that window groups can be unchained correctly

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create chains of window groups and check that the window groups can be
  					unchained correctly

  @SYMTestExpectedResults The chain can be unchained correctly

*/
		case 10:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0325"));
			iTest->LogSubTest(KTest9);
			UnchainWindowGroupsL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0326

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test the ordinal position of chained window groups

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create chains of window groups and check their ordinal position is correct
  					for different scenarios

  @SYMTestExpectedResults Ordinal position of chained window group is correct

*/
		case 11:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0326"));
			iTest->LogSubTest(KTest10);
			TestOrdinalPositionL();
			break;
		case 12:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0326"));
			iTest->LogSubTest(KTest10);
			TestOrdinalPositionNoDebugL();
			break;
/**

  @SYMTestCaseID GRAPHICS-WSERV-0327

  @SYMDEF             DEF081259

  @SYMTestCaseDesc Test that window groups are dealt with correctly if their client is closed

  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Create window groups and then close there client.

  @SYMTestExpectedResults The window groups of the closed client are handled without error

*/
		case 13:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0327"));
			iTest->LogSubTest(KTest11);
			TestclosingclientL();
			break;
		case 14:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0327"));
			iTest->LogSubTest(KTest12);
			TestClearingAndSettingChildGroupsL();
			break;
		case 15:
			((CTGwHandleStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0327"));
			iTest->LogSubTest(KTest13);
			TestAgainstLoopsWhenAddingChildGroupsL();
			break;
		default:
			((CTGwHandleStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			((CTGwHandleStep*)iStep)->CloseTMSGraphicsStep();
			TestComplete();
			break;
		}
	((CTGwHandleStep*)iStep)->RecordTestResultL();
	}

__WS_CONSTRUCT_STEP__(GwHandle)