From: <bo...@us...> - 2010-07-06 15:01:34
|
Revision: 412 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=412&view=rev Author: bodewig Date: 2010-07-06 15:01:27 +0000 (Tue, 06 Jul 2010) Log Message: ----------- port DocumentType comparisons and parts of Document comparisons Modified Paths: -------------- trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml trunk/xmlunit/src/main/net-core/diff/DifferenceEvaluators.cs trunk/xmlunit/src/main/net-core/util/Convert.cs trunk/xmlunit/src/tests/net-core/TestResources.cs trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs Modified: trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs =================================================================== --- trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/main/net-core/diff/ComparisonType.cs 2010-07-06 15:01:27 UTC (rev 412) @@ -19,6 +19,20 @@ /// </summary> public enum ComparisonType { /// <summary> + /// Do both documents specify the same version in their XML declaration? + /// </summary> + XML_VERSION, + /// <summary> + /// Do both documents specify the same standalone declaration + /// in their XML declaration? + /// </summary> + XML_STANDALONE, + /// <summary> + /// Do both documents specify the same encoding in their XML + /// declaration? + /// </summary> + XML_ENCODING, + /// <summary> /// Do both documents have a DOCTYPE (or neither of each)? /// </summary> HAS_DOCTYPE_DECLARATION, Modified: trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml =================================================================== --- trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/main/net-core/diff/DOMDifferenceEngine.xml 2010-07-06 15:01:27 UTC (rev 412) @@ -78,12 +78,10 @@ } break; case XmlNodeType.Document: -#if false - if (test instanceof Document) { - return compareDocuments((Document) control, - (Document) test); + if (test is XmlDocument) { + return CompareDocuments((XmlDocument) control, + (XmlDocument) test); } -#endif break; case XmlNodeType.Element: #if false @@ -100,6 +98,12 @@ (XmlProcessingInstruction) test); } break; + case XmlNodeType.DocumentType: + if (test is XmlDocumentType) { + return CompareDocTypes((XmlDocumentType) control, + (XmlDocumentType) test); + } + break; } return ComparisonResult.EQUAL; } @@ -114,6 +118,48 @@ test, null, test.Data)); } + private ComparisonResult CompareDocuments(XmlDocument control, + XmlDocument test) { + XmlDocumentType controlDt = control.DocumentType; + XmlDocumentType testDt = test.DocumentType; +]]></literal> + <lastResultDef/> + <compareExpr type="HAS_DOCTYPE_DECLARATION" + controlExpr="controlDt != null" + testExpr="testDt != null"/> + <literal><![CDATA[ + if (controlDt != null && testDt != null) { +]]></literal> + <compareMethodExpr method="NodeTypeSpecificComparison" + controlExpr="controlDt" + testExpr="testDt"/> + <literal><![CDATA[ + } +]]></literal> +<!-- + <compare type="XML_VERSION" property="getXmlVersion()"/> + <compare type="XML_STANDALONE" property="getXmlStandalone()"/> + <literal><![CDATA[ + return Compare(new Comparison(ComparisonType.XML_ENCODING, + control, null, control.getXmlEncoding(), + test, null, test.getXmlEncoding())); +--> + <literal><![CDATA[ + return lastResult; + } + + private ComparisonResult CompareDocTypes(XmlDocumentType control, + XmlDocumentType test) { +]]></literal> + <lastResultDef/> + <compare type="DOCTYPE_NAME" property="Name"/> + <compare type="DOCTYPE_PUBLIC_ID" property="PublicId"/> + <literal><![CDATA[ + return Compare(new Comparison(ComparisonType.DOCTYPE_SYSTEM_ID, + control, null, control.SystemId, + test, null, test.SystemId)); + } + private ComparisonResult CompareProcessingInstructions(XmlProcessingInstruction control, XmlProcessingInstruction test) { Modified: trunk/xmlunit/src/main/net-core/diff/DifferenceEvaluators.cs =================================================================== --- trunk/xmlunit/src/main/net-core/diff/DifferenceEvaluators.cs 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/main/net-core/diff/DifferenceEvaluators.cs 2010-07-06 15:01:27 UTC (rev 412) @@ -43,6 +43,7 @@ outcome = ComparisonResult.SIMILAR; } break; + case ComparisonType.XML_ENCODING: case ComparisonType.HAS_DOCTYPE_DECLARATION: case ComparisonType.DOCTYPE_SYSTEM_ID: case ComparisonType.SCHEMA_LOCATION: Modified: trunk/xmlunit/src/main/net-core/util/Convert.cs =================================================================== --- trunk/xmlunit/src/main/net-core/util/Convert.cs 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/main/net-core/util/Convert.cs 2010-07-06 15:01:27 UTC (rev 412) @@ -27,6 +27,13 @@ /// Creates a DOM Document from an ISource. /// </summary> public static XmlDocument ToDocument(ISource s) { + return ToDocument(s, true); + } + + /// <summary> + /// Creates a DOM Document from an ISource. + /// </summary> + public static XmlDocument ToDocument(ISource s, bool prohibitDTD) { DOMSource ds = s as DOMSource; if (ds != null) { XmlDocument doc = ds.Node as XmlDocument; @@ -35,7 +42,9 @@ } } XmlDocument d = new XmlDocument(); - d.Load(s.Reader); + XmlReaderSettings sett = new XmlReaderSettings(); + sett.ProhibitDtd = prohibitDTD; + d.Load(XmlReader.Create(s.Reader, sett)); return d; } Modified: trunk/xmlunit/src/tests/net-core/TestResources.cs =================================================================== --- trunk/xmlunit/src/tests/net-core/TestResources.cs 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/tests/net-core/TestResources.cs 2010-07-06 15:01:27 UTC (rev 412) @@ -20,6 +20,9 @@ public const string ANIMAL_XSL = "../../../src/tests/resources/animal.xsl"; public const string DOG_FILE = "../../../src/tests/resources/testAnimal.xml"; + public const string BOOK_DTD = "../../../src/tests/resources/Book.dtd"; + public const string TEST_DTD = "../../../src/tests/resources/test.dtd"; + private TestResources() { } } } Modified: trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs =================================================================== --- trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs 2010-07-06 15:00:37 UTC (rev 411) +++ trunk/xmlunit/src/tests/net-core/diff/DOMDifferenceEngineTest.cs 2010-07-06 15:01:27 UTC (rev 412) @@ -14,6 +14,7 @@ using System; using System.Xml; using NUnit.Framework; +using net.sf.xmlunit.builder; namespace net.sf.xmlunit.diff { @@ -265,5 +266,204 @@ Assert.AreEqual(1, invocations); } + [Test] + public void CompareDocuments() { + DOMDifferenceEngine d = new DOMDifferenceEngine(); + int invocations = 0; + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.HAS_DOCTYPE_DECLARATION, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = delegate(Comparison comparison, + ComparisonResult outcome) { + if (comparison.Type == ComparisonType.HAS_DOCTYPE_DECLARATION) { + Assert.AreEqual(ComparisonResult.DIFFERENT, outcome); + return ComparisonResult.CRITICAL; + } + Assert.AreEqual(ComparisonResult.EQUAL, outcome); + return ComparisonResult.EQUAL; + }; + + XmlDocument d1, d2; + +#if false // ProhibitDtd needs to be handled at a lower level + d1 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<Book/>").Build()); + d2 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<!DOCTYPE Book PUBLIC " + + "\"XMLUNIT/TEST/PUB\" " + + "\"" + TestResources.BOOK_DTD + + "\">" + + "<Book/>") + .Build()); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(d1, d2)); + Assert.AreEqual(1, invocations); +#endif + +#if false // need a way to figure out the XML_* differences + + // .NET doesn't like XML 1.1 anyway + invocations = 0; + d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.XML_VERSION, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = + DifferenceEvaluators.DefaultStopWhenDifferent; + + d1 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.0\"" + + " encoding=\"UTF-8\"?>" + + "<Book/>").Build()); + d2 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.1\"" + + " encoding=\"UTF-8\"?>" + + "<Book/>").Build()); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(d1, d2)); + Assert.AreEqual(1, invocations); +#endif + +#if false // need a way to figure out the XML_* differences + invocations = 0; + d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.XML_STANDALONE, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = + DifferenceEvaluators.DefaultStopWhenDifferent; + + d1 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.0\"" + + " standalone=\"yes\"?>" + + "<Book/>").Build()); + d2 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.0\"" + + " standalone=\"no\"?>" + + "<Book/>").Build()); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(d1, d2)); + Assert.AreEqual(1, invocations); +#endif + +#if false // need a way to figure out the XML_* differences + invocations = 0; + d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.XML_ENCODING, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = delegate(Comparison comparison, + ComparisonResult outcome) { + if (comparison.Type == ComparisonType.XML_ENCODING) { + Assert.AreEqual(ComparisonResult.DIFFERENT, outcome); + return ComparisonResult.CRITICAL; + } + Assert.AreEqual(ComparisonResult.EQUAL, outcome); + return ComparisonResult.EQUAL; + }; + + d1 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.0\"" + + " encoding=\"UTF-8\"?>" + + "<Book/>").Build()); + d2 = net.sf.xmlunit.util.Convert + .ToDocument(Input.FromMemory("<?xml version=\"1.0\"" + + " encoding=\"UTF-16\"?>" + + "<Book/>").Build()); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(d1, d2)); + Assert.AreEqual(1, invocations); +#endif + } + + [Test] + public void CompareDocTypes() { + int invocations = 0; + DOMDifferenceEngine d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.DOCTYPE_NAME, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = + DifferenceEvaluators.DefaultStopWhenDifferent; + + XmlDocumentType dt1 = doc.CreateDocumentType("name", "pub", + TestResources.BOOK_DTD, + null); + XmlDocumentType dt2 = doc.CreateDocumentType("name2", "pub", + TestResources.BOOK_DTD, + null); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(dt1, dt2)); + Assert.AreEqual(1, invocations); + + invocations = 0; + d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.DOCTYPE_PUBLIC_ID, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = + DifferenceEvaluators.DefaultStopWhenDifferent; + dt2 = doc.CreateDocumentType("name", "pub2", + TestResources.BOOK_DTD, null); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(dt1, dt2)); + Assert.AreEqual(1, invocations); + + invocations = 0; + d = new DOMDifferenceEngine(); + d.DifferenceListener += delegate(Comparison comp, + ComparisonResult r) { + Assert.AreEqual(0, invocations); + invocations++; + Assert.AreEqual(ComparisonType.DOCTYPE_SYSTEM_ID, + comp.Type); + Assert.AreEqual(ComparisonResult.CRITICAL, r); + }; + d.DifferenceEvaluator = delegate(Comparison comparison, + ComparisonResult outcome) { + if (comparison.Type == ComparisonType.DOCTYPE_SYSTEM_ID) { + Assert.AreEqual(ComparisonResult.DIFFERENT, outcome); + return ComparisonResult.CRITICAL; + } + Assert.AreEqual(ComparisonResult.EQUAL, outcome); + return ComparisonResult.EQUAL; + }; + dt2 = doc.CreateDocumentType("name", "pub", + TestResources.TEST_DTD, null); + Assert.AreEqual(ComparisonResult.CRITICAL, + d.NodeTypeSpecificComparison(dt1, dt2)); + Assert.AreEqual(1, invocations); + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |