From: <bo...@us...> - 2010-09-14 10:10:37
|
Revision: 476 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=476&view=rev Author: bodewig Date: 2010-09-14 10:10:30 +0000 (Tue, 14 Sep 2010) Log Message: ----------- enable NewDifferenceEngine even for compareUnmatched = true Modified Paths: -------------- trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/Diff.java trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/NewDifferenceEngine.java trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/XMLUnit.java trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_DetailedDiff.java trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_NewDifferenceEngine.java Modified: trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/Diff.java =================================================================== --- trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/Diff.java 2010-09-14 07:28:50 UTC (rev 475) +++ trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/Diff.java 2010-09-14 10:10:30 UTC (rev 476) @@ -421,15 +421,14 @@ private DifferenceEngineContract getDifferenceEngine() { if (differenceEngine == null) { if ( - !XMLUnit.getExplicitCompareUnmatched() - && XMLUnit.getIgnoreAttributeOrder() && !XMLUnit.getNormalizeWhitespace() && differenceListenerDelegate == null && - !usesUnknownElementQualifier() + (!usesUnknownElementQualifier() + || XMLUnit.getCompareUnmatched()) ) { return new NewDifferenceEngine(this, matchTrackerDelegate); } Modified: trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/NewDifferenceEngine.java =================================================================== --- trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/NewDifferenceEngine.java 2010-09-14 07:28:50 UTC (rev 475) +++ trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/NewDifferenceEngine.java 2010-09-14 10:10:30 UTC (rev 476) @@ -36,6 +36,10 @@ package org.custommonkey.xmlunit; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; import javax.xml.namespace.QName; import javax.xml.transform.Source; @@ -48,8 +52,10 @@ import net.sf.xmlunit.diff.DefaultNodeMatcher; import net.sf.xmlunit.diff.DifferenceEvaluators; import net.sf.xmlunit.diff.ElementSelector; +import net.sf.xmlunit.diff.NodeMatcher; import net.sf.xmlunit.input.CommentLessSource; import net.sf.xmlunit.input.WhitespaceStrippedSource; +import net.sf.xmlunit.util.Linqy; import org.w3c.dom.CDATASection; import org.w3c.dom.Comment; @@ -170,9 +176,15 @@ } }); + NodeMatcher m = new DefaultNodeMatcher(); if (elementQualifier != null) { - engine.setNodeMatcher(new DefaultNodeMatcher(new ElementQualifier2ElementSelector(elementQualifier))); + m = new DefaultNodeMatcher(new ElementQualifier2ElementSelector(elementQualifier)); } + if (!XMLUnit.getCompareUnmatched()) { + engine.setNodeMatcher(m); + } else { + engine.setNodeMatcher(new CompareUnmatchedNodeMatcher(m)); + } Input.Builder ctrlBuilder = Input.fromNode(control); Input.Builder tstBuilder = Input.fromNode(test); @@ -513,4 +525,60 @@ } } + private static class CompareUnmatchedNodeMatcher + implements NodeMatcher { + private final NodeMatcher nestedMatcher; + private CompareUnmatchedNodeMatcher(NodeMatcher nested) { + nestedMatcher = nested; + } + + public Iterable<Map.Entry<Node, Node>> + match(Iterable<Node> controlNodes, + Iterable<Node> testNodes) { + final Map<Node, Node> map = new HashMap<Node, Node>(); + for (Map.Entry<Node, Node> e + : nestedMatcher.match(controlNodes, testNodes)) { + map.put(e.getKey(), e.getValue()); + } + + final LinkedList<Map.Entry<Node, Node>> result = + new LinkedList<Map.Entry<Node, Node>>(); + + for (Node n : controlNodes) { + if (map.containsKey(n)) { + result.add(new Entry(n, map.get(n))); + } else if (n instanceof Element) { + Iterable<Node> unmatchedTestElements = + Linqy.filter(testNodes, new Linqy.Predicate<Node>() { + public boolean matches(Node t) { + return t instanceof Element + && !map.containsValue(t); + } + }); + Iterator<Node> it = unmatchedTestElements.iterator(); + if (it.hasNext()) { + Node t = it.next(); + map.put(n, t); + result.add(new Entry(n, t)); + } + } + } + return result; + } + + private static class Entry implements Map.Entry<Node, Node> { + private final Node key; + private final Node value; + private Entry(Node k, Node v) { + key = k; + value = v; + } + public Node getKey() { return key; } + public Node getValue() { return value; } + public Node setValue(Node v) { + throw new UnsupportedOperationException(); + } + } + } + } Modified: trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/XMLUnit.java 2010-09-14 07:28:50 UTC (rev 475) +++ trunk/xmlunit/src/main/java-legacy/org/custommonkey/xmlunit/XMLUnit.java 2010-09-14 10:10:30 UTC (rev 476) @@ -83,7 +83,7 @@ private static String xsltVersion = "1.0"; private static String xpathFactoryName = null; private static boolean expandEntities = false; - private static Boolean compareUnmatched = null; + private static boolean compareUnmatched = true; private static final String XSLT_VERSION_START = " version=\""; private static final String XSLT_VERSION_END = "\">"; @@ -887,37 +887,18 @@ * <p>Defaults to true.</p> */ public static void setCompareUnmatched(boolean b) { - compareUnmatched = Boolean.valueOf(b); + compareUnmatched = b; } /** - * Reset whether to compare unmatched control nodes to unmatched - * test nodes to its default setting. - */ - static void clearCompareUnmatched() { - compareUnmatched = null; - } - - /** * Whether unmatched control nodes should be compared to unmatched * test nodes. * * @return true by default */ public static boolean getCompareUnmatched() { - return compareUnmatched != null - ? compareUnmatched.booleanValue() : true; + return compareUnmatched; } - /** - * Whether unmatched control nodes should be compared to unmatched - * test nodes. - * - * @return false by default - */ - public static boolean getExplicitCompareUnmatched() { - return compareUnmatched != null - ? compareUnmatched.booleanValue() : false; - } } Modified: trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_DetailedDiff.java =================================================================== --- trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_DetailedDiff.java 2010-09-14 07:28:50 UTC (rev 475) +++ trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_DetailedDiff.java 2010-09-14 10:10:30 UTC (rev 476) @@ -111,38 +111,13 @@ File test, control; control = new File(test_Constants.BASEDIR + "/src/tests/resources/controlDetail.xml"); test = new File(test_Constants.BASEDIR + "/src/tests/resources/testDetail.xml"); - try { - XMLUnit.setCompareUnmatched(true); - DetailedDiff differencesWithWhitespace = new DetailedDiff( - new Diff(new InputSource(new FileReader(control)), - new InputSource(new FileReader(test))) ); - List l = differencesWithWhitespace.getAllDifferences(); - int unmatchedNodes = 0; - for (Iterator iter = l.iterator(); iter.hasNext();) { - Difference d = (Difference) iter.next(); - if (d.getId() == DifferenceConstants.CHILD_NODE_NOT_FOUND_ID) { - unmatchedNodes++; - } - } - - assertEquals(1402 + unmatchedNodes, - differencesWithWhitespace.getAllDifferences().size()); - try { XMLUnit.setIgnoreWhitespace(true); Diff prototype = new Diff(new FileReader(control), new FileReader(test)); DetailedDiff detailedDiff = new DetailedDiff(prototype); List differences = detailedDiff.getAllDifferences(); - unmatchedNodes = 0; - for (Iterator iter = differences.iterator(); iter.hasNext();) { - Difference d = (Difference) iter.next(); - if (d.getId() == DifferenceConstants.CHILD_NODE_NOT_FOUND_ID) { - unmatchedNodes++; - } - } - assertEquals(40 + unmatchedNodes, differences.size()); SimpleXpathEngine xpathEngine = new SimpleXpathEngine(); Document controlDoc = @@ -187,10 +162,6 @@ } finally { XMLUnit.setIgnoreWhitespace(false); } - } finally { - XMLUnit.clearCompareUnmatched(); - } - } public void testSeeAllDifferencesEvenIfDiffWouldSayHaltComparison() throws Exception { @@ -276,8 +247,8 @@ DetailedDiff dd = new DetailedDiff(diff); List l = dd.getAllDifferences(); assertEquals(3, l.size()); - // (0) number of children, (1) node not found, (2) order different - Difference d = (Difference) l.get(1); + // (0) number of children, (1) order different, (2) node not found + Difference d = (Difference) l.get(2); assertEquals(DifferenceConstants.CHILD_NODE_NOT_FOUND_ID, d.getId()); assertEquals("/books[1]/book[1]", @@ -332,26 +303,21 @@ * https://sourceforge.net/tracker/?func=detail&aid=2758280&group_id=23187&atid=377768 */ public void testCompareUnmatched() throws Exception { - try { - XMLUnit.setCompareUnmatched(true); - String control = "<root><a>1</a>" - + "<b>1</b>" - + "<c>1</c>" - + "<d>1</d>" - + "<e>1</e></root>"; - String test = "<root><a>1</a>" - + "<b>1</b>" - + "<z>1</z>" - + "<d>1</d>" - + "<e>1</e></root>"; - DetailedDiff d = (DetailedDiff) buildDiff(control, test); - List l = d.getAllDifferences(); - assertEquals(1, l.size()); - Difference diff = (Difference) l.get(0); - assertEquals(DifferenceConstants.ELEMENT_TAG_NAME_ID, diff.getId()); - } finally { - XMLUnit.clearCompareUnmatched(); - } + String control = "<root><a>1</a>" + + "<b>1</b>" + + "<c>1</c>" + + "<d>1</d>" + + "<e>1</e></root>"; + String test = "<root><a>1</a>" + + "<b>1</b>" + + "<z>1</z>" + + "<d>1</d>" + + "<e>1</e></root>"; + DetailedDiff d = (DetailedDiff) buildDiff(control, test); + List l = d.getAllDifferences(); + assertEquals(1, l.size()); + Difference diff = (Difference) l.get(0); + assertEquals(DifferenceConstants.ELEMENT_TAG_NAME_ID, diff.getId()); } /** @@ -384,7 +350,7 @@ assertNull(diff.getControlNodeDetail().getNode()); assertNotNull(diff.getTestNodeDetail().getNode()); } finally { - XMLUnit.clearCompareUnmatched(); + XMLUnit.setCompareUnmatched(true); } } @@ -449,7 +415,7 @@ diff.getTestNodeDetail().getXpathLocation()); } finally { - XMLUnit.clearCompareUnmatched(); + XMLUnit.setCompareUnmatched(true); } } } Modified: trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_NewDifferenceEngine.java =================================================================== --- trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_NewDifferenceEngine.java 2010-09-14 07:28:50 UTC (rev 475) +++ trunk/xmlunit/src/tests/java-legacy/org/custommonkey/xmlunit/test_NewDifferenceEngine.java 2010-09-14 10:10:30 UTC (rev 476) @@ -241,14 +241,13 @@ String control = "<stuff><thing id=\"1\"/><item id=\"2\"/></stuff>"; String test = "<stuff><item id=\"2\"/><item id=\"1\"/></stuff>"; listenToDifferences(control, test); - // DifferenceEngine matches test node //item[2] with control - // node //item[1] and then generates a difference of attribute - // vales by default. - // NewDifferenceEngine has a "no match" for test node - // //item[2] as last comparison - assertNull("14th control xpath", listener.controlXpath); - assertEquals("14th test xpath", "/stuff[1]/item[2]", - listener.testXpath); + assertEquals("14th difference type", + NewDifferenceEngine.CHILD_NODELIST_SEQUENCE_ID, + listener.comparingWhat); + assertEquals("14th control xpath", "/stuff[1]/item[1]", + listener.controlXpath); + assertEquals("14th test xpath", "/stuff[1]/item[1]", + listener.testXpath); } public void testIssue1027863() throws Exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |