/// <summary> /// Compares the 2 Xml subtrees. /// </summary> /// <param name="lhs">The left-hand side Xml subtree</param> /// <param name="rhs">The right-hand side Xml subtree</param> /// <param name="filter">The XmlNodeType filter to apply during comparison</param> public void CompareXML(XmlNode lhs, XmlNode rhs, IXmlNodeFilter filter) { bool lhsFilter = filter.Filter(lhs); bool rhsFilter = filter.Filter(rhs); Assert.AreEqual(lhsFilter, rhsFilter); // At this point, lhsFilter and rhsFilter are known to be equal. // If both elements should be filtered, avoid comparing the subtrees altogether. if (!lhsFilter) { _CompareXML(lhs, rhs, filter); } }
/// <summary> /// Internal version of CompareXML. Compares the 2 Xml subtrees. /// </summary> /// <remarks>In contrast to the public CompareXML, this version avoids checking whether both elements should be filtered or not.</remarks> /// <param name="lhs">The left-hand side Xml subtree</param> /// <param name="rhs">The right-hand side Xml subtree</param> /// <param name="filter">The XmlNodeType filter to apply during comparison</param> private void _CompareXML(XmlNode lhs, XmlNode rhs, IXmlNodeFilter filter) { Assert.AreEqual(lhs.NodeType, rhs.NodeType); Assert.AreEqual(lhs.NamespaceURI, rhs.NamespaceURI); Assert.AreEqual(lhs.LocalName, rhs.LocalName); if (lhs.NodeType == XmlNodeType.CDATA || lhs.NodeType == XmlNodeType.Comment || lhs.NodeType == XmlNodeType.Text) { Assert.AreEqual(lhs.Value, rhs.Value); } CompareXML(GetXmlCollectionEnumerator(lhs.ChildNodes), GetXmlCollectionEnumerator(rhs.ChildNodes), filter); CompareXML(GetXmlCollectionEnumerator(lhs.Attributes), GetXmlCollectionEnumerator(rhs.Attributes), filter); }
/// <summary> /// Compares the 2 Xml collections. /// </summary> /// <param name="lhs">The left-hand side Xml collection enumerator</param> /// <param name="rhs">The right-hand side Xml collection enumerator</param> /// <param name="filter">The XmlNodeType filter to apply during comparison</param> private void CompareXML(IEnumerator lhs, IEnumerator rhs, IXmlNodeFilter filter) { bool lhsNext = lhs != null && lhs.MoveNext(); bool rhsNext = rhs != null && rhs.MoveNext(); while (lhsNext && rhsNext) { XmlNode lhsChild = (XmlNode)lhs.Current; XmlNode rhsChild = (XmlNode)rhs.Current; if (filter.Filter(lhsChild)) { lhsNext = lhs.MoveNext(); continue; } else if (filter.Filter(rhsChild)) { rhsNext = rhs.MoveNext(); continue; } _CompareXML(lhsChild, rhsChild, filter); lhsNext = lhs.MoveNext(); rhsNext = rhs.MoveNext(); } // Ensure that any remaining nodes are filtered // and not important for the comparison process while (lhsNext) { Assert.IsTrue(filter.Filter((XmlNode)lhs.Current)); lhsNext = lhs.MoveNext(); } while (rhsNext) { Assert.IsTrue(filter.Filter((XmlNode)rhs.Current)); rhsNext = rhs.MoveNext(); } }
/// <summary> /// Compares the 2 Xml string fragments. /// </summary> /// <param name="lhs">The left-hand side Xml fragment</param> /// <param name="rhs">The right-hand side Xml fragment</param> /// <param name="filter">The XmlNodeType filter to apply during comparison</param> public void CompareXML(string lhs, string rhs, IXmlNodeFilter filter) { this.CompareXML(LoadXml(lhs), LoadXml(rhs), filter); }