lafagnosticuifoundation/cone/tef/TCONE3STEP.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/cone/tef/TCONE3STEP.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1521 @@
+// Copyright (c) 2005-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:
+// Tests for Object provider mechanism.\n
+// An interface that allows an object to be part of a network of object providers.
+// The object provider mechanism can be used to find and access objects of a 
+// given type, where the type is defined by a TTypeUid object. Object providers 
+// may be arranged in a hierarchy, i.e. an object provider may have a parent-child 
+// relationship with another object provider.
+// An object provider must provide an implementation for the MopSupplyObject() 
+// function and can choose to provide an implementation for the MopNext() function. 
+// Typically, it will also have functionality to define who its parent is.
+// 
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+ @test
+*/
+
+#include <e32std.h>
+#include <coeaui.h>
+#include <coemop.h>
+#include "TCone3Step.h"
+#include "statecon.h"
+
+
+//				Object Tree
+
+/**
+					A
+				   / \
+				 /	  \
+			   /		\
+			 /			  \
+			B				E
+		  /   \			  /   \
+		C		D		F		G
+
+*/
+
+
+
+/**   Destructor for Class CSquareObj.\n */
+
+CSquareObj::~CSquareObj()
+	{}
+
+/**   Sets the parent object provider's class name.\n  */
+
+void CSquareObj::SetParentClassName(TDesC& aName)
+	{
+	iName.Set( aName );
+	}
+
+TPtrC CSquareObj::GetParentClassName() const
+	{
+	return iName;
+	}
+//! A CBase Derived Class.\n
+
+/**   The class is used to test the object provider mechanism.\n */
+
+class CTriangleObj : public CBase
+	{
+public:
+	DECLARE_TYPE_ID(0x10004C75)
+    ~CTriangleObj();
+	void SetParentClassName(TDesC& aName);
+	TPtrC GetParentClassName()  const;
+private:
+	TPtrC	iName;
+   };
+
+/**   Destructor for class CTriangleObj.\n */
+    
+CTriangleObj::~CTriangleObj()
+    {}
+
+/**   Sets the Parent class name of CTriangleObj class to aName.\n */
+
+void CTriangleObj::SetParentClassName(TDesC& aName)
+	{
+	iName.Set( aName );
+	}
+/**   Returns the Parent class name of CTriangleObj class.\n */
+	
+TPtrC CTriangleObj::GetParentClassName() const
+	{
+	return iName;
+	}
+
+/**   Destructor for class COctagonObj.\n */
+  
+COctagonObj::~COctagonObj()
+    {}
+
+/**   Sets the Parent class name of COctagonObj class to aName.\n */
+void COctagonObj::SetParentClassName(TDesC& aName)
+	{
+	iName.Set( aName );
+	}
+/**   Returns the Parent class name of COctagonObj class.\n */		
+TPtrC COctagonObj::GetParentClassName() const
+	{
+	return iName;
+	}
+//! A Class derived from CBase and MObjectProvider.\n
+
+/**
+  CObjectNode is an object provider implementing the MObjectProvider interface.\n
+  MObjectProvider interface that allows an object to be part of a network of object providers.\n
+  This class contains objects of classes CTriangleObj,CSquareObj and COctagonObj.\n
+*/
+class CObjectNode : public CBase, public MObjectProvider
+	{
+public:
+	CObjectNode();
+	CObjectNode(CTriangleObj* aTriangleObj, CSquareObj* aSquareObj, COctagonObj* aOctagonObj);
+    ~CObjectNode();
+	void SetMopParent(MObjectProvider* aParent);
+	
+	CTriangleObj* GetTriangleObject();	
+	CTriangleObj* GetTriangleObjNoChaining();
+	
+	CSquareObj* GetSquareObject();
+	CSquareObj* GetSquareObjNoChaining();
+	
+	COctagonObj* GetOctagonObject();
+	COctagonObj* GetOctagonObjNoChaining();
+
+protected: // from MObjectProvider
+	TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
+	MObjectProvider* MopNext();
+private:
+	inline TTypeUid::Ptr SupplyMopObject(const TTypeUid aId);
+public:
+	//! Array to store objects linked through object provider mechanism.\n
+	RPointerArray<CObjectNode> iArray;
+private:
+	//! Parent object provider.\n
+	MObjectProvider* iMopParent;
+	//! Pointer to the CTriangleObj returned searched by object provider mechanism.\n
+	CTriangleObj* iTriangleObj;
+	//! Pointer to the CSquareObj returned searched by object provider mechanism.\n	
+	CSquareObj* iSquareObj;
+	//! Pointer to the COctagonObj returned searched by object provider mechanism.\n	
+	COctagonObj* iOctagonObj;
+    };
+/**   Default Constructor for CObjectNode class.\n */
+
+CObjectNode::CObjectNode()
+	{}
+/**
+  Three argument constructor for CObjectNode class.\n
+  Initializes iTriangleObj,iSquareObj and iOctagonObj member objects.\n
+*/
+CObjectNode::CObjectNode(CTriangleObj* aTriangleObj, CSquareObj* aSquareObj, COctagonObj* aOctagonObj)
+: iTriangleObj(aTriangleObj), iSquareObj(aSquareObj), iOctagonObj(aOctagonObj)
+	{}
+/**
+  Destructor for CObjectNode class.\n
+  Deletes the member objects of CTriangleObj,CSquareObj and COctagonObj classes.\n
+*/
+CObjectNode::~CObjectNode()
+    {
+	delete iTriangleObj;
+	delete iSquareObj;
+	delete iOctagonObj;
+
+	iArray.ResetAndDestroy();
+	iArray.Close();
+    }
+
+/**
+ 
+  Support for the object provider mechanism is in the construction of 
+  top-level controls in an application or view.\n
+  Top level controls must have the view or app UI set as their object provider.\n
+  The view or app UI does this by calling the control's SetMopParent() function.\n
+*/
+void CObjectNode::SetMopParent(MObjectProvider* aParent)
+	{
+	iMopParent = aParent;
+	}
+/**
+  Gets the parent object provider.\n
+  This is called by the private function MopGetById() when a call to MopGetObject()
+  returns NULL.\n
+  
+*/
+MObjectProvider* CObjectNode::MopNext()
+	{
+	return iMopParent;
+	}
+/**
+  Gets an object whose type is encapsulated by the specified TTypeUid object.\n
+  Calls the inline function SupplyMopObject .\n
+*/
+TTypeUid::Ptr CObjectNode::MopSupplyObject(TTypeUid aId)
+	{
+	return SupplyMopObject(aId);
+	}
+/**
+  This function is called by the MopSupplyObject when there is a request
+  to get an object whose type is encapsulated by the specified TTypeUid object.\n
+  The type uid is compared with the Uids of the three component objects namely
+  aTriangleObj,aSquareObj and aOctagonObj.\n
+  If the Uid matches,pointer to the matched object is returned.\n
+*/
+inline TTypeUid::Ptr CObjectNode::SupplyMopObject(const TTypeUid aId)
+	{
+	if (iTriangleObj)
+		{
+		if(aId.iUid == CTriangleObj::ETypeId)
+			{
+			return aId.MakePtr(iTriangleObj);
+			}
+		}
+
+	if (iSquareObj)
+		{
+		if(aId.iUid == CSquareObj::ETypeId)
+			{
+			return aId.MakePtr(iSquareObj);
+			}
+		}
+
+	if (iOctagonObj)
+		{
+		if(aId.iUid == COctagonObj::ETypeId)
+			{
+			return aId.MakePtr(iOctagonObj);
+			}
+		}
+
+	return TTypeUid::Null();
+	}
+/**
+  The function tests the ability to get the triangle object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+CTriangleObj* CObjectNode::GetTriangleObject()
+	{
+	CTriangleObj* triangle = MopGetObject(triangle);
+	return triangle;
+	}
+	
+/**
+  The function tests the ability to get the square object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+CSquareObj* CObjectNode::GetSquareObject()
+	{
+	CSquareObj* square = MopGetObject(square);
+	return square;
+	}
+/**
+  The function tests the ability to get the octagon object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+COctagonObj* CObjectNode::GetOctagonObject()
+	{
+	COctagonObj* octagon = MopGetObject(octagon);
+	return octagon;
+	}
+	
+/**
+  The function tests the ability to get the triangle object pointer 
+  using the Object provider mechanism without chaining.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+CTriangleObj* CObjectNode::GetTriangleObjNoChaining()
+	{
+	CTriangleObj* triangle = MopGetObjectNoChaining(triangle);
+	return triangle;
+	}
+	
+/**
+  The function tests the ability to get the square object pointer 
+  using the Object provider mechanism without chaining.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+CSquareObj* CObjectNode::GetSquareObjNoChaining()
+	{
+	CSquareObj* square = MopGetObjectNoChaining(square);
+	return square;
+	}
+/**
+  The function tests the ability to get the octagon object pointer 
+  using the Object provider mechanism without chaining.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+COctagonObj* CObjectNode::GetOctagonObjNoChaining()
+	{
+	COctagonObj* octagon = MopGetObjectNoChaining(octagon);
+	return octagon;
+	}
+	
+
+
+//! A class derived from CBase and MObjectProvider interface.\n
+/**
+  The CObjectNodeConst tests the object provider mechanism by providing 
+  a constant interface. All the Get functions are constant to ensure that no changes
+  are made to the objects.\n
+*/
+class CObjectNodeConst : public CBase, public MObjectProvider
+	{
+public:
+	CObjectNodeConst();
+	CObjectNodeConst(const CTriangleObj* aTriangleObj, const CSquareObj* aSquareObj, const COctagonObj* aOctagonObj);
+    ~CObjectNodeConst();
+	void SetMopParent(MObjectProvider* aParent);
+	
+	const CTriangleObj* GetTriangleObject();
+	const CTriangleObj* GetTriangleObjNoChaining();
+	
+	const CSquareObj* GetSquareObject();
+	const CSquareObj* GetSquareObjNoChaining();
+	
+	const COctagonObj* GetOctagonObject();
+	const COctagonObj* GetOctagonObjNoChaining();
+
+protected: // from MObjectProvider
+	TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
+	MObjectProvider* MopNext();
+private:
+	inline const TTypeUid::Ptr SupplyMopObject(TTypeUid aId);
+
+public:
+		//! Array to store objects linked through object provider mechanism.\n
+	RPointerArray<CObjectNodeConst> iArray;
+private:
+	//! Parent object provider.\n
+	MObjectProvider* iMopParent;
+	//! Pointer to the CTriangleObj returned searched by object provider mechanism.\n
+	const CTriangleObj* iTriangleObj;
+	//! Pointer to the CSquareObj returned searched by object provider mechanism.\n
+	const CSquareObj* iSquareObj;
+	//! Pointer to the COctagonObj returned searched by object provider mechanism.\n
+	const COctagonObj* iOctagonObj;
+    };
+
+/**   Default constructor for CObjectNodeConst class.\n */
+
+CObjectNodeConst::CObjectNodeConst()
+	{}
+/**
+  Three argument constructor for CObjectNodeConst class.\n
+  Initializes iTriangleObj,iSquareObj and iOctagonObj member objects.\n
+*/
+CObjectNodeConst::CObjectNodeConst(const CTriangleObj* aTriangleObj, 
+						 const CSquareObj* aSquareObj, 
+						 const COctagonObj* aOctagonObj)
+: iTriangleObj(aTriangleObj), iSquareObj(aSquareObj), iOctagonObj(aOctagonObj)
+	{}
+/**
+  Destructor for CObjectNodeConst class.\n
+  Deletes the iTriangleObj,iSquareObj and iOctagonObj objects.\n
+*/
+CObjectNodeConst::~CObjectNodeConst()
+    {
+	delete iTriangleObj;
+	delete iSquareObj;
+	delete iOctagonObj;
+
+	iArray.ResetAndDestroy();
+	iArray.Close();
+    }
+
+/**
+  Sets the context - that is, the enclosing parent object - for this object.\n
+*/
+void CObjectNodeConst::SetMopParent(MObjectProvider* aParent)
+	{
+	iMopParent = aParent;
+	}
+/**
+  Retrieves the parent object provider.\n
+  This function may be overridden to continue the chain of object providers 
+  which are to be asked to supply an object.\n
+  This is called by the private function MopGetById() when a call to MopGetObject()
+  returns NULL.\n
+*/
+MObjectProvider* CObjectNodeConst::MopNext()
+	{
+	return iMopParent;
+	}
+/**
+  Gets an object whose type is encapsulated by the specified TTypeUid object.\n
+  Calls the inline function SupplyMopObject .\n
+*/
+TTypeUid::Ptr CObjectNodeConst::MopSupplyObject(TTypeUid aId)
+	{
+	return SupplyMopObject(aId);
+	}
+
+/**
+  This function is called by the MopSupplyObject when there is a request
+  to get an object whose type is encapsulated by the specified TTypeUid object.\n
+  The type uid is compared with the Uids of the three component objects namely
+  aTriangleObj,aSquareObj and aOctagonObj.\n
+  If the Uid matches,pointer to the matched object is returned.\n
+*/
+inline const TTypeUid::Ptr CObjectNodeConst::SupplyMopObject(TTypeUid aId)
+	{
+	if (iTriangleObj)
+		{
+		if(aId.iUid == CTriangleObj::ETypeId)
+			{
+			return aId.MakePtr(const_cast<CTriangleObj*>(iTriangleObj));
+			}
+		}
+
+	if (iSquareObj)
+		{
+		if(aId.iUid == CSquareObj::ETypeId)
+			{
+			return aId.MakePtr(const_cast<CSquareObj*>(iSquareObj));
+			}
+		}
+
+	if (iOctagonObj)
+		{
+		if(aId.iUid == COctagonObj::ETypeId)
+			{
+			return aId.MakePtr(const_cast<COctagonObj*>(iOctagonObj));
+			}
+		}
+
+	return TTypeUid::Null();
+	}
+
+/**
+  The function tests the ability to get the triangle object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/	
+const CTriangleObj* CObjectNodeConst::GetTriangleObject()
+	{
+	const CTriangleObj* triangle = MopGetObject(triangle);
+	return triangle;
+	}
+/**
+  The function tests the ability to get the square object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/	
+const CSquareObj* CObjectNodeConst::GetSquareObject()
+	{
+	const CSquareObj* square = MopGetObject(square);
+	return square;
+	}
+/**
+  The function tests the ability to get the octagon object pointer 
+  using the Object provider mechanism.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+const COctagonObj* CObjectNodeConst::GetOctagonObject()
+	{
+	const COctagonObj* octagon = MopGetObject(octagon);
+	return octagon;
+	}
+/**
+  The function tests the ability to get the triangle object pointer 
+  using the Object provider mechanism without chaining for constant functions.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/	
+const CTriangleObj* CObjectNodeConst::GetTriangleObjNoChaining()
+	{
+	const CTriangleObj* triangle = MopGetObjectNoChaining(triangle);
+	return triangle;
+	}
+/**
+  The function tests the ability to get the square object pointer 
+  using the Object provider mechanism without chaining for constant functions.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/	
+const CSquareObj* CObjectNodeConst::GetSquareObjNoChaining()
+	{
+	const CSquareObj* square = MopGetObjectNoChaining(square);
+	return square;
+	}
+/**
+  The function tests the ability to get the octagon object pointer 
+  using the Object provider mechanism without chaining for constant functions.\n
+  The object will be supplied directly by this object provider, or NULL 
+  will be returned, this function does not recurse through the object chain.\n
+  The function calls MopGetObject passing a pointer reference.\n
+*/
+const COctagonObj* CObjectNodeConst::GetOctagonObjNoChaining()
+	{
+	const COctagonObj* octagon = MopGetObjectNoChaining(octagon);
+	return octagon;
+	}
+
+/**   Single Argument Constructor for CCone3TestAppUi class.\n */
+
+CCone3TestAppUi::CCone3TestAppUi(CTmsTestStep* aStep) :
+	CTestCoeAppUi(aStep)
+	{}
+
+/**   Destructor for CCone3TestAppUi class.\n */
+
+CCone3TestAppUi::~CCone3TestAppUi()
+	{}
+
+ /**
+  Second phase Constructor for CCone3TestAppUi class.\n
+  Invokes the base class CTestCoeAppUi second phase constructor.\n
+  Executes the testcases asynchronously using Autotest Manager.\n
+*/
+void CCone3TestAppUi::ConstructL()
+    {
+    CTestCoeAppUi::ConstructL();	
+	AutoTestManager().StartAutoTest();
+    }
+
+/**
+   @SYMTestCaseID UIF-TCone3Step-DoTestsL
+  
+   @SYMPREQ
+  
+   @SYMTestCaseDesc Tests the object provider mechanism
+  
+   @SYMTestPriority High
+  
+   @SYMTestStatus Implemented
+   
+   @SYMTestActions : Three types of component objects are created.\n
+   a. Triangle object.\n
+   b. Square Object.\n
+   c. Octagon Object.\n
+   Node objects instantiated from CObjectNode are created and a network
+   is created using object provider mechanism.\n
+   The details of the network are as follows.\n
+   0. Node A - Contains Triangle A.\n
+   1. Node B - Contains Square B.\n
+   2. Node C - Contains Triangle C.\n
+   3. Node D - Contains no component objects.\n
+   4. Node E - Contains Triangle E and Octogen E as component objects.\n
+   5. Node F - Contains Square F.\n
+   6. Node G - Contains Triangle G.\n
+   Parent-child relationships are set using SetMopParent at each node.\n
+   Adds the pointers to above six object providers to iArray.\n
+   Component objects are retrieved using GetMopObject() at every node.\n
+   If the node does not have an object of particular type a search is made
+   at the parent object provider also.\n
+   These pointers are verified.\n  
+  
+   @SYMTestExpectedResults The pointers of component objects obtained should match 
+   with the original objects.\n
+  
+   @SYMTestType : CIT 
+ */
+void CCone3TestAppUi::DoTestsL()
+    {
+	__UHEAP_MARK;
+
+	TPtrC nodeA(_L("A"));
+	TPtrC nodeB(_L("B"));
+	TPtrC nodeC(_L("C"));
+	TPtrC nodeE(_L("E"));
+	TPtrC nodeF(_L("F"));
+	TPtrC nodeG(_L("G"));
+
+	CTriangleObj* triangleA = new(ELeave) CTriangleObj();
+	triangleA->SetParentClassName(nodeA);
+
+	CSquareObj* squareB = new(ELeave) CSquareObj();
+	squareB->SetParentClassName(nodeB);
+
+	CTriangleObj* triangleC = new(ELeave) CTriangleObj();
+	triangleC->SetParentClassName(nodeC);
+
+	CTriangleObj* triangleE = new(ELeave) CTriangleObj();
+	triangleE->SetParentClassName(nodeE);
+
+	COctagonObj* octagonE = new(ELeave) COctagonObj() ;
+	octagonE->SetParentClassName(nodeE);
+
+	CSquareObj* squareF = new(ELeave) CSquareObj();
+	squareF->SetParentClassName(nodeF);
+
+	CTriangleObj* triangleG = new(ELeave) CTriangleObj();
+	triangleG->SetParentClassName(nodeG);
+	
+	CObjectNode* node = new (ELeave) CObjectNode();
+	CleanupStack::PushL(node);
+
+	node->iArray.Append(new (ELeave) CObjectNode(triangleA, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, squareB, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(triangleE, NULL, octagonE));
+
+	node->iArray.Append(new (ELeave) CObjectNode(triangleC, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, NULL, NULL));
+
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, squareF, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(triangleG, NULL, NULL));
+
+	node->iArray[1]->SetMopParent(node->iArray[0]);
+	node->iArray[2]->SetMopParent(node->iArray[0]);
+
+	node->iArray[3]->SetMopParent(node->iArray[1]);
+	node->iArray[4]->SetMopParent(node->iArray[1]);
+
+	node->iArray[5]->SetMopParent(node->iArray[2]);
+	node->iArray[6]->SetMopParent(node->iArray[2]);
+
+
+	//Node0 - A
+	CTriangleObj*	getTriangle = NULL;
+	CSquareObj*		getSquare = NULL;
+	COctagonObj*	getOctagon = NULL;
+	INFO_PRINTF1(_L("Testing Node A"));
+	getTriangle = node->iArray[0]->GetTriangleObject();
+	getSquare	= node->iArray[0]->GetSquareObject();
+	getOctagon	= node->iArray[0]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node B"));
+	//Node1 - B
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[1]->GetTriangleObject();
+	getSquare	= node->iArray[1]->GetSquareObject();
+	getOctagon	= node->iArray[1]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node C"));
+	//Node3 - C
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[3]->GetTriangleObject();
+	getSquare	= node->iArray[3]->GetSquareObject();
+	getOctagon	= node->iArray[3]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeC) == KErrNone);
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node D"));
+	//Node4 - D
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[4]->GetTriangleObject();
+	getSquare	= node->iArray[4]->GetSquareObject();
+	getOctagon	= node->iArray[4]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node E"));
+	//Node2 - E
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[2]->GetTriangleObject();
+	getSquare	= node->iArray[2]->GetSquareObject();
+	getOctagon	= node->iArray[2]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+
+	INFO_PRINTF1(_L("Testing Node F"));
+	//Node5 - F
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[5]->GetTriangleObject();
+	getSquare	= node->iArray[5]->GetSquareObject();
+	getOctagon	= node->iArray[5]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeF) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+
+	INFO_PRINTF1(_L("Testing Node G"));
+	//Node6 - G
+	getTriangle = NULL;
+	getSquare	= NULL;
+	getOctagon	= NULL;	
+	
+	getTriangle = node->iArray[6]->GetTriangleObject();
+	getSquare	= node->iArray[6]->GetSquareObject();
+	getOctagon	= node->iArray[6]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeG) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+	
+	CleanupStack::PopAndDestroy(); // node
+
+//	test.Printf(_L("TEST COMPLETE [Press any key]"));
+	__UHEAP_MARKEND;
+    }
+/**
+   @SYMTestCaseID UIF-TCone3Step-DoMopConstTestsL
+  
+   @SYMPREQ 
+ 
+   @SYMTestCaseDesc Tests the object provider mechanism using constant Mop functions.\n
+  
+   @SYMTestPriority High
+  
+   @SYMTestStatus Implemented
+   
+   @SYMTestActions : Three types of component objects are created.\n
+   a. Triangle object.\n
+   b. Square Object.\n
+   c. Octagon Object.\n
+   Node objects instantiated from CObjectNode are created and a network
+   is created using object provider mechanism.\n
+   The details of the network are as follows.\n
+   0. Node A - Contains Triangle A.\n
+   1. Node B - Contains Square B.\n
+   2. Node C - Contains Triangle C.\n
+   3. Node D - Contains no component objects.\n
+   4. Node E - Contains Triangle E and Octogen E as component objects.\n
+   5. Node F - Contains Square F.\n
+   6. Node G - Contains Triangle G.\n
+   Parent-child relationships are set using SetMopParent at each node.\n
+   Adds the pointers to above six object providers to iArray.\n
+   Component objects are retrieved using GetMopObject() at every node.\n
+   If the node does not have an object of particular type a search is made
+   at the parent object provider also.\n
+   These pointers are verified.\n  
+  
+   @SYMTestExpectedResults The pointers of component objects obtained should match 
+   with the original objects.\n
+   
+ */    
+
+void CCone3TestAppUi::DoMopConstTestsL()
+    {
+	__UHEAP_MARK;
+
+	TPtrC nodeA(_L("A"));
+	TPtrC nodeB(_L("B"));
+	TPtrC nodeC(_L("C"));
+	TPtrC nodeE(_L("E"));
+	TPtrC nodeF(_L("F"));
+	TPtrC nodeG(_L("G"));
+
+	CObjectNodeConst* node = new (ELeave) CObjectNodeConst();
+	CleanupStack::PushL(node);
+
+	const CTriangleObj* triangleA = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleA))->SetParentClassName(nodeA);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleA));
+
+	const CSquareObj* squareB = new(ELeave) CSquareObj();
+	(const_cast<CSquareObj*>(squareB))->SetParentClassName(nodeB);
+	CleanupStack::PushL(const_cast<CSquareObj*>(squareB));
+
+	const CTriangleObj* triangleC = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleC))->SetParentClassName(nodeC);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleC));
+
+	const CTriangleObj* triangleE = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleE))->SetParentClassName(nodeE);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleE));
+	
+
+	const COctagonObj* octagonE = new(ELeave) COctagonObj() ;
+	(const_cast<COctagonObj*>(octagonE))->SetParentClassName(nodeE);
+	CleanupStack::PushL(const_cast<COctagonObj*>(octagonE));
+
+	const CSquareObj* squareF = new(ELeave) CSquareObj();
+	(const_cast<CSquareObj*>(squareF))->SetParentClassName(nodeF);
+	CleanupStack::PushL(const_cast<CSquareObj*>(squareF));
+
+	const CTriangleObj* triangleG = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleG))->SetParentClassName(nodeG);
+	
+	CleanupStack::Pop(6);
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleA, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, squareB, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleE, NULL, octagonE));
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleC, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, NULL, NULL));
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, squareF, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleG, NULL, NULL));
+
+	node->iArray[1]->SetMopParent(node->iArray[0]);
+	node->iArray[2]->SetMopParent(node->iArray[0]);
+
+	node->iArray[3]->SetMopParent(node->iArray[1]);
+	node->iArray[4]->SetMopParent(node->iArray[1]);
+
+	node->iArray[5]->SetMopParent(node->iArray[2]);
+	node->iArray[6]->SetMopParent(node->iArray[2]);
+
+
+	//Node0 - A
+	const CTriangleObj*	getTriangle = NULL;
+	const CSquareObj*		getSquare = NULL;
+	const COctagonObj*	getOctagon = NULL;
+	INFO_PRINTF1(_L("Testing Node A Const"));
+	getTriangle = node->iArray[0]->GetTriangleObject();
+	getSquare	= node->iArray[0]->GetSquareObject();
+	getOctagon	= node->iArray[0]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node B Const"));
+	//Node1 - B
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[1]->GetTriangleObject();
+	getSquare	= node->iArray[1]->GetSquareObject();
+	getOctagon	= node->iArray[1]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node C Const"));
+	//Node3 - C
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[3]->GetTriangleObject();
+	getSquare	= node->iArray[3]->GetSquareObject();
+	getOctagon	= node->iArray[3]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeC) == KErrNone);
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node D Const"));
+	//Node4 - D
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[4]->GetTriangleObject();
+	getSquare	= node->iArray[4]->GetSquareObject();
+	getOctagon	= node->iArray[4]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node E Const"));
+	//Node2 - E
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[2]->GetTriangleObject();
+	getSquare	= node->iArray[2]->GetSquareObject();
+	getOctagon	= node->iArray[2]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+
+	INFO_PRINTF1(_L("Testing Node F Const"));
+	//Node5 - F
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[5]->GetTriangleObject();
+	getSquare	= node->iArray[5]->GetSquareObject();
+	getOctagon	= node->iArray[5]->GetOctagonObject();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeF) == KErrNone);
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+
+	INFO_PRINTF1(_L("Testing Node G Const"));
+	//Node6 - G
+	getTriangle = NULL;
+	getSquare	= NULL;
+	getOctagon	= NULL;	
+	
+	getTriangle = node->iArray[6]->GetTriangleObject();
+	getSquare	= node->iArray[6]->GetSquareObject();
+	getOctagon	= node->iArray[6]->GetOctagonObject();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeG) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+	
+	CleanupStack::PopAndDestroy(); // node
+
+//	test.Printf(_L("TEST COMPLETE [Press any key]"));
+	__UHEAP_MARKEND;
+    }
+    
+/**
+   @SYMTestCaseID UIF-TCone3Step-DoMopNoChainingTestsL
+ 
+   @SYMPREQ
+  
+   @SYMTestCaseDesc Tests the object provider mechanism without no chaining.\n
+  
+   @SYMTestPriority High
+  
+   @SYMTestStatus Implemented
+   
+   @SYMTestActions : Three types of component objects are created.\n
+   a. Triangle object.\n
+   b. Square Object.\n
+   c. Octagon Object.\n
+   Node objects instantiated from CObjectNode are created and a network
+   is created using object provider mechanism.\n
+   The details of the network are as follows.\n
+   0. Node A - Contains Triangle A.\n
+   1. Node B - Contains Square B.\n
+   2. Node C - Contains Triangle C.\n
+   3. Node D - Contains no component objects.\n
+   4. Node E - Contains Triangle E and Octogen E as component objects.\n
+   5. Node F - Contains Square F.\n
+   6. Node G - Contains Triangle G.\n
+   Parent-child relationships are set using SetMopParent at each node.\n
+   Adds the pointers to above six object providers to iArray.\n
+   Component objects are retrieved using GetMopObject() at every node.\n
+   If the node does not have an object of particular type a search is made
+   at the parent object provider also.\n
+   These pointers are verified.\n  
+  
+   @SYMTestExpectedResults The pointers of component objects obtained should match 
+   with the original objects.\n
+ 
+   @SYMTestType : CIT 
+ */
+void CCone3TestAppUi::DoMopNoChainingTestsL()
+	{
+	__UHEAP_MARK;
+
+	TPtrC nodeA(_L("A"));
+	TPtrC nodeB(_L("B"));
+	TPtrC nodeC(_L("C"));
+	TPtrC nodeE(_L("E"));
+	TPtrC nodeF(_L("F"));
+	TPtrC nodeG(_L("G"));
+
+	CObjectNode* node = new (ELeave) CObjectNode();
+	CleanupStack::PushL(node);
+
+	CTriangleObj* triangleA = new(ELeave) CTriangleObj();
+	triangleA->SetParentClassName(nodeA);
+	CleanupStack::PushL(triangleA);
+
+	CSquareObj* squareB = new(ELeave) CSquareObj();
+	squareB->SetParentClassName(nodeB);
+	CleanupStack::PushL(squareB);
+
+	CTriangleObj* triangleC = new(ELeave) CTriangleObj();
+	triangleC->SetParentClassName(nodeC);
+	CleanupStack::PushL(triangleC);
+
+	CTriangleObj* triangleE = new(ELeave) CTriangleObj();
+	triangleE->SetParentClassName(nodeE);
+	CleanupStack::PushL(triangleE);
+	
+
+	COctagonObj* octagonE = new(ELeave) COctagonObj() ;
+	octagonE->SetParentClassName(nodeE);
+	CleanupStack::PushL(octagonE);
+
+	CSquareObj* squareF = new(ELeave) CSquareObj();
+	squareF->SetParentClassName(nodeF);
+	CleanupStack::PushL(squareF);
+
+	CTriangleObj* triangleG = new(ELeave) CTriangleObj();
+	triangleG->SetParentClassName(nodeG);
+	
+	CleanupStack::Pop(6, triangleA);
+	node->iArray.Append(new (ELeave) CObjectNode(triangleA, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, squareB, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(triangleE, NULL, octagonE));
+
+	node->iArray.Append(new (ELeave) CObjectNode(triangleC, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, NULL, NULL));
+
+	node->iArray.Append(new (ELeave) CObjectNode(NULL, squareF, NULL));
+	node->iArray.Append(new (ELeave) CObjectNode(triangleG, NULL, NULL));
+
+	node->iArray[1]->SetMopParent(node->iArray[0]);
+	node->iArray[2]->SetMopParent(node->iArray[0]);
+
+	node->iArray[3]->SetMopParent(node->iArray[1]);
+	node->iArray[4]->SetMopParent(node->iArray[1]);
+
+	node->iArray[5]->SetMopParent(node->iArray[2]);
+	node->iArray[6]->SetMopParent(node->iArray[2]);
+
+	//Node0 - A
+	CTriangleObj*	getTriangle = NULL;
+	CSquareObj*		getSquare = NULL;
+	COctagonObj*	getOctagon = NULL;
+	INFO_PRINTF1(_L("Testing Node A No Chaining"));
+	getTriangle = node->iArray[0]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[0]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[0]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node B No Chaining"));
+	//Node1 - B
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[1]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[1]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[1]->GetOctagonObjNoChaining();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node C No Chaining"));
+	//Node3 - C
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[3]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[3]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[3]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeC) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node D No Chaining"));
+	//Node4 - D
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[4]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[4]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[4]->GetOctagonObjNoChaining();
+
+	TEST(getSquare == NULL);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node E No Chaining"));
+	//Node2 - E
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[2]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[2]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[2]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+
+	INFO_PRINTF1(_L("Testing Node F No Chaining"));
+	//Node5 - F
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[5]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[5]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[5]->GetOctagonObjNoChaining();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeF) == KErrNone);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node G No Chaining"));
+	//Node6 - G
+	getTriangle = NULL;
+	getSquare	= NULL;
+	getOctagon	= NULL;	
+	
+	getTriangle = node->iArray[6]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[6]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[6]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeG) == KErrNone);
+	TEST(getOctagon == NULL);
+	TEST(getSquare == NULL);
+	
+	CleanupStack::PopAndDestroy(node);
+
+	__UHEAP_MARKEND;
+	
+	}
+
+/**
+   @SYMTestCaseID UIF-TCone3Step-DoMopNoChainingConstTestsL
+  
+   @SYMPREQ
+  
+   @SYMTestCaseDesc Tests the object provider mechanism without no chaining 
+   and using constant functions only.\n
+  
+   @SYMTestPriority High
+  
+   @SYMTestStatus Implemented
+   
+   @SYMTestActions : Three types of component objects are created.\n
+   a. Triangle object.\n
+   b. Square Object.\n
+   c. Octagon Object.\n
+   Node objects instantiated from CObjectNode are created and a network
+   is created using object provider mechanism.\n
+   The details of the network are as follows.\n
+   0. Node A - Contains Triangle A.\n
+   1. Node B - Contains Square B.\n
+   2. Node C - Contains Triangle C.\n
+   3. Node D - Contains no component objects.\n
+   4. Node E - Contains Triangle E and Octogen E as component objects.\n
+   5. Node F - Contains Square F.\n
+   6. Node G - Contains Triangle G.\n
+   Parent-child relationships are set using SetMopParent at each node.\n
+   Adds the pointers to above six object providers to iArray.\n
+   Component objects are retrieved using GetMopObject() at every node.\n
+   If the node does not have an object of particular type a search is made
+   at the parent object provider also.\n
+   These pointers are verified.\n  
+  
+   @SYMTestExpectedResults The pointers of component objects obtained should match 
+   with the original objects.\n
+  
+   @SYMTestType : CIT 
+ */
+void CCone3TestAppUi::DoMopNoChainingConstTestsL()
+	{
+	__UHEAP_MARK;
+
+	TPtrC nodeA(_L("A"));
+	TPtrC nodeB(_L("B"));
+	TPtrC nodeC(_L("C"));
+	TPtrC nodeE(_L("E"));
+	TPtrC nodeF(_L("F"));
+	TPtrC nodeG(_L("G"));
+
+	CObjectNodeConst* node = new (ELeave) CObjectNodeConst();
+	CleanupStack::PushL(node);
+
+	const CTriangleObj* triangleA = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleA))->SetParentClassName(nodeA);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleA));
+
+	const CSquareObj* squareB = new(ELeave) CSquareObj();
+	(const_cast<CSquareObj*>(squareB))->SetParentClassName(nodeB);
+	CleanupStack::PushL(const_cast<CSquareObj*>(squareB));
+
+	const CTriangleObj* triangleC = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleC))->SetParentClassName(nodeC);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleC));
+
+	const CTriangleObj* triangleE = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleE))->SetParentClassName(nodeE);
+	CleanupStack::PushL(const_cast<CTriangleObj*>(triangleE));
+	
+
+	const COctagonObj* octagonE = new(ELeave) COctagonObj() ;
+	(const_cast<COctagonObj*>(octagonE))->SetParentClassName(nodeE);
+	CleanupStack::PushL(const_cast<COctagonObj*>(octagonE));
+
+	const CSquareObj* squareF = new(ELeave) CSquareObj();
+	(const_cast<CSquareObj*>(squareF))->SetParentClassName(nodeF);
+	CleanupStack::PushL(const_cast<CSquareObj*>(squareF));
+
+	const CTriangleObj* triangleG = new(ELeave) CTriangleObj();
+	(const_cast<CTriangleObj*>(triangleG))->SetParentClassName(nodeG);
+	
+	CleanupStack::Pop(6);
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleA, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, squareB, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleE, NULL, octagonE));
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleC, NULL, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, NULL, NULL));
+
+	node->iArray.Append(new (ELeave) CObjectNodeConst(NULL, squareF, NULL));
+	node->iArray.Append(new (ELeave) CObjectNodeConst(triangleG, NULL, NULL));
+
+	node->iArray[1]->SetMopParent(node->iArray[0]);
+	node->iArray[2]->SetMopParent(node->iArray[0]);
+
+	node->iArray[3]->SetMopParent(node->iArray[1]);
+	node->iArray[4]->SetMopParent(node->iArray[1]);
+
+	node->iArray[5]->SetMopParent(node->iArray[2]);
+	node->iArray[6]->SetMopParent(node->iArray[2]);
+
+	//Node0 - A
+	const CTriangleObj*	getTriangle = NULL;
+	const CSquareObj*		getSquare = NULL;
+	const COctagonObj*	getOctagon = NULL;
+	INFO_PRINTF1(_L("Testing Node A No Chaining Const"));
+	getTriangle = node->iArray[0]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[0]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[0]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeA) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node B No Chaining Const"));
+	//Node1 - B
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[1]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[1]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[1]->GetOctagonObjNoChaining();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeB) == KErrNone);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node C No Chaining Const"));
+	//Node3 - C
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[3]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[3]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[3]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeC) == KErrNone);
+	TEST(getSquare == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node D No Chaining Const"));
+	//Node4 - D
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[4]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[4]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[4]->GetOctagonObjNoChaining();
+
+	TEST(getSquare == NULL);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node E No Chaining Const"));
+	//Node2 - E
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[2]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[2]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[2]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getOctagon != NULL);
+	TEST(getOctagon->GetParentClassName().Compare(nodeE) == KErrNone);
+	TEST(getSquare == NULL);
+
+	INFO_PRINTF1(_L("Testing Node F No Chaining Const"));
+	//Node5 - F
+	getTriangle = NULL;
+	getSquare = NULL;
+	getOctagon = NULL;	
+	
+	getTriangle = node->iArray[5]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[5]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[5]->GetOctagonObjNoChaining();
+
+	TEST(getSquare != NULL);
+	TEST(getSquare->GetParentClassName().Compare(nodeF) == KErrNone);
+	TEST(getTriangle == NULL);
+	TEST(getOctagon == NULL);
+
+	INFO_PRINTF1(_L("Testing Node G No Chaining Const"));
+	//Node6 - G
+	getTriangle = NULL;
+	getSquare	= NULL;
+	getOctagon	= NULL;	
+	
+	getTriangle = node->iArray[6]->GetTriangleObjNoChaining();
+	getSquare	= node->iArray[6]->GetSquareObjNoChaining();
+	getOctagon	= node->iArray[6]->GetOctagonObjNoChaining();
+
+	TEST(getTriangle != NULL);
+	TEST(getTriangle->GetParentClassName().Compare(nodeG) == KErrNone);
+	TEST(getOctagon == NULL);
+	TEST(getSquare == NULL);
+	
+	CleanupStack::PopAndDestroy(node);
+
+	__UHEAP_MARKEND;
+	
+	}
+
+/**
+   @SYMTestCaseID UIF-CONE-DoStateObserverTestL
+
+   @SYMCR CR1251
+
+   @SYMTestCaseDesc Tests calling MakeVisible or SetDimmed calls the new Mop interface
+   when only the control itself provides the relevant Mop interface
+
+   @SYMTestPriority High
+
+   @SYMTestStatus Implemented
+
+   @SYMTestActions Makes many calls to MakeVisible or SetDimmed in different situations 
+   and checks if the new Mop interface is called or not on each time.
+
+   @SYMTestExpectedResults The new interface is called if there is a change in the controls state
+
+   @SYMTestType : Unit Test
+ */
+void CCone3TestAppUi::DoStateObserverTestL()
+	{
+	//Creating the first font allocates memory that is never deleted so must do this outside heap checks
+	CFbsFont* font=iCoeEnv->CreateScreenFontL(CStateObserverControl::iFontSpec);
+	iCoeEnv->ReleaseScreenFont(font);
+	__UHEAP_MARK;
+	CStateObserverControl* stateObCnt=new(ELeave) CStateObserverControl();
+	CleanupStack::PushL(stateObCnt);
+	stateObCnt->ConstructL();
+	stateObCnt->SetReturnObserver(CStateObserverControl::EObserver);
+	stateObCnt->SetRecievers(ETrue,EFalse);
+	TInt failAt=stateObCnt->DoTest();
+	CleanupStack::PopAndDestroy(stateObCnt);
+	if (failAt>0)
+		{
+		TEST(EFalse);
+		_LIT(KLog,"StateObserverTest failed on subtest: %d");
+		INFO_PRINTF2(KLog,failAt);
+		}
+	__UHEAP_MARKEND;
+	}
+
+/**
+   Auxiliary Function for all Test Cases.\n
+ 
+   The method is an override from CTestCoeAppUi.\n
+   This function is called asynchronously by RunL function of the
+   AutotestManager after previous test case is executed.\n
+   Calls the following functions one by one.\n
+   1. DoTestsL().\n
+   2. DoMopConstTestsL().\n
+   3. DoMopNoChainingTestsL().\n
+   4. DoMopNoChainingConstTestsL().\n
+   5. DoStateObserverTestL().
+ */
+void CCone3TestAppUi::RunTestStepL(TInt aStepNum)
+	{
+	_LIT(KTest1,"Tests Mop interface returns right object");
+	_LIT(KTest2,"Tests MCoeControlStateObserver is called at the right times");
+	switch(aStepNum)
+		{
+		case 1:
+			SetTestStepID(_L("UIF-TCone3Step-DoMopNoChainingConstTestsL"));			
+			INFO_PRINTF1(KTest1);
+			DoTestsL();
+			DoMopConstTestsL();
+			DoMopNoChainingTestsL();
+			DoMopNoChainingConstTestsL();
+			RecordTestResultL();			
+			break;
+		case 2:
+			SetTestStepID(_L("UIF-CONE-DoStateObserverTestL"));			
+			INFO_PRINTF1(KTest2);
+			DoStateObserverTestL();
+			RecordTestResultL();	
+			CloseTMSGraphicsStep();
+			break;
+		default:
+			AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass);
+			break;
+		}
+	}
+
+/**
+  Completes the construction of the Control Environment(CCoeEnv object).\n
+  Instantiates the CCone3TestAppUi class which serves as a AppUi class.\n
+  Sets the CCone3TestAppUi object as the application's user interface object.\n
+  Invokes the second phase constructor of the application's UI.\n
+*/
+void CTCone3Step::ConstructCone3AppL(CCoeEnv* aCoe)
+	{ // runs inside a TRAP harness
+	aCoe->ConstructL();
+	CCone3TestAppUi* appUi=new(ELeave) CCone3TestAppUi(this);
+	aCoe->SetAppUi(appUi);
+	appUi->ConstructL();
+	}
+/**
+  Constructor for CTCone3Step class.\n
+  Sets the test step name.\n
+*/
+CTCone3Step::CTCone3Step()
+	{
+	SetTestStepName(KTCone3Step);
+	}
+
+/**   Destructor for CTCone3Step class.\n */
+
+CTCone3Step::~CTCone3Step()
+{}
+
+/**
+  Entry function for CTCone3 Test Step.\n
+  Sets up the control environment.\n
+  Constructs and Launches the CTCone3 Test application.\n
+*/
+TVerdict CTCone3Step::doTestStepL()
+	{
+    INFO_PRINTF1(_L("Test Started"));
+	CCoeEnv* coe=new(ELeave) CCoeEnv;
+    TRAPD(err,ConstructCone3AppL(coe));
+    if (!err)
+        coe->ExecuteD();
+	else
+		{
+		SetTestStepResult(EFail);
+		delete coe;
+		}
+
+	INFO_PRINTF1(_L("Test Finished"));
+	return TestStepResult();
+	}
+
+