public void DeepClone_HashSetRefItemInMultiplePlaces_AsReference(TypeModel model)
		{
			var item = new ItemClass() { Message = "Test" };

			var obj = new CollectionRefItemInMutiplePlacesRef
			{
				AAItem = item,
				HashSet = new HashsetRefItemInMultiplePlaces
				{
					Item = item,
					Collection = new HashSet<ItemClass> { item }
				}
			};

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

			Assert.AreEqual(obj.AAItem.Message, clone.AAItem.Message);

			Assert.AreEqual(obj.HashSet.Item.Message, clone.HashSet.Item.Message);
			Assert.AreEqual(1, clone.HashSet.Collection.Count);
			Assert.AreEqual(obj.HashSet.Collection.First().Message, clone.HashSet.Collection.First().Message);

			Assert.IsTrue(object.ReferenceEquals(obj.AAItem, obj.HashSet.Item), "Original Outside Item - Collection Item reference");
			Assert.IsTrue(object.ReferenceEquals(obj.HashSet.Item, obj.HashSet.Collection.First()), "Original Item - Collection reference");

			Assert.IsTrue(object.ReferenceEquals(clone.AAItem, clone.HashSet.Item), "Clone Outside Item - Collection Item reference");
			Assert.IsTrue(object.ReferenceEquals(clone.HashSet.Item, clone.HashSet.Collection.First()), "Clone Collection - Collection reference");
		}
		public void DeepClone_ListRefItemInMultiplePlaces_AsReference(TypeModel model)
		{
			var item = new ItemClass() { Message = "Test" };

			var obj = new CollectionRefItemInMutiplePlacesRef
			{
				AAItem = item,
				List = new ListRefItemInMultiplePlaces()
				{
					Item = item,
					Collection = new List<ItemClass> { item, item }
				}
			};

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

			Assert.AreEqual(obj.AAItem.Message, clone.AAItem.Message);

			Assert.AreEqual(obj.List.Item.Message, clone.List.Item.Message);
			Assert.AreEqual(2, clone.List.Collection.Count);
			Assert.AreEqual(obj.List.Collection[0].Message, clone.List.Collection[0].Message);
			Assert.AreEqual(obj.List.Collection[1].Message, clone.List.Collection[1].Message);

			Assert.IsTrue(object.ReferenceEquals(obj.AAItem, obj.List.Item), "Original Outside Item - Collection Item reference");
			Assert.IsTrue(object.ReferenceEquals(obj.List.Item, obj.List.Collection[0]), "Original Item - Collection reference");
			Assert.IsTrue(object.ReferenceEquals(obj.List.Collection[0], obj.List.Collection[1]), "Original Collection - Collection reference");

			Assert.IsTrue(object.ReferenceEquals(clone.AAItem, clone.List.Item), "Clone Outside Item - Collection Item reference");
			Assert.IsTrue(object.ReferenceEquals(clone.List.Item, clone.List.Collection[0]), "Clone Item - Collection reference");
			Assert.IsTrue(object.ReferenceEquals(clone.List.Collection[0], clone.List.Collection[1]), "Clone Collection - Collection reference");
		}
		public void DeepClone_ArrayRefItemInMultiplePlaces_AsReference(TypeModel model)
		{
			var item = new ItemClass() { Message = "Test" };

			var obj = new CollectionRefItemInMutiplePlacesRef
			{
				AAItem = item,
				Array = new ArrayRefItemInMultiplePlaces()
				{
					Item = item,
					Collection = new[] { item, item }
				}
			};

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

			Assert.AreEqual(obj.AAItem.Message, clone.AAItem.Message);

			Assert.AreEqual(obj.Array.Item.Message, clone.Array.Item.Message);
			Assert.AreEqual(2, clone.Array.Collection.Length);
			Assert.AreEqual(obj.Array.Collection[0].Message, clone.Array.Collection[0].Message);
			Assert.AreEqual(obj.Array.Collection[1].Message, clone.Array.Collection[1].Message);

			Assert.IsTrue(object.ReferenceEquals(obj.AAItem, obj.Array.Item), "Original Oustide item - Collection item reference");
			Assert.IsTrue(object.ReferenceEquals(obj.Array.Item, obj.Array.Collection[0]), "Original Item - Collection reference");
			Assert.IsTrue(object.ReferenceEquals(obj.Array.Collection[0], obj.Array.Collection[1]), "Original Collection - Collection reference");

			Assert.IsTrue(object.ReferenceEquals(clone.AAItem, clone.Array.Item), "Clone Oustide item - Collection item reference");
			Assert.IsTrue(object.ReferenceEquals(clone.Array.Item, clone.Array.Collection[0]), "Clone Item - Collection reference");
			Assert.IsTrue(object.ReferenceEquals(clone.Array.Collection[0], clone.Array.Collection[1]), "Clone Collection - Collection reference");
		}