From b056719cdcc12f79e5c4eaa1db527ff3f6d0cc93 Mon Sep 17 00:00:00 2001 From: Ollie Philpott Date: Thu, 23 Apr 2020 15:01:17 +0100 Subject: [PATCH] Move XmlHelper tests and add builder --- .../XmlDocumentBuilder.cs | 126 ++++++++ .../Umbraco.Core/Xml/XmlHelperTests.cs | 157 ++++++++++ .../Builders/XmlDocumentBuilderTests.cs | 27 ++ src/Umbraco.Tests/Misc/XmlHelperTests.cs | 270 ------------------ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 - 5 files changed, 310 insertions(+), 271 deletions(-) create mode 100644 src/Umbraco.Tests.Common/XmlDocumentBuilder.cs create mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Core/Xml/XmlHelperTests.cs create mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/XmlDocumentBuilderTests.cs delete mode 100644 src/Umbraco.Tests/Misc/XmlHelperTests.cs diff --git a/src/Umbraco.Tests.Common/XmlDocumentBuilder.cs b/src/Umbraco.Tests.Common/XmlDocumentBuilder.cs new file mode 100644 index 0000000000..14fde615e2 --- /dev/null +++ b/src/Umbraco.Tests.Common/XmlDocumentBuilder.cs @@ -0,0 +1,126 @@ +using System.Xml; +using Umbraco.Tests.Common.Builders; + +namespace Umbraco.Tests.Common +{ + public class XmlDocumentBuilder : BuilderBase + { + private string _content; + + public XmlDocumentBuilder WithContent(string content) + { + _content = content; + return this; + } + + public override XmlDocument Build() + { + var xml = new XmlDocument(); + xml.LoadXml(_content ?? DefaultContent); + return xml; + } + + private const string DefaultContent = + @" + + + + + ]> + + + + + 1 + + This is some content]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "; + } +} diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Xml/XmlHelperTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Xml/XmlHelperTests.cs new file mode 100644 index 0000000000..d25da903f8 --- /dev/null +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Xml/XmlHelperTests.cs @@ -0,0 +1,157 @@ +using System.Diagnostics; +using System.Linq; +using System.Xml; +using System.Xml.XPath; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Xml; +using Umbraco.Tests.Common; + +namespace Umbraco.Tests.UnitTests.Umbraco.Core.Xml +{ + [TestFixture] + public class XmlHelperTests + { + private XmlDocumentBuilder _builder; + + [SetUp] + public void SetUp() + { + _builder = new XmlDocumentBuilder(); + } + + [Ignore("This is a benchmark test so is ignored by default")] + [Test] + public void Sort_Nodes_Benchmark_Legacy() + { + var xml = _builder.Build(); + var original = xml.GetElementById(1173.ToString()); + Assert.IsNotNull(original); + + long totalTime = 0; + var watch = new Stopwatch(); + var iterations = 10000; + + for (var i = 0; i < iterations; i++) + { + //don't measure the time for clone! + var parentNode = original.Clone(); + watch.Start(); + LegacySortNodes(ref parentNode); + watch.Stop(); + totalTime += watch.ElapsedMilliseconds; + watch.Reset(); + + //do assertions just to make sure it is working properly. + var currSort = 0; + foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) + { + Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); + currSort++; + } + + //ensure the parent node's properties still exist first + Assert.AreEqual("content", parentNode.ChildNodes[0].Name); + Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); + //then the child nodes should come straight after + Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); + } + + Debug.WriteLine("Total time for " + iterations + " iterations is " + totalTime); + } + + [Ignore("This is a benchmark test so is ignored by default")] + [Test] + public void Sort_Nodes_Benchmark_New() + { + var xml = _builder.Build(); + var original = xml.GetElementById(1173.ToString()); + Assert.IsNotNull(original); + + long totalTime = 0; + var watch = new Stopwatch(); + var iterations = 10000; + + for (var i = 0; i < iterations; i++) + { + //don't measure the time for clone! + var parentNode = (XmlElement) original.Clone(); + watch.Start(); + XmlHelper.SortNodes( + parentNode, + "./* [@id]", + x => x.AttributeValue("sortOrder")); + watch.Stop(); + totalTime += watch.ElapsedMilliseconds; + watch.Reset(); + + //do assertions just to make sure it is working properly. + var currSort = 0; + foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) + { + Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); + currSort++; + } + + //ensure the parent node's properties still exist first + Assert.AreEqual("content", parentNode.ChildNodes[0].Name); + Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); + //then the child nodes should come straight after + Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); + } + + Debug.WriteLine("Total time for " + iterations + " iterations is " + totalTime); + } + + [Test] + public void Sort_Nodes() + { + var xml = _builder.Build(); + var original = xml.GetElementById(1173.ToString()); + Assert.IsNotNull(original); + + var parentNode = (XmlElement) original.Clone(); + + XmlHelper.SortNodes( + parentNode, + "./* [@id]", + x => x.AttributeValue("sortOrder")); + + //do assertions just to make sure it is working properly. + var currSort = 0; + foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) + { + Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); + currSort++; + } + + //ensure the parent node's properties still exist first + Assert.AreEqual("content", parentNode.ChildNodes[0].Name); + Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); + //then the child nodes should come straight after + Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); + } + + /// + /// This was the logic to sort before and now lives here just to show the benchmarks tests above. + /// + /// + private static void LegacySortNodes(ref XmlNode parentNode) + { + var n = parentNode.CloneNode(true); + + // remove all children from original node + var xpath = "./* [@id]"; + foreach (XmlNode child in parentNode.SelectNodes(xpath)) + parentNode.RemoveChild(child); + + var nav = n.CreateNavigator(); + var expr = nav.Compile(xpath); + expr.AddSort("@sortOrder", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number); + var iterator = nav.Select(expr); + while (iterator.MoveNext()) + parentNode.AppendChild( + ((IHasXmlNode) iterator.Current).GetNode()); + } + } +} diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/XmlDocumentBuilderTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/XmlDocumentBuilderTests.cs new file mode 100644 index 0000000000..0c77cd3222 --- /dev/null +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/XmlDocumentBuilderTests.cs @@ -0,0 +1,27 @@ +using NUnit.Framework; +using Umbraco.Tests.Common; + +namespace Umbraco.Tests.UnitTests.Umbraco.Tests.Common.Builders +{ + [TestFixture] + public class XmlDocumentBuilderTests + { + [Test] + public void Is_Built_Correctly() + { + // Arrange + const string content = + @""; + + var builder = new XmlDocumentBuilder(); + + // Act + var xml = builder + .WithContent(content) + .Build(); + + // Assert + Assert.AreEqual(content, xml.OuterXml); + } + } +} diff --git a/src/Umbraco.Tests/Misc/XmlHelperTests.cs b/src/Umbraco.Tests/Misc/XmlHelperTests.cs deleted file mode 100644 index cb666a72fb..0000000000 --- a/src/Umbraco.Tests/Misc/XmlHelperTests.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System.Diagnostics; -using System.Linq; -using System.Xml; -using System.Xml.XPath; -using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Xml; - -namespace Umbraco.Tests.Misc -{ - [TestFixture] - public class XmlHelperTests - { - [SetUp] - public void Setup() - { - } - - [Ignore("This is a benchmark test so is ignored by default")] - [Test] - public void Sort_Nodes_Benchmark_Legacy() - { - var xmlContent = GetXmlContent(1); - var xml = new XmlDocument(); - xml.LoadXml(xmlContent); - var original = xml.GetElementById(1173.ToString()); - Assert.IsNotNull(original); - - long totalTime = 0; - var watch = new Stopwatch(); - var iterations = 10000; - - for (var i = 0; i < iterations; i++) - { - //don't measure the time for clone! - var parentNode = original.Clone(); - watch.Start(); - LegacySortNodes(ref parentNode); - watch.Stop(); - totalTime += watch.ElapsedMilliseconds; - watch.Reset(); - - //do assertions just to make sure it is working properly. - var currSort = 0; - foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) - { - Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); - currSort++; - } - - //ensure the parent node's properties still exist first - Assert.AreEqual("content", parentNode.ChildNodes[0].Name); - Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); - //then the child nodes should come straight after - Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); - } - - Debug.WriteLine("Total time for " + iterations + " iterations is " + totalTime); - } - - [Ignore("This is a benchmark test so is ignored by default")] - [Test] - public void Sort_Nodes_Benchmark_New() - { - var xmlContent = GetXmlContent(1); - var xml = new XmlDocument(); - xml.LoadXml(xmlContent); - var original = xml.GetElementById(1173.ToString()); - Assert.IsNotNull(original); - - long totalTime = 0; - var watch = new Stopwatch(); - var iterations = 10000; - - for (var i = 0; i < iterations; i++) - { - //don't measure the time for clone! - var parentNode = (XmlElement)original.Clone(); - watch.Start(); - XmlHelper.SortNodes( - parentNode, - "./* [@id]", - x => x.AttributeValue("sortOrder")); - watch.Stop(); - totalTime += watch.ElapsedMilliseconds; - watch.Reset(); - - //do assertions just to make sure it is working properly. - var currSort = 0; - foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) - { - Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); - currSort++; - } - //ensure the parent node's properties still exist first - Assert.AreEqual("content", parentNode.ChildNodes[0].Name); - Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); - //then the child nodes should come straight after - Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); - - } - - Debug.WriteLine("Total time for " + iterations + " iterations is " + totalTime); - } - - - [Test] - public void Sort_Nodes() - { - var xmlContent = GetXmlContent(1); - var xml = new XmlDocument(); - xml.LoadXml(xmlContent); - var original = xml.GetElementById(1173.ToString()); - Assert.IsNotNull(original); - - var parentNode = (XmlElement)original.Clone(); - - XmlHelper.SortNodes( - parentNode, - "./* [@id]", - x => x.AttributeValue("sortOrder")); - - //do assertions just to make sure it is working properly. - var currSort = 0; - foreach (var child in parentNode.SelectNodes("./* [@id]").Cast()) - { - Assert.AreEqual(currSort, int.Parse(child.Attributes["sortOrder"].Value)); - currSort++; - } - //ensure the parent node's properties still exist first - Assert.AreEqual("content", parentNode.ChildNodes[0].Name); - Assert.AreEqual("umbracoUrlAlias", parentNode.ChildNodes[1].Name); - //then the child nodes should come straight after - Assert.IsTrue(parentNode.ChildNodes[2].Attributes["id"] != null); - } - - /// - /// This was the logic to sort before and now lives here just to show the benchmarks tests above. - /// - /// - private static void LegacySortNodes(ref XmlNode parentNode) - { - XmlNode n = parentNode.CloneNode(true); - - // remove all children from original node - string xpath = "./* [@id]"; - foreach (XmlNode child in parentNode.SelectNodes(xpath)) - parentNode.RemoveChild(child); - - - XPathNavigator nav = n.CreateNavigator(); - XPathExpression expr = nav.Compile(xpath); - expr.AddSort("@sortOrder", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number); - XPathNodeIterator iterator = nav.Select(expr); - while (iterator.MoveNext()) - parentNode.AppendChild( - ((IHasXmlNode)iterator.Current).GetNode()); - } - - /// - /// returns xml with a reverse sort order - /// - /// - /// - private string GetXmlContent(int templateId) - { - return @" - - - - -]> - - - - - 1 - - This is some content]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - } - } -} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 1844327a7f..afd82dbe75 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -490,7 +490,6 @@ -