public void DeepClone_JaggedArrayInterface_AsReference(TypeModel model)
		{
			var obj = new ListOfListWrapper()
			{
				JaggedArray = new JaggedArray()
				{
					ICollection = new IItemClass[][]
					{
						new IItemClass[]{
							new ItemClass() { Message = "1" },
							new ItemClass() { Message = "2" }
						}, 
						new IItemClass[]{
						   	new ItemClass() { Message = "3" }
						}
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.JaggedArray.ICollection.Length);
			Assert.AreEqual(2, clone.JaggedArray.ICollection[0].Length);
			Assert.AreEqual(1, clone.JaggedArray.ICollection[1].Length);

			Assert.AreEqual("1", clone.JaggedArray.ICollection[0][0].Message);
			Assert.AreEqual("2", clone.JaggedArray.ICollection[0][1].Message);
			Assert.AreEqual("3", clone.JaggedArray.ICollection[1][0].Message);
		}
		public void DeepClone_MultiDimensionalArrayInterface_AsReference(TypeModel model)
		{
			var obj = new ListOfListWrapper()
			{
				MultiDimensionalArray = new MultiDimensionalArray()
				{
					ICollection = new IItemClass[,]
					{
						{
							new ItemClass() { Message = "1" },
							new ItemClass() { Message = "2" }
						}, 
						{
						   	new ItemClass() { Message = "3" },
						   	new ItemClass() { Message = "4" }
						}       		
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.MultiDimensionalArray.ICollection.Rank);

			Assert.AreEqual("1", clone.MultiDimensionalArray.ICollection[0, 0].Message);
			Assert.AreEqual("2", clone.MultiDimensionalArray.ICollection[0, 1].Message);
			Assert.AreEqual("3", clone.MultiDimensionalArray.ICollection[1, 0].Message);
			Assert.AreEqual("4", clone.MultiDimensionalArray.ICollection[1, 1].Message);
		}
		public void DeepClone_ArrayOfLisInterface_AsReference(TypeModel model)
		{
			var obj = new ListOfListWrapper()
			{
				ArrayOfList = new ArrayOfList()
				{
					ICollection = new List<IItemClass>[]
					{
						new List<IItemClass>()
						{
							new ItemClass() { Message = "1" },
							new ItemClass() { Message = "2" }
						}, 
						new List<IItemClass>()
						{
							new ItemClass() { Message = "3" }	
						}       		
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.ArrayOfList.ICollection.Length);
			Assert.AreEqual(2, clone.ArrayOfList.ICollection[0].Count);
			Assert.AreEqual(1, clone.ArrayOfList.ICollection[1].Count);

			Assert.AreEqual("1", clone.ArrayOfList.ICollection[0][0].Message);
			Assert.AreEqual("2", clone.ArrayOfList.ICollection[0][1].Message);
			Assert.AreEqual("3", clone.ArrayOfList.ICollection[1][0].Message);
		}
		public void DeepClone_ListOfArrayNormal_AsReference(TypeModel model)
		{
			var obj = new ListOfListWrapper()
			{
				ListOfArray = new ListOfArray()
				{
					Collection = new List<ItemClass[]>()
					{
						new ItemClass[] 
						{
							new ItemClass() { Message = "1" },
							new ItemClass() { Message = "2" }
						},
           				new ItemClass[]
						{
							new ItemClass() { Message = "3" }
						}
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.ListOfArray.Collection.Count);
			Assert.AreEqual(2, clone.ListOfArray.Collection[0].Length);
			Assert.AreEqual(1, clone.ListOfArray.Collection[1].Length);

			Assert.AreEqual("1", clone.ListOfArray.Collection[0][0].Message);
			Assert.AreEqual("2", clone.ListOfArray.Collection[0][1].Message);
			Assert.AreEqual("3", clone.ListOfArray.Collection[1][0].Message);
		}
		public void DeepClone_ListOfListOfListNormal_AsReference(TypeModel model)
		{
			var item = new ItemClass() { Message = "1" };

			var obj = new ListOfListWrapper()
			{
				ListOfListOfList = new ListOfListOfList()
				{
					Collection = new List<List<List<ItemClass>>>()
					{
						new List<List<ItemClass>>()
						{
							new List<ItemClass>()
							{
								item,
								new ItemClass() { Message = "2" }
							}
						},
						new List<List<ItemClass>>()
						{
							new List<ItemClass>()
							{
								new ItemClass() { Message = "3" }
							},
							new List<ItemClass>()
							{
								new ItemClass() { Message = "4" },
								item
							}
						}
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.ListOfListOfList.Collection.Count);
			Assert.AreEqual(1, clone.ListOfListOfList.Collection[0].Count);
			Assert.AreEqual(2, clone.ListOfListOfList.Collection[1].Count);

			Assert.AreEqual("1", clone.ListOfListOfList.Collection[0][0][0].Message);
			Assert.AreEqual("2", clone.ListOfListOfList.Collection[0][0][1].Message);
			Assert.AreEqual("3", clone.ListOfListOfList.Collection[1][0][0].Message);
			Assert.AreEqual("4", clone.ListOfListOfList.Collection[1][1][0].Message);
			Assert.AreEqual("1", clone.ListOfListOfList.Collection[1][1][1].Message);

			Assert.IsTrue(object.ReferenceEquals(obj.ListOfListOfList.Collection[0][0][0], obj.ListOfListOfList.Collection[1][1][1]), "Original reference failed");
			Assert.IsTrue(object.ReferenceEquals(clone.ListOfListOfList.Collection[0][0][0], clone.ListOfListOfList.Collection[1][1][1]), "Clone reference not maintained");
		}
		public void DeepClone_ListOfListInterfaceInterface_AsReference(TypeModel model)
		{
			var obj = new ListOfListWrapper()
			{
				ListOfList = new ListOfList()
				{
					IICollection = new List<IList<int>>()
					{
						new List<int>() { 1, 2, 3 },
						new List<int>() { 4, 5 }             		
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.ListOfList.IICollection.Count);

			Assert.AreEqual(1, clone.ListOfList.IICollection[0][0]);
			Assert.AreEqual(2, clone.ListOfList.IICollection[0][1]);
			Assert.AreEqual(3, clone.ListOfList.IICollection[0][2]);
			Assert.AreEqual(4, clone.ListOfList.IICollection[1][0]);
			Assert.AreEqual(5, clone.ListOfList.IICollection[1][1]);
		}
		public void DeepClone_ListOfListReferenceItem_AsReference(TypeModel model)
		{
			var list = new List<int>() { 1, 2, 3 };

			var obj = new ListOfListWrapper()
			{
				ListOfList = new ListOfList()
				{
					Collection = new List<List<int>>()
					{
						list,
						list             		
					}
				}
			};

			var clone = (ListOfListWrapper)model.DeepClone(obj);

			Assert.AreEqual(2, clone.ListOfList.Collection.Count);

			Assert.AreEqual(1, clone.ListOfList.Collection[0][0]);
			Assert.AreEqual(2, clone.ListOfList.Collection[0][1]);
			Assert.AreEqual(3, clone.ListOfList.Collection[0][2]);
			Assert.AreEqual(1, clone.ListOfList.Collection[1][0]);
			Assert.AreEqual(2, clone.ListOfList.Collection[1][1]);
			Assert.AreEqual(3, clone.ListOfList.Collection[1][2]);

			Assert.IsTrue(object.ReferenceEquals(obj.ListOfList.Collection[0], obj.ListOfList.Collection[1]), "Original reference failed");
			Assert.IsTrue(object.ReferenceEquals(clone.ListOfList.Collection[0], clone.ListOfList.Collection[1]), "Clone reference not maitained");
		}