From: <bo...@us...> - 2010-06-24 15:31:31
|
Revision: 405 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=405&view=rev Author: bodewig Date: 2010-06-24 15:31:25 +0000 (Thu, 24 Jun 2010) Log Message: ----------- comparisons for texts, PIs and Document Nodes (the latter lacking tests for now) Modified Paths: -------------- trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/ComparisonType.java trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java Modified: trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/ComparisonType.java =================================================================== --- trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/ComparisonType.java 2010-06-21 14:37:51 UTC (rev 404) +++ trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/ComparisonType.java 2010-06-24 15:31:25 UTC (rev 405) @@ -18,6 +18,19 @@ */ public enum ComparisonType { /** + * Do both documents specify the same version in their XML declaration? + */ + XML_VERSION, + /** + * Do both documents specify the same standalone declaration in + * their XML declaration? + */ + XML_STANDALONE, + /** + * Do both documents specify the same encoding in their XML declaration? + */ + XML_ENCODING, + /** * Do both documents have a DOCTYPE (or neither of each)? */ HAS_DOCTYPE_DECLARATION, @@ -62,17 +75,10 @@ NAMESPACE_URI, /** - * Compare content of CDATA sections. + * Compare content of text nodes, comments and CDATA sections. */ - CDATA_VALUE, - /** - * Compare content of comments. - */ - COMMENT_VALUE, - /** - * Compare content of text nodes. - */ TEXT_VALUE, + /** * Compare targets of processing instructions. */ Modified: trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java =================================================================== --- trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java 2010-06-21 14:37:51 UTC (rev 404) +++ trunk/xmlunit/src/main/java-core/net/sf/xmlunit/diff/DOMDifferenceEngine.java 2010-06-24 15:31:25 UTC (rev 405) @@ -13,11 +13,15 @@ */ package net.sf.xmlunit.diff; +import javax.xml.transform.Source; import net.sf.xmlunit.util.Convert; -import javax.xml.transform.Source; +import org.w3c.dom.CharacterData; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.w3c.dom.Document; +import org.w3c.dom.ProcessingInstruction; /** * Difference engine based on DOM. @@ -90,22 +94,22 @@ ComparisonResult compareNodes(Node control, Node test) { ComparisonResult lastResult = compare(new Comparison(ComparisonType.NODE_TYPE, control, - null, control.getNodeType(), - test, null, test.getNodeType())); + null, control.getNodeType(), + test, null, test.getNodeType())); if (lastResult == ComparisonResult.CRITICAL) { return lastResult; } lastResult = compare(new Comparison(ComparisonType.NAMESPACE_URI, control, - null, control.getNamespaceURI(), - test, null, test.getNamespaceURI())); + null, control.getNamespaceURI(), + test, null, test.getNamespaceURI())); if (lastResult == ComparisonResult.CRITICAL) { return lastResult; } lastResult = compare(new Comparison(ComparisonType.NAMESPACE_PREFIX, control, - null, control.getPrefix(), - test, null, test.getPrefix())); + null, control.getPrefix(), + test, null, test.getPrefix())); if (lastResult == ComparisonResult.CRITICAL) { return lastResult; } @@ -113,15 +117,143 @@ NodeList testChildren = test.getChildNodes(); lastResult = compare(new Comparison(ComparisonType.CHILD_NODELIST_LENGTH, - control, null, controlChildren.getLength(), - test, null, testChildren.getLength())); + control, null, controlChildren.getLength(), + test, null, testChildren.getLength())); if (lastResult == ComparisonResult.CRITICAL) { return lastResult; } - /* TODO node type specific stuff */ + lastResult = nodeTypeSpecificComparison(control, test); + if (lastResult == ComparisonResult.CRITICAL) { + return lastResult; + } return compareNodeLists(controlChildren, testChildren); } + /** + * Dispatches to the node type specific comparison if one is + * defined for the given combination of nodes. + * + * <p>package private to support tests.</p> + */ + ComparisonResult nodeTypeSpecificComparison(Node control, Node test) { + switch (control.getNodeType()) { + case Node.CDATA_SECTION_NODE: + case Node.COMMENT_NODE: + case Node.TEXT_NODE: + if (test instanceof CharacterData) { + return compareCharacterData((CharacterData) control, + (CharacterData) test); + } + break; + case Node.DOCUMENT_NODE: + if (test instanceof Document) { + return compareDocuments((Document) control, + (Document) test); + } + break; + case Node.ELEMENT_NODE: + if (test instanceof Element) { + return compareElements((Element) control, + (Element) test); + } + break; + case Node.PROCESSING_INSTRUCTION_NODE: + if (test instanceof ProcessingInstruction) { + return + compareProcessingInstructions((ProcessingInstruction) control, + (ProcessingInstruction) test); + } + break; + } + return ComparisonResult.EQUAL; + } + + /** + * Compares textual content. + */ + private ComparisonResult compareCharacterData(CharacterData control, + CharacterData test) { + return compare(new Comparison(ComparisonType.TEXT_VALUE, control, + null, control.getData(), + test, null, test.getData())); + } + + ComparisonResult compareDocuments(Document control, + Document test) { + DocumentType controlDt = control.getDoctype(); + DocumentType testDt = test.getDoctype(); + ComparisonResult r = + compare(new Comparison(ComparisonType.HAS_DOCTYPE_DECLARATION, + control, null, + Boolean.valueOf(controlDt != null), + test, null, + Boolean.valueOf(testDt != null))); + if (r == ComparisonResult.CRITICAL) { + return r; + } + if (controlDt != null && testDt != null) { + r = compareDocTypes(controlDt, testDt); + } + if (r == ComparisonResult.CRITICAL) { + return r; + } + r = compare(new Comparison(ComparisonType.XML_VERSION, + control, null, control.getXmlVersion(), + test, null, test.getXmlVersion())); + if (r == ComparisonResult.CRITICAL) { + return r; + } + r = compare(new Comparison(ComparisonType.XML_STANDALONE, + control, null, control.getXmlStandalone(), + test, null, test.getXmlStandalone())); + if (r == ComparisonResult.CRITICAL) { + return r; + } + return compare(new Comparison(ComparisonType.XML_ENCODING, + control, null, control.getXmlEncoding(), + test, null, test.getXmlEncoding())); + } + + ComparisonResult compareDocTypes(DocumentType control, + DocumentType test) { + ComparisonResult r = + compare(new Comparison(ComparisonType.DOCTYPE_NAME, + control, null, control.getName(), + test, null, test.getName())); + if (r == ComparisonResult.CRITICAL) { + return r; + } + r = compare(new Comparison(ComparisonType.DOCTYPE_PUBLIC_ID, + control, null, control.getPublicId(), + test, null, test.getPublicId())); + if (r == ComparisonResult.CRITICAL) { + return r; + } + return compare(new Comparison(ComparisonType.DOCTYPE_SYSTEM_ID, + control, null, control.getSystemId(), + test, null, test.getSystemId())); + } + + ComparisonResult compareElements(Element control, + Element test) { + return ComparisonResult.EQUAL; + } + + ComparisonResult + compareProcessingInstructions(ProcessingInstruction control, + ProcessingInstruction test) { + ComparisonResult r = + compare(new Comparison(ComparisonType.PROCESSING_INSTRUCTION_TARGET, + control, null, control.getTarget(), + test, null, test.getTarget())); + if (r == ComparisonResult.CRITICAL) { + return r; + } + return compare(new Comparison(ComparisonType.PROCESSING_INSTRUCTION_DATA, + control, null, control.getData(), + test, null, test.getData())); + } + ComparisonResult compareNodeLists(NodeList control, NodeList test) { return ComparisonResult.EQUAL; } Modified: trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs =================================================================== --- trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs 2010-06-21 14:37:51 UTC (rev 404) +++ trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs 2010-06-24 15:31:25 UTC (rev 405) @@ -63,17 +63,10 @@ NAMESPACE_URI, /// <summary> - /// Compare content of CDATA sections. + /// Compare content of text nodes, comments, CDATA sections. /// </summary> - CDATA_VALUE, - /// <summary> - /// Compare content of comments. - /// </summary> - COMMENT_VALUE, - /// <summary> - /// Compare content of text nodes. - /// </summary> TEXT_VALUE, + /// <summary> /// Compare targets of processing instructions. /// </summary> @@ -99,6 +92,7 @@ /// Compare attribute's value. /// </summary> ATTR_VALUE, + /// <summary> /// Compare number of child nodes. /// </summary> 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-06-21 14:37:51 UTC (rev 404) +++ trunk/xmlunit/src/tests/java-core/net/sf/xmlunit/diff/DOMDifferenceEngineTest.java 2010-06-24 15:31:25 UTC (rev 405) @@ -17,8 +17,12 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Before; import org.junit.Test; +import org.w3c.dom.CDATASection; +import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.ProcessingInstruction; +import org.w3c.dom.Text; import static org.junit.Assert.*; public class DOMDifferenceEngineTest { @@ -218,4 +222,88 @@ assertEquals(2, ex.invoked); } + @Test public void compareCharacterData() { + DOMDifferenceEngine d = new DOMDifferenceEngine(); + DiffExpecter ex = new DiffExpecter(ComparisonType.TEXT_VALUE, 9); + d.addDifferenceListener(ex); + d.setDifferenceEvaluator(DifferenceEvaluators.DefaultStopWhenDifferent); + + Comment fooComment = doc.createComment("foo"); + Comment barComment = doc.createComment("bar"); + Text fooText = doc.createTextNode("foo"); + Text barText = doc.createTextNode("bar"); + CDATASection fooCDATASection = doc.createCDATASection("foo"); + CDATASection barCDATASection = doc.createCDATASection("bar"); + + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooComment, fooComment)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooComment, barComment)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooText, fooText)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooText, barText)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooCDATASection, fooCDATASection)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooCDATASection, barCDATASection)); + + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooComment, fooText)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooComment, barText)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooComment, fooCDATASection)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooComment, barCDATASection)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooText, fooComment)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooText, barComment)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooText, fooCDATASection)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooText, barCDATASection)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooCDATASection, fooText)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooCDATASection, barText)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooCDATASection, fooComment)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(fooCDATASection, barComment)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(fooText, + doc.createElement("bar"))); + assertEquals(9, ex.invoked); + } + + @Test public void compareProcessingInstructions() { + DOMDifferenceEngine d = new DOMDifferenceEngine(); + DiffExpecter ex = new DiffExpecter(ComparisonType.PROCESSING_INSTRUCTION_TARGET); + d.addDifferenceListener(ex); + d.setDifferenceEvaluator(DifferenceEvaluators.DefaultStopWhenDifferent); + + ProcessingInstruction foo1 = doc.createProcessingInstruction("foo", "1"); + ProcessingInstruction bar1 = doc.createProcessingInstruction("bar", "1"); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(foo1, foo1)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(foo1, bar1)); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(foo1, + doc.createElement("bar"))); + assertEquals(1, ex.invoked); + + d = new DOMDifferenceEngine(); + ex = new DiffExpecter(ComparisonType.PROCESSING_INSTRUCTION_DATA); + d.addDifferenceListener(ex); + d.setDifferenceEvaluator(DifferenceEvaluators.DefaultStopWhenDifferent); + ProcessingInstruction foo2 = doc.createProcessingInstruction("foo", "2"); + assertEquals(ComparisonResult.EQUAL, + d.nodeTypeSpecificComparison(foo1, foo1)); + assertEquals(ComparisonResult.CRITICAL, + d.nodeTypeSpecificComparison(foo1, foo2)); + assertEquals(1, ex.invoked); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |