public void DeepClone_DictionaryBaseCollectionAsProperty_AsReference(TypeModel model)
		{
			var assignableItem = new AssignableItem() { Test = "Test" };

			var obj = new BaseCollectionWrapper()
			{
				LookupItems = new LookupItems()
				{
				    { "1-2-3", assignableItem },				    
					{ "null", null },
					{ "4-5-6", assignableItem },         		
				}
			};

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

			Assert.AreEqual(3, clone.LookupItems.Count);
			Assert.AreEqual(obj.LookupItems["1-2-3"].Test, clone.LookupItems["1-2-3"].Test);
			Assert.AreEqual(obj.LookupItems["4-5-6"].Test, clone.LookupItems["4-5-6"].Test);
			Assert.IsNull(clone.LookupItems["null"]);

			Assert.IsTrue(object.ReferenceEquals(obj.LookupItems["1-2-3"], obj.LookupItems["4-5-6"]), "Original Reference failed");
			Assert.IsTrue(object.ReferenceEquals(clone.LookupItems["1-2-3"], clone.LookupItems["4-5-6"]), "Clone reference not maintained");
		}
		public void DeepClone_MultiLayeredBaseCollection_AsReference(TypeModel model)
		{
			var superItem = new SuperItem() { Message = "Yellow" };

			var obj = new BaseCollectionWrapper()
			{
				MultiLayerCollections = new SuperItems()
				{
					superItem,
					superItem,
					null                 		
				}
			};

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

			Assert.AreEqual(3, clone.MultiLayerCollections.Count);
			Assert.AreEqual(obj.MultiLayerCollections[0].Message, clone.MultiLayerCollections[0].Message);
			Assert.AreEqual(obj.MultiLayerCollections[1].Message, clone.MultiLayerCollections[1].Message);
			Assert.IsNull(clone.MultiLayerCollections[2]);

			Assert.IsTrue(object.ReferenceEquals(obj.MultiLayerCollections[0], obj.MultiLayerCollections[1]), "Original Reference failed");
			Assert.IsTrue(object.ReferenceEquals(clone.MultiLayerCollections[0], clone.MultiLayerCollections[1]), "Clone Reference failed");
		}
		public void DeepClone_ListBaseCollectionAsProperty_AsReference(TypeModel model)
		{
			var assignableItem = new AssignableItem() { Test = "Test" };

			var obj = new BaseCollectionWrapper()
			{
				AssignableItems = new AssignableItems()
				{
				    assignableItem,
					null,
					assignableItem
				}
			};

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

			Assert.AreEqual(3, clone.AssignableItems.Count);
			Assert.AreEqual(obj.AssignableItems[0].Test, clone.AssignableItems[0].Test);
			Assert.IsNull(clone.AssignableItems[1]);
			Assert.AreEqual(obj.AssignableItems[2].Test, clone.AssignableItems[2].Test);

			Assert.IsTrue(object.ReferenceEquals(obj.AssignableItems[0], obj.AssignableItems[2]), "Original Reference failed");
			Assert.IsTrue(object.ReferenceEquals(clone.AssignableItems[0], clone.AssignableItems[2]), "Clone reference not maintained");
		}