From: <bo...@us...> - 2010-08-18 14:06:12
|
Revision: 426 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=426&view=rev Author: bodewig Date: 2010-08-18 14:06:06 +0000 (Wed, 18 Aug 2010) Log Message: ----------- make NodeList comparison symmetric Modified Paths: -------------- trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java.xml trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs Modified: trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java.xml =================================================================== --- trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java.xml 2010-08-13 13:10:16 UTC (rev 425) +++ trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java.xml 2010-08-18 14:06:06 UTC (rev 426) @@ -18,6 +18,8 @@ extends="AbstractDifferenceEngine"> <import reference="java.util.List"/> + <import reference="java.util.Set"/> + <import reference="java.util.TreeSet"/> <import reference="javax.xml.transform.Source"/> <import reference="net.sf.xmlunit.util.Convert"/> <import reference="net.sf.xmlunit.util.IterableNodeList"/> @@ -241,13 +243,19 @@ private ComparisonResult compareNodeLists(NodeList control, NodeList test) { List<Node> controlList = IterableNodeList.asList(control); List<Node> testList = IterableNodeList.asList(test); - Match lastMatch = new Match(null, -1); + final int testSize = testList.size(); + Set<Integer> unmatchedTestIndexes = new TreeSet<Integer>(); + for (int i = 0; i < testSize; i++) { + unmatchedTestIndexes.add(Integer.valueOf(i)); + } ]]></literal> <lastResultDef/> + <literal><![CDATA[ // if there are no children on either Node, the result is equal lastResult = ComparisonResult.EQUAL; - <literal><![CDATA[ - for (int i = 0; i < controlList.size(); i++) { + final int controlSize = controlList.size(); + Match lastMatch = new Match(null, -1); + for (int i = 0; i < controlSize; i++) { Match testMatch = findMatchingNode(controlList.get(i), testList, lastMatch.index); if (testMatch != null) { @@ -256,6 +264,7 @@ controlExpr="controlList.get(i)" testExpr="testMatch.node"/> <literal><![CDATA[ + unmatchedTestIndexes.remove(Integer.valueOf(testMatch.index)); lastMatch = testMatch; } else { lastResult = @@ -268,6 +277,16 @@ <literal><![CDATA[ } } + for (Integer I : unmatchedTestIndexes) { + int i = I.intValue(); + lastResult = + compare(new Comparison(ComparisonType.CHILD_LOOKUP, + null, null, null, + testList.get(i), null, testList.get(i))); +]]></literal> + <if-return-boilerplate/> + <literal><![CDATA[ + } return lastResult; } Modified: trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml =================================================================== --- trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml 2010-08-13 13:10:16 UTC (rev 425) +++ trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml 2010-08-18 14:06:06 UTC (rev 426) @@ -233,29 +233,37 @@ test, null, test.Data)); } + private static readonly object DUMMY = new object(); + private ComparisonResult CompareNodeLists(XmlNodeList control, XmlNodeList test) { - List<XmlNode> controlList = + IList<XmlNode> controlList = new List<XmlNode>(net.sf.xmlunit.util.Convert .Cast<XmlNode>(control)); - List<XmlNode> testList = + IList<XmlNode> testList = new List<XmlNode>(net.sf.xmlunit.util.Convert .Cast<XmlNode>(test)); - Match lastMatch = new Match(null, -1); + IDictionary<int, object> unmatchedTestIndexes = + new SortedDictionary<int, object>(); + for (int i = 0; i < testList.Count; i++) { + unmatchedTestIndexes.Add(i, DUMMY); + } ]]></literal> <lastResultDef/> + <literal><![CDATA[ // if there are no children on either Node, the result is equal lastResult = ComparisonResult.EQUAL; - <literal><![CDATA[ + Match lastMatch = new Match(null, -1); for (int i = 0; i < controlList.Count; i++) { Match testMatch = FindMatchingNode(controlList[i], testList, - lastMatch.index); + lastMatch.Index); if (testMatch != null) { ]]></literal> <compareMethodExpr method="CompareNodes" controlExpr="controlList[i]" - testExpr="testMatch.node"/> + testExpr="testMatch.Node"/> <literal><![CDATA[ + unmatchedTestIndexes.Remove(testMatch.Index); lastMatch = testMatch; } else { lastResult = @@ -268,6 +276,15 @@ <literal><![CDATA[ } } + foreach (int i in unmatchedTestIndexes.Keys) { + lastResult = + Compare(new Comparison(ComparisonType.CHILD_LOOKUP, + null, null, null, + testList[i], null, testList[i])); +]]></literal> + <if-return-boilerplate/> + <literal><![CDATA[ + } return lastResult; } @@ -319,11 +336,11 @@ } internal class Match { - internal readonly XmlNode node; - internal readonly int index; + internal readonly XmlNode Node; + internal readonly int Index; internal Match(XmlNode match, int index) { - this.node = match; - this.index = index; + Node = match; + Index = index; } } ]]></literal> Modified: trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java =================================================================== --- trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java 2010-08-13 13:10:16 UTC (rev 425) +++ trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java 2010-08-18 14:06:06 UTC (rev 426) @@ -490,6 +490,14 @@ assertEquals(ComparisonResult.CRITICAL, d.compareNodes(e1, e2)); assertEquals(1, ex.invoked); + // symmetric? + d = new DOMDifferenceEngine(); + ex = new DiffExpecter(ComparisonType.CHILD_LOOKUP); + d.addDifferenceListener(ex); + d.setDifferenceEvaluator(ev); + assertEquals(ComparisonResult.CRITICAL, d.compareNodes(e2, e1)); + assertEquals(1, ex.invoked); + Element c2 = doc.createElement("bar"); e2.appendChild(c2); d = new DOMDifferenceEngine(); Modified: trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs =================================================================== --- trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs 2010-08-13 13:10:16 UTC (rev 425) +++ trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs 2010-08-18 14:06:06 UTC (rev 426) @@ -482,6 +482,14 @@ Assert.AreEqual(ComparisonResult.CRITICAL, d.CompareNodes(e1, e2)); Assert.AreEqual(1, ex.invoked); + // symmetric? + d = new DOMDifferenceEngine(); + ex = new DiffExpecter(ComparisonType.CHILD_LOOKUP); + d.DifferenceListener += ex.ComparisonPerformed; + d.DifferenceEvaluator = ev; + Assert.AreEqual(ComparisonResult.CRITICAL, d.CompareNodes(e2, e1)); + Assert.AreEqual(1, ex.invoked); + XmlElement c2 = doc.CreateElement("bar"); e2.AppendChild(c2); d = new DOMDifferenceEngine(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |