diff --git a/src/Umbraco.Core/Dynamics/DynamicXml.cs b/src/Umbraco.Core/Dynamics/DynamicXml.cs index a6a7441580..0a1ed5ed3b 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXml.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Dynamic; using System.Reflection; @@ -11,6 +12,7 @@ using System.Web; namespace Umbraco.Core.Dynamics { + [TypeConverter(typeof(DynamicXmlConverter))] public class DynamicXml : DynamicObject, IEnumerable, IEnumerable { public XElement BaseElement { get; set; } @@ -72,51 +74,51 @@ namespace Umbraco.Core.Dynamics return true; //anyway } - //ok, now lets try to match by member, property, extensino method - var attempt = DynamicInstanceHelper.TryInvokeMember(this, binder, args, new[] + //ok, now lets try to match by member, property, extensino method + var attempt = DynamicInstanceHelper.TryInvokeMember(this, binder, args, new[] { typeof (IEnumerable), typeof (IEnumerable), typeof (DynamicXml) }); - if (attempt.Success) - { - result = attempt.Result.ObjectResult; + if (attempt.Success) + { + result = attempt.Result.ObjectResult; - //need to check the return type and possibly cast if result is from an extension method found - if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod) - { - //if the result is already a DynamicXml instance, then we do not need to cast - if (attempt.Result.ObjectResult != null && !(attempt.Result.ObjectResult is DynamicXml)) - { - if (attempt.Result.ObjectResult is XElement) - { - result = new DynamicXml((XElement)attempt.Result.ObjectResult); - } - else if (attempt.Result.ObjectResult is IEnumerable) - { - result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x)); - } - else if (attempt.Result.ObjectResult is IEnumerable) - { - result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x.BaseElement)); - } - } - } - return true; - } + //need to check the return type and possibly cast if result is from an extension method found + if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod) + { + //if the result is already a DynamicXml instance, then we do not need to cast + if (attempt.Result.ObjectResult != null && !(attempt.Result.ObjectResult is DynamicXml)) + { + if (attempt.Result.ObjectResult is XElement) + { + result = new DynamicXml((XElement)attempt.Result.ObjectResult); + } + else if (attempt.Result.ObjectResult is IEnumerable) + { + result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x)); + } + else if (attempt.Result.ObjectResult is IEnumerable) + { + result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x.BaseElement)); + } + } + } + return true; + } - //this is the result of an extension method execution gone wrong so we return dynamic null - if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod - && attempt.Error != null && attempt.Error is TargetInvocationException) - { - result = new DynamicNull(); - return true; - } + //this is the result of an extension method execution gone wrong so we return dynamic null + if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod + && attempt.Error != null && attempt.Error is TargetInvocationException) + { + result = new DynamicNull(); + return true; + } - result = null; - return false; + result = null; + return false; } public override bool TryGetMember(GetMemberBinder binder, out object result) @@ -213,6 +215,16 @@ namespace Umbraco.Core.Dynamics } return root; } + + /// + /// Return the string version of Xml + /// + /// + public override string ToString() + { + return ToXml(); + } + public IHtmlString ToHtml() { return new HtmlString(this.ToXml()); @@ -228,40 +240,40 @@ namespace Umbraco.Core.Dynamics return new DynamicXml(this.BaseElement.XPathSelectElements(expression).FirstOrDefault()); } - IEnumerator IEnumerable.GetEnumerator() - { - return this.BaseElement.Elements().GetEnumerator(); - } + IEnumerator IEnumerable.GetEnumerator() + { + return this.BaseElement.Elements().GetEnumerator(); + } - public IEnumerator GetEnumerator() - { - return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); - } + public IEnumerator GetEnumerator() + { + return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - public int Count() { - return ((IEnumerable)this).Count(); + return ((IEnumerable)this).Count(); } public bool Any() { - return ((IEnumerable)this).Any(); + return ((IEnumerable)this).Any(); } - public IEnumerable Take(int count) - { - return ((IEnumerable)this).Take(count); - } + public IEnumerable Take(int count) + { + return ((IEnumerable)this).Take(count); + } - public IEnumerable Skip(int count) - { - return ((IEnumerable)this).Skip(count); - } + public IEnumerable Skip(int count) + { + return ((IEnumerable)this).Skip(count); + } public bool IsNull() { @@ -503,72 +515,72 @@ namespace Umbraco.Core.Dynamics public HtmlString IsDescendant(DynamicXml other, string valueIfTrue) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsDescendantOrSelf(DynamicXml other) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestor(DynamicXml other) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestorOrSelf(DynamicXml other) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public IEnumerable Descendants() { return Descendants(n => true); } - public IEnumerable Descendants(Func func) + public IEnumerable Descendants(Func func) { var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); return flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n)); } - public IEnumerable DescendantsOrSelf() + public IEnumerable DescendantsOrSelf() { return DescendantsOrSelf(n => true); } - public IEnumerable DescendantsOrSelf(Func func) + public IEnumerable DescendantsOrSelf(Func func) { var flattenedNodes = this.BaseElement.Elements().Map(func, (XElement n) => { return n.Elements(); }); var list = new List(); @@ -576,11 +588,11 @@ namespace Umbraco.Core.Dynamics list.AddRange(flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n))); return list; } - public IEnumerable Ancestors() + public IEnumerable Ancestors() { return Ancestors(item => true); } - public IEnumerable Ancestors(Func func) + public IEnumerable Ancestors(Func func) { var ancestorList = new List(); var node = this.BaseElement; @@ -611,11 +623,11 @@ namespace Umbraco.Core.Dynamics ancestorList.Reverse(); return ancestorList.ConvertAll(item => new DynamicXml(item)); } - public IEnumerable AncestorsOrSelf() + public IEnumerable AncestorsOrSelf() { return AncestorsOrSelf(item => true); } - public IEnumerable AncestorsOrSelf(Func func) + public IEnumerable AncestorsOrSelf(Func func) { List ancestorList = new List(); var node = this.BaseElement; @@ -730,6 +742,6 @@ namespace Umbraco.Core.Dynamics } } - + } } diff --git a/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs new file mode 100644 index 0000000000..45ac9290c0 --- /dev/null +++ b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs @@ -0,0 +1,59 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Xml; +using System.Xml.Linq; + +namespace Umbraco.Core.Dynamics +{ + /// + /// A custom type converter for DynamicXml + /// + public class DynamicXmlConverter : TypeConverter + { + public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType) + { + var convertableTypes = new[] { typeof(string), typeof(XElement), typeof(XmlElement), typeof(XmlDocument) }; + + return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, sourceType)) + || base.CanConvertFrom(context, sourceType); + } + + public override object ConvertTo( + ITypeDescriptorContext context, + CultureInfo culture, + object value, + Type destinationType) + { + var dxml = value as DynamicXml; + if (dxml == null) + return null; + //string + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + return value.ToString(); + } + //XElement + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + return dxml.BaseElement; + } + //XmlElement + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + var xDoc = new XmlDocument(); + xDoc.LoadXml(dxml.ToString()); + return xDoc.DocumentElement; + } + //XmlDocument + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + var xDoc = new XmlDocument(); + xDoc.LoadXml(dxml.ToString()); + return xDoc; + } + return base.ConvertTo(context, culture, value, destinationType); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 672bed94a7..4ebdac20df 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -66,6 +66,7 @@ + diff --git a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs index 7c1a3598fb..1e5b169319 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs @@ -1,145 +1,202 @@ using System; using System.Diagnostics; +using System.Xml; +using System.Xml.Linq; using Microsoft.CSharp.RuntimeBinder; using NUnit.Framework; using Umbraco.Core.Dynamics; using System.Linq; +using Umbraco.Tests.PartialTrust; +using Umbraco.Core; namespace Umbraco.Tests.PublishedContent { - [TestFixture] - public class DynamicXmlTests - { + [TestFixture] + public class DynamicXmlConverterTests : AbstractPartialTrustFixture + { + [Test] + public void Convert_To_String() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result); + } - [Test] - public void Custom_Extension_Method_Legacy() - { - var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml); - dynamic dynamicXml = typedXml; + [Test] + public void Convert_To_XElement() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.ToString(SaveOptions.DisableFormatting)); + } - //we haven't explicitly defined ElementAt so this will dynamically invoke this method - var element = dynamicXml.ElementAt(0); + [Test] + public void Convert_To_XmlElement() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.OuterXml); + } - Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value); - } + [Test] + public void Convert_To_XmlDocument() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.InnerXml); + } - [Test] - public void Custom_Extension_Method() - { - var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var typedXml = new DynamicXml(xml); - - dynamic dynamicXml = typedXml; + public override void TestSetup() + { - //we haven't explicitly defined ElementAt so this will dynamically invoke this method - var element = dynamicXml.ElementAt(0); + } - Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value); - } + public override void TestTearDown() + { + } + } - [Test] - public void Take_Legacy() - { - var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml); - dynamic dynamicXml = typedXml; - var typedTaken = typedXml.Take(1); - var dynamicTaken = dynamicXml.Take(1); + [TestFixture] + public class DynamicXmlTests + { - Assert.AreEqual(1, typedTaken.Count()); - Assert.AreEqual(1, Enumerable.Count(dynamicTaken)); + [Test] + public void Custom_Extension_Method_Legacy() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml); + dynamic dynamicXml = typedXml; - Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value); - Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value); - } + //we haven't explicitly defined ElementAt so this will dynamically invoke this method + var element = dynamicXml.ElementAt(0); - [Test] - public void Take() - { - var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var typedXml = new DynamicXml(xml); - dynamic dynamicXml = typedXml; - var typedTaken = typedXml.Take(1); - var dynamicTaken = dynamicXml.Take(1); + Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value); + } - Assert.AreEqual(1, typedTaken.Count()); - Assert.AreEqual(1, Enumerable.Count(dynamicTaken)); + [Test] + public void Custom_Extension_Method() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var typedXml = new DynamicXml(xml); - Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value); - Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value); - } + dynamic dynamicXml = typedXml; - [Test] - public void Ensure_Legacy_Objects_Are_Returned() - { - var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var mediaItems = new global::umbraco.MacroEngines.DynamicXml(xml); - //Debug.WriteLine("full xml = {0}", mediaItems.ToXml()); + //we haven't explicitly defined ElementAt so this will dynamically invoke this method + var element = dynamicXml.ElementAt(0); - if (mediaItems.Count() != 0) - { - foreach (dynamic item in mediaItems) - { - Type itemType = item.GetType(); - Debug.WriteLine("item type = {0}", itemType); - dynamic image = item.Image; + Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value); + } - Type imageType = image.GetType(); - Debug.WriteLine("image type = {0}", imageType); - - //ensure they are the same - Assert.AreEqual(itemType, imageType); + [Test] + public void Take_Legacy() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml); + dynamic dynamicXml = typedXml; + var typedTaken = typedXml.Take(1); + var dynamicTaken = dynamicXml.Take(1); - //ensure they are legacy - Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), itemType); - Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), imageType); - } - } - } + Assert.AreEqual(1, typedTaken.Count()); + Assert.AreEqual(1, Enumerable.Count(dynamicTaken)); - /// - /// Test the current Core class - /// - [Test] - public void Find_Test_Core_Class() - { - RunFindTest(x => new DynamicXml(x)); - } + Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value); + Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value); + } - /// - /// Tests the macroEngines legacy class - /// - [Test] - public void Find_Test_Legacy_Class() - { - RunFindTest(x => new global::umbraco.MacroEngines.DynamicXml(x)); - } + [Test] + public void Take() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var typedXml = new DynamicXml(xml); + dynamic dynamicXml = typedXml; + var typedTaken = typedXml.Take(1); + var dynamicTaken = dynamicXml.Take(1); - private void RunFindTest(Func getDynamicXml) - { - var xmlstring = @" + Assert.AreEqual(1, typedTaken.Count()); + Assert.AreEqual(1, Enumerable.Count(dynamicTaken)); + + Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value); + Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value); + } + + [Test] + public void Ensure_Legacy_Objects_Are_Returned() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var mediaItems = new global::umbraco.MacroEngines.DynamicXml(xml); + //Debug.WriteLine("full xml = {0}", mediaItems.ToXml()); + + if (mediaItems.Count() != 0) + { + foreach (dynamic item in mediaItems) + { + Type itemType = item.GetType(); + Debug.WriteLine("item type = {0}", itemType); + dynamic image = item.Image; + + Type imageType = image.GetType(); + Debug.WriteLine("image type = {0}", imageType); + + //ensure they are the same + Assert.AreEqual(itemType, imageType); + + //ensure they are legacy + Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), itemType); + Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), imageType); + } + } + } + + /// + /// Test the current Core class + /// + [Test] + public void Find_Test_Core_Class() + { + RunFindTest(x => new DynamicXml(x)); + } + + /// + /// Tests the macroEngines legacy class + /// + [Test] + public void Find_Test_Legacy_Class() + { + RunFindTest(x => new global::umbraco.MacroEngines.DynamicXml(x)); + } + + private void RunFindTest(Func getDynamicXml) + { + var xmlstring = @" "; - dynamic dXml = getDynamicXml(xmlstring); + dynamic dXml = getDynamicXml(xmlstring); - var result1 = dXml.Find("@name", "test 1"); - var result2 = dXml.Find("@name", "test 2"); - var result3 = dXml.Find("@name", "test 3"); - var result4 = dXml.Find("@name", "dont find"); + var result1 = dXml.Find("@name", "test 1"); + var result2 = dXml.Find("@name", "test 2"); + var result3 = dXml.Find("@name", "test 3"); + var result4 = dXml.Find("@name", "dont find"); - Assert.AreEqual("found 1", result1.value); - Assert.AreEqual("found 2", result2.value); - Assert.AreEqual("found 3", result3.value); - Assert.Throws(() => - { - //this will throw because result4 is not found - var temp = result4.value; - }); - } + Assert.AreEqual("found 1", result1.value); + Assert.AreEqual("found 2", result2.value); + Assert.AreEqual("found 3", result3.value); + Assert.Throws(() => + { + //this will throw because result4 is not found + var temp = result4.value; + }); + } - } + } } \ No newline at end of file