/// <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> /// 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(); } }