More work on deep cloning, have test passing for IContent

This commit is contained in:
Shannon
2014-04-15 13:52:49 +10:00
parent b7f7775b89
commit 58758e7a41
18 changed files with 156 additions and 81 deletions

View File

@@ -420,9 +420,9 @@ namespace Umbraco.Tests.Models.Collections
return _hash.Value;
}*/
public T DeepClone<T>() where T : IDeepCloneable
public object DeepClone()
{
return (T)this.MemberwiseClone();
return this.MemberwiseClone();
}
}
}

View File

@@ -6,6 +6,7 @@ using System.Web;
using Moq;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
@@ -111,7 +112,7 @@ namespace Umbraco.Tests.Models
[Test]
public void Can_Clone_Content()
public void Can_Clone_Content_With_Reset_Identity()
{
// Arrange
var contentType = MockedContentTypes.CreateTextpageContentType();
@@ -120,7 +121,7 @@ namespace Umbraco.Tests.Models
content.Key = new Guid("29181B97-CB8F-403F-86DE-5FEB497F4800");
// Act
var clone = content.DeepClone<IContent>();
var clone = content.Clone();
// Assert
Assert.AreNotSame(clone, content);
@@ -131,6 +132,99 @@ namespace Umbraco.Tests.Models
Assert.AreNotSame(content.Properties, clone.Properties);
}
[Test]
public void Can_Deep_Clone()
{
// Arrange
var contentType = MockedContentTypes.CreateTextpageContentType();
contentType.Id = 99;
var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1);
var i = 200;
foreach (var property in content.Properties)
{
property.Id = ++i;
}
content.Id = 10;
content.CreateDate = DateTime.Now;
content.CreatorId = 22;
content.ExpireDate = DateTime.Now;
content.Key = Guid.NewGuid();
content.Language = "en";
content.Level = 3;
content.Path = "-1,4,10";
content.ReleaseDate = DateTime.Now;
content.ChangePublishedState(PublishedState.Published);
content.SortOrder = 5;
content.Template = new Template("-1,2,3,4", "Test Template", "testTemplate")
{
Id = 88
};
content.Trashed = false;
content.UpdateDate = DateTime.Now;
content.Version = Guid.NewGuid();
content.WriterId = 23;
((IUmbracoEntity)content).AdditionalData.Add("test1", 123);
((IUmbracoEntity)content).AdditionalData.Add("test2", "hello");
// Act
var clone = (Content)content.DeepClone();
// Assert
Assert.AreNotSame(clone, content);
Assert.AreEqual(clone, content);
Assert.AreEqual(clone.Id, content.Id);
Assert.AreEqual(clone.Version, content.Version);
Assert.AreEqual(((IUmbracoEntity)clone).AdditionalData, ((IUmbracoEntity)content).AdditionalData);
Assert.AreNotSame(clone.ContentType, content.ContentType);
Assert.AreEqual(clone.ContentType, content.ContentType);
Assert.AreEqual(clone.ContentType.PropertyGroups.Count, content.ContentType.PropertyGroups.Count);
for (var index = 0; index < content.ContentType.PropertyGroups.Count; index++)
{
Assert.AreNotSame(clone.ContentType.PropertyGroups[index], content.ContentType.PropertyGroups[index]);
Assert.AreEqual(clone.ContentType.PropertyGroups[index], content.ContentType.PropertyGroups[index]);
}
Assert.AreEqual(clone.ContentType.PropertyTypes.Count(), content.ContentType.PropertyTypes.Count());
for (var index = 0; index < content.ContentType.PropertyTypes.Count(); index++)
{
Assert.AreNotSame(clone.ContentType.PropertyTypes.ElementAt(index), content.ContentType.PropertyTypes.ElementAt(index));
Assert.AreEqual(clone.ContentType.PropertyTypes.ElementAt(index), content.ContentType.PropertyTypes.ElementAt(index));
}
Assert.AreEqual(clone.ContentTypeId, content.ContentTypeId);
Assert.AreEqual(clone.CreateDate, content.CreateDate);
Assert.AreEqual(clone.CreatorId, content.CreatorId);
Assert.AreEqual(clone.ExpireDate, content.ExpireDate);
Assert.AreEqual(clone.Key, content.Key);
Assert.AreEqual(clone.Language, content.Language);
Assert.AreEqual(clone.Level, content.Level);
Assert.AreEqual(clone.Path, content.Path);
Assert.AreEqual(clone.ReleaseDate, content.ReleaseDate);
Assert.AreEqual(clone.Published, content.Published);
Assert.AreEqual(clone.PublishedState, content.PublishedState);
Assert.AreEqual(clone.SortOrder, content.SortOrder);
Assert.AreEqual(clone.PublishedState, content.PublishedState);
Assert.AreNotSame(clone.Template, content.Template);
Assert.AreEqual(clone.Template, content.Template);
Assert.AreEqual(clone.Trashed, content.Trashed);
Assert.AreEqual(clone.UpdateDate, content.UpdateDate);
Assert.AreEqual(clone.Version, content.Version);
Assert.AreEqual(clone.WriterId, content.WriterId);
Assert.AreNotSame(clone.Properties, content.Properties);
Assert.AreEqual(clone.Properties.Count(), content.Properties.Count());
for (var index = 0; index < content.Properties.Count; index++)
{
Assert.AreNotSame(clone.Properties[index], content.Properties[index]);
Assert.AreEqual(clone.Properties[index], content.Properties[index]);
}
//This double verifies by reflection
var allProps = clone.GetType().GetProperties();
foreach (var propertyInfo in allProps)
{
Assert.AreEqual(propertyInfo.GetValue(clone, null), propertyInfo.GetValue(content, null));
}
}
/*[Test]
public void Cannot_Change_Property_With_Invalid_Value()
{