You can subscribe to this list here.
2007 |
Jan
|
Feb
(3) |
Mar
(18) |
Apr
(39) |
May
(15) |
Jun
(12) |
Jul
(3) |
Aug
(23) |
Sep
|
Oct
(1) |
Nov
(1) |
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(21) |
Feb
(23) |
Mar
(33) |
Apr
(8) |
May
(1) |
Jun
(22) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
(6) |
Nov
|
Dec
(11) |
2009 |
Jan
(5) |
Feb
|
Mar
(2) |
Apr
(24) |
May
(36) |
Jun
(18) |
Jul
(2) |
Aug
(3) |
Sep
(9) |
Oct
(3) |
Nov
(1) |
Dec
|
2010 |
Jan
(5) |
Feb
(3) |
Mar
|
Apr
(15) |
May
(24) |
Jun
(11) |
Jul
(8) |
Aug
(34) |
Sep
(42) |
Oct
|
Nov
|
Dec
|
2011 |
Jan
(13) |
Feb
(32) |
Mar
(35) |
Apr
(31) |
May
(33) |
Jun
(30) |
Jul
(32) |
Aug
(31) |
Sep
(30) |
Oct
(31) |
Nov
(32) |
Dec
(31) |
2012 |
Jan
(35) |
Feb
(31) |
Mar
(31) |
Apr
(30) |
May
(31) |
Jun
(34) |
Jul
(23) |
Aug
(30) |
Sep
(30) |
Oct
(29) |
Nov
(30) |
Dec
(32) |
2013 |
Jan
(25) |
Feb
(39) |
Mar
(1) |
Apr
(18) |
May
(1) |
Jun
|
Jul
(1) |
Aug
(20) |
Sep
(41) |
Oct
(32) |
Nov
(9) |
Dec
(31) |
2014 |
Jan
(31) |
Feb
(30) |
Mar
(34) |
Apr
(60) |
May
(31) |
Jun
(28) |
Jul
(32) |
Aug
(28) |
Sep
(26) |
Oct
(32) |
Nov
(43) |
Dec
(115) |
2015 |
Jan
(106) |
Feb
(101) |
Mar
(51) |
Apr
(32) |
May
(63) |
Jun
(18) |
Jul
|
Aug
(18) |
Sep
|
Oct
(1) |
Nov
(84) |
Dec
(63) |
2016 |
Jan
(26) |
Feb
(17) |
Mar
(104) |
Apr
(30) |
May
(6) |
Jun
(30) |
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
(48) |
Dec
(22) |
2017 |
Jan
(15) |
Feb
(29) |
Mar
(43) |
Apr
(29) |
May
(25) |
Jun
(28) |
Jul
(62) |
Aug
(35) |
Sep
(35) |
Oct
(72) |
Nov
(10) |
Dec
(4) |
2018 |
Jan
(7) |
Feb
(4) |
Mar
|
Apr
(46) |
May
(20) |
Jun
(12) |
Jul
(9) |
Aug
(42) |
Sep
(4) |
Oct
(17) |
Nov
(32) |
Dec
(31) |
2019 |
Jan
(21) |
Feb
(14) |
Mar
|
Apr
(74) |
May
(25) |
Jun
(43) |
Jul
(2) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
|
Dec
(10) |
2020 |
Jan
(1) |
Feb
|
Mar
(26) |
Apr
(8) |
May
(62) |
Jun
(4) |
Jul
(25) |
Aug
|
Sep
(21) |
Oct
(24) |
Nov
(26) |
Dec
(9) |
2021 |
Jan
|
Feb
(4) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(1) |
Oct
(11) |
Nov
(1) |
Dec
(12) |
2022 |
Jan
(47) |
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(14) |
2023 |
Jan
(3) |
Feb
|
Mar
(60) |
Apr
(9) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2024 |
Jan
(5) |
Feb
|
Mar
|
Apr
(10) |
May
(1) |
Jun
|
Jul
|
Aug
(17) |
Sep
(2) |
Oct
|
Nov
|
Dec
(1) |
2025 |
Jan
|
Feb
|
Mar
(88) |
Apr
(64) |
May
(47) |
Jun
(20) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <bo...@us...> - 2007-05-16 11:25:24
|
Revision: 209 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=209&view=rev Author: bodewig Date: 2007-05-16 04:25:23 -0700 (Wed, 16 May 2007) Log Message: ----------- Treat xsi:schemaLocation and xsi:noNamespaceSchemaLocation in a special way Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/JAXPConstants.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLConstants.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Diff.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java 2007-05-16 11:25:23 UTC (rev 209) @@ -87,6 +87,16 @@ /** Comparing 2 nodes and one holds more childnodes than can be * matched against child nodes of the other. */ int CHILD_NODE_NOT_FOUND_ID = 22; + /** Comparing 2 nodes with different xsi:schemaLocation + * attributes, potentially only one of the two provides such an + * attribute at all. + */ + int SCHEMA_LOCATION_ID = 23; + /** Comparing 2 nodes with different xsi:noNamespaceSchemaLocation + * attributes, potentially only one of the two provides such an + * attribute at all. + */ + int NO_NAMESPACE_SCHEMA_LOCATION_ID = 24; /** Comparing an implied attribute value against an explicit value */ public static final Difference ATTR_VALUE_EXPLICITLY_SPECIFIED = @@ -181,4 +191,20 @@ * matched against child nodes of the other. */ public static final Difference CHILD_NODE_NOT_FOUND = new Difference(CHILD_NODE_NOT_FOUND_ID, "presence of child node"); + + /** Comparing 2 nodes with different xsi:schemaLocation + * attributes, potentially only one of the two provides such an + * attribute at all. + */ + public static final Difference SCHEMA_LOCATION = + new Difference(SCHEMA_LOCATION_ID, "xsi:schemaLocation attribute", + true); + /** Comparing 2 nodes with different xsi:noNamespaceSchemaLocation + * attributes, potentially only one of the two provides such an + * attribute at all. + */ + public static final Difference NO_NAMESPACE_SCHEMA_LOCATION = + new Difference(NO_NAMESPACE_SCHEMA_LOCATION_ID, + "xsi:noNamespaceSchemaLocation attribute", + true); } \ No newline at end of file Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java 2007-05-16 11:25:23 UTC (rev 209) @@ -453,9 +453,10 @@ control, test, listener, ELEMENT_TAG_NAME); NamedNodeMap controlAttr = control.getAttributes(); - Integer controlNonXmlnsAttrLength = getNonXmlnsAttrLength(controlAttr); + Integer controlNonXmlnsAttrLength = + getNonSpecialAttrLength(controlAttr); NamedNodeMap testAttr = test.getAttributes(); - Integer testNonXmlnsAttrLength = getNonXmlnsAttrLength(testAttr); + Integer testNonXmlnsAttrLength = getNonSpecialAttrLength(testAttr); compare(controlNonXmlnsAttrLength, testNonXmlnsAttrLength, control, test, listener, ELEMENT_NUM_ATTRIBUTES); @@ -463,10 +464,16 @@ listener); } - private Integer getNonXmlnsAttrLength(NamedNodeMap attributes) { + /** + * The number of attributes not related to namespace declarations + * and/or Schema location. + */ + private Integer getNonSpecialAttrLength(NamedNodeMap attributes) { int length = 0, maxLength = attributes.getLength(); for (int i = 0; i < maxLength; ++i) { - if (!isXMLNSAttribute((Attr) attributes.item(i))) { + Attr a = (Attr) attributes.item(i); + if (!isXMLNSAttribute(a) + && !isRecognizedXMLSchemaInstanceAttribute(a)) { ++length; } } @@ -493,8 +500,13 @@ } else { compareTo = (Attr) testAttr.getNamedItem(attrName); } - - if (compareTo != null) { + + if (isRecognizedXMLSchemaInstanceAttribute(nextAttr)) { + compareRecognizedXMLSchemaInstanceAttribute(nextAttr, + compareTo, + listener); + + } else if (compareTo != null) { compareAttribute(nextAttr, compareTo, listener); if (!XMLUnit.getIgnoreAttributeOrder()) { @@ -539,12 +551,54 @@ } /** + * @param attr + * @return true if the attribute is an XML Schema Instance + * namespace attribute XMLUnit treats in a special way. + */ + private boolean isRecognizedXMLSchemaInstanceAttribute(Attr attr) { + return XMLConstants + .W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(attr.getNamespaceURI()) + && (XMLConstants + .W3C_XML_SCHEMA_INSTANCE_SCHEMA_LOCATION_ATTR + .equals(attr.getLocalName()) + || XMLConstants + .W3C_XML_SCHEMA_INSTANCE_NO_NAMESPACE_SCHEMA_LOCATION_ATTR + .equals(attr.getLocalName())); + } + + /** * Compare two attributes * @param control * @param test * @param listener * @throws DifferenceFoundException */ + protected void compareRecognizedXMLSchemaInstanceAttribute(Attr control, + Attr test, + DifferenceListener listener) + throws DifferenceFoundException { + Difference d = + XMLConstants.W3C_XML_SCHEMA_INSTANCE_SCHEMA_LOCATION_ATTR + .equals(control.getLocalName()) + ? SCHEMA_LOCATION : NO_NAMESPACE_SCHEMA_LOCATION; + + controlTracker.visited(control); + if (test != null) { + testTracker.visited(test); + } + + compare(control.getValue(), + test != null ? test.getValue() : "[not specified]", + control, test, listener, d); + } + + /** + * Compare two attributes + * @param control + * @param test + * @param listener + * @throws DifferenceFoundException + */ protected void compareAttribute(Attr control, Attr test, DifferenceListener listener) throws DifferenceFoundException { controlTracker.visited(control); Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/JAXPConstants.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/JAXPConstants.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/JAXPConstants.java 2007-05-16 11:25:23 UTC (rev 209) @@ -1,6 +1,6 @@ /* ****************************************************************** - Copyright (c) 200, Jeff Martin, Tim Bacon + Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLConstants.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLConstants.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLConstants.java 2007-05-16 11:25:23 UTC (rev 209) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007 Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -139,4 +139,22 @@ */ public static final String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema"; + + /** + * http://www.w3.org/2001/XMLSchema-instance + */ + public static final String W3C_XML_SCHEMA_INSTANCE_NS_URI + = "http://www.w3.org/2001/XMLSchema-instance"; + + /** + * "schemaLocation" + */ + public static final String W3C_XML_SCHEMA_INSTANCE_SCHEMA_LOCATION_ATTR + = "schemaLocation"; + + /** + * "noNamespaceSchemaLocation" + */ + String W3C_XML_SCHEMA_INSTANCE_NO_NAMESPACE_SCHEMA_LOCATION_ATTR + = "noNamespaceSchemaLocation"; } Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Diff.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Diff.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Diff.java 2007-05-16 11:25:23 UTC (rev 209) @@ -683,4 +683,27 @@ } } + /** + * inspired by {@link + * http://day-to-day-stuff.blogspot.com/2007/05/comparing-xml-in-junit-test.html + * Erik von Oosten's Weblog }, made us implement special handling + * of schemaLocation. + */ + public void testNamespacePrefixDiff() throws Exception { + String xml1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + + "<Message xmlns=\"http://www.a.nl/a10.xsd\"" + + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + + " xsi:schemaLocation=\"C:/longpath/a10.xsd\"" + + ">" + + "<MessageHeader/>" + + "</Message>"; + String xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + + "<a:Message xmlns:a=\"http://www.a.nl/a10.xsd\">" + + "<a:MessageHeader/>" + + "</a:Message>"; + Diff d = buildDiff(xml1, xml2); + assertFalse(d.toString(), d.identical()); + assertTrue(d.toString(), d.similar()); + } + } Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java 2007-05-12 19:54:41 UTC (rev 208) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java 2007-05-16 11:25:23 UTC (rev 209) @@ -780,6 +780,57 @@ assertEquals(expectDifference, listener.different); } + public void testMissingSchemaLocation() throws Exception { + testMissingXSIAttribute(XMLConstants + .W3C_XML_SCHEMA_INSTANCE_SCHEMA_LOCATION_ATTR, + DifferenceConstants.SCHEMA_LOCATION_ID); + } + + public void testMissingNoNamespaceSchemaLocation() throws Exception { + testMissingXSIAttribute(XMLConstants + .W3C_XML_SCHEMA_INSTANCE_NO_NAMESPACE_SCHEMA_LOCATION_ATTR, + DifferenceConstants.NO_NAMESPACE_SCHEMA_LOCATION_ID); + } + + private void testMissingXSIAttribute(String attrName, + int expectedDifference) + throws Exception { + Element control = document.createElement("foo"); + control.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, + attrName, "bar"); + Element test = document.createElement("foo"); + engine.compare(control, test, listener, null); + assertEquals(expectedDifference, listener.comparingWhat); + //resetListener(); + //engine.compare(test, control, listener, null); + //assertEquals(expectedDifference, listener.comparingWhat); + } + + public void testDifferentSchemaLocation() throws Exception { + testDifferentXSIAttribute(XMLConstants + .W3C_XML_SCHEMA_INSTANCE_SCHEMA_LOCATION_ATTR, + DifferenceConstants.SCHEMA_LOCATION_ID); + } + + public void testDifferentNoNamespaceSchemaLocation() throws Exception { + testDifferentXSIAttribute(XMLConstants + .W3C_XML_SCHEMA_INSTANCE_NO_NAMESPACE_SCHEMA_LOCATION_ATTR, + DifferenceConstants.NO_NAMESPACE_SCHEMA_LOCATION_ID); + } + + private void testDifferentXSIAttribute(String attrName, + int expectedDifference) + throws Exception { + Element control = document.createElement("foo"); + control.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, + attrName, "bar"); + Element test = document.createElement("foo"); + test.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, + attrName, "baz"); + engine.compare(control, test, listener, null); + assertEquals(expectedDifference, listener.comparingWhat); + } + private void listenToDifferences(String control, String test) throws SAXException, IOException { Document controlDoc = XMLUnit.buildControlDocument(control); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-05-12 19:54:48
|
Revision: 208 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=208&view=rev Author: bodewig Date: 2007-05-12 12:54:41 -0700 (Sat, 12 May 2007) Log Message: ----------- new signatures Modified Paths: -------------- trunk/xmlunit/KEYS Modified: trunk/xmlunit/KEYS =================================================================== --- trunk/xmlunit/KEYS 2007-05-07 09:32:50 UTC (rev 207) +++ trunk/xmlunit/KEYS 2007-05-12 19:54:41 UTC (rev 208) @@ -23,7 +23,7 @@ sig 0CAA68B4 2004-11-11 Patrick Rentsch <pat...@su...> sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Har...@ha...> sig 5793498F 2005-07-21 Tim Ellison <ti...@el...> -sig E4136392 2005-07-21 [User ID not found] +sig E4136392 2005-07-21 Noel J. Bergman <no...@ap...> sig 8408F755 2005-07-21 Christian Geisert <ch...@ap...> sig 2 FC243F3C 2005-07-20 Henk P. Penning <pe...@cs...> sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> @@ -49,6 +49,19 @@ sig 3 F8EA2967 2005-07-26 [User ID not found] sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +sig CE419C8F 2007-01-05 Upayavira <upa...@od...> +sig E222DE4F 2007-05-02 Mathias Herberts <Mat...@ir...> +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kah...@ap...> +sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rp...@ap...> +sig 3 88817402 2007-05-06 Thomas Vandahl <th...@va...> +sig 5F298824 2007-05-06 Simon Pepping <spe...@le...> +sig 4CEED75F 2007-05-06 Nick Burch <ni...@ga...> +sig 4358C584 2007-05-06 Vincent Hennebert <vhe...@ap...> +sig 0B7E6CFA 2007-05-06 Sami Siren <si...@ap...> +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <lu...@sp...> +sig 40581837 2007-05-08 Nick Kew <ni...@we...> uid Stefan Bodewig <ste...@fr...> sig 3 5F6B8B72 2003-03-07 Stefan Bodewig <bo...@ap...> sig 3 F88341D9 2003-03-17 Lars Eilebrecht <la...@ei...> @@ -84,6 +97,18 @@ sig 3 F8EA2967 2005-07-26 [User ID not found] sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +sig E222DE4F 2007-05-02 Mathias Herberts <Mat...@ir...> +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kah...@ap...> +sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rp...@ap...> +sig 3 88817402 2007-05-06 Thomas Vandahl <th...@va...> +sig 4CEED75F 2007-05-06 Nick Burch <ni...@ga...> +sig 4358C584 2007-05-06 Vincent Hennebert <vhe...@ap...> +sig 0B7E6CFA 2007-05-06 Sami Siren <si...@ap...> +sig 3 DE8884A0 2007-05-07 Xavier Hanin <xav...@gm...> +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <lu...@sp...> +sig 40581837 2007-05-08 Nick Kew <ni...@we...> uid Stefan Bodewig <st...@sa...> sig 3 5F6B8B72 2005-05-31 Stefan Bodewig <bo...@ap...> sig 51898504 2005-06-21 Conor MacNeill <co...@co...> @@ -112,6 +137,17 @@ sig 3 F8EA2967 2005-07-26 [User ID not found] sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +sig E222DE4F 2007-05-02 Mathias Herberts <Mat...@ir...> +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kah...@ap...> +sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rp...@ap...> +sig 3 88817402 2007-05-06 Thomas Vandahl <th...@va...> +sig 4CEED75F 2007-05-06 Nick Burch <ni...@ga...> +sig 4358C584 2007-05-06 Vincent Hennebert <vhe...@ap...> +sig 0B7E6CFA 2007-05-06 Sami Siren <si...@ap...> +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <lu...@sp...> +sig 40581837 2007-05-08 Nick Kew <ni...@we...> sub 1024g/24774157 2001-05-28 sig 5F6B8B72 2001-05-28 Stefan Bodewig <bo...@ap...> @@ -193,196 +229,252 @@ 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 -uWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== -=95C5 +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 +uiwdKSnkFbNcFS3g +=1whY -----END PGP PUBLIC KEY BLOCK----- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-05-07 09:32:50
|
Revision: 207 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=207&view=rev Author: bodewig Date: 2007-05-07 02:32:50 -0700 (Mon, 07 May 2007) Log Message: ----------- better use the result you've just obtained Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/Validator.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/Validator.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/Validator.java 2007-05-01 11:52:08 UTC (rev 206) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/Validator.java 2007-05-07 09:32:50 UTC (rev 207) @@ -464,7 +464,9 @@ throw new XMLUnitRuntimeException("failed to resolve entity: " + publicId, e); } - if (s == null && systemId != null) { + if (s != null) { + return s; + } else if (systemId != null) { return new InputSource(systemId); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-05-01 11:52:09
|
Revision: 206 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=206&view=rev Author: bodewig Date: 2007-05-01 04:52:08 -0700 (Tue, 01 May 2007) Log Message: ----------- Document setXPathFactory in User's Guide Modified Paths: -------------- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml Modified: trunk/xmlunit/src/user-guide/XMLUnit-Java.xml =================================================================== --- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-05-01 11:41:21 UTC (rev 205) +++ trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-05-01 11:52:08 UTC (rev 206) @@ -889,6 +889,11 @@ building DOM <literal>Document</literal>s using the configured parsers.</para> + <para>You can also set the class name for the + <literal>XPathFactory</literal> to use when using JAXP 1.3 by + passing the class name to + <literal>XMLUnit.setXPathFactory</literal>.</para> + </section> <section id="EntityResolver"> @@ -2669,6 +2674,10 @@ JAXP XSLT transformer (see <xref linkend="JAXP"/>) under the covers.</para> + <para>When using JAXP 1.3 you can chose the actual + <literal>XPathFactory</literal> implementation using + <literal>XMLUnit.setXPathFactory</literal>.</para> + <para>It is possible to establish a global <literal>NamespaceContext</literal> with the help of the <literal>XMLUnit.setXpathNamespaceContext</literal> method. Any This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-05-01 11:41:21
|
Revision: 205 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=205&view=rev Author: bodewig Date: 2007-05-01 04:41:21 -0700 (Tue, 01 May 2007) Log Message: ----------- Make XPathFactory configurable Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/jaxp13/Jaxp13XpathEngine.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-05-01 10:47:53 UTC (rev 204) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-05-01 11:41:21 UTC (rev 205) @@ -76,6 +76,7 @@ private static boolean normalizeWhitespace = false; private static boolean ignoreAttributeOrder = false; private static String xsltVersion = "1.0"; + private static String xpathFactoryName = null; private static final String XSLT_VERSION_START = " version=\""; private static final String XSLT_VERSION_END = "\">"; @@ -744,6 +745,20 @@ } /** + * Sets the class to use as XPathFactory when using JAXP 1.3. + */ + public static void setXPathFactory(String className) { + xpathFactoryName = className; + } + + /** + * Gets the class to use as XPathFactory when using JAXP 1.3. + */ + public static String getXPathFactory() { + return xpathFactoryName; + } + + /** * XSLT stylesheet element using the configured XSLT version. */ static String getXSLTStart() { Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/jaxp13/Jaxp13XpathEngine.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/jaxp13/Jaxp13XpathEngine.java 2007-05-01 10:47:53 UTC (rev 204) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/jaxp13/Jaxp13XpathEngine.java 2007-05-01 11:41:21 UTC (rev 205) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2006-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -36,10 +36,11 @@ package org.custommonkey.xmlunit.jaxp13; +import org.custommonkey.xmlunit.NamespaceContext; +import org.custommonkey.xmlunit.XMLUnit; +import org.custommonkey.xmlunit.XpathEngine; import org.custommonkey.xmlunit.exceptions.ConfigurationException; import org.custommonkey.xmlunit.exceptions.XpathException; -import org.custommonkey.xmlunit.NamespaceContext; -import org.custommonkey.xmlunit.XpathEngine; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; @@ -59,7 +60,15 @@ public Jaxp13XpathEngine() throws ConfigurationException { try { - xpath = XPathFactory.newInstance().newXPath(); + XPathFactory f = null; + if (XMLUnit.getXPathFactory() != null) { + f = (XPathFactory) Class.forName(XMLUnit.getXPathFactory()) + .newInstance(); + } else { + f = XPathFactory.newInstance(); + } + + xpath = f.newXPath(); } catch (Exception ex) { throw new ConfigurationException(ex); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-05-01 10:47:55
|
Revision: 204 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=204&view=rev Author: bodewig Date: 2007-05-01 03:47:53 -0700 (Tue, 01 May 2007) Log Message: ----------- Add homepage to ivy.xml, thanks to advice by Xavier Hanin Modified Paths: -------------- trunk/xmlunit/src/etc/xmlunit-ivy.xml Modified: trunk/xmlunit/src/etc/xmlunit-ivy.xml =================================================================== --- trunk/xmlunit/src/etc/xmlunit-ivy.xml 2007-04-30 13:49:32 UTC (rev 203) +++ trunk/xmlunit/src/etc/xmlunit-ivy.xml 2007-05-01 10:47:53 UTC (rev 204) @@ -5,7 +5,7 @@ publication="@DATE@"> <license name="@LICENSE@" url="@LICENSE_URL@"/> - <description>@DESCRIPTION@</description> + <description homepage="http://xmlunit.sourceforge.net/">@DESCRIPTION@</description> </info> <publications> <artifact name="@ARTIFACT@" type="@TYPE@"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-30 13:49:32
|
Revision: 203 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=203&view=rev Author: bodewig Date: 2007-04-30 06:49:32 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Properly check for assertion failures Modified Paths: -------------- trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs trunk/xmlunit/tests/csharp/XmlAssertionTests.cs Modified: trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs 2007-04-30 13:40:12 UTC (rev 202) +++ trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs 2007-04-30 13:49:32 UTC (rev 203) @@ -21,7 +21,8 @@ new XmlDiff("", "").OptionalDescription); } - [Test] public void DefaultConfiguredToUseValidatingParser() { + [Test][ExpectedException(typeof(XmlSchemaValidationException))] + public void DefaultConfiguredToUseValidatingParser() { DiffConfiguration diffConfiguration = new DiffConfiguration(); Assert.AreEqual(DiffConfiguration.DEFAULT_USE_VALIDATING_PARSER, diffConfiguration.UseValidatingParser); @@ -34,16 +35,14 @@ XmlDiff diff = new XmlDiff(new StreamReader(controlFileStream), new StreamReader(testFileStream)); diff.Compare(); - Assert.Fail("Expected validation failure"); - } catch (XmlSchemaException e) { - string message = e.Message; // to prevent 'unused variable' compiler warning } finally { controlFileStream.Close(); testFileStream.Close(); } } - [Test] public void CanConfigureNotToUseValidatingParser() { + [Test] + public void CanConfigureNotToUseValidatingParser() { DiffConfiguration diffConfiguration = new DiffConfiguration(false); Assert.AreEqual(false, diffConfiguration.UseValidatingParser); Modified: trunk/xmlunit/tests/csharp/XmlAssertionTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XmlAssertionTests.cs 2007-04-30 13:40:12 UTC (rev 202) +++ trunk/xmlunit/tests/csharp/XmlAssertionTests.cs 2007-04-30 13:49:32 UTC (rev 203) @@ -22,24 +22,30 @@ [Test] public void AssertXmlIdenticalUsesOptionalDescription() { string description = "An Optional Description"; + bool caughtException = true; try { XmlDiff diff = new XmlDiff(new XmlInput("<a/>"), new XmlInput("<b/>"), new DiffConfiguration(description)); XmlAssertion.AssertXmlIdentical(diff); + caughtException = false; } catch (NUnit.Framework.AssertionException e) { Assert.IsTrue(e.Message.StartsWith(description)); } + Assert.IsTrue(caughtException); } [Test] public void AssertXmlEqualsUsesOptionalDescription() { string description = "Another Optional Description"; + bool caughtException = true; try { XmlDiff diff = new XmlDiff(new XmlInput("<a/>"), new XmlInput("<b/>"), new DiffConfiguration(description)); XmlAssertion.AssertXmlEquals(diff); + caughtException = false; } catch (NUnit.Framework.AssertionException e) { Assert.AreEqual(true, e.Message.StartsWith(description)); } + Assert.IsTrue(caughtException); } [Test] public void AssertXmlValidTrueForValidFile() { @@ -53,14 +59,16 @@ [Test] public void AssertXmlValidFalseForInvalidFile() { StreamReader reader = GetStreamReader(ValidatorTests.INVALID_FILE); + bool caughtException = true; try { XmlAssertion.AssertXmlValid(reader); - Assert.Fail("Expected assertion failure"); + caughtException = false; } catch(AssertionException e) { AvoidUnusedVariableCompilerWarning(e); } finally { reader.Close(); } + Assert.IsTrue(caughtException); } private StreamReader GetStreamReader(string file) { @@ -76,13 +84,15 @@ } [Test] public void AssertXPathExistsFailsForNonExistentXPath() { + bool caughtException = true; try { XmlAssertion.AssertXPathExists("//star[@name='alpha centauri']", MY_SOLAR_SYSTEM); - Assert.Fail("Expected assertion failure"); + caughtException = false; } catch (AssertionException e) { AvoidUnusedVariableCompilerWarning(e); } + Assert.IsTrue(caughtException); } [Test] public void AssertXPathEvaluatesToWorksForMatchingExpression() { @@ -127,17 +137,14 @@ StreamReader xml = GetStreamReader(".\\..\\tests\\etc\\testAnimal.xml"); XmlInput xmlToTransform = new XmlInput(xml); XmlInput expectedXml = new XmlInput("<cat/>"); - bool exceptionExpected = true; + bool caughtException = true; try { XmlAssertion.AssertXslTransformResults(xslt, xmlToTransform, expectedXml); - exceptionExpected = false; - Assert.Fail("Expected dog not cat!"); + caughtException = false; } catch (AssertionException e) { AvoidUnusedVariableCompilerWarning(e); - if (!exceptionExpected) { - throw e; - } } + Assert.IsTrue(caughtException); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-30 13:40:13
|
Revision: 202 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=202&view=rev Author: bodewig Date: 2007-04-30 06:40:12 -0700 (Mon, 30 Apr 2007) Log Message: ----------- keep backwards compatibility Modified Paths: -------------- trunk/xmlunit/src/csharp/XmlAssertion.cs Modified: trunk/xmlunit/src/csharp/XmlAssertion.cs =================================================================== --- trunk/xmlunit/src/csharp/XmlAssertion.cs 2007-04-23 16:13:15 UTC (rev 201) +++ trunk/xmlunit/src/csharp/XmlAssertion.cs 2007-04-30 13:40:12 UTC (rev 202) @@ -2,7 +2,7 @@ using NUnit.Framework; using System.IO; - public class XmlAssertion : Assert { + public class XmlAssertion : Assertion { public static void AssertXmlEquals(TextReader controlTextReader, TextReader testTextReader) { AssertXmlEquals(new XmlDiff(controlTextReader, testTextReader)); } @@ -38,9 +38,9 @@ private static void AssertXmlEquals(XmlDiff xmlDiff, bool equalOrNot) { DiffResult diffResult = xmlDiff.Compare(); if (equalOrNot) { - IsTrue(diffResult.Equal, diffResult.StringValue); + NUnit.Framework.Assert.IsTrue(diffResult.Equal, diffResult.StringValue); } else { - IsFalse(diffResult.Equal, diffResult.StringValue); + NUnit.Framework.Assert.IsFalse(diffResult.Equal, diffResult.StringValue); } } @@ -55,9 +55,9 @@ private static void AssertXmlIdentical(XmlDiff xmlDiff, bool identicalOrNot) { DiffResult diffResult = xmlDiff.Compare(); if (identicalOrNot) { - IsTrue(diffResult.Identical, xmlDiff.OptionalDescription); + NUnit.Framework.Assert.IsTrue(diffResult.Identical, xmlDiff.OptionalDescription); } else { - IsFalse(diffResult.Identical, xmlDiff.OptionalDescription); + NUnit.Framework.Assert.IsFalse(diffResult.Identical, xmlDiff.OptionalDescription); } } @@ -83,7 +83,7 @@ } public static void AssertXmlValid(Validator validator) { - IsTrue(validator.IsValid, validator.ValidationMessage); + NUnit.Framework.Assert.IsTrue(validator.IsValid, validator.ValidationMessage); } public static void AssertXPathExists(string anXPathExpression, string inXml) { @@ -96,7 +96,7 @@ public static void AssertXPathExists(string anXPathExpression, XmlInput inXml) { XPath xpath = new XPath(anXPathExpression); - AreEqual(true, xpath.XPathExists(inXml)); + NUnit.Framework.Assert.AreEqual(true, xpath.XPathExists(inXml)); } public static void AssertXPathEvaluatesTo(string anXPathExpression, string inXml, @@ -112,7 +112,7 @@ public static void AssertXPathEvaluatesTo(string anXPathExpression, XmlInput inXml, string expectedValue) { XPath xpath = new XPath(anXPathExpression); - AreEqual(expectedValue, xpath.EvaluateXPath(inXml)); + NUnit.Framework.Assert.AreEqual(expectedValue, xpath.EvaluateXPath(inXml)); } public static void AssertXslTransformResults(string xslTransform, string xmlToTransform, string expectedResult) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-23 16:13:16
|
Revision: 201 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=201&view=rev Author: bodewig Date: 2007-04-23 09:13:15 -0700 (Mon, 23 Apr 2007) Log Message: ----------- make test locale independent Modified Paths: -------------- trunk/xmlunit/tests/csharp/ValidatorTests.cs Modified: trunk/xmlunit/tests/csharp/ValidatorTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/ValidatorTests.cs 2007-04-23 15:47:38 UTC (rev 200) +++ trunk/xmlunit/tests/csharp/ValidatorTests.cs 2007-04-23 16:13:15 UTC (rev 201) @@ -28,9 +28,12 @@ [Test] public void XsdInvalidFileIsNotValid() { Validator validator = PerformAssertion(INVALID_FILE, false); - string expected = "The element 'http://www.publishing.org:Book' has incomplete content"; - Assert.AreEqual(true, - validator.ValidationMessage.StartsWith(expected)); + Assert.IsFalse(validator.IsValid); + Assert.IsTrue(validator.ValidationMessage + .IndexOf("http://www.publishing.org") > -1, + validator.ValidationMessage); + Assert.IsTrue(validator.ValidationMessage.IndexOf("Book") > -1, + validator.ValidationMessage); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-23 16:09:50
|
Revision: 200 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=200&view=rev Author: bodewig Date: 2007-04-23 08:47:38 -0700 (Mon, 23 Apr 2007) Log Message: ----------- modernize NUnit usage: Assertion -> Assert Modified Paths: -------------- trunk/xmlunit/src/csharp/XmlAssertion.cs trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs trunk/xmlunit/tests/csharp/DiffResultTests.cs trunk/xmlunit/tests/csharp/DifferenceTests.cs trunk/xmlunit/tests/csharp/ValidatorTests.cs trunk/xmlunit/tests/csharp/XPathTests.cs trunk/xmlunit/tests/csharp/XmlAssertionTests.cs trunk/xmlunit/tests/csharp/XmlDiffTests.cs trunk/xmlunit/tests/csharp/XmlInputTests.cs trunk/xmlunit/tests/csharp/XsltTests.cs Modified: trunk/xmlunit/src/csharp/XmlAssertion.cs =================================================================== --- trunk/xmlunit/src/csharp/XmlAssertion.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/src/csharp/XmlAssertion.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -2,7 +2,7 @@ using NUnit.Framework; using System.IO; - public class XmlAssertion : Assertion { + public class XmlAssertion : Assert { public static void AssertXmlEquals(TextReader controlTextReader, TextReader testTextReader) { AssertXmlEquals(new XmlDiff(controlTextReader, testTextReader)); } @@ -37,7 +37,11 @@ private static void AssertXmlEquals(XmlDiff xmlDiff, bool equalOrNot) { DiffResult diffResult = xmlDiff.Compare(); - Assertion.AssertEquals(diffResult.StringValue, equalOrNot, diffResult.Equal); + if (equalOrNot) { + IsTrue(diffResult.Equal, diffResult.StringValue); + } else { + IsFalse(diffResult.Equal, diffResult.StringValue); + } } public static void AssertXmlIdentical(XmlDiff xmlDiff) { @@ -50,7 +54,11 @@ private static void AssertXmlIdentical(XmlDiff xmlDiff, bool identicalOrNot) { DiffResult diffResult = xmlDiff.Compare(); - AssertEquals(xmlDiff.OptionalDescription, identicalOrNot, diffResult.Identical); + if (identicalOrNot) { + IsTrue(diffResult.Identical, xmlDiff.OptionalDescription); + } else { + IsFalse(diffResult.Identical, xmlDiff.OptionalDescription); + } } public static void AssertXmlValid(string someXml) { @@ -75,7 +83,7 @@ } public static void AssertXmlValid(Validator validator) { - AssertEquals(validator.ValidationMessage, true, validator.IsValid); + IsTrue(validator.IsValid, validator.ValidationMessage); } public static void AssertXPathExists(string anXPathExpression, string inXml) { @@ -88,7 +96,7 @@ public static void AssertXPathExists(string anXPathExpression, XmlInput inXml) { XPath xpath = new XPath(anXPathExpression); - AssertEquals(true, xpath.XPathExists(inXml)); + AreEqual(true, xpath.XPathExists(inXml)); } public static void AssertXPathEvaluatesTo(string anXPathExpression, string inXml, @@ -104,7 +112,7 @@ public static void AssertXPathEvaluatesTo(string anXPathExpression, XmlInput inXml, string expectedValue) { XPath xpath = new XPath(anXPathExpression); - AssertEquals(expectedValue, xpath.EvaluateXPath(inXml)); + AreEqual(expectedValue, xpath.EvaluateXPath(inXml)); } public static void AssertXslTransformResults(string xslTransform, string xmlToTransform, string expectedResult) { Modified: trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/DiffConfigurationTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -14,16 +14,16 @@ [Test] public void DefaultConfiguredWithGenericDescription() { DiffConfiguration diffConfiguration = new DiffConfiguration(); - Assertion.AssertEquals(DiffConfiguration.DEFAULT_DESCRIPTION, + Assert.AreEqual(DiffConfiguration.DEFAULT_DESCRIPTION, diffConfiguration.Description); - Assertion.AssertEquals(DiffConfiguration.DEFAULT_DESCRIPTION, + Assert.AreEqual(DiffConfiguration.DEFAULT_DESCRIPTION, new XmlDiff("", "").OptionalDescription); } [Test] public void DefaultConfiguredToUseValidatingParser() { DiffConfiguration diffConfiguration = new DiffConfiguration(); - Assertion.AssertEquals(DiffConfiguration.DEFAULT_USE_VALIDATING_PARSER, + Assert.AreEqual(DiffConfiguration.DEFAULT_USE_VALIDATING_PARSER, diffConfiguration.UseValidatingParser); FileStream controlFileStream = File.Open(ValidatorTests.VALID_FILE, @@ -34,7 +34,7 @@ XmlDiff diff = new XmlDiff(new StreamReader(controlFileStream), new StreamReader(testFileStream)); diff.Compare(); - Assertion.Fail("Expected validation failure"); + Assert.Fail("Expected validation failure"); } catch (XmlSchemaException e) { string message = e.Message; // to prevent 'unused variable' compiler warning } finally { @@ -45,7 +45,7 @@ [Test] public void CanConfigureNotToUseValidatingParser() { DiffConfiguration diffConfiguration = new DiffConfiguration(false); - Assertion.AssertEquals(false, diffConfiguration.UseValidatingParser); + Assert.AreEqual(false, diffConfiguration.UseValidatingParser); FileStream controlFileStream = File.Open(ValidatorTests.VALID_FILE, FileMode.Open, FileAccess.Read); @@ -57,7 +57,7 @@ diffConfiguration); diff.Compare(); } catch (XmlSchemaException e) { - Assertion.Fail("Unexpected validation failure: " + e.Message); + Assert.Fail("Unexpected validation failure: " + e.Message); } finally { controlFileStream.Close(); testFileStream.Close(); @@ -66,7 +66,7 @@ [Test] public void DefaultConfiguredWithWhitespaceHandlingAll() { DiffConfiguration diffConfiguration = new DiffConfiguration(); - Assertion.AssertEquals(WhitespaceHandling.All, diffConfiguration.WhitespaceHandling); + Assert.AreEqual(WhitespaceHandling.All, diffConfiguration.WhitespaceHandling); PerformAssertion(xmlWithoutWhitespace, xmlWithWhitespaceElement, false); PerformAssertion(xmlWithoutWhitespace, xmlWithoutWhitespaceElement, false); @@ -85,8 +85,8 @@ PerformAssertion(diff, assertion); } private void PerformAssertion(XmlDiff diff, bool assertion) { - Assertion.AssertEquals(assertion, diff.Compare().Equal); - Assertion.AssertEquals(assertion, diff.Compare().Identical); + Assert.AreEqual(assertion, diff.Compare().Equal); + Assert.AreEqual(assertion, diff.Compare().Identical); } [Test] public void CanConfigureWhitespaceHandlingSignificant() { Modified: trunk/xmlunit/tests/csharp/DiffResultTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/DiffResultTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/DiffResultTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -18,25 +18,25 @@ } [Test] public void NewDiffResultIsEqualAndIdentical() { - Assertion.AssertEquals(true, _result.Identical); - Assertion.AssertEquals(true, _result.Equal); - Assertion.AssertEquals("Identical", _result.StringValue); + Assert.AreEqual(true, _result.Identical); + Assert.AreEqual(true, _result.Equal); + Assert.AreEqual("Identical", _result.StringValue); } [Test] public void NotEqualOrIdenticalAfterMajorDifferenceFound() { _result.DifferenceFound(_diff, _majorDifference); - Assertion.AssertEquals(false, _result.Identical); - Assertion.AssertEquals(false, _result.Equal); - Assertion.AssertEquals(_diff.OptionalDescription + Assert.AreEqual(false, _result.Identical); + Assert.AreEqual(false, _result.Equal); + Assert.AreEqual(_diff.OptionalDescription + Environment.NewLine + _majorDifference.ToString(), _result.StringValue); } [Test] public void NotIdenticalButEqualAfterMinorDifferenceFound() { _result.DifferenceFound(_diff, _minorDifference); - Assertion.AssertEquals(false, _result.Identical); - Assertion.AssertEquals(true, _result.Equal); - Assertion.AssertEquals(_diff.OptionalDescription + Assert.AreEqual(false, _result.Identical); + Assert.AreEqual(true, _result.Equal); + Assert.AreEqual(_diff.OptionalDescription + Environment.NewLine + _minorDifference.ToString(), _result.StringValue); } Modified: trunk/xmlunit/tests/csharp/DifferenceTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/DifferenceTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/DifferenceTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -9,16 +9,15 @@ [SetUp] public void CreateMinorDifference() { DifferenceType id = DifferenceType.ATTR_SEQUENCE_ID; - Assertion.AssertEquals(false, Differences.isMajorDifference(id)); + Assert.IsFalse(Differences.isMajorDifference(id)); minorDifference = new Difference(id); } [Test] public void ToStringContainsId() { string commentDifference = minorDifference.ToString(); string idValue = "type: " + (int)DifferenceType.ATTR_SEQUENCE_ID; - Assertion.AssertEquals("contains " + idValue, - true, - commentDifference.IndexOfAny(idValue.ToCharArray()) > 0); + Assert.IsTrue(commentDifference.IndexOfAny(idValue.ToCharArray()) > 0, + "contains " + idValue); } } } Modified: trunk/xmlunit/tests/csharp/ValidatorTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/ValidatorTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/ValidatorTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -19,7 +19,7 @@ FileStream input = File.Open(file, FileMode.Open, FileAccess.Read); try { Validator validator = new Validator(new XmlInput(new StreamReader(input))); - Assertion.AssertEquals(expected, validator.IsValid); + Assert.AreEqual(expected, validator.IsValid); return validator; } finally { input.Close(); @@ -29,7 +29,7 @@ [Test] public void XsdInvalidFileIsNotValid() { Validator validator = PerformAssertion(INVALID_FILE, false); string expected = "The element 'http://www.publishing.org:Book' has incomplete content"; - Assertion.AssertEquals(true, + Assert.AreEqual(true, validator.ValidationMessage.StartsWith(expected)); } } Modified: trunk/xmlunit/tests/csharp/XPathTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XPathTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/XPathTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -13,39 +13,39 @@ private static readonly string COUNT_XPATH = "count(//b)"; [Test] public void XpathExistsTrueForXpathThatExists() { XPath xpath = new XPath(EXISTENT_XPATH); - Assertion.AssertEquals(true, + Assert.AreEqual(true, xpath.XPathExists(SIMPLE_XML)); } [Test] public void XpathExistsFalseForUnmatchedExpression() { XPath xpath = new XPath(NONEXISTENT_XPATH); - Assertion.AssertEquals(false, + Assert.AreEqual(false, xpath.XPathExists(SIMPLE_XML)); } [Test] public void XpathEvaluatesToTextValueForSimpleString() { string expectedValue = "one two"; XPath xpath = new XPath(EXISTENT_XPATH); - Assertion.AssertEquals(expectedValue, + Assert.AreEqual(expectedValue, xpath.EvaluateXPath(SIMPLE_XML)); } [Test] public void XpathEvaluatesToEmptyStringForUnmatchedExpression() { string expectedValue = ""; XPath xpath = new XPath(NONEXISTENT_XPATH); - Assertion.AssertEquals(expectedValue, + Assert.AreEqual(expectedValue, xpath.EvaluateXPath(SIMPLE_XML)); } [Test] public void XpathEvaluatesCountExpression() { string expectedValue = "2"; XPath xpath = new XPath(COUNT_XPATH); - Assertion.AssertEquals(expectedValue, + Assert.AreEqual(expectedValue, xpath.EvaluateXPath(MORE_COMPLEX_XML)); } [Test] public void XpathEvaluatesMultiNodeExpression() { string expectedValue = "onetwo"; XPath xpath = new XPath(MULTI_NODE_XPATH); - Assertion.AssertEquals(expectedValue, + Assert.AreEqual(expectedValue, xpath.EvaluateXPath(MORE_COMPLEX_XML)); } } Modified: trunk/xmlunit/tests/csharp/XmlAssertionTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XmlAssertionTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/XmlAssertionTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -27,7 +27,7 @@ new DiffConfiguration(description)); XmlAssertion.AssertXmlIdentical(diff); } catch (NUnit.Framework.AssertionException e) { - Assertion.AssertEquals(true, e.Message.StartsWith(description)); + Assert.IsTrue(e.Message.StartsWith(description)); } } @@ -38,7 +38,7 @@ new DiffConfiguration(description)); XmlAssertion.AssertXmlEquals(diff); } catch (NUnit.Framework.AssertionException e) { - Assertion.AssertEquals(true, e.Message.StartsWith(description)); + Assert.AreEqual(true, e.Message.StartsWith(description)); } } @@ -55,7 +55,7 @@ StreamReader reader = GetStreamReader(ValidatorTests.INVALID_FILE); try { XmlAssertion.AssertXmlValid(reader); - Assertion.Fail("Expected assertion failure"); + Assert.Fail("Expected assertion failure"); } catch(AssertionException e) { AvoidUnusedVariableCompilerWarning(e); } finally { @@ -79,7 +79,7 @@ try { XmlAssertion.AssertXPathExists("//star[@name='alpha centauri']", MY_SOLAR_SYSTEM); - Assertion.Fail("Expected assertion failure"); + Assert.Fail("Expected assertion failure"); } catch (AssertionException e) { AvoidUnusedVariableCompilerWarning(e); } @@ -131,7 +131,7 @@ try { XmlAssertion.AssertXslTransformResults(xslt, xmlToTransform, expectedXml); exceptionExpected = false; - Assertion.Fail("Expected dog not cat!"); + Assert.Fail("Expected dog not cat!"); } catch (AssertionException e) { AvoidUnusedVariableCompilerWarning(e); if (!exceptionExpected) { Modified: trunk/xmlunit/tests/csharp/XmlDiffTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XmlDiffTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/XmlDiffTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -10,14 +10,14 @@ [Test] public void EqualResultForSameReader() { TextReader reader = new StringReader("<empty/>"); DiffResult result = PerformDiff(reader, reader); - Assertion.AssertEquals(true, result.Equal); + Assert.AreEqual(true, result.Equal); } [Test] public void SameResultForTwoInvocations() { TextReader reader = new StringReader("<empty/>"); DiffResult result1 = PerformDiff(reader, reader); DiffResult result2 = _xmlDiff.Compare(); - Assertion.AssertSame(result1, result2); + Assert.AreSame(result1, result2); } @@ -26,7 +26,7 @@ TextReader reader2 = new StringReader(input2); DiffResult result = PerformDiff(reader1, reader2); string msg = "comparing " + input1 + " to " + input2 + ": " + result.Difference; - Assertion.AssertEquals(msg, expected, result.Equal); + Assert.AreEqual(expected, result.Equal); } private void AssertExpectedResult(string[] inputs1, string[] inputs2, bool expected) { Modified: trunk/xmlunit/tests/csharp/XmlInputTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XmlInputTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/XmlInputTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -18,13 +18,13 @@ [Test] public void StringInputTranslatesToXmlReader() { XmlInput input = new XmlInput(INPUT); string actual = ReadOuterXml(input.CreateXmlReader()); - Assertion.AssertEquals(_expected, actual); + Assert.AreEqual(_expected, actual); } [Test] public void TextReaderInputTranslatesToXmlReader() { XmlInput input = new XmlInput(new StringReader(INPUT)); string actual = ReadOuterXml(input.CreateXmlReader()); - Assertion.AssertEquals(_expected, actual); + Assert.AreEqual(_expected, actual); } [Test] public void StreamInputTranslatesToXmlReader() { @@ -36,7 +36,7 @@ XmlInput input = new XmlInput(stream); string actual = ReadOuterXml(input.CreateXmlReader()); try { - Assertion.AssertEquals(_expected, actual); + Assert.AreEqual(_expected, actual); } finally { writer.Close(); } @@ -53,32 +53,32 @@ [Test] public void NotEqualsNull() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(false, input.Equals(null)); + Assert.AreEqual(false, input.Equals(null)); } [Test] public void NotEqualsADifferentClass() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(false, input.Equals(INPUT)); + Assert.AreEqual(false, input.Equals(INPUT)); } [Test] public void EqualsSelf() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(input, input); + Assert.AreEqual(input, input); } [Test] public void EqualsCopyOfSelf() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(new XmlInput(INPUT), input); + Assert.AreEqual(new XmlInput(INPUT), input); } [Test] public void HashCodeEqualsHashCodeOfInput() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(INPUT.GetHashCode(), input.GetHashCode()); + Assert.AreEqual(INPUT.GetHashCode(), input.GetHashCode()); } [Test] public void HashCodeEqualsHashCodeOfCopy() { XmlInput input = new XmlInput(INPUT); - Assertion.AssertEquals(new XmlInput(INPUT).GetHashCode(), input.GetHashCode()); + Assert.AreEqual(new XmlInput(INPUT).GetHashCode(), input.GetHashCode()); } } Modified: trunk/xmlunit/tests/csharp/XsltTests.cs =================================================================== --- trunk/xmlunit/tests/csharp/XsltTests.cs 2007-04-23 15:18:56 UTC (rev 199) +++ trunk/xmlunit/tests/csharp/XsltTests.cs 2007-04-23 15:47:38 UTC (rev 200) @@ -27,8 +27,8 @@ Xslt xslt = new Xslt(IDENTITY_TRANSFORM); string input = "<qwerty>uiop</qwerty>"; string output = new string(input.ToCharArray()); - Assertion.AssertEquals(output, xslt.Transform(input).AsString()); - Assertion.AssertEquals(output, xslt.Transform(input).AsString()); + Assert.AreEqual(output, xslt.Transform(input).AsString()); + Assert.AreEqual(output, xslt.Transform(input).AsString()); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-23 15:18:54
|
Revision: 199 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=199&view=rev Author: bodewig Date: 2007-04-23 08:18:56 -0700 (Mon, 23 Apr 2007) Log Message: ----------- Modernize NAnt build Modified Paths: -------------- trunk/xmlunit/xmlunit.nant.build Modified: trunk/xmlunit/xmlunit.nant.build =================================================================== --- trunk/xmlunit/xmlunit.nant.build 2007-04-23 14:59:01 UTC (rev 198) +++ trunk/xmlunit/xmlunit.nant.build 2007-04-23 15:18:56 UTC (rev 199) @@ -1,70 +1,84 @@ <project name="xmlunit" description="XmlUnit for .Net" default="compile"> - <property name="project.version" value="0.3"/> - <property name="base.dir" value="${nant.project.basedir}"/> - <property name="src.dir" value="${base.dir}/src/csharp"/> - <property name="tests.src.dir" value="${base.dir}/tests/csharp"/> - <property name="bin.dir" value="${base.dir}/bin"/> - <property name="csc.verbose" value="false"/> - <property name="deploy.file" value="${nant.project.name}${project.version}.zip"/> + <property name="project.version" value="0.3" overwrite="false"/> + <property name="base.dir" value="${project::get-base-directory()}" + overwrite="false"/> + <property name="src.dir" value="${base.dir}/src/csharp" overwrite="false"/> + <property name="tests.src.dir" value="${base.dir}/tests/csharp" + overwrite="false"/> + <property name="bin.dir" value="${base.dir}/bin" overwrite="false"/> + <property name="csc.verbose" value="false" overwrite="false"/> + <property name="deploy.file" overwrite="false" + value="${project::get-name()}-${project.version}.zip"/> <!-- *** You may need to edit these properties for your filesystem *** --> - <property name="nunit.v2.assembly" value="nunit.framework.dll"/> - <property name="nunit.v2.bin.dir" value="c:/apps/SharpDevelop/bin/nunit"/> + <property name="nunit.v2.assembly" value="nunit.framework.dll" + overwrite="false"/> + <property name="nunit.v2.bin.dir" overwrite="false" + value="c:/apps/SharpDevelop/bin/nunit" /> <target name="init" description="prepare for other targets"> <mkdir dir="${bin.dir}"/> - <copy file="${nunit.v2.bin.dir}/${nunit.v2.assembly}" tofile="${bin.dir}/${nunit.v2.assembly}"/> + <copy file="${nunit.v2.bin.dir}/${nunit.v2.assembly}" + tofile="${bin.dir}/${nunit.v2.assembly}"/> </target> <target name="clean" description="clean out compiled files"> <delete failonerror="false"> <fileset basedir="${bin.dir}"> - <includes name="${nant.project.name}.*"/> + <include name="${project::get-name()}.*"/> </fileset> </delete> </target> <target name="compile" description="compile all source files" depends="init"> - <csc target="library" output="${bin.dir}/${nant.project.name}.dll" debug="true" verbose="${csc.verbose}"> + <csc target="library" output="${bin.dir}/${project::get-name()}.dll" + debug="true" verbose="${csc.verbose}"> <references basedir="${bin.dir}"> - <includes name="${nunit.v2.assembly}"/> + <include name="${nunit.v2.assembly}"/> </references> <sources basedir="${src.dir}"> - <includes name="*.cs"/> + <include name="*.cs"/> </sources> </csc> - <csc target="library" output="${bin.dir}/${nant.project.name}.tests.dll" debug="true" verbose="${csc.verbose}"> - <references basedir="${bin.dir}"> - <includes name="${nant.project.name}.dll"/> - <includes name="${nunit.v2.assembly}"/> - </references> - <sources basedir="${tests.src.dir}"> - <includes name="*.cs"/> - <excludes name="AllTests.cs"/> - </sources> + <csc target="library" + output="${bin.dir}/${project::get-name()}.tests.dll" + debug="true" verbose="${csc.verbose}"> + <references basedir="${bin.dir}"> + <include name="${project::get-name()}.dll"/> + <include name="${nunit.v2.assembly}"/> + </references> + <sources basedir="${tests.src.dir}"> + <include name="*.cs"/> + <exclude name="AllTests.cs"/> + </sources> </csc> </target> <target name="test" description="run all tests" depends="compile"> - <exec basedir="${bin.dir}" workingdir="${bin.dir}" program="${nunit.v2.bin.dir}/nunit-console.exe" commandline="${nant.project.name}.tests.dll"/> + <nunit2> + <formatter type="Plain"/> + <test assemblyname="${bin.dir}/${project::get-name()}.tests.dll"/> + </nunit2> </target> - <target name="deploy" description="zip all code for deployment" depends="test"> + <target name="deploy" description="zip all code for deployment" + depends="test"> <delete file="${deploy.file}" failonerror="false"/> <zip zipfile="${deploy.file}"> <fileset basedir="${base.dir}"> - <includes name="LICENSE.txt"/> - <includes name="NUnit.ReadMe"/> - <includes name="*.build"/> - <includes name="**/*.cs"/> - <includes name="./tests/etc/**/*.*"/> - <includes name="**/${nant.project.name}*.dll"/> - <excludes name="**/AllTests.cs"/> + <include name="LICENSE.txt"/> + <include name="NUnit.ReadMe"/> + <include name="*.build"/> + <include name="**/*.cs"/> + <include name="./tests/etc/**/*.*"/> + <include name="**/${project::get-name()}*.dll"/> + <exclude name="**/AllTests.cs"/> </fileset> </zip> </target> - <target name="all" description="execute all tasks in the project" depends="clean,compile,test,deploy"/> + <target name="all" description="execute all tasks in the project" + depends="clean,compile,test,deploy"/> </project> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-23 14:59:02
|
Revision: 198 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=198&view=rev Author: bodewig Date: 2007-04-23 07:59:01 -0700 (Mon, 23 Apr 2007) Log Message: ----------- Remove old documentation which has been absorbed by the User's Guide Removed Paths: ------------- trunk/xmlunit/src/site/XMLUnit.pdf trunk/xmlunit/src/site/XMLUnit.rtf Deleted: trunk/xmlunit/src/site/XMLUnit.pdf =================================================================== (Binary files differ) Deleted: trunk/xmlunit/src/site/XMLUnit.rtf =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-23 14:58:09
|
Revision: 197 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=197&view=rev Author: bodewig Date: 2007-04-23 07:58:02 -0700 (Mon, 23 Apr 2007) Log Message: ----------- Add POM and ivy.xml to bin-dist, remove C# from Java source-dist Modified Paths: -------------- trunk/xmlunit/build.xml Modified: trunk/xmlunit/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-19 04:00:56 UTC (rev 196) +++ trunk/xmlunit/build.xml 2007-04-23 14:58:02 UTC (rev 197) @@ -171,6 +171,10 @@ basedir="${out.dir}" /> + <tstamp> + <format property="ivy.publication.datetime" pattern="yyyyMMddHHmmss"/> + </tstamp> + <copy todir="${lib.dir}"> <fileset dir="${src.dir}/etc"> <include name="xmlunit.pom"/> @@ -195,7 +199,7 @@ <target name="bindist" depends="jar,test,docs"> <zip zipfile="${dist.dir}/xmlunit-${xmlunit.version}-bin.zip"> <zipfileset prefix="xmlunit-${xmlunit.version}/lib" - dir="${lib.dir}" includes="*.jar"/> + dir="${lib.dir}"/> <zipfileset prefix="xmlunit-${xmlunit.version}/docs" dir="${docs.dir}"/> <zipfileset prefix="xmlunit-${xmlunit.version}" dir="."> @@ -215,6 +219,7 @@ <include name="KEYS"/> <include name="LICENSE.txt"/> <include name="README.txt"/> + <exclude name="**/csharp/**"/> </zipfileset> <zipfileset dir="${userguide.docs.dir}" prefix="xmlunit-${xmlunit.version}/userguide"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-19 04:00:54
|
Revision: 196 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=196&view=rev Author: bodewig Date: 2007-04-18 21:00:56 -0700 (Wed, 18 Apr 2007) Log Message: ----------- bump version Modified Paths: -------------- trunk/xmlunit/build.xml trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java Modified: trunk/xmlunit/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-19 03:59:31 UTC (rev 195) +++ trunk/xmlunit/build.xml 2007-04-19 04:00:56 UTC (rev 196) @@ -4,7 +4,7 @@ <property file="build.properties"/> <!-- Version --> - <property name="xmlunit.version" value="1.1alpha"/> + <property name="xmlunit.version" value="1.1beta2"/> <!-- some locations --> <property name="src.dir" value="src"/> Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-19 03:59:31 UTC (rev 195) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-19 04:00:56 UTC (rev 196) @@ -469,7 +469,7 @@ * @return current version */ public static String getVersion() { - return "1.1alpha"; + return "1.1beta2"; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-19 03:59:30
|
Revision: 195 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=195&view=rev Author: bodewig Date: 2007-04-18 20:59:31 -0700 (Wed, 18 Apr 2007) Log Message: ----------- Tag XMLUnit for Java 1.1 beta 1 Modified Paths: -------------- tags/XMLUnit-Java-1.1-beta1/build.xml tags/XMLUnit-Java-1.1-beta1/src/java/org/custommonkey/xmlunit/XMLUnit.java Added Paths: ----------- tags/XMLUnit-Java-1.1-beta1/ Copied: tags/XMLUnit-Java-1.1-beta1 (from rev 194, trunk/xmlunit) Modified: tags/XMLUnit-Java-1.1-beta1/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-18 15:29:47 UTC (rev 194) +++ tags/XMLUnit-Java-1.1-beta1/build.xml 2007-04-19 03:59:31 UTC (rev 195) @@ -4,7 +4,7 @@ <property file="build.properties"/> <!-- Version --> - <property name="xmlunit.version" value="1.1alpha"/> + <property name="xmlunit.version" value="1.1beta1"/> <!-- some locations --> <property name="src.dir" value="src"/> Modified: tags/XMLUnit-Java-1.1-beta1/src/java/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-18 15:29:47 UTC (rev 194) +++ tags/XMLUnit-Java-1.1-beta1/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-19 03:59:31 UTC (rev 195) @@ -469,7 +469,7 @@ * @return current version */ public static String getVersion() { - return "1.1alpha"; + return "1.1beta1"; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-18 15:29:46
|
Revision: 194 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=194&view=rev Author: bodewig Date: 2007-04-18 08:29:47 -0700 (Wed, 18 Apr 2007) Log Message: ----------- Add a target for Apache Gump Modified Paths: -------------- trunk/xmlunit/build.xml Modified: trunk/xmlunit/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-18 15:27:50 UTC (rev 193) +++ trunk/xmlunit/build.xml 2007-04-18 15:29:47 UTC (rev 194) @@ -165,7 +165,7 @@ </copy> </target> - <target name="jar" depends="clean,compile" + <target name="jar" depends="compile" description="creates jar, Maven2 POM and Ivy file"> <jar jarfile="${lib.dir}/xmlunit-${xmlunit.version}.jar" basedir="${out.dir}" @@ -190,6 +190,8 @@ </copy> </target> + <target name="Gump" depends="test,jar"/> + <target name="bindist" depends="jar,test,docs"> <zip zipfile="${dist.dir}/xmlunit-${xmlunit.version}-bin.zip"> <zipfileset prefix="xmlunit-${xmlunit.version}/lib" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-18 15:27:49
|
Revision: 193 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=193&view=rev Author: bodewig Date: 2007-04-18 08:27:50 -0700 (Wed, 18 Apr 2007) Log Message: ----------- Preparing build system and site for release Modified Paths: -------------- trunk/xmlunit/build.xml trunk/xmlunit/src/site/index.html Added Paths: ----------- trunk/xmlunit/docbook.xml Modified: trunk/xmlunit/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-18 15:27:27 UTC (rev 192) +++ trunk/xmlunit/build.xml 2007-04-18 15:27:50 UTC (rev 193) @@ -1,16 +1,37 @@ -<project name="xmlunit" default="compile" basedir="."> - <!-- The properties junit.lib, xmlxsl.lib, and test.report.dir should be defined in your build.properties file --> - <target name="props"> - <property name="xmlunit.version" value="1.1alpha"/> - <property name="src.dir" value="src"/> - <property name="test.dir" value="tests"/> - <property name="lib.dir" value="lib"/> - <property name="out.dir" value="classes"/> - <property name="dist.dir" value="dist"/> - <property name="docs.dir" value="doc"/> - <property name="build.user.guide" value="userguide"/> - <property file="build.properties"/> +<project name="xmlunit" default="test" basedir="."> + <!-- allow properties to be overridden in a properties file --> + <property file="build.properties"/> + + <!-- Version --> + <property name="xmlunit.version" value="1.1alpha"/> + + <!-- some locations --> + <property name="src.dir" value="src"/> + <property name="test.dir" value="tests"/> + <property name="build.dir" location="build"/> + <property name="lib.dir" value="${build.dir}/lib"/> + <property name="out.dir" value="${build.dir}/classes"/> + <property name="test.out.dir" value="${build.dir}/test-classes"/> + <property name="userguide.out.dir" value="${build.dir}/ug-classes"/> + <property name="test.report.dir" value="${build.dir}/test-report"/> + <property name="dist.dir" value="${build.dir}/dist"/> + <property name="docs.dir" value="${build.dir}/doc"/> + <property name="userguide.docs.dir" value="${docs.dir}/userguide"/> + + <!-- javac properties --> + <property name="javac.source" value="1.3"/> + <property name="javac.target" value="1.3"/> + <property name="javac.debug" value="true"/> + + <!-- some library paths --> + <!-- where is JAXP? property name="${xmlxsl.lib}" location="."/ --> + <!-- where is JUnit? property name="${junit.lib}" location="."/ --> + + <!-- Docbook related properties, macros and targets --> + <import file="docbook.xml"/> + + <target name="-props"> <available property="jaxp13+" classname="javax.xml.xpath.XPath"/> <condition property="jaxp13+.impl"> <and> @@ -21,31 +42,34 @@ <available property="regexp.present" classname="java.util.regex.Matcher"/> </target> - <target name="check-props" unless="test.report.dir"> - <fail>Please provide the -values for junit.lib, xmlxsl.lib, and test.report.dir -in build.properties</fail> - </target> - - <target name="init" depends="props,check-props"> + <target name="-init" depends="-props"> <mkdir dir="${lib.dir}"/> <mkdir dir="${out.dir}"/> + <mkdir dir="${test.out.dir}"/> <mkdir dir="${test.report.dir}"/> <mkdir dir="${dist.dir}"/> + <mkdir dir="${docs.dir}"/> + <mkdir dir="${userguide.docs.dir}"/> </target> - <target name="clean" depends="init"> + <target name="clean" + description="removes created directories"> <delete includeEmptyDirs="true" quiet="true"> - <fileset dir="${out.dir}" includes="**/*.class"/> - <fileset dir="${test.report.dir}" includes="**/TEST*.*"/> + <fileset dir="${lib.dir}"/> + <fileset dir="${out.dir}"/> + <fileset dir="${test.out.dir}"/> + <fileset dir="${test.report.dir}"/> <fileset dir="${dist.dir}"/> - <fileset dir="${build.user.guide}"/> + <fileset dir="${docs.dir}"/> + <fileset dir="${userguide.docs.dir}"/> + <fileset dir="${build.dir}"/> </delete> </target> - <target name="compile" depends="init"> - <mkdir dir="${out.dir}"/> - <javac srcdir="${src.dir}/java:${test.dir}/java" destdir="${out.dir}" debug="on" target="1.2" source="1.3"> + <target name="compile" depends="-init" + description="compiles sources and tests"> + <javac srcdir="${src.dir}/java" destdir="${out.dir}" + debug="${javac.debug}" target="${javac.target}" source="${javac.source}"> <classpath> <pathelement location="${xmlxsl.lib}"/> <pathelement location="${junit.lib}"/> @@ -54,11 +78,23 @@ <exclude name="**/jaxp13/**" unless="jaxp13+"/> <exclude name="**/*XPathRegexAssert.java" unless="regexp.present"/> </javac> + <javac srcdir="${test.dir}/java" destdir="${test.out.dir}" + debug="${javac.debug}" target="${javac.target}" source="${javac.source}"> + <classpath> + <pathelement location="${out.dir}"/> + <pathelement location="${xmlxsl.lib}"/> + <pathelement location="${junit.lib}"/> + <pathelement path="${java.class.path}"/> + </classpath> + <exclude name="**/jaxp13/**" unless="jaxp13+"/> + <exclude name="**/*XPathRegexAssert.java" unless="regexp.present"/> + </javac> </target> - <target name="test" depends="compile"> - <mkdir dir="${test.report.dir}"/> - <junit printsummary="yes" haltonfailure="no" fork="yes" forkMode="perBatch"> + <target name="test" depends="compile" + description="runs the tests"> + <junit printsummary="yes" haltonfailure="no" fork="yes" + forkMode="perBatch" failureproperty="tests.failed"> <sysproperty key="basedir" value="${basedir}"/> <sysproperty key="user.dir" value="${basedir}"/> <!-- @@ -71,6 +107,7 @@ --> <classpath> <pathelement location="${out.dir}"/> + <pathelement location="${test.out.dir}"/> <pathelement location="${xmlxsl.lib}"/> <pathelement location="${junit.lib}"/> <pathelement path="${java.class.path}"/> @@ -90,25 +127,23 @@ </fileset> <report format="frames" todir="${test.report.dir}/html"/> </junitreport> - </target> - <target name="setDistVersion" depends="init"> - <replace dir="${src.dir}" token="@@version@@" value="${xmlunit.version}" - includes="**/*.java"/> - <tstamp> - <format property="ivy.publication.datetime" pattern="yyyyMMddHHmmss"/> - </tstamp> + <fail if="tests.failed">Some tests failed</fail> </target> - <target name="docs" depends="init"> - <mkdir dir="${docs.dir}"/> - <delete includeEmptyDirs="true" dir="${docs.dir}/org"/> - <javadoc destdir="${docs.dir}" + <target name="docs" + depends="create-users-guide,javadocs,-site" + description="creates the documentation bundle"/> + + <target name="javadocs" depends="-init" + description="creates the API documentation"> + <delete includeEmptyDirs="true" dir="${docs.dir}/api"/> + <javadoc destdir="${docs.dir}/api" overview="${src.dir}/java/overview.html" windowtitle="XMLUnit Documentation" footer="<p><a href="http://xmlunit.sourceforge.net/">XMLUnit</a> is hosted by sourceforge.net</p>"> <group title="XMLUnit v${xmlunit.version}" - packages="org.custommonkey.xmlunit.*"/> + packages="org.custommonkey.xmlunit*"/> <fileset dir="${src.dir}/java"> <include name="org/custommonkey/**/*.java"/> </fileset> @@ -121,14 +156,23 @@ </javadoc> </target> - <target name="jar" depends="clean,setDistVersion,compile"> + <target name="-site" depends="-init"> + <copy todir="${docs.dir}"> + <fileset dir="${src.dir}/site"> + <include name="*.html"/> + <include name="*.png"/> + </fileset> + </copy> + </target> + + <target name="jar" depends="clean,compile" + description="creates jar, Maven2 POM and Ivy file"> <jar jarfile="${lib.dir}/xmlunit-${xmlunit.version}.jar" basedir="${out.dir}" - excludes="**/test_*.class" /> <copy todir="${lib.dir}"> - <fileset dir="src/etc"> + <fileset dir="${src.dir}/etc"> <include name="xmlunit.pom"/> <include name="xmlunit-ivy.xml"/> </fileset> @@ -146,50 +190,59 @@ </copy> </target> - <target name="dist" depends="jar,test,docs"> - <mkdir dir="${dist.dir}"/> - <zip zipfile="${dist.dir}/xmlunit${xmlunit.version}.zip"> - <zipfileset prefix="xmlunit" dir="${basedir}" - includes="**/xmlunit${xmlunit.version}.jar"/> - <zipfileset prefix="xmlunit" dir="${basedir}" - includes="**/*.java,**/*.txt,**/*.xml,**/*.xsl,**/*.dtd,**/*.xsd" - excludes="${out.dir}/*,**/TEST*.xml,bugs/*"/> - <zipfileset prefix="xmlunit" dir="${basedir}" - includes="${docs.dir}/**/*.css,${docs.dir}/**/*.html,${test.dir}/etc/*.html"/> - <zipfileset prefix="xmlunit" dir="${src.dir}/site" - includes="*.pdf,example.html"/> + <target name="bindist" depends="jar,test,docs"> + <zip zipfile="${dist.dir}/xmlunit-${xmlunit.version}-bin.zip"> + <zipfileset prefix="xmlunit-${xmlunit.version}/lib" + dir="${lib.dir}" includes="*.jar"/> + <zipfileset prefix="xmlunit-${xmlunit.version}/docs" + dir="${docs.dir}"/> + <zipfileset prefix="xmlunit-${xmlunit.version}" dir="."> + <include name="KEYS"/> + <include name="LICENSE.txt"/> + <include name="README.txt"/> + </zipfileset> </zip> </target> - <target name="src" depends="clean"> - <property name="dist.name" - value="${ant.project.name}-${xmlunit.version}"/> - <copy todir="${dist.dir}/${dist.name}"> - <fileset dir="${basedir}"> - <include name="${src.dir}/**"/> - <include name="${test.dir}/**"/> - <include name="ISSUES"/> + <target name="srcdist" depends="-init,create-users-guide"> + <zip zipfile="${dist.dir}/xmlunit-${xmlunit.version}-src.zip"> + <zipfileset prefix="xmlunit-${xmlunit.version}" dir="."> + <include name="*.xml"/> + <include name="${src.dir}/"/> + <include name="${test.dir}/"/> + <include name="KEYS"/> <include name="LICENSE.txt"/> <include name="README.txt"/> - <include name="build.xml"/> - <include name="build.properties"/> + </zipfileset> + <zipfileset dir="${userguide.docs.dir}" + prefix="xmlunit-${xmlunit.version}/userguide"/> + </zip> + </target> + + <target name="dist" + depends="clean,bindist,srcdist,compile-userguide-examples" + description="creates the distribution files"> + <checksum algorithm="md5"> + <fileset dir="${dist.dir}"> + <include name="*.zip"/> </fileset> - </copy> - <tar tarfile="${dist.name}-src.tar" basedir="${dist.dir}"> - </tar> - <gzip zipfile="${dist.name}-src.tgz" - src="${dist.name}-src.tar" /> - <delete file="${dist.name}-src.tar" /> + </checksum> + <checksum algorithm="sha1"> + <fileset dir="${dist.dir}"> + <include name="*.zip"/> + </fileset> + </checksum> </target> <target name="compile-userguide-examples" depends="compile"> - <mkdir dir="${build.user.guide}"/> + <mkdir dir="${userguide.out.dir}"/> <javac srcdir="src/user-guide" includes="org/" - destdir="${build.user.guide}" source="1.3" target="1.2"> + destdir="${userguide.out.dir}" source="1.3" target="1.2"> <classpath> <pathelement location="${junit.lib}"/> <pathelement location="${out.dir}"/> </classpath> </javac> + <delete dir="${userguide.out.dir}"/> </target> </project> Added: trunk/xmlunit/docbook.xml =================================================================== --- trunk/xmlunit/docbook.xml (rev 0) +++ trunk/xmlunit/docbook.xml 2007-04-18 15:27:50 UTC (rev 193) @@ -0,0 +1,84 @@ +<project> + <!-- allow overrides --> + <property file="docbook.properties"/> + + <!-- location of Docbook Stylesheets and dblatex --> + <property name="db5.xsl" location="../../docbook/docbook5-xsl-1.72.0"/> + <property name="dblatex" value="/usr/bin/dblatex"/> + + <property name="html.dir" location="${userguide.docs.dir}/html"/> + <property name="user.guide" value="XMLUnit-Java"/> + <property name="src.userguide.dir" value="${src.dir}/user-guide"/> + + <target name="create-users-guide" + depends="users-guide-html,users-guide-pdf" + description="creates PDF and HTML version of User's Guide"/> + + <target name="-html-needs-refresh?"> + <uptodate property="HTML is up-to-date" + srcfile="${src.userguide.dir}/${user.guide}.xml" + targetfile="${html.dir}/index.html"/> + </target> + + <target name="users-guide-html" depends="-html-needs-refresh?" + unless="HTML is up-to-date" + description="Creates HTML version of the User's Guide"> + <delete dir="${html.dir}" quiet="true"/> + <mkdir dir="${html.dir}"/> + <xslt + basedir="${src.userguide.dir}" + destdir="${html.dir}" + style="${db5.xsl}/html/chunk.xsl"> + <include name="${user.guide}.xml"/> + + <param name="section.autolabel" expression="1"/> + <param name="section.label.includes.component.label" expression="1"/> + </xslt> + <copy file="${src.dir}/site/xmlunit.png" toDir="${html.dir}"/> + <delete file="${html.dir}/${user.guide}.html" quiet="true"/> + </target> + + <target name="-check-os"> + <condition property="isWindows"> + <os family="windows"/> + </condition> + </target> + + <target name="-define-dblatex-unix" unless="isWindows" + depends="-check-os"> + <macrodef name="dblatex"> + <attribute name="sourcefile"/> + <sequential> + <apply executable="${dblatex}"> + <fileset file="@{sourcefile}"/> + <globmapper from="*.xml" to="*.pdf"/> + </apply> + </sequential> + </macrodef> + </target> + + <target name="-define-dblatex-cygwin" if="isWindows" + depends="-check-os"> + <macrodef name="dblatex"> + <attribute name="sourcefile"/> + <sequential> + <apply executable="bash.exe" addsourcefile="false"> + <fileset file="@{sourcefile}"/> + <globmapper from="*.xml" to="*.pdf"/> + <arg value="-c"/> + <arg value="${dblatex} @{sourcefile}"/> + </apply> + </sequential> + </macrodef> + </target> + + <target name="-define-dblatex" + depends="-define-dblatex-unix,-define-dblatex-cygwin"/> + + <target name="users-guide-pdf" depends="-define-dblatex" + description="Creates the PDF version of the User's Guide"> + <dblatex sourcefile="${src.userguide.dir}/${user.guide}.xml"/> + <move file="${src.userguide.dir}/${user.guide}.pdf" + todir="${userguide.docs.dir}"/> + </target> +</project> \ No newline at end of file Property changes on: trunk/xmlunit/docbook.xml ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Modified: trunk/xmlunit/src/site/index.html =================================================================== --- trunk/xmlunit/src/site/index.html 2007-04-18 15:27:27 UTC (rev 192) +++ trunk/xmlunit/src/site/index.html 2007-04-18 15:27:50 UTC (rev 193) @@ -62,10 +62,10 @@ </tr> <tr> <td colspan="2"> - <p>The current release is <a + <p>The current stable release is <a href="http://sourceforge.net/project/showfiles.php?group_id=23187&release_id=155097">XMLUnit 1.0</a>, April 2003 (release notes are <a - href="http://xmlunit.svn.sourceforge.net/viewvc/*checkout*/xmlunit/tags/v1_0/xmlunit/README.txt">here</a>)</p> + href="http://xmlunit.svn.sourceforge.net/viewvc/*checkout*/xmlunit/tags/v1_0/xmlunit/README.txt">here</a>), the latest release is XMLUnit 1.1 beta 1 released in April 2007. It can be downloaded from <a href="http://sourceforge.net/project/showfiles.php?group_id=23187">here</a>.</p> <p>XMLUnit for Java provides two JUnit extension classes, <code>XMLAssert</code> and <code>XMLTestCase</code>, and a set of supporting classes (e.g. <code>Diff</code>, <code>DetailedDiff</code>,<code>Transform</code>,<code>SimpleXpathEngine</code>,<code>Validator</code>,<code>NodeTest</code>) @@ -84,9 +84,11 @@ <table border="0" cellspacing="5" cellpadding="5"> <tbody> <tr> - <td><a href="XMLUnit.pdf">Read the overview document (PDF)</a></td> + <td>Read the User's Guide (<a + href="userguide/XMLUnit-Java.pdf">PDF</a> or <a + href="userguide/html/index.html">HTML</a>)</td> <td><a href="example.html">See some example code</a></td> - <td><a href="doc">Browse the Javadocs</a></td> + <td><a href="api/index.html">Browse the Javadocs</a></td> <td><a href="http://xmlunit.svn.sourceforge.net/viewvc/xmlunit/trunk/xmlunit/">Visit the Subversion repository</a> </td> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-18 15:27:29
|
Revision: 192 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=192&view=rev Author: bodewig Date: 2007-04-18 08:27:27 -0700 (Wed, 18 Apr 2007) Log Message: ----------- Don't use deprecated method Modified Paths: -------------- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml trunk/xmlunit/src/user-guide/org/custommonkey/xmlunit/examples/ATourOfXMLUnit.java Modified: trunk/xmlunit/src/user-guide/XMLUnit-Java.xml =================================================================== --- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-18 01:36:07 UTC (rev 191) +++ trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-18 15:27:27 UTC (rev 192) @@ -33,7 +33,7 @@ </revision> <revision> <revnumber>1.1</revnumber> - <date>... 2007</date> + <date>April 2007</date> <revremark>Documentation for XMLUnit Java 1.1</revremark> </revision> </revhistory> @@ -470,7 +470,7 @@ + "<planet name='Earth' position='3' supportsLife='yes'/>" + "<planet name='Venus' position='4'/></solar-system>"; assertXpathExists("//planet[@name='Earth']", mySolarSystemXML); - assertNotXpathExists("//star[@name='alpha centauri']", + assertXpathNotExists("//star[@name='alpha centauri']", mySolarSystemXML); assertXpathsEqual("//planet[@name='Earth']", "//planet[@position='3']", mySolarSystemXML); @@ -1192,6 +1192,13 @@ same child nodes but in a different order.</entry> </row> <row> + <entry><literal>CHILD_NODE_NOT_FOUND_ID</literal></entry> + <entry><literal>CHILD_NODE_NOT_FOUND</literal></entry> + <entry><literal>false</literal></entry> + <entry>A child node in one piece of XML couldn't be + matched against any other node of the other piece.</entry> + </row> + <row> <entry><literal>ATTR_SEQUENCE_ID</literal></entry> <entry><literal>ATTR_SEQUENCE</literal></entry> <entry><literal>true</literal></entry> @@ -1416,6 +1423,11 @@ <literal>String</literal>.</entry> </row> <row> + <entry><literal>CHILD_NODE_NOT_FOUND_ID</literal></entry> + <entry>The name of the unmatched node or + <literal>null</literal>.</entry> + </row> + <row> <entry><literal>ATTR_SEQUENCE_ID</literal></entry> <entry>The attribute's name.</entry> </row> @@ -2995,6 +3007,22 @@ but if you tried to catch these exceptions they will now bypass your catch blocks.</para> </listitem> + + <listitem> + <para>A new type of <literal>Difference</literal> + (<literal>CHILD_NODE_NOT_FOUND_ID</literal>) has been + added. It will be raised for the excess children if the + control element has more child nodes than the test element + - or vice versa.</para> + + <para>Prior to XMLUnit 1.1 a <literal>Difference</literal> + of either <literal>ELEMENT_TAG_NAME_ID</literal> or + <literal>NODE_TYPE_ID</literal> would have been raised if + the control element had more children. The excess + children were compared to the very first child node of the + test element. Excess children of the test element were + not reported at all.</para> + </listitem> </itemizedlist> </section> Modified: trunk/xmlunit/src/user-guide/org/custommonkey/xmlunit/examples/ATourOfXMLUnit.java =================================================================== --- trunk/xmlunit/src/user-guide/org/custommonkey/xmlunit/examples/ATourOfXMLUnit.java 2007-04-18 01:36:07 UTC (rev 191) +++ trunk/xmlunit/src/user-guide/org/custommonkey/xmlunit/examples/ATourOfXMLUnit.java 2007-04-18 15:27:27 UTC (rev 192) @@ -173,7 +173,7 @@ + "<planet name='Earth' position='3' supportsLife='yes'/>" + "<planet name='Venus' position='4'/></solar-system>"; assertXpathExists("//planet[@name='Earth']", mySolarSystemXML); - assertNotXpathExists("//star[@name='alpha centauri']", + assertXpathNotExists("//star[@name='alpha centauri']", mySolarSystemXML); assertXpathsEqual("//planet[@name='Earth']", "//planet[@position='3']", mySolarSystemXML); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-18 01:36:08
|
Revision: 191 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=191&view=rev Author: bodewig Date: 2007-04-17 18:36:07 -0700 (Tue, 17 Apr 2007) Log Message: ----------- Implement new difference type for unmatched nodes Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DetailedDiff.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java 2007-04-17 04:04:57 UTC (rev 190) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceConstants.java 2007-04-18 01:36:07 UTC (rev 191) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -84,6 +84,9 @@ int CHILD_NODELIST_SEQUENCE_ID = 20; /** Comparing 2 Documents only one of which has a doctype */ int HAS_DOCTYPE_DECLARATION_ID = 21; + /** Comparing 2 nodes and one holds more childnodes than can be + * matched against child nodes of the other. */ + int CHILD_NODE_NOT_FOUND_ID = 22; /** Comparing an implied attribute value against an explicit value */ public static final Difference ATTR_VALUE_EXPLICITLY_SPECIFIED = @@ -173,4 +176,9 @@ public static final Difference HAS_DOCTYPE_DECLARATION = new Difference(HAS_DOCTYPE_DECLARATION_ID, "presence of doctype declaration", true); + + /** Comparing 2 nodes and one holds more childnodes than can be + * matched against child nodes of the other. */ + public static final Difference CHILD_NODE_NOT_FOUND = + new Difference(CHILD_NODE_NOT_FOUND_ID, "presence of child node"); } \ No newline at end of file Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java 2007-04-17 04:04:57 UTC (rev 190) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/DifferenceEngine.java 2007-04-18 01:36:07 UTC (rev 191) @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import org.w3c.dom.Attr; @@ -360,6 +361,8 @@ HashMap/*<Node, Node>*/ matchingNodes = new HashMap(); HashMap/*<Node, Integer>*/ matchingNodeIndexes = new HashMap(); + List/*<Node>*/ unmatchedTestNodes = new ArrayList(testChildren); + // first pass to find the matching nodes in control and test docs for (int i=0; i < numNodes; ++i) { Node nextControl = (Node) controlChildren.get(i); @@ -371,12 +374,14 @@ boolean matchFound = false; while (!matchFound) { - if (findNodeType == ((Node)testChildren.get(j)).getNodeType()) { + Node t = (Node) testChildren.get(j); + if (findNodeType == t.getNodeType() + || comparingTextAndCDATA(findNodeType, t.getNodeType())) { matchFound = !matchOnElement || elementQualifier == null || elementQualifier .qualifyForComparison((Element) nextControl, - (Element) testChildren.get(j)); + (Element) t); } if (!matchFound) { ++j; @@ -392,47 +397,38 @@ if (matchFound) { matchingNodes.put(nextControl, testChildren.get(j)); matchingNodeIndexes.put(nextControl, new Integer(j)); + unmatchedTestNodes.remove(testChildren.get(j)); } } // next, do the actual comparision on those that matched - or // match them against the first test nodes that didn't match // any other control nodes - Collection matchingTestNodes = matchingNodes.values(); for (int i=0; i < numNodes; ++i) { Node nextControl = (Node) controlChildren.get(i); Node nextTest = (Node) matchingNodes.get(nextControl); Integer testIndex = (Integer) matchingNodeIndexes.get(nextControl); - if (nextTest == null) { - short findNodeType = nextControl.getNodeType(); - int startAt = ( i > lastTestNode ? lastTestNode : i); - j = startAt; - - boolean matchFound = false; - - while (!matchFound) { - if (((Node) testChildren.get(j)) - .getNodeType() == findNodeType - && !matchingTestNodes.contains(testChildren.get(j))) { - matchFound = true; - } else { - ++j; - if (j > lastTestNode) { - j = 0; - } - if (j == startAt) { - // been through all children - break; - } - } - } - nextTest = (Node) testChildren.get(j); - testIndex = new Integer(j); + if (nextTest == null && !unmatchedTestNodes.isEmpty()) { + nextTest = (Node) unmatchedTestNodes.get(0); + testIndex = new Integer(testChildren.indexOf(nextTest)); + unmatchedTestNodes.remove(0); } + if (nextTest != null) { compareNode(nextControl, nextTest, listener, elementQualifier); compare(new Integer(i), testIndex, nextControl, nextTest, listener, CHILD_NODELIST_SEQUENCE); + } else { + compare(nextControl.getNodeName(), null, nextControl, null, + listener, CHILD_NODE_NOT_FOUND); + } } + + // now handle remaining unmatched test nodes + for (Iterator iter = unmatchedTestNodes.iterator(); iter.hasNext();) { + Node n = (Node) iter.next(); + compare(null, n.getNodeName(), null, n, listener, + CHILD_NODE_NOT_FOUND); + } } /** Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DetailedDiff.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DetailedDiff.java 2007-04-17 04:04:57 UTC (rev 190) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DetailedDiff.java 2007-04-18 01:36:07 UTC (rev 191) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 200, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -110,15 +110,33 @@ DetailedDiff differencesWithWhitespace = new DetailedDiff( new Diff(new InputSource(new FileReader(control)), new InputSource(new FileReader(test))) ); - assertEquals(1402, differencesWithWhitespace.getAllDifferences().size()); + 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(); - assertEquals(40, differences.size()); + 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 = @@ -217,8 +235,9 @@ DetailedDiff diff = new DetailedDiff(new Diff(control, test)); List changes = diff.getAllDifferences(); - // number of children, text of first child - assertEquals(2, changes.size()); + // number of children, text of first child, unexpected second + // test child + assertEquals(3, changes.size()); } protected Diff buildDiff(Document control, Document test) { Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java 2007-04-17 04:04:57 UTC (rev 190) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_DifferenceEngine.java 2007-04-18 01:36:07 UTC (rev 191) @@ -620,7 +620,7 @@ String control = "<stuff><item id=\"1\"/><item id=\"2\"/></stuff>"; String test = "<stuff><?item data?></stuff>"; listenToDifferences(control, test); - assertEquals("13th control xpath", "/stuff[1]/item[2]", + assertEquals("13th control xpath", "/stuff[1]/item[1]", listener.controlXpath); assertEquals("13th test xpath", "/stuff[1]/processing-instruction()[1]", listener.testXpath); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-17 04:04:57
|
Revision: 190 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=190&view=rev Author: bodewig Date: 2007-04-16 21:04:57 -0700 (Mon, 16 Apr 2007) Log Message: ----------- adapt to changes Modified Paths: -------------- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml Modified: trunk/xmlunit/src/user-guide/XMLUnit-Java.xml =================================================================== --- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-17 04:02:14 UTC (rev 189) +++ trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-17 04:04:57 UTC (rev 190) @@ -931,6 +931,26 @@ linkend="Whitespace Handling"/> for more details.</para> </section> + + <section id="XSLT Stylesheet Version"> + <title>XSLT Stylesheet Version</title> + + <para>Some features of XMLUnit use XSLT stylesheets under the + covers, in particular XSLT will be used to strip element + content whitespace or comments as well as by + <literal>SimpleXpathEngine</literal>. These stylesheets only + require a XSLT transformer that supports XSLT 1.0 and will say + so in the <literal>stylesheet</literal> element.</para> + + <para>If your XSLT transformer supports XSLT 2.0 or newer it + may<footnote><para>The W3C recommendation says it + SHOULD.</para></footnote> issue a warning for these stylesheets + which can be annoying. You can use + <literal>XMLUnit.setXSLTVersion</literal> to make XMLUnit + change the version attribute to a different value. Note that + XMLUnit hasn't been tested with a value other than + <literal>"1.0"</literal>.</para> + </section> </section> <section id="Providing Input to XMLUnit"> @@ -2958,6 +2978,11 @@ </listitem> <listitem> + <para>All methods that have been deprecated in XMLUnit 1.0 + have been removed.</para> + </listitem> + + <listitem> <para>All methods that had been declared to throw <literal>TransformerConfigurationException</literal> or <literal>ParserConfigurationException</literal> now no @@ -3012,6 +3037,10 @@ </listitem> <listitem>It is now possible to provide a custom + <literal>org.xml.sax.EntityResolver</literal> for control + and test parsers.</listitem> + + <listitem>It is now possible to provide a custom <literal>javax.xml.transform.URIResolver</literal> for transformations.</listitem> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-17 04:02:13
|
Revision: 189 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=189&view=rev Author: bodewig Date: 2007-04-16 21:02:14 -0700 (Mon, 16 Apr 2007) Log Message: ----------- Make XSLT version used for internal stylesheets configurable Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/SimpleXpathEngine.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/XSLTConstants.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/exceptions/ConfigurationException.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Constants.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Transform.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_XMLUnit.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/SimpleXpathEngine.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/SimpleXpathEngine.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/SimpleXpathEngine.java 2007-04-17 04:02:14 UTC (rev 189) @@ -73,7 +73,7 @@ */ private StringBuffer getXSLTBase() { StringBuffer result = new StringBuffer(XML_DECLARATION) - .append(XSLT_START); + .append(XMLUnit.getXSLTStart()); String tmp = result.toString(); int close = tmp.lastIndexOf('>'); if (close == -1) { Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ***************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -48,6 +48,9 @@ import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -72,19 +75,33 @@ private static boolean normalize = false; private static boolean normalizeWhitespace = false; private static boolean ignoreAttributeOrder = false; + private static String xsltVersion = "1.0"; - private static final String STRIP_WHITESPACE_STYLESHEET + private static final String XSLT_VERSION_START = " version=\""; + private static final String XSLT_VERSION_END = "\">"; + + private static final String STRIP_WHITESPACE_STYLESHEET_START = new StringBuffer(XMLConstants.XML_DECLARATION) - .append(XSLTConstants.XSLT_START) + .append(XSLTConstants.XSLT_START_NO_VERSION) + .append(XSLT_VERSION_START) + .toString(); + + private static final String STRIP_WHITESPACE_STYLESHEET_END + = new StringBuffer(XSLT_VERSION_END) .append(XSLTConstants.XSLT_XML_OUTPUT_NOINDENT) .append(XSLTConstants.XSLT_STRIP_WHITESPACE) .append(XSLTConstants.XSLT_IDENTITY_TEMPLATE) .append(XSLTConstants.XSLT_END) .toString(); - private static final String STRIP_COMMENTS_STYLESHEET + private static final String STRIP_COMMENTS_STYLESHEET_START = new StringBuffer(XMLConstants.XML_DECLARATION) - .append(XSLTConstants.XSLT_START) + .append(XSLTConstants.XSLT_START_NO_VERSION) + .append(XSLT_VERSION_START) + .toString(); + + private static final String STRIP_COMMENTS_STYLESHEET_END + = new StringBuffer(XSLT_VERSION_END) .append(XSLTConstants.XSLT_XML_OUTPUT_NOINDENT) .append(XSLTConstants.XSLT_STRIP_COMMENTS_TEMPLATE) .append(XSLTConstants.XSLT_END) @@ -418,23 +435,33 @@ return newFactory; } + private static String getStripWhitespaceStylesheet() { + return STRIP_WHITESPACE_STYLESHEET_START + getXSLTVersion() + + STRIP_WHITESPACE_STYLESHEET_END; + } + /** - * Obtain the transformation that will strip whitespace from a DOM containing - * empty Text nodes + * Obtain the transformation that will strip whitespace from a DOM + * containing empty Text nodes * @param forDocument * @return a <code>Transform</code> to do the whitespace stripping */ public static Transform getStripWhitespaceTransform(Document forDocument) { - return new Transform(forDocument, STRIP_WHITESPACE_STYLESHEET); + return new Transform(forDocument, getStripWhitespaceStylesheet()); } + private static String getStripCommentsStylesheet() { + return STRIP_COMMENTS_STYLESHEET_START + getXSLTVersion() + + STRIP_COMMENTS_STYLESHEET_END; + } + /** * Obtain the transformation that will strip comments from a DOM. * @param forDocument * @return a <code>Transform</code> to do the whitespace stripping */ public static Transform getStripCommentsTransform(Document forDocument) { - return new Transform(forDocument, STRIP_COMMENTS_STYLESHEET); + return new Transform(forDocument, getStripCommentsStylesheet()); } /** @@ -685,5 +712,43 @@ public static boolean getIgnoreAttributeOrder() { return ignoreAttributeOrder; } + + /** + * Sets the XSLT version to set on stylesheets used internally. + * + * <p>Defaults to "1.0".</p> + * + * @throws ConfigurationException if the argument cannot be parsed + * as a positive number. + */ + public static void setXSLTVersion(String s) { + try { + Number n = NumberFormat.getInstance(Locale.US).parse(s); + if (n.doubleValue() < 0) { + throw new ConfigurationException(s + " doesn't reperesent a" + + " positive number."); + } + } catch (ParseException e) { + throw new ConfigurationException(e); + } + xsltVersion = s; + } + + /** + * The XSLT version set on stylesheets used internally. + * + * <p>Defaults to "1.0".</p> + */ + public static String getXSLTVersion() { + return xsltVersion; + } + + /** + * XSLT stylesheet element using the configured XSLT version. + */ + static String getXSLTStart() { + return XSLTConstants.XSLT_START_NO_VERSION + + XSLT_VERSION_START + getXSLTVersion() + XSLT_VERSION_END; + } } Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XSLTConstants.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XSLTConstants.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XSLTConstants.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -41,34 +41,40 @@ */ public interface XSLTConstants extends XMLConstants { /** - * <xsl:stylesheet> + * <xsl:stylesheet */ - public static final String XSLT_START = - "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"; + String XSLT_START_NO_VERSION = + "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\""; /** + * <xsl:stylesheet ... version="1.0"> + */ + String XSLT_START = + XSLT_START_NO_VERSION + " version=\"1.0\">"; + + /** * <xsl:output> for XML with no indentation */ - public static final String XSLT_XML_OUTPUT_NOINDENT = + String XSLT_XML_OUTPUT_NOINDENT = "<xsl:output method=\"xml\" version=\"1.0\" indent=\"no\"/>"; /** * <xsl:strip-space> for all elements */ - public static final String XSLT_STRIP_WHITESPACE = + String XSLT_STRIP_WHITESPACE = "<xsl:strip-space elements=\"*\"/>"; /** * <xsl:template> to copy the current nodeset into the output tree */ - public static final String XSLT_IDENTITY_TEMPLATE = + String XSLT_IDENTITY_TEMPLATE = "<xsl:template match=\"/\"><xsl:copy-of select=\".\"/></xsl:template>"; /** * <xsl:template> to copy the current nodeset into the * output tree while stripping comments. */ - public static final String XSLT_STRIP_COMMENTS_TEMPLATE = + String XSLT_STRIP_COMMENTS_TEMPLATE = "<xsl:template match=\"node()[not(self::comment())]|@*\">" + "<xsl:copy><xsl:apply-templates select=\"node()[not(self::comment())]|@*\"/></xsl:copy>" + "</xsl:template>"; @@ -76,5 +82,5 @@ /** * </xsl:stylesheet> */ - public static final String XSLT_END = "</xsl:stylesheet>"; + String XSLT_END = "</xsl:stylesheet>"; } Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/exceptions/ConfigurationException.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/exceptions/ConfigurationException.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/exceptions/ConfigurationException.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 2001, Jeff Martin, Tim Bacon +Copyright (c) 2006-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -44,4 +44,7 @@ public ConfigurationException(Throwable t) { super(t != null ? t.getMessage() : null, t); } + public ConfigurationException(String s) { + super(s, null); + } } \ No newline at end of file Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Constants.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Constants.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Constants.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 200, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Transform.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Transform.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_Transform.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 200, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_XMLUnit.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_XMLUnit.java 2007-04-17 03:59:29 UTC (rev 188) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/test_XMLUnit.java 2007-04-17 04:02:14 UTC (rev 189) @@ -1,6 +1,6 @@ /* ****************************************************************** -Copyright (c) 200, Jeff Martin, Tim Bacon +Copyright (c) 2001-2007, Jeff Martin, Tim Bacon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -40,6 +40,7 @@ import junit.framework.TestCase; import junit.framework.TestSuite; +import org.custommonkey.xmlunit.exceptions.ConfigurationException; import org.w3c.dom.Document; import org.xml.sax.EntityResolver; import org.xml.sax.helpers.DefaultHandler; @@ -112,10 +113,26 @@ assertTrue(diff.similar()); } - /** - * Returns a TestSuite containing this test case. - */ - public static TestSuite suite(){ - return new TestSuite(test_XMLUnit.class); + public void testXSLTVersion() { + try { + assertEquals("1.0", XMLUnit.getXSLTVersion()); + assertEquals(XSLTConstants.XSLT_START, XMLUnit.getXSLTStart()); + XMLUnit.setXSLTVersion("2.0"); + assertTrue(XMLUnit.getXSLTStart() + .startsWith(XSLTConstants.XSLT_START_NO_VERSION)); + assertTrue(XMLUnit.getXSLTStart().endsWith("\"2.0\">")); + try { + XMLUnit.setXSLTVersion("foo"); + fail("foo is not a number"); + } catch (ConfigurationException expected) { + } + try { + XMLUnit.setXSLTVersion("-1.0"); + fail("-1.0 is negative"); + } catch (ConfigurationException expected) { + } + } finally { + XMLUnit.setXSLTVersion("1.0"); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-17 03:59:28
|
Revision: 188 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=188&view=rev Author: bodewig Date: 2007-04-16 20:59:29 -0700 (Mon, 16 Apr 2007) Log Message: ----------- remove deprecated methods Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLAssert.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLTestCase.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLAssert.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLAssert.java 2007-04-16 13:06:55 UTC (rev 187) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLAssert.java 2007-04-17 03:59:29 UTC (rev 188) @@ -145,17 +145,6 @@ /** * Assert that the result of an XML comparison is or is not identical - * @param diff the result of an XML comparison - * @param assertion true if asserting that result is identical - * @param msg additional message to display if assertion fails - * @deprecated Use XMLTestCase#assertXMLIdentical(String, Diff, boolean) instead - */ - public static void assertXMLIdentical(Diff diff, boolean assertion, String msg) { - assertXMLIdentical(msg, diff, assertion); - } - - /** - * Assert that the result of an XML comparison is or is not identical * @param msg Message to display if assertion fails * @param diff the result of an XML comparison * @param assertion true if asserting that result is identical Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLTestCase.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLTestCase.java 2007-04-16 13:06:55 UTC (rev 187) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLTestCase.java 2007-04-17 03:59:29 UTC (rev 188) @@ -78,34 +78,6 @@ } /** - * Whether to ignore whitespace in attributes and elements - * @param ignore - * @deprecated this is a global setting and should be invoked on - * {@link XMLUnit#setIgnoreWhitespace XMLUnit} instead - */ - public void setIgnoreWhitespace(boolean ignore){ - XMLUnit.setIgnoreWhitespace(ignore); - } - - /** - * Overide default sax parser used to parser documents - * @deprecated this is a global setting and should be invoked on - * {@link XMLUnit#setControlParser XMLUnit} instead - */ - public void setControlParser(String parser){ - XMLUnit.setControlParser(parser); - } - - /** - * Overide default sax parser used to parse documents - * @deprecated this is a global setting and should be invoked on - * {@link XMLUnit#setTestParser XMLUnit} instead - */ - public void setTestParser(String parser){ - XMLUnit.setTestParser(parser); - } - - /** * Compare XML documents provided by two InputSource classes * @param control Control document * @param test Document to test @@ -191,18 +163,7 @@ /** * Assert that the result of an XML comparison is or is not similar. - * @param diff the result of an XML comparison - * @param assertion true if asserting that result is similar * @param msg additional message to display if assertion fails - * @deprecated Use XMLTestCase#assertXMLEqual(String, Diff, boolean) instead - */ - public void assertXMLEqual(Diff diff, boolean assertion, String msg) { - XMLAssert.assertXMLEqual(msg, diff, assertion); - } - - /** - * Assert that the result of an XML comparison is or is not similar. - * @param msg additional message to display if assertion fails * @param diff the result of an XML comparison * @param assertion true if asserting that result is similar */ @@ -221,17 +182,6 @@ /** * Assert that the result of an XML comparison is or is not identical - * @param diff the result of an XML comparison - * @param assertion true if asserting that result is identical - * @param msg additional message to display if assertion fails - * @deprecated Use XMLTestCase#assertXMLIdentical(String, Diff, boolean) instead - */ - public void assertXMLIdentical(Diff diff, boolean assertion, String msg) { - XMLAssert.assertXMLIdentical(msg, diff, assertion); - } - - /** - * Assert that the result of an XML comparison is or is not identical * @param msg Message to display if assertion fails * @param diff the result of an XML comparison * @param assertion true if asserting that result is identical @@ -925,18 +875,6 @@ /** * Assert that a specific XPath does NOT exist in some given XML * @param inXpathExpression - * @param inXMLString - * @deprecated Use assertXpathNotExists instead - */ - public void assertNotXpathExists(String xPathExpression, - String inXMLString) - throws IOException, SAXException , XpathException { - XMLAssert.assertXpathNotExists(xPathExpression, inXMLString); - } - - /** - * Assert that a specific XPath does NOT exist in some given XML - * @param inXpathExpression * @param inDocument * @see XpathEngine which provides the underlying evaluation mechanism */ @@ -947,18 +885,6 @@ } /** - * Assert that a specific XPath does NOT exist in some given XML - * @param inXpathExpression - * @param inDocument - * @deprecated Use assertXpathNotExists instead - */ - public void assertNotXpathExists(String xPathExpression, - Document inDocument) - throws XpathException { - XMLAssert.assertXpathNotExists(xPathExpression, inDocument); - } - - /** * Assert that a piece of XML contains valid XML: the input must * contain a DOCTYPE declaration to be validated * @param xml Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-16 13:06:55 UTC (rev 187) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/XMLUnit.java 2007-04-17 03:59:29 UTC (rev 188) @@ -280,76 +280,6 @@ } /** - * Compare XML documents provided by two Reader classes. - * @param control Control document - * @param test Document to test - * @return Diff object describing differences in documents - * @throws SAXException - * @throws IOException - * @deprecated use Diff constructor directly - */ - public static Diff compare(Reader control, Reader test) - throws SAXException, IOException { - return new Diff(control, test); - } - - /** - * Compare two XML documents provided by SAX <code>InputSources</code> - * @param control Control document - * @param test Document to test - * @return Diff object describing differences in documents - * @throws SAXException - * @throws IOException - * @deprecated use Diff constructor directly - */ - public static Diff compare(InputSource control, InputSource test) - throws SAXException, IOException { - return new Diff(control, test); - } - - /** - * Compare two XML documents provided by a string and a Reader. - * @param control Control document - * @param test Document to test - * @return Diff object describing differences in documents - * @throws SAXException - * @throws IOException - * @deprecated use Diff constructor directly - */ - public static Diff compare(String control, Reader test) throws SAXException, - IOException { - return new Diff(new StringReader(control), test); - } - - /** - * Compare two XML documents provided by a Reader and a string. - * @param control Control document - * @param test Document to test - * @return Diff object describing differences in documents - * @throws SAXException - * @throws IOException - * @deprecated use Diff constructor directly - */ - public static Diff compare(Reader control, String test) throws SAXException, - IOException { - return new Diff(control, new StringReader(test)); - } - - /** - * Compare two XML documents provided as strings. - * @param control Control document - * @param test Document to test - * @return Diff object describing differences in documents - * @throws SAXException - * @throws IOException - * @deprecated use Diff constructor directly - */ - public static Diff compare(String control, String test) throws SAXException, - IOException { - return new Diff(control, test); - } - - /** * Utility method to build a Document using the control DocumentBuilder * to parse the specified String. * @param fromXML This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-16 13:06:57
|
Revision: 187 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=187&view=rev Author: bodewig Date: 2007-04-16 06:06:55 -0700 (Mon, 16 Apr 2007) Log Message: ----------- Add my GPG key Added Paths: ----------- trunk/xmlunit/KEYS Added: trunk/xmlunit/KEYS =================================================================== --- trunk/xmlunit/KEYS (rev 0) +++ trunk/xmlunit/KEYS 2007-04-16 13:06:55 UTC (rev 187) @@ -0,0 +1,388 @@ +This file contains the PGP keys of various developers. + +Users: pgp < KEYS + gpg --import KEYS +Developers: + pgp -kxa <your name> and append it to this file. + (pgpk -ll <your name> && pgpk -xa <your name>) >> this file. + (gpg --list-sigs <your name> + && gpg --armor --export <your name>) >> this file. + +pub 1024D/5F6B8B72 2001-05-28 +uid Stefan Bodewig <bo...@ap...> +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig <bo...@ap...> +sig 51898504 2002-01-11 Conor MacNeill <co...@co...> +sig 3 F88341D9 2003-03-17 Lars Eilebrecht <la...@ei...> +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) <ke...@ke...> +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 75A67692 2003-03-18 Erik Abele <er...@co...> +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE <pg...@ct...> +sig 3 8103A37E 2003-04-04 Andre Malo <nd...@ap...> +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig <bo...@ap...> +sig D6298F01 2003-04-27 Paulo Henrique Gaspar Jorge <pj...@as...> +sig 0CAA68B4 2004-11-11 Patrick Rentsch <pat...@su...> +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Har...@ha...> +sig 5793498F 2005-07-21 Tim Ellison <ti...@el...> +sig E4136392 2005-07-21 [User ID not found] +sig 8408F755 2005-07-21 Christian Geisert <ch...@ap...> +sig 2 FC243F3C 2005-07-20 Henk P. Penning <pe...@cs...> +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 3 EE65E321 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 3642CB4B 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <co...@Ap...> +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 CC78C893 2005-07-22 Rich Bowen <rb...@rc...> +sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sy...@ap...> +sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fie...@gb...> +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz <bde...@ap...> +sig 3 87315C31 2005-07-23 Rapha\xEBl Luta <rap...@ap...> +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <czi...@ap...> +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <co...@st...> +sig 1CD4861F 2005-07-25 Eran Chinthaka <chi...@ap...> +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <aj...@ap...> +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <cha...@ap...> +sig 152924AF 2005-07-29 Sander Temme <sa...@te...> +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hp...@in...> +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> +sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +uid Stefan Bodewig <ste...@fr...> +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig <bo...@ap...> +sig 3 F88341D9 2003-03-17 Lars Eilebrecht <la...@ei...> +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) <ke...@ke...> +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 75A67692 2003-03-18 Erik Abele <er...@co...> +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE <pg...@ct...> +sig 3 8103A37E 2003-04-04 Andre Malo <nd...@ap...> +sig 51898504 2005-06-21 Conor MacNeill <co...@co...> +sig 0CAA68B4 2004-11-11 Patrick Rentsch <pat...@su...> +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Har...@ha...> +sig 5793498F 2005-07-21 Tim Ellison <ti...@el...> +sig 8408F755 2005-07-21 Christian Geisert <ch...@ap...> +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 3 EE65E321 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 3642CB4B 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <co...@Ap...> +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 CC78C893 2005-07-22 Rich Bowen <rb...@rc...> +sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sy...@ap...> +sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fie...@gb...> +sig 3 87315C31 2005-07-23 Rapha\xEBl Luta <rap...@ap...> +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <czi...@ap...> +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <co...@st...> +sig 1CD4861F 2005-07-25 Eran Chinthaka <chi...@ap...> +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <aj...@ap...> +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <cha...@ap...> +sig 152924AF 2005-07-29 Sander Temme <sa...@te...> +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hp...@in...> +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> +sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +uid Stefan Bodewig <st...@sa...> +sig 3 5F6B8B72 2005-05-31 Stefan Bodewig <bo...@ap...> +sig 51898504 2005-06-21 Conor MacNeill <co...@co...> +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Har...@ha...> +sig 5793498F 2005-07-21 Tim Ellison <ti...@el...> +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 3 EE65E321 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <di...@an...> +sig 3 3642CB4B 2005-07-20 Martin Kraemer <ma...@ap...> +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <co...@Ap...> +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <co...@ph...> +sig 3 CC78C893 2005-07-22 Rich Bowen <rb...@rc...> +sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sy...@ap...> +sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fie...@gb...> +sig 3 87315C31 2005-07-23 Rapha\xEBl Luta <rap...@ap...> +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <czi...@ap...> +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <co...@st...> +sig 1CD4861F 2005-07-25 Eran Chinthaka <chi...@ap...> +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <aj...@ap...> +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <cha...@ap...> +sig 152924AF 2005-07-29 Sander Temme <sa...@te...> +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hp...@in...> +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran <st...@ap...> +sig DE885DD3 2005-11-25 Sander Striker <st...@ap...> +sub 1024g/24774157 2001-05-28 +sig 5F6B8B72 2001-05-28 Stefan Bodewig <bo...@ap...> + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2 (GNU/Linux) + +mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ +5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82 +EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ +nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW +Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm +XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y +LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn +Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV +dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrQjU3RlZmFuIEJv +ZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz6IYgQTEQIAGgULBwoDBAMVAwIDFgIB +AheAAhkBBQI7EiJPABIHZUdQRwABAQkQohFa4V9ri3KPOACfdr6cV41veYBlBHiV +FxfLcX7x5OEAniK4u3g2jpNQH3E0ROubdj/RO+RTiEYEEBECAAYFAjw+1Y8ACgkQ +gQRkT1GJhQSdkgCeM6RDHUF/E334TtiLPgw7GpmNJSkAoNCLQCW/9VHrV+ZHsodn +XUnaD4dIiJkEEwECAAYFAj513wwACgkQPo+38viDQdknZAPlHNiMnR+LUavo2yOY +iJT+W9+8+qNs2grYDZ+WSYujaWT2NJrUCYXQRM6gKDyFlkcJvHI9lF2yYMkVetll +ZVN1TJkeEdtbHncNHcdq+ZUQR0NkFKTF9d1K7UI2rfWxt1y6a13TcUjpJXzbtw/O +XX9EZSI6QQt4rSFlvci9J3mIRgQTEQIABgUCPnXawQAKCRDu0eo5ImHQc0W4AJ9v +uq4wlkc6TmmmZPF/gZVLluHcTgCeItrnvzyS11xkIETk6v4b7K4gaiiIPwMFED51 +qhr9b4jGIdCnGxECRAUAoOaVZW5CdZ9oYr3PwI/i8RJN+JfJAKCmd/XIlYOCpa9Q +c4C855pM8NFw6YhGBBARAgAGBQI+d6QQAAoJEBU/oM11pnaSL+sAn1DTHmbhITeE +w0ZSgyBLQw2ZhcM5AJ0ZrRBbZ9lbgHXBKOJQiLpWBj4XsYhGBBARAgAGBQI+yi6W +AAoJENvSRfyzsqEsF/AAoNXq7Cp/0AwEmWvhoTjmtY6eVYB5AKCMFhBUdYWNXVya +lPTq8ThswNUnr4hGBBMRAgAGBQI+jc4sAAoJEMppOXSBA6N+kUoAn1Nj6YqarQg0 +sL2KrFsQROM3A6fSAKCyl40SpfVJSO33fYuPci9dHp+QCIhXBBMRAgAXBQI7EiJO +BQsHCgMEAxUDAgMWAgECF4AACgkQohFa4V9ri3IsngCfbIpJDWj6UgXY7rBH8To1 +2BgB+RIAn3jw72WJzplAtShVTmuMlRFS+FUNiEYEEBECAAYFAj6sazwACgkQqywx +6dYpjwFkeQCeOkJrnO5r2hWDhX4ACPPLObZvXLIAnR0VHAgkEH1W/t7B4zdDYdBB +Zrd5iEYEEBECAAYFAkGS8mMACgkQ5BNhMwyqaLQs9ACgio5zJcieYLppigvSYLBf +ubUVrXUAnRKZJ6MACpH6fpoz2vkc2dh69tbSiEYEEBECAAYFAkLFMoEACgkQm/Ij +RS/ii88aCQCfd1cIawDqpkYU86f3JEjcN85ntFcAni0m8WR6s+bkh3fd+EIrSRsr +u3uQiEYEEBECAAYFAkLfRQIACgkQQeoJoFeTSY8XxQCdFd+XEWqyDkCx37gaIQAG +4dHpwiUAoOZ/K5OHyTJCNFaBUDtpCh7hL8TPiEYEEBECAAYFAkLfkncACgkQAQVm +vOQTY5L3SgCgiEi5/1vYvJrKoAdl0hRWU57ieUIAn2n08BQfMZJQ439aNW/CnIK8 +jPBPiEYEEBECAAYFAkLgNdAACgkQc84u+4QI91XdNQCgoBB1ebohIflinAPlvI37 +pFHuu0MAoJ4yMtbKZMaq0xIBnxV9c5uu99tGiEYEEhECAAYFAkLerWMACgkQi5Yp +Q/wkPzxD7ACgqKnyeb/fjVS8vov4FePxeLju4msAn1SCGaiF9gEf+qIaZUnjcT7J +DJ96iJwEEwECAAYFAkLerG8ACgkQMaY9luwUC4Ea9gP/WON+0xIWOvWP7mKkg/+X +0ukW+mbjE426qKtG/B0vNrTKpElmz8ttR+oajqbg20LazoEUuA9ZXjLPfsdWA+vF +kxgV6qIdtxYPMamPm7ytEBOmgMowYXUftGteqM5fxLlceHiwdUlynG2fmtMqvPnd +2OCezSFRx3W6nvAiIjoLZpCInAQTAQIABgUCQt7H0wAKCRA34/Rf7mXjIcAUA/4n +DlQbnToSSDOZkFj1CoGL8TjsVgzrO3r3S3x38uQQTFAE/AGBY4mtHgNcYmiJaC2h +N1Y+mlEGu/80Rjv185ZfJsFEerU6Y/9tRJJ1So9AAe5AmvGpD9ysXae5geB+k+ep +IMSuf9WMeTRUCbQs9ufGZLV5a8jqstv+btcrzNaY9oicBBMBAgAGBQJC32x4AAoJ +EJrNPMCpn3XdRBkD/iNi0Y6A3afDG9ZL/K4JrOPgHUFWC/DgAEBme4AY62agUsT0 +uXlz+Mu1Ps2E0t26ejScuVMMvqpXg7iJ2+3yKzsnX0ySEXW6/696XEpe3TFn1iVO +mMElPKxakn3t/jr6SDepo9jqD5P5CJR4GsDsG3iKIisWdDf81ZXpf86y7A5eiEYE +ExECAAYFAkLeuuUACgkQMsnkzjZCy0vmSQCdHGC6jOEVo96yyospTq7bL+EEeioA +oNMKIZy5qFLXXZbSNvsj7mDRg2c8iEYEExECAAYFAkLfbHoACgkQUI6uxTAtpWhY +hQCaAvqVBsTX5s4c+sTOo06BNMdzHIUAoIwpThAKq936Szy/3Gfv8K3gs5NOiEYE +ExECAAYFAkLfbHwACgkQ3bpkuiwxLS9z8ACfYeocOK4J204xwbXgEdUJQyvHK2UA +oKz2AF1I2b8Ebu7vTUZLNFV1QMtwiEYEExECAAYFAkLgyTgACgkQXP03+sx4yJNb +EgCfRcj6QKHVHQtYVXdCYKUbrj97wAoAnimqV15cvz1siDjUK9K/aTskGwajiEYE +ExECAAYFAkLg7MsACgkQybWm7OLXdN8UoQCdFfqef8My1xhn6mLd9WTLLaIewTQA +nRXGh/Af4hVG0KwtZcJEA464nCoJiEYEExECAAYFAkLg7TwACgkQW5aAEOBPmol+ +JwCeLxZjKNisjgP4AxV5BCKR+5SU9NoAoIwPF/7B2NmGNR0t3EZze8wpNhQ0iEYE +ExECAAYFAkLg7V8ACgkQN/aP9QFa/IqerACfafKJi4s8LYV2JxNfQKHgmRXzeIIA +oNBHOzukDCdxIvmYJfamItnCP45giEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDH8 +HwCgq8P29CwMX7PKhRmY3T32APsOaMEAnjdd/WvzVBFtTcJFWkH6iF4L8EQpiEYE +ExECAAYFAkLjVb4ACgkQEy5J1OQe3H56DACcDPfWLO5cDkeKFCvIP8mc4p4KkfkA +oJITROldIRxXqUiML1oTJxieuHJfiEYEExECAAYFAkLjZNoACgkQdcqio/ObN1CI +tACgsJhqBxeZTaSrRVNk3aj6ciAJrgEAoIxPXYTvIpnWBr4/WMbN0jpV0TGEiEYE +EBECAAYFAkLkbxIACgkQjON2uBzUhh/gZQCbBpIqkCEuIbd6tqChz3PzcIGiZbgA +njluBFHl4l1/NHtP9fEYCgl8nbCviEYEEBECAAYFAkLkkr4ACgkQBJE0Quobo42f ++QCgjtO6EOdDRiruCi6gKvwM1a2eRwcAn0XUELm5AZezL5E0rEfIM2FBiMi5iEYE +EBECAAYFAkLlwh0ACgkQYRlqLjM+ToS9pwCfUEgO834XY/clWzkw/VLBfe7MLZQA +mwdz0nleOHYWFBrnYgEz53d4MxUPiEYEEBECAAYFAkLqY/QACgkQsr68QBUpJK/o +MQCfc7M9KpApCWW7eE22PlLoN1sPK+4AoJdwE8TsDM2Pmehk9K+uHIx6FoRviEYE +ExECAAYFAkLj7WcACgkQMoZOQZyFIitClACfWpH0+V/N6vuucWZ7bsMm2BcmM3oA +n3fF5qqovlog4/PcgvKCToNEF8uWiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4YU +ZwCgg7vJpDpUXnuNvgc5RHgG7UYhRQYAoIEKHsrswh6XzVn5yQRkfjdB/A0OiEYE +ExECAAYFAkLlEaQACgkQa3OhBipiP3JA4QCffb8NgQssOQXaVR0dSwPCeU2nQPUA +n15EAjykVZsUi2tZWqEM08SNOKI9iEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWd7 +AQCbBpwyitQ77kd9KIT6y95Im1vmWt8AnAnkNTBctVtMfwddYTG+xLkaOllOiEYE +ExECAAYFAkLnYVAACgkQbpR1lMFSQxqIRACffQqUXTgOa4hyHYQBUwrlGEqmWt4A +nRMXVGhd47loS27MmiEiWwDlkNjJiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdOr +9gCgh2fn26W0DSL5WZATvvQkwZeJNiMAnR6+0AlUK8uFSFIVhl+RZMnY+XFwtCBT +dGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPohfBBMRAgAXBQI7EjmBBQsH +CgMEAxUDAgMWAgECF4AAEgkQohFa4V9ri3IHZUdQRwABAcm6AKDaA//SYJv2pcXw +GBC89OSzGvxy3gCg1kx6qu6zJKaWaE1L9oFqVc65OUSIRgQQEQIABgUCPD7VlQAK +CRCBBGRPUYmFBNCzAJ9tv7tNS6NwaOZQ8cR0pGslJGKtuQCgpttMmhhRrUwyVuEX +c+dKX7rdQMKImQQTAQIABgUCPnXfDwAKCRA+j7fy+INB2Vm6A+IDxiYtMvd/mad+ +7hRoKXvD5AddB1SwnvQdJe0ewStFBYZxZdNOLXdkVngCwAJziPGZcQmocEHVMrN+ +Mxe+3OX0PEZ+3KOOsAUi+fTov2xvf8EWKgX9d0li9iEytVA4M0c52a3bPTC0Kki/ +KAY3m8oNvAmTwWB9dBSooFFDMIhGBBMRAgAGBQI+ddrHAAoJEO7R6jkiYdBzruYA +nAzvTrvDQNvoAoaDQJ+o/ydqMA8ZAJwNEOQDHsz+6ynbMPoQmKmUqfEISIg/AwUQ +PnWqIf1viMYh0KcbEQIkpwCeInf4o3C5Ykh/xBodVImrp2Cvcy8AoMn3me5p4Sl2 +rm2tjVxTJZt2sUr7iEYEEBECAAYFAj53pBoACgkQFT+gzXWmdpIpGgCgiTARP6Cf ++JKOxUaVFr0L9DC5oUcAoIxF7D5mOVK/AFcp1cxNk3BLtdq3iEYEEBECAAYFAj7K +LjIACgkQ29JF/LOyoSwAbACglNp7V2Pw4U575IuooM677bZf8pwAn2U2TcHj7PYp +rU+qYRkyJ3pa7FyyiEYEExECAAYFAj6NzjUACgkQymk5dIEDo35YPwCeJIU/monN +96nP4jJjAuflEXMbemUAoJXq7oVCYuOCqWr/T3VW0DM3W+dniEYEEBECAAYFAkGS +8+sACgkQ5BNhMwyqaLQ2RwCeMcDf4bb+OMjRUJwAk2LHN9th42QAn03fVqMUZEVm +OrVXfWILpjXNLMDIiEYEEBECAAYFAkLFMoYACgkQm/IjRS/ii8/gpQCffXXRCeZf +1Vv5ih70yE2ZXg0r/rsAoJYKsdx0K5aqfoEzyiBCj5I46JvhiGoEMBECACoFAkLh +OBAjHSBUaGlzIHdhcyBhIGpvYiBhZGRyZXNzIGFuZCBJIHF1aXQACgkQohFa4V9r +i3LxGACgiQ+wlaa9iMOue5DuhtyLPMSmuiIAoIkrciYFOf3VBBD0HLWfGVWUqxzR +iEYEEBECAAYFAkLfRQwACgkQQeoJoFeTSY/ndgCfUEQl4Rc5nnu3G4ZX3o4OywbF +7DEAn3Htv1s/on+ei+1mmS6Z/PdwgM7viJwEEwECAAYFAkLerHEACgkQMaY9luwU +C4F1JAP/epJYDZX4flU0sa8AlFtSROY/O6g3iVq5zeYm1WD3e0xOOYTXlkIntkYF +hqbBzZQ3pFYfWmbhzCW/Tc0RigACdmroEELrwyrfLIHvsnUTF7C5AL6SuFQZqG6q +oMjtHFd6KDMos2sDEZ3VXDG1buW+hpHY9rWRJKPzb/SgSetTCeuInAQTAQIABgUC +Qt7H2QAKCRA34/Rf7mXjIaxmBACiYCwxZLtxnaRfwSOBkASqmnS8oBdyIKvTad9d +LE3CziNgEW+AdfE76vQskeDxL3ZVQubhKWiaM4B7YU2nYxk4INVpok1qht9bN1Ps +y+TS3SvpPKqq8Ri8xc4ZPDwdcCcCJiXLy5iR5tx3iBsnHRM5+LMIJg+LiOqd/ZnB +sggjjYicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3XdrMQD/3vFtnKssqT6mB7NOZ08 +Tcw+cC5e9gAVr5Y33X+ZgPe7BJd6uPNt+I97FDdVJOnNtTZSvnkQZ/C79Yoci0yZ +AAoHYlzRb4tXguLy4UDBjj3BlvPsCOKJZrKn7bxvtoTbeHgjHmneiIwCuyzSoA1h +AYxiPliDrwuVCQTudHDVxjl1iEYEExECAAYFAkLeuu0ACgkQMsnkzjZCy0sSYACf +X2gis4g5jep0HjKABAk31byHU0QAoI5294fLHOeIHKLCIdvKm+7gVLn+iEYEExEC +AAYFAkLfbHsACgkQUI6uxTAtpWg6BwCfVQtdTRbNPgQGFqGQSUlBJ459xfYAoLKh +j68YUwZB5VgIeIorpqt9bWR2iEYEExECAAYFAkLfbH0ACgkQ3bpkuiwxLS94SQCg +hB4+5RwGR0ZOyy2xUA4e6ImO6ZQAoIjkWwYRd1Vp9SQoJW5OdSquYSctiEYEExEC +AAYFAkLgyTsACgkQXP03+sx4yJOsAACeKo39hTRNVVyvj5y9ohT9Ye3/C+MAn27a +EKrGgxNbwq50qGxFE+p36j7fiEYEExECAAYFAkLg7MwACgkQybWm7OLXdN8i0ACg +s+aW41FnchB0K/OUdB3t0Lg4i5IAoM+l0PyxS3XJsAwI+JbCm0aR3VA8iEYEExEC +AAYFAkLg7UAACgkQW5aAEOBPmokbqACcC3in6U+mqjSwb67rB5zTY0ThYucAoI4V +7qe0XHTDUwwWOgRo/NzR7k1OiEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDGcDgCg +i5CrpyZ1Dcu0IKML05Ffvw8lPhYAn0nL0BczEo9RpNVYg2ytJ+YtjKUFiEYEExEC +AAYFAkLjVcAACgkQEy5J1OQe3H7q9gCfV5xTyo5SD7G62VSUbjYfeqcuxXwAoKAu +chsMkavYWCt0jBhgLuTJkFqUiEYEExECAAYFAkLjZNsACgkQdcqio/ObN1AdZACg +pUgi5qnnDUpVXhTsJUoo4U485sYAoOXmMbhyaOMH9g9ndYFm5aHPMbf9iEYEEBEC +AAYFAkLkbxQACgkQjON2uBzUhh9ScwCgqFELgIdNWky221EuFgjKzgEG5WoAn3cB +ZbE+PMFhAZyUhQIl2hHEbVJIiEYEEBECAAYFAkLkkscACgkQBJE0Quobo43EoQCf +RCtbvMHoTGmS7dmZ3sRyAj4W7WoAoJDfouy1wZ5tSMJT+XBm5oFtwSUSiEYEEBEC +AAYFAkLlwiAACgkQYRlqLjM+ToRAHwCbBxMHNYyvbYmAb1kTEt8ydF660oYAn3zs +rmZawTXrjvbPE/VpC+/7wpzpiEYEEBECAAYFAkLqY/gACgkQsr68QBUpJK8VgwCf +aCR45JtzFnz0v4jCuooqaFGgH80An2BcoE/psLPTECGRDKE4v7JNADnCiEYEExEC +AAYFAkLj7WoACgkQMoZOQZyFIisbBgCeJjAXLGfz5ahDdgozqDYrbOzxWG8Ani7h +FwwxHFAIe42+OsL6xweRD46fiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4ZbzQCe +MBjFzDvBIFmK5VNIvvcK3ejdDPwAoLzg1ytKCg3A0OebfMX9nr5iQOxwiEYEExEC +AAYFAkLlEaUACgkQa3OhBipiP3JevgCeJGjwezorOSri8IWxMJqTt3tOzkEAoMNZ +CTo3AmcKICFhtdttgcuOZNWAiEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWfg8QCf +dYdGhkb7pBqgFhGn3uJ50+sY/QgAn1PdZCfRtVgdk/JVv35F7fJp5a1CiEYEExEC +AAYFAkLnYVcACgkQbpR1lMFSQxoJggCfQ7Du5ZKb7ooJj6CF+ne77nxVuYgAnjLF +1tZ19A1n+hPaT4A2nmfnW2tRiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdPfvgCf +RhYzSFLrXLaM7hTa3iHktsQE1iUAn01MLep3eEdd3+VNPojrE8FlV+odtCpTdGVm +YW4gQm9kZXdpZyA8c3RlZmFuLmJvZGV3aWdAZnJlZW5ldC5kZT6IXAQTEQIAHAUC +PmiBXAIbAwQLBwMCAxUCAwMWAgECHgECF4AACgkQohFa4V9ri3JPKACfXhFOr4gM +MIQwEGvUb6J/X4asuzIAnje2H9T1r/jSVi1NbIEtQfbpmyQXiJkEEwECAAYFAj51 +3w8ACgkQPo+38viDQdmGkgPnUYJfHlDrQ2jYJWuPDve9n4pV9OvyIllKyLdfULjs +LWXw4Jm+fMQJgWr2GEov1ZYIyS2+rGDZpbz/vxaBVbgqM8TPdiXzxwU8AFq4k+Em +4fKXR58ByLSJjvLLza61spNHJennEUFp3tTpEsr4bNuuaoRYhtiKzTqNuoC+0x+I +RgQTEQIABgUCPnXaxwAKCRDu0eo5ImHQc5lcAJ9FOoAL4uHMuqHXrrxsEVPJvEJ2 +/ACggaOR62EziUqcqpdm/1Zy3P4T22iIPwMFED51qjj9b4jGIdCnGxECWssAoKnk +R63bWGCFDB5YJtfZJ+nQq3TAAKD1bzG/kITQpIHsT2vCY1yBmlWbBYhGBBARAgAG +BQI+d6QaAAoJEBU/oM11pnaS+9IAn0kFlXAzOhhu4r5fglMVuw5bTAd0AKCtYRX2 +ESU/+tsE8vuXWtsMCGeI5YhGBBARAgAGBQI+yi67AAoJENvSRfyzsqEsSccAoKqG +39X2y6xoQa56nviF5iCj/oTFAJwLKx9GyKEUbSM9f/IQ7AsZPhHT54hGBBMRAgAG +BQI+jc41AAoJEMppOXSBA6N+xYgAn1HbGamcXTDYSFjn3U5ik2vQa8nuAKC/uUM0 +1gsdn+71EiAkmrjlH6H9MIhGBBARAgAGBQJCuAqrAAoJEIEEZE9RiYUE0MUAn3cW +FVW03CDuMuA7TSUqTf/eWARWAKC/GjQnPZ0+g7NbDw68ZSY3k8WuuohGBBARAgAG +BQJBkvP5AAoJEOQTYTMMqmi0GIQAn1mpdHz/wV++rSU2Qn7R32slfNdpAKDJPqpn +mcN4MUmk90yZEeHAdJmrhIhGBBARAgAGBQJCxTKGAAoJEJvyI0Uv4ovP3YUAn1z8 +L1EnLdIYttWrT1zs0E89Lz4BAJ4sFzcSq2NO3OZsEQfh9F6CrUe3UohGBBARAgAG +BQJC30UMAAoJEEHqCaBXk0mPIUgAoOF/OCzco+n/3sGJ57m0+aqGLOwjAJ9bC86B +2hRvkaZlGm/ne3TzCgFGnohGBBARAgAGBQJC4DXTAAoJEHPOLvuECPdVsEoAn2hq +8w0JUtfJpu3SmMUkFZLBFm3+AJ48pxmjHXjoBJGpokXw4i9Cfb56BoibBBMBAgAG +BQJC3qxxAAoJEDGmPZbsFAuBGDUD93nHzcDWR6AuDxDvaDp1xR8oJZHojeZ9sWSR +QffiNJKF07vvdjGbygqiWbQmtTM9qBnAxEiBpSpJemBhvGTKivPkb9H88KQe2jqo +wDO3IJorIVMT+eUFB+4pn5c+kFLD/IhG7ohZ2rBIc47L62FFuD19esxvMcVelrBF +q67ZV4KInAQTAQIABgUCQt7H2QAKCRA34/Rf7mXjIY9vBADqrguzlNOJFkWvEkgd +VXCCH2TP3OUuPZ9JQtbJfbkg1nn1hCnMITapNJlEE3yyjB7kEpBkmUtyKv3VSwOD +spfis/ps6zJRIne/2R5xqtT38Hf/sYucoMZUceipFAoCLYOqkKJKwTpYM0401dUp +uxp1y8Lq5N0SDtTW9fKMNs9jioicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3Xdek0E +ANLj3wh2FCukydsfSzqgjFDpkVjiBxbTtCep86flaLMrF3H0idckGCjMUf/JostB +sjwCpL2VlCtvhwl5ZgIzm8luceHupq2iC5hvUN0IjKuIXMLbZP7DE+Lfcvw82nKt +8JNPpjosXiMhysQZms2XfuNP6f/Ey8J5jaB2Z2JCYWJBiEYEExECAAYFAkLeuu0A +CgkQMsnkzjZCy0vBrgCglfCttIxFGqVTLTq/nhPnRFMHX9YAoM4Z05oTuPFxGWS4 +RzxCzCb3vpsAiEYEExECAAYFAkLfbHsACgkQUI6uxTAtpWgipACfTBzbyb7Vc0jr +2FZDiXJFUSBCoEYAnR+ySWmedkcJWESStqRstD8T72mOiEYEExECAAYFAkLfbH0A +CgkQ3bpkuiwxLS/5RACgm88lpYDxy0bYF9/ubFbvqCw6i9YAnjrQoOLRBtQ4QmIP +R+T/9HReOeSciEYEExECAAYFAkLgyTwACgkQXP03+sx4yJNXxQCffoccUBWO51YI +EM0mbsqpnKHtawoAn2xTiDgo3TjtbRJskADuw+QnATQLiEYEExECAAYFAkLg7MwA +CgkQybWm7OLXdN8bPwCfeKtfQWKm8i+KuFJTIoMTvAN65QQAn2A9G1wtEN4Vzg6H +fnTvtgus32rRiEYEExECAAYFAkLg7UAACgkQW5aAEOBPmonAkwCfeF3l1lE2WijQ +F0BmPMfqvkyA2UcAnRQzuc7PWyP0nydGoJvfEUHByVs7iEYEExECAAYFAkLiYm8A +CgkQbZiNF4cxXDEC6gCgqICh/djzt1i6uadJAOztZc/zxl0AnjR1OaM2JxR+wqK3 +loSTEKX1uOpBiEYEExECAAYFAkLjVcAACgkQEy5J1OQe3H7rRwCeJWLmLyPzpg3n +r65j7AxqGRJeDfUAnRT2Oa85dAM02wgdYlj3FejPuNFziEYEExECAAYFAkLjZNsA +CgkQdcqio/ObN1DA+gCeOaeMarEJDPbZjaN3y/Pf5PB/Cv0AoMGPjPSTGt/iHJ2a +Arfyd0ME/R52iEYEEBECAAYFAkLkbxQACgkQjON2uBzUhh+lnQCfVbPGF5UWlzFb +xK+xKmY2DbKXb5wAnjpoAxffSRO1PZlQUHgWlS+NaeCziEYEEBECAAYFAkLkkscA +CgkQBJE0Quobo40fbACgo9YCJXu5Hpoc/SVp3rHCYmTuEMYAoIt2q6rPL/Jbbkik +bRqausEnFstziEYEEBECAAYFAkLlwiAACgkQYRlqLjM+ToRP8wCeOVAIpaG+q9G7 +uJgVCyDZ0JbjjfIAoJgg+NrBfhNeOBuu5mS1PSGDztQ+iEYEEBECAAYFAkLqY/gA +CgkQsr68QBUpJK8HfwCfWgNlYNLBWmn/nejlx0m6NstT2CsAnRdhsusv6RbcKNoV +UudxGG4Xm3nGiEYEExECAAYFAkLj7WoACgkQMoZOQZyFIiv6jQCeMior8Tg4msrR +c+FfXfj5Uln03d4An3RTaHKU+Sv4SgEecXlW0RYlVa6eiEYEExECAAYFAkLlELcA +CgkQUnkvr5l4r4ZC9gCbB5X0rL/DtpGptiNO12DdTQqzsMMAoOWpJFg3W7zAr7al +Vjqlx0t1vS4KiEYEExECAAYFAkLlEaUACgkQa3OhBipiP3LYawCgiuQqhVay7FE8 +e05Za69seQwF4CYAnAxBVNyvXu/1aeAuSi3iC6tywvFoiEYEExECAAYFAkLmmWIA +CgkQaOuMdvjqKWfdbQCdHfDneYM+nWXT/oYOqohamLvk8iQAn1LLJhkLiCMOa9/b +iF24zKt+MjaHiEYEExECAAYFAkLnYVcACgkQbpR1lMFSQxog0ACgp/m7d/NdNP0w +605VyrJWCdogeG8An2E+FpFBQgyvJaD6klzDRNNYLc71iEYEEBECAAYFAkOHn54A +CgkQZjW2wN6IXdNgDgCfUVMGJZV/D1QEdnwrTkRmMb37KR4AnRLDWMsKtq4qKXQj +YbmuLNdHa1EQtCRTdGVmYW4gQm9kZXdpZyA8c3RlZmFuQHNhbWFmbG9zdC5kZT6I +XgQTEQIAHgUCQpxp5QIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCiEVrhX2uL +csktAJ9XkWAsu0zJ293dGa+Yban+Zr1V9ACg3b9Petds6ebqQZoiHRopckbbOLqI +RgQQEQIABgUCQrgKqwAKCRCBBGRPUYmFBP0VAKCPH0b7S+TylV1uBuYcYnWIb/RJ +zwCeJvRTMPnWNjVz+CVOvVzJTH4ol5mIRgQQEQIABgUCQsUyhgAKCRCb8iNFL+KL +z3iqAKCXRZWdGjBVbj3IBFl3kvh3xF2gsgCcD3H79mbVDRNMxpGArFQ1hqQFzleI +RgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjzHQAJ9IfkjKkiEuFxUhznsghAQ8bsBW +nACgoT0kWSB3iUepLIDoWhhGtDIS5FSInAQTAQIABgUCQt6scQAKCRAxpj2W7BQL +gebOBACAFFpEKETO3ZHbjMnPogACNr6EZCQxzGTIXrXSyWQs68VcH54wUOA4yk3c +GpfH2pgAxYjaHejTJRvDKvGrPGlKHgCZFy4+wHzo17pW9J1aKk2sUWlT67snDVdM +un/i8WxD9yz299cXR6iCxPfP2HIMEqbsxWJaXITo7drWSjO35YicBBMBAgAGBQJC +3sfZAAoJEDfj9F/uZeMhRawEAM9wfn9sBIsFzQRQbAO+ll83f8ki++A4Anj6DXQ4 +xRmClUxqahL1BjxxeQhE+Qomq1IebDJr0Se34XB0g3J7bzr/i9QmEwEqnDJfWVob +v1Ugjy+1jzErlZBhm8hnCI+zPnrWKLk0n78vzJ5RrnVaTTV+OW5r4rdVZ86yKYHt +pVSoiJwEEwECAAYFAkLfbHkACgkQms08wKmfdd0HDQP8DDD+1FQU8PPPe+Kuf2bJ +OO7Ycrej4JF1I/Gbs2HH3xXgOZsRv6WJ41M/ovxJLYrpVqQA2YF/Gxwguwrf4lPk ++4spFdabguiJK0d2/KZAtnLsjIzdYcoY01IKGT3xkPwIDErNFSmxX6bKCUePcFNH +YZ6dDBHFFcYVTsdo/wbAe6aIRgQTEQIABgUCQt6wsgAKCRD9b4jGIdCnG30UAKDC +xsPZksKIcvj7tbHQEwm+PV5+DwCg7PorUCgIvTIWnID8zRWDBG4ACXaIRgQTEQIA +BgUCQt667QAKCRAyyeTONkLLS/d2AJwM7BQIQgqLA0qA75R2EjHFXQKZWACgo7ia +ANHxIRc/Nw19j8CxNbWJRJ6IRgQTEQIABgUCQt9sewAKCRBQjq7FMC2laIx3AJsF +0Hjrm4N21EwdrmhS9PHKQL2KdgCgjlus2GyuCzafgb9JHVhBDrhelkmIRgQTEQIA +BgUCQt9sfQAKCRDdumS6LDEtL7MWAKC6rQU6ZjSS6gVnwswutaqBwfwtvwCgv2mM +GJf2hnYVaNNqV5WIFAuycmOIRgQTEQIABgUCQuDJOwAKCRBc/Tf6zHjIk9TlAJ9d +bM2HowI5oD6hGSnADhI2dKfBrQCg4O9WtFiRzLqC1TgCAsbigqy+JDiIRgQTEQIA +BgUCQuDszAAKCRDJtabs4td0311pAJ9L3yUe7GUeDqMzd3WLWatclf7ruQCeOenA +9nhyKgHASeEK/ZXQXDDBW0uIRgQTEQIABgUCQuDtQAAKCRBbloAQ4E+aibNVAJ4w +nAfcA/rtUs3+Hu9nNn8ar/2Q5wCfe6W+k9yHjd7hZWnYHdnCkAZkOMeIRgQTEQIA +BgUCQuJibwAKCRBtmI0XhzFcMezQAKCnk+So0Anm4kLDwl+srHvIB7b6jACgqROB +N5MeEGXQm+Gan2VSt+nvTZ+IRgQTEQIABgUCQuNVwAAKCRATLknU5B7cflR0AKCT +AlfhPFwHPXnBo+5IROopwNQnsQCgh2vHS9VRZRt5I9isNDaNf1biCQmIRgQTEQIA +BgUCQuNk2wAKCRB1yqKj85s3UK9XAKCELi7ymxtLxdwYfdfV3dxd63mV2wCgjgaU +lQqFXjx5mXnRsgy4S6cS9yuIRgQQEQIABgUCQuRvFAAKCRCM43a4HNSGH5/sAJ9J +VHMVwBwHD8PN3DQq8hHEumn8twCfVQSXooNY2P744K+8k6lLO8nOH6GIRgQQEQIA +BgUCQuSSxwAKCRAEkTRC6hujjb+qAJ0Z+AoGDYe122wRAOYAKayl9f9e0QCeKeto +ll6NZ+Rm/NKbFJGP6fYywIuIRgQQEQIABgUCQuXCIAAKCRBhGWouMz5OhDd7AJ40 +l37cLZcSxfPt3M7/aOPgVGpa5wCfciaEynzuHDfIQD/vtXrZb2m0+NeIRgQQEQIA +BgUCQupj+AAKCRCyvrxAFSkkrwQsAJwM8IqtXQk/TBiQi6Fyq/HHm5/zvACg5atZ +V8F+r7jVRhT1SJ+FaVsaQDiIRgQTEQIABgUCQuPtagAKCRAyhk5BnIUiKwuyAJwO +ljL2++fVQ0BSKRvFSvS+fSu3KACeJxsOhbyCd3o3rqwaVeY5FFi+Fm+IRgQTEQIA +BgUCQuUQtwAKCRBSeS+vmXivhv0OAJ0Sg/UEnB/IAoqjHzKoBivCMYDtrQCfVY3I +DKRHbbLNfWBSDERWCTpHXtiIRgQTEQIABgUCQuURpQAKCRBrc6EGKmI/cqGBAKDE +gTewzt6TjmCkI9RrYjF46a9H4wCeJPh4bmTymcfwRGn60h0a9Mz1mKaIRgQTEQIA +BgUCQuaZYgAKCRBo64x2+OopZ3lEAJ9w4EWAgRUMxf0Ud1zoygYDQedAgQCeJPHS +bk62Ej11NljNGN1zdwzRHuSIRgQTEQIABgUCQudhVwAKCRBulHWUwVJDGkOfAKCg +QM+50dTktJDaDd8gVOGBKRiSIgCgkT9gdtDac0m9s2IHAqktk0mc0U+IRgQQEQIA +BgUCQ4efngAKCRBmNbbA3ohd05uvAKCjMnn4GpnZhjWFS7iN0LIXgxm5PwCfYodj +KF5zSbIROx79dJ41Gg0/VxW0KFN0ZWZhbiBCb2Rld2lnIDxzdGVmYW4uYm9kZXdp +Z0BlcG9zdC5kZT6IdwQwEQIANwUCQsVK6jAdIEkgbm8gbG9uZ2VyIGhhdmUgYWNj +ZXNzIHRvIHRoYXQgZW1haWwgYWRkcmVzcy4ACgkQohFa4V9ri3LW7wCdEc6hdCr0 +94a8LG+chTd+OzGxfFUAnR3FvtuG8sv367Knk0ybMnpOM/4hiEYEEBECAAYFAj53 +pBoACgkQFT+gzXWmdpL1ewCeOSe7lOufhc3mfTXs7eSvqECt89oAn0VM+YgQHbfd +Vp32YE7Ht6N6GPf0iJkEEwECAAYFAj513w8ACgkQPo+38viDQdkP7QPmPZXPi7m6 +wRiLofsTlHCbBrR+ehWoSSqCmHQjN1DGRtamGE6X8QbMIttD+NLp+uTx8j/E0sGU +dPnWkky6fwt1f3AYeoAgCXNvPoewsC6mZn3FMdEo6vJc43FmhsUfumOtunvGNBnX +dM8GSCJ+RBS/ASMjRrECF12/14xwgyyIVwQTEQIAFwUCPD7aNgULBwoDBAMVAwID +FgIBAheAAAoJEKIRWuFfa4tys/4AoND5QhEdyVIypBvCUHv5SCaAKcd/AKDFthtZ +TrjF+eEYlktPLRtI9zjeE4hGBBMRAgAGBQI+jc41AAoJEMppOXSBA6N+jAIAoIcA +eCIKt2QBPnAthnUk4DhlmM7FAKCA0Iz9ZutXGb2l+p8s7hhF3+Y9L4hGBBMRAgAG +BQI+ddrHAAoJEO7R6jkiYdBzi84AnRddvByuDodl5KaCSdpe6k9aYkLqAJoC/ud2 +8X0M478KlmacVVjb+PqzBIg/AwUQPnWqLv1viMYh0KcbEQJ6DwCff918LRigFUyE +vYj04C12so87JNUAn0RNFw+P1/SR9Mr/JQmOzJVhlwdriEYEEBECAAYFAkLFMoYA +CgkQm/IjRS/ii8+wZwCfRvfW6NyBoAp7oS9ILRHNYh2GbhsAnRYGs1hSaGK4rGxm +/fmqxj+DvqI2uQENBDsSIlQQBADNUpZLxCuTKzJ1tMm7b/XjAhvPYKiL3doAZ6XA +LBdLF/nQmlh1jcuRy93QWpPxtwSfPjcwJLHy+Uq5tC1SnH1YwYhviLG1KEsniUBr +oUmV2HJyHP92fFI3LPk3xbqxvLh1NXFpzSuWjGMA66sZqeEbtMy2B8OLRwQShdHI +BWgrIwADBQP+PWkmbg2mraaUmgTswre8CGArBgcV+WYm6yaq9IC1G4V1PXmlswms +DlsAr6UDdJU46GFZMIi2WmFJHarEkIBwFN44ypSLmiEVwKRJE2/CYO0f7zQHcF6G +USwQo2TxneahrZyHs7GdvpcRcfm0YnlC/H1CJ3pl8FpfHttzzIrIJviITgQYEQIA +BgUCOxIiVAASCRCiEVrhX2uLcgdlR1BHAAEBDTIAoJ3NtpI/E345LVOruElFKrnd +uWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== +=95C5 +-----END PGP PUBLIC KEY BLOCK----- Property changes on: trunk/xmlunit/KEYS ___________________________________________________________________ Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-14 16:31:22
|
Revision: 186 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=186&view=rev Author: bodewig Date: 2007-04-14 09:31:23 -0700 (Sat, 14 Apr 2007) Log Message: ----------- copy DifferenceListener Delegate in Prototype constructor Modified Paths: -------------- trunk/xmlunit/build.xml trunk/xmlunit/src/java/org/custommonkey/xmlunit/Diff.java Modified: trunk/xmlunit/build.xml =================================================================== --- trunk/xmlunit/build.xml 2007-04-14 16:18:35 UTC (rev 185) +++ trunk/xmlunit/build.xml 2007-04-14 16:31:23 UTC (rev 186) @@ -35,7 +35,7 @@ </target> <target name="clean" depends="init"> - <delete includeEmptyDirs="true" > + <delete includeEmptyDirs="true" quiet="true"> <fileset dir="${out.dir}" includes="**/*.class"/> <fileset dir="${test.report.dir}" includes="**/TEST*.*"/> <fileset dir="${dist.dir}"/> Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/Diff.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/Diff.java 2007-04-14 16:18:35 UTC (rev 185) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/Diff.java 2007-04-14 16:31:23 UTC (rev 186) @@ -81,7 +81,7 @@ private boolean haltComparison = false; private StringBuffer messages; private DifferenceEngine differenceEngine; - private DifferenceListener differenceListenerDelegate; + private DifferenceListener differenceListenerDelegate; private ElementQualifier elementQualifierDelegate; /** @@ -166,6 +166,7 @@ protected Diff(Diff prototype) { this(prototype.controlDoc, prototype.testDoc, prototype.differenceEngine, prototype.elementQualifierDelegate); + this.differenceListenerDelegate = prototype.differenceListenerDelegate; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2007-04-14 16:18:34
|
Revision: 185 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=185&view=rev Author: bodewig Date: 2007-04-14 09:18:35 -0700 (Sat, 14 Apr 2007) Log Message: ----------- complete user's guide Modified Paths: -------------- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml Modified: trunk/xmlunit/src/user-guide/XMLUnit-Java.xml =================================================================== --- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-14 16:16:11 UTC (rev 184) +++ trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-04-14 16:18:35 UTC (rev 185) @@ -39,7 +39,7 @@ </revhistory> </articleinfo> - <section><title>A Tour of XMLUnit</title> + <section id="A Tour of XMLUnit"><title>A Tour of XMLUnit</title> <para>This first section contains a tour through XMLUnit's features, the next sections will cover them in more detail.</para> @@ -49,7 +49,7 @@ XMLUnit, but not the only one. XMLUnit's features can be fully used without any dependency on JUnit at all.</para> - <section><title>What is XMLUnit?</title> + <section id="What is XMLUnit?"><title>What is XMLUnit?</title> <para>XMLUnit enables JUnit-style assertions to be made about the content and structure of XML<footnote id="more on @@ -71,7 +71,7 @@ generate and the message that the system actually generated. And that was the beginning of XMLUnit.</para> </section> - <section><title>Quick tour</title> + <section id="Quick Tour"><title>Quick tour</title> <para>XMLUnit provides a single JUnit extension class, <literal>XMLTestCase</literal>, and a set of supporting classes @@ -103,7 +103,7 @@ class).</para> </section> - <section><title>Glossary</title> + <section id="Glossary"><title>Glossary</title> <para>As with many projects some words in XMLUnit have particular meanings so here is a quick overview. A @@ -126,7 +126,7 @@ unrecoverable differences</emphasis> between them.</para> </section> - <section id="configuring-intro"><title>Configuring XMLUnit</title> + <section id="Configuring XMLUnit"><title>Configuring XMLUnit</title> <para>There are many Java XML parsers available, and XMLUnit should work with any JAXP compliant parser library, such as @@ -174,7 +174,8 @@ </section> - <section><title>Writing XML comparison tests</title> + <section id="Writing XML comparison tests"> + <title>Writing XML comparison tests</title> <para>Let's say we have two pieces of XML that we wish to compare and assert that they are equal. We could write a simple @@ -191,7 +192,7 @@ String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>"; String myTestXML = "<msg><localId>2376</localId></msg>"; assertXMLEqual("Comparing test xml to control xml", - myControlXML, myTestXML); + myControlXML, myTestXML); } }]]></programlisting></example> @@ -232,9 +233,9 @@ "<struct><boolean>false</boolean><int>3</int></struct>"; Diff myDiff = new Diff(myControlXML, myTestXML); assertTrue("XML similar " + myDiff.toString(), - myDiff.similar()); + myDiff.similar()); assertTrue("XML identical " + myDiff.toString(), - myDiff.identical()); + myDiff.identical()); }]]></programlisting></example> <para>This test fails as two pieces of XML are similar but not @@ -318,7 +319,7 @@ Diff myDiff = new Diff(myControlXML, myTestXML); myDiff.overrideDifferenceListener(myDifferenceListener); assertTrue("test XML matches control skeleton XML", - myDiff.similar()); + myDiff.similar()); }]]></programlisting></example> <para>The <literal>DifferenceEngine</literal> class generates @@ -376,7 +377,7 @@ </section> - <section id="transform-intro"> + <section id="Comparing XML Transformations"> <title>Comparing XML Transformations</title> <para>XMLUnit can test XSL transformations at a high level using @@ -422,7 +423,7 @@ </section> - <section><title>Validation Tests</title> + <section id="Validation Tests"><title>Validation Tests</title> <para>XML parsers that validate a piece of XML against a DTD are common, however they rely on a DTD reference being present in @@ -450,11 +451,11 @@ <para>Starting with XMLUnit 1.1, the <literal>Validator</literal> class can also validate against one or more XML Schema definitions. See <xref - linkend="validating-schema"/> for details.</para> + linkend="XML Schema Validation"/> for details.</para> </section> - <section><title>Xpath Tests</title> + <section id="Xpath Tests"><title>Xpath Tests</title> <para>One of the strengths of XML is the ability to programmatically extract specific parts of a document using @@ -557,7 +558,7 @@ </section> - <section id="intro-nodetest"> + <section id="Testing by Tree Walking"> <title>Testing by Tree Walking</title> <para>The DOM specification allows a <literal>Document</literal> @@ -657,9 +658,10 @@ </section> </section> - <section id="Using"><title>Using XMLUnit</title> + <section id="Using XMLUnit"> + <title>Using XMLUnit</title> - <section id="requirements"> + <section id="Requirements"> <title>Requirements</title> <para>XMLUnit requires a JAXP compliant XML parser virtually @@ -691,7 +693,7 @@ <literal>XMLAssert</literal> classes.</para> </section> - <section id="using-plain"> + <section id="Basic Usage"> <title>Basic Usage</title> <para>XMLUnit consists of a few classes all living in the @@ -705,7 +707,8 @@ found in the more specific sections later in this document.</para> - <section><title>Comparing Pieces of XML</title> + <section id="Basic: Comparing Pieces of XML"> + <title>Comparing Pieces of XML</title> <para>Heart and soul of XMLUnit's comparison engine is <literal>DifferenceEngine</literal> but most of the time you @@ -717,11 +720,11 @@ of options on the <literal>XMLUnit</literal> class.</para> <para>More information is available in <xref - linkend="Comparing"/>.</para> + linkend="Comparing Pieces of XML"/>.</para> </section> - <section><title>Validating</title> + <section id="Basic: Validating"><title>Validating</title> <para>All validation happens in the <literal>Validator</literal> class. The default is to @@ -733,11 +736,11 @@ affect validation.</para> <para>More information is available in <xref - linkend="Validating"/>.</para> + linkend="Validating XML Documents"/>.</para> </section> - <section><title>XSLT Transformations</title> + <section id="XSLT Transformations"><title>XSLT Transformations</title> <para>The <literal>Transform</literal> class provides an easy to use layer on top of JAXP's transformations. An instance of @@ -751,7 +754,7 @@ There is no detailed sections on transformations since they are really only a different way to create input for the rest of XMLUnit's machinery. Examples can be found in <xref - linkend="transform-intro"/>.</para> + linkend="Comparing XML Transformations"/>.</para> <para>It is possible to provide a custom <literal>javax.xml.transform.URIResolver</literal> via the @@ -761,7 +764,7 @@ <literal>XMLUnit.getTransformerFactory</literal>.</para> </section> - <section> + <section id="XPath Engine"> <title>XPath Engine</title> <para>The central piece of XMLUnit's XPath support is the @@ -794,10 +797,10 @@ <literal>String</literal>s.</para> <para>More information is available in <xref - linkend="XPath"/>.</para> + linkend="XPath Tests"/>.</para> </section> - <section> + <section id="Basic: DOM Tree Walking"> <title>DOM Tree Walking</title> <para>To test pieces of XML by traversing the DOM tree you use @@ -809,11 +812,11 @@ own.</para> <para>More information is available in <xref - linkend="NodeTest"/>.</para> + linkend="DOM Tree Walking"/>.</para> </section> </section> - <section id="junit3"> + <section id="Using XMLUnit With JUnit 3.x"> <title>Using XMLUnit With JUnit 3.x</title> <para>Initially XMLUnit was tightly coupled to JUnit and the @@ -839,7 +842,7 @@ </section> - <section id="common-config"> + <section id="Common Configuration Options"> <title>Common Configuration Options</title> <section id="JAXP"> @@ -852,7 +855,7 @@ since the versions shipping with some JDKs are known to contain serious bugs.</para> - <para>As described in <xref linkend="configuring-intro"/> + <para>As described in <xref linkend="Configuring XMLUnit"/> there are two main approaches to choose the XML parser of XSLT transformer: System properties and setters in the <literal>XMLUnit</literal> class.</para> @@ -888,7 +891,7 @@ </section> - <section id="entityresolver"> + <section id="EntityResolver"> <title><literal>EntityResolver</literal></title> <para>You can provide a custom @@ -900,7 +903,7 @@ <literal>setControlEntityResolver</literal> as well.</para> </section> - <section id="element-content-whitespace"> + <section id="Basic: Element Content Whitespace"> <title>Element Content Whitespace</title> <para>Element content whitespace - also known as ignorable @@ -925,12 +928,12 @@ validation by default. It does have an effect when comparing pieces of XML, though, since the same flag is used for a different purpose as well in that case. See <xref - linkend="comparing-config"/> for more details.</para> + linkend="Whitespace Handling"/> for more details.</para> </section> </section> - <section id="input-choices"> + <section id="Providing Input to XMLUnit"> <title>Providing Input to XMLUnit</title> <para>Most methods in XMLUnit that expect a piece of XML as @@ -990,9 +993,10 @@ </section> - <section id="Comparing"><title>Comparing Pieces of XML</title> + <section id="Comparing Pieces of XML"> + <title>Comparing Pieces of XML</title> - <section id="comparing-basics"> + <section id="The Difference Engine"> <title>The Difference Engine</title> <para>At the center of XMLUnit's support for comparisons is the @@ -1002,7 +1006,7 @@ classes (see <xref linkend="Diff"/>).</para> <para>The <literal>DifferenceEngine</literal> walks two trees of - DOM <literal>Node</literal>s, the control and the test tree and + DOM <literal>Node</literal>s, the control and the test tree, and compares the nodes. Whenever it detects a difference, it sends a message to a configured <literal>DifferenceListener</literal> (see <xref linkend="DifferenceListener"/>) and asks a @@ -1025,15 +1029,16 @@ <para>A <literal>Difference</literal> can be recoverable; recoverable <literal>Difference</literal>s make the - <literal>Diff</literal> class consider the two pieces of XML - similar while non-recoverable <literal>Difference</literal>s - render the two pieces different.</para> + <literal>Diff</literal> class consider two pieces of XML similar + while non-recoverable <literal>Difference</literal>s render the + two pieces different.</para> - <para>The following types of <literal>Difference</literal>s are - currently detected (the first two columns refer to the - <literal>DifferenceConstants</literal> class):</para> + <para>The types of <literal>Difference</literal>s that are + currently detected are listed in <xref linkend="docleveldiff"/> + to <xref linkend="otherdiff"/> (the first two columns refer to + the <literal>DifferenceConstants</literal> class).</para> - <table frame="all" rules="all" pgwide="1"> + <table frame="all" rules="all" pgwide="1" id="docleveldiff"> <title>Document level <literal>Difference</literal>s detected by <literal>DifferenceEngine</literal></title> <tgroup cols="4"> @@ -1046,7 +1051,7 @@ <row> <entry><literal>ID</literal></entry> <entry><literal>Constant</literal></entry> - <entry><literal>revoverable</literal></entry> + <entry><literal>recoverable</literal></entry> <entry align="center">Description</entry> </row> </thead> @@ -1068,16 +1073,16 @@ root element.</entry> </row> <row> + <entry><literal>DOCTYPE_PUBLIC_ID_ID</literal></entry> <entry><literal>DOCTYPE_PUBLIC_ID</literal></entry> - <entry><literal>DOCTYPE_PUBLIC_ID</literal></entry> <entry><literal>false</literal></entry> <entry>Both pieces of XML contain a DOCTYPE declaration but the declarations specify different PUBLIC identifiers.</entry> </row> <row> + <entry><literal>DOCTYPE_SYSTEM_ID_ID</literal></entry> <entry><literal>DOCTYPE_SYSTEM_ID</literal></entry> - <entry><literal>DOCTYPE_SYSTEM_ID</literal></entry> <entry><literal>true</literal></entry> <entry>Both pieces of XML contain a DOCTYPE declaration but the declarations specify different SYSTEM @@ -1088,7 +1093,10 @@ <entry><literal>NODE_TYPE</literal></entry> <entry><literal>false</literal></entry> <entry>The test piece of XML contains a different type - of node than was expected.</entry> + of node than was expected. This type of difference will + also occur if either the root control or test + <literal>Node</literal> is <literal>null</literal> while + the other is not.</entry> </row> <row> <entry><literal>NAMESPACE_PREFIX_ID</literal></entry> @@ -1108,7 +1116,7 @@ </tgroup> </table> - <table frame="all" rules="all" pgwide="1"> + <table frame="all" rules="all" pgwide="1" id="elementleveldiff"> <title>Element level <literal>Difference</literal>s detected by <literal>DifferenceEngine</literal></title> <tgroup cols="4"> @@ -1121,7 +1129,7 @@ <row> <entry><literal>ID</literal></entry> <entry><literal>Constant</literal></entry> - <entry><literal>revoverable</literal></entry> + <entry><literal>recoverable</literal></entry> <entry align="center">Description</entry> </row> </thead> @@ -1168,13 +1176,20 @@ <entry><literal>ATTR_SEQUENCE</literal></entry> <entry><literal>true</literal></entry> <entry>The attributes on an element appear in different - order in the two pieces of XML.</entry> + order<footnote><para>Note that the order of attributes + is not significant in XML, different parsers may return + attributes in a different order even if parsing the same + XML document. There is an option to turn this check off + - see <xref linkend="Comparing: Configuration"/> - but it is on + by default for backwards compatibility + reasons</para></footnote> in the two pieces of + XML.</entry> </row> </tbody> </tgroup> </table> - <table frame="all" rules="all" pgwide="1"> + <table frame="all" rules="all" pgwide="1" id="attributeleveldiff"> <title>Attribute level <literal>Difference</literal>s detected by <literal>DifferenceEngine</literal></title> @@ -1188,7 +1203,7 @@ <row> <entry><literal>ID</literal></entry> <entry><literal>Constant</literal></entry> - <entry><literal>revoverable</literal></entry> + <entry><literal>recoverable</literal></entry> <entry align="center">Description</entry> </row> </thead> @@ -1198,10 +1213,14 @@ <entry><literal>ATTR_VALUE_EXPLICITLY_SPECIFIED_ID</literal></entry> <entry><literal>ATTR_VALUE_EXPLICITLY_SPECIFIED</literal></entry> <entry><literal>true</literal></entry> - <entry>An attribute that is not required and has a - default value according to the content model of the - element in question has been specified explicitly in one - piece of XML but not in the other.</entry> + <entry>An attribute that has a default value according + to the content model of the element in question has been + specified explicitly in one piece of XML but not in the + other.<footnote><para>In order for this difference to be + detected the parser must have been in validating mode + when the piece of XML was parsed and the DTD or XML + Schema must have been available.</para></footnote></entry> + </row> <row> <entry><literal>ATTR_NAME_NOT_FOUND_ID</literal></entry> @@ -1221,7 +1240,7 @@ </tgroup> </table> - <table frame="all" rules="all" pgwide="1"> + <table frame="all" rules="all" pgwide="1" id="otherdiff"> <title>Other <literal>Difference</literal>s detected by <literal>DifferenceEngine</literal></title> @@ -1235,7 +1254,7 @@ <row> <entry><literal>ID</literal></entry> <entry><literal>Constant</literal></entry> - <entry><literal>revoverable</literal></entry> + <entry><literal>recoverable</literal></entry> <entry align="center">Description</entry> </row> </thead> @@ -1281,12 +1300,556 @@ </tgroup> </table> - <para>Note that some of the listed differences may be ignored by + <para>Note that some of the differences listed may be ignored by the <literal>DifferenceEngine</literal> if certain configuration options have been specified. See <xref - linkend="comparing-config"/> for details.</para> + linkend="Comparing: Configuration"/> for details.</para> + + <para><literal>DifferenceEngine</literal> passes differences + found around as instances of the <literal>Difference</literal> + class. In addition to the type of of difference this class also + holds information on the nodes that have been found to be + different. The nodes are described by + <literal>NodeDetail</literal> instances that encapsulate the DOM + <literal>Node</literal> instance as well as the XPath expression + that locates the <literal>Node</literal> inside the given piece + of XML. <literal>NodeDetail</literal> also contains a "value" + that provides more information on the actual values that have + been found to be different, the concrete interpretation depends + on the type of difference as can be seen in <xref + linkend="diffvalue"/>.</para> + + <table frame="all" rules="all" pgwide="0" id="diffvalue"> + <title>Contents of <literal>NodeDetail.getValue()</literal> + for <literal>Difference</literal>s</title> + + <tgroup cols="2"> + <colspec colname="id" align="center"/> + <colspec colname="value" align="left"/> + + <thead> + <row> + <entry><literal>Difference.getId()</literal></entry> + <entry align="center"><literal>NodeDetail.getValue()</literal></entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>HAS_DOCTYPE_DECLARATION_ID</literal></entry> + <entry><literal>"not null"</literal> if the document has + a DOCTYPE declaration, <literal>"null"</literal> + otherwise.</entry> + </row> + <row> + <entry><literal>DOCTYPE_NAME_ID</literal></entry> + <entry>The name of the root element.</entry> + </row> + <row> + <entry><literal>DOCTYPE_PUBLIC_ID</literal></entry> + <entry>The PUBLIC identifier.</entry> + </row> + <row> + <entry><literal>DOCTYPE_SYSTEM_ID</literal></entry> + <entry>The SYSTEM identifier.</entry> + </row> + <row> + <entry><literal>NODE_TYPE_ID</literal></entry> + <entry>If one node was absent: <literal>"not + null"</literal> if the node exists, + <literal>"null"</literal> otherwise. If the node types + differ the value will be a string-ified version of + <literal>org.w3c.dom.Node.getNodeType()</literal>.</entry> + </row> + <row> + <entry><literal>NAMESPACE_PREFIX_ID</literal></entry> + <entry>The Namespace prefix.</entry> + </row> + <row> + <entry><literal>NAMESPACE_URI_ID</literal></entry> + <entry>The Namespace URI.</entry> + </row> + <row> + <entry><literal>ELEMENT_TAG_NAME_ID</literal></entry> + <entry>The tag name with any Namespace information + stripped.</entry> + </row> + <row> + <entry><literal>ELEMENT_NUM_ATTRIBUTES_ID</literal></entry> + <entry>The number of attributes present turned into a + <literal>String</literal>.</entry> + </row> + <row> + <entry><literal>HAS_CHILD_NODES_ID</literal></entry> + <entry><literal>"true"</literal> if the element has + child nodes, <literal>"false"</literal> + otherwise.</entry> + </row> + <row> + <entry><literal>CHILD_NODELIST_LENGTH_ID</literal></entry> + <entry>The number of child nodes present turned into a + <literal>String</literal>.</entry> + </row> + <row> + <entry><literal>CHILD_NODELIST_SEQUENCE_ID</literal></entry> + <entry>The sequence number of this child node turned into a + <literal>String</literal>.</entry> + </row> + <row> + <entry><literal>ATTR_SEQUENCE_ID</literal></entry> + <entry>The attribute's name.</entry> + </row> + <row> + <entry><literal>ATTR_VALUE_EXPLICITLY_SPECIFIED_ID</literal></entry> + <entry><literal>"true"</literal> if the attribute has + been specified, <literal>"false"</literal> + otherwise.</entry> + </row> + <row> + <entry><literal>ATTR_NAME_NOT_FOUND_ID</literal></entry> + <entry>The attribute's name or <literal>null</literal>.</entry> + </row> + <row> + <entry><literal>ATTR_VALUE_ID</literal></entry> + <entry>The attribute's value.</entry> + </row> + <row> + <entry><literal>COMMENT_VALUE_ID</literal></entry> + <entry>The actual comment.</entry> + </row> + <row> + <entry><literal>PROCESSING_INSTRUCTION_TARGET_ID</literal></entry> + <entry>The processing instruction's target.</entry> + </row> + <row> + <entry><literal>PROCESSING_INSTRUCTION_DATA_ID</literal></entry> + <entry>The processing instruction's data.</entry> + </row> + + <row> + <entry><literal>CDATA_VALUE_ID</literal></entry> + <entry>The content of the CDATA section.</entry> + </row> + <row> + <entry><literal>TEXT_VALUE_ID</literal></entry> + <entry>The actual text.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>As said in the first paragraph you won't deal with + <literal>DifferenceEngine</literal> directly in most cases. In + cases where <literal>Diff</literal> or + <literal>DetailedDiff</literal> don't provide what you need + you'd create an instance of <literal>DifferenceEngine</literal> + passing a <literal>ComparisonController</literal> in the + constructor and invoke <literal>compare</literal> with your DOM + trees to compare as well as a + <literal>DifferenceListener</literal> and + <literal>ElementQualifier</literal>. The listener will be + called on any differences while the <literal>control</literal> + method is executing.</para> + + <example> + <title>Using <literal>DifferenceEngine</literal> + Directly</title> + <programlisting language="Java"><![CDATA[ +class MyDifferenceListener implements DifferenceListener { + private boolean calledFlag = false; + public boolean called() { return calledFlag; } + + public int differenceFound(Difference difference) { + calledFlag = true; + return RETURN_ACCEPT_DIFFERENCE; + } + + public void skippedComparison(Node control, Node test) { + } +} + +DifferenceEngine engine = new DifferenceEngine(myComparisonController); +MyDifferenceListener listener = new MyDifferenceListener(); +engine.compare(controlNode, testNode, listener, + myElementQualifier); +System.err.println("There have been " + + (listener.called() ? "" : "no ") + + "differences."); +]]></programlisting></example> </section> + <section id="ComparisonController"> + <title><literal>ComparisonController</literal></title> + + <para>The <literal>ComparisonController</literal>'s job is to + decide whether a comparison should be halted after a difference + has been found. Its interface is:</para> + + <programlisting language="Java"><![CDATA[ + /** + * Determine whether a Difference that the listener has been notified of + * should halt further XML comparison. Default behaviour for a Diff + * instance is to halt if the Difference is not recoverable. + * @see Difference#isRecoverable + * @param afterDifference the last Difference passed to <code>differenceFound</code> + * @return true to halt further comparison, false otherwise + */ + boolean haltComparison(Difference afterDifference); +]]></programlisting> + + <para>Whenever a difference has been detected by the + <literal>DifferenceEngine</literal> the + <literal>haltComparison</literal> method will be called + immediately after the <literal>DifferenceListener</literal> has + been informed of the difference. This is true no matter what + type of <literal>Difference</literal> has been found or which + value the <literal>DifferenceListener</literal> has + returned.</para> + + <para>The only implementations of + <literal>ComparisonController</literal> that ship with XMLUnit + are <literal>Diff</literal> and <literal>DetailedDiff</literal>, + see <xref linkend="Diff"/> for details about them.</para> + + <para>A <literal>ComparisonController</literal> that halted the + comparison on any non-recoverable difference could be + implemented as:</para> + + <example> + <title>A Simple + <literal>ComparisonController</literal></title> + <programlisting language="Java"><![CDATA[ +public class HaltOnNonRecoverable implements ComparisonController { + public boolean haltComparison(Difference afterDifference) { + return !afterDifference.isRecoverable(); + } +} +]]></programlisting></example> + </section> + + <section id="DifferenceListener"> + <title><literal>DifferenceListener</literal></title> + + <para><literal>DifferenceListener</literal> contains two + callback methods that are invoked by the + <literal>DifferenceEngine</literal> when differences are + detected:</para> + + <programlisting language="Java"><![CDATA[ + /** + * Receive notification that 2 nodes are different. + * @param difference a Difference instance as defined in {@link + * DifferenceConstants DifferenceConstants} describing the cause + * of the difference and containing the detail of the nodes that + * differ + * @return int one of the RETURN_... constants describing how this + * difference was interpreted + */ + int differenceFound(Difference difference); + + /** + * Receive notification that a comparison between 2 nodes has been skipped + * because the node types are not comparable by the DifferenceEngine + * @param control the control node being compared + * @param test the test node being compared + * @see DifferenceEngine + */ + void skippedComparison(Node control, Node test); +]]></programlisting> + + <para><literal>differenceFound</literal> is invoked by + <literal>DifferenceEngine</literal> as soon as a difference has + been detected. The return value of that method is completely + ignored by <literal>DifferenceEngine</literal>, it becomes + important when used together with <literal>Diff</literal>, + though (see <xref linkend="Diff"/>). The return value should be + one of the three constants defined in the the + <literal>DifferenceListener</literal> interface:</para> + + <programlisting language="Java"><![CDATA[ + /** + * Standard return value for the <code>differenceFound</code> method. + * Indicates that the <code>Difference</code> is interpreted as defined + * in {@link DifferenceConstants DifferenceConstants}. + */ + int RETURN_ACCEPT_DIFFERENCE; + /** + * Override return value for the <code>differenceFound</code> method. + * Indicates that the nodes identified as being different should be + * interpreted as being identical. + */ + int RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; + /** + * Override return value for the <code>differenceFound</code> method. + * Indicates that the nodes identified as being different should be + * interpreted as being similar. + */ + int RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; +]]></programlisting> + + <para>The <literal>skippedComparison</literal> method is + invoked if the <literal>DifferenceEngine</literal> encounters + two <literal>Node</literal>s it cannot compare. Before invoking + <literal>skippedComparison</literal> + <literal>DifferenceEngine</literal> will have invoked + <literal>differenceFound</literal> with a + <literal>Difference</literal> of type + <literal>NODE_TYPE</literal>.</para> + + <para>A custom <literal>DifferenceListener</literal> that + ignored any DOCTYPE related differences could be written + as:</para> + + <example> + <title>A <literal>DifferenceListener</literal> that Ignores + DOCTYPE Differences</title> + <programlisting language="Java"><![CDATA[ +public class IgnoreDoctype implements DifferenceListener { + private static final int[] IGNORE = new int[] { + DifferenceConstants.HAS_DOCTYPE_DECLARATION_ID, + DifferenceConstants.DOCTYPE_NAME_ID, + DifferenceConstants.DOCTYPE_PUBLIC_ID_ID, + DifferenceConstants.DOCTYPE_SYSTEM_ID_ID + }; + + static { + Arrays.sort(IGNORE); + } + + public int differenceFound(Difference difference) { + return Arrays.binarySearch(IGNORE, difference.getId()) >= 0 + ? RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL + : RETURN_ACCEPT_DIFFERENCE; + } + + public void skippedComparison(Node control, Node test) { + } +} +]]></programlisting></example> + + <para>Apart from <literal>Diff</literal> and + <literal>DetailedDiff</literal> XMLUnit ships with an additional + implementation of <literal>DifferenceListener</literal>.</para> + + <section id="IgnoreTextAndAttributeValuesDifferenceListener"> + <title><literal>IgnoreTextAndAttributeValuesDifferenceListener</literal></title> + + <para><literal>IgnoreTextAndAttributeValuesDifferenceListener</literal> + doesn't do anything in <literal>skippedComparison</literal>. + It "downgrades" <literal>Difference</literal>s of type + <literal>ATTR_VALUE</literal>, + <literal>ATTR_VALUE_EXPLICITLY_SPECIFIED</literal> and + <literal>TEXT_VALUE</literal> to recoverable + differences.</para> + + <para>This means if instances of + <literal>IgnoreTextAndAttributeValuesDifferenceListener</literal> + are used together with <literal>Diff</literal> then two pieces + of XML will be considered similar if they have the same basic + structure. They are not considered identical, though.</para> + + <para>Note that the list of ignored differences doesn't cover + all textual differences. You should configure XMLUnit to + ignore comments and whitespace and to consider CDATA sections + and text nodes to be the same (see <xref + linkend="Comparing: Configuration"/>) in order to cover + <literal>COMMENT_VALUE</literal> and + <literal>CDATA_VALUE</literal> as well.</para> + + </section> + </section> + + <section id="ElementQualifier"> + <title><literal>ElementQualifier</literal></title> + + <para>When <literal>DifferenceEngine</literal> encounters a list + of DOM <literal>Element</literal>s as children of another + <literal>Element</literal> it will ask the configured + <literal>ElementQualifier</literal> which + <literal>Element</literal> of the control piece of XML should be + compared to which of the test piece. Its contract is:</para> + + <programlisting language="Java"><![CDATA[ + /** + * Determine whether two elements are comparable + * @param control an Element from the control XML NodeList + * @param test an Element from the test XML NodeList + * @return true if the elements are comparable, false otherwise + */ + boolean qualifyForComparison(Element control, Element test); +]]></programlisting> + + <para>For any given <literal>Element</literal> in the control + piece of XML <literal>DifferenceEngine</literal> will cycle + through the corresponding list of <literal>Element</literal>s in + the test piece of XML until + <literal>qualifyForComparison</literal> has returned + <literal>true</literal> or the test document is + exhausted.</para> + + <para>When using <literal>DifferenceEngine</literal> or + <literal>Diff</literal> it is completely legal to set the + <literal>ElementQualifier</literal> to <literal>null</literal>. + In this case any kind of <literal>Node</literal> is compared to + the test <literal>Node</literal> that appears at the same + position in the sequence.</para> + + <example id="eq-nodelist-example"> + <title>Example Nodes for <literal>ElementQualifier</literal> + (the comments are not part of the example)</title> + <programlisting language="XML"><![CDATA[ +<!-- control piece of XML --> +<parent> + <child1/> <!-- control node 1 --> + <child2/> <!-- control node 2 --> + <child2 foo="bar">xyzzy</child2> <!-- control node 3 --> + <child2 foo="baz"/> <!-- control node 4 --> +</parent> + +<!-- test piece of XML --> +<parent> + <child2 foo="baz"/> <!-- test node 1 --> + <child1/> <!-- test node 2 --> + <child2>xyzzy</child2> <!-- test node 3 --> + <child2 foo="bar"/> <!-- test node 4 --> +</parent> +]]></programlisting></example> + + <para>Taking <xref linkend="eq-nodelist-example"/> without any + <literal>ElementQualifier</literal> + <literal>DifferenceEngine</literal> will compare control node + <literal>n</literal> to test node <literal>n</literal> for + <literal>n</literal> between 1 and 4. In many cases this is + exactly what is desired, but sometimes + <literal><![CDATA[<a><b/><c/></a>]]></literal> should be similar + to <literal><![CDATA[<a><c/><b/></a>]]></literal> because the + order of elements doesn't matter - this is when you'd use a + different <literal>ElementQualifier</literal>. XMLUnit ships + with several implementations.</para> + + <section id="ElementNameQualifier"> + <title><literal>ElementNameQualifier</literal></title> + + <para>Only <literal>Element</literal>s with the same name - + and Namespace URI if present - qualify.</para> + + <para>In <xref linkend="eq-nodelist-example"/> this means + control node 1 will be compared to test node 2. Then control + node 2 will be compared to test node 3 because + <literal>DifferenceEngine</literal> will start to search for + the matching test <literal>Element</literal> at the second + test node, the same sequence number the control node is at. + Control node 3 is compared to test node 3 as well and control + node 4 to test node 4.</para> + </section> + + <section id="ElementNameAndAttributeQualifier"> + <title><literal>ElementNameAndAttributeQualifier</literal></title> + + <para>Only <literal>Element</literal>s with the same name - + and Namespace URI if present - as well as the same values for + all attributes given in + <literal>ElementNameAndAttributeQualifier</literal>'s + constructor qualify.</para> + + <para>Let's say <literal>"foo"</literal> has been passed to + <literal>ElementNameAndAttributeQualifier</literal>'s + constructor when looking at <xref + linkend="eq-nodelist-example"/>. This again means control + node 1 will be compared to test node 2 since they do have the + same name and no value at all for attribute + <literal>"foo"</literal>. Then control node 2 will be + compared to test node 3 - again, no value for + <literal>"foo"</literal>. Control node 3 is compared to test + node 4 as they have the same value <literal>"bar"</literal>. + Finally control node 4 is compared to test node 1; here + <literal>DifferenceEngine</literal> searches from the + beginning of the test node list after test node 4 didn't + match.</para> + + <para>There are three constructors in + <literal>ElementNameAndAttributeQualifier</literal>. The + no-arg constructor creates an instance that compares all + attributes while the others will compare a single attribute or + a given subset of all attributes.</para> + </section> + + <section id="ElementNameAndTextQualifier"> + <title><literal>ElementNameAndTextQualifier</literal></title> + + <para>Only <literal>Element</literal>s with the same name - + and Namespace URI if present - as well as the same text + content nested into them qualify.</para> + + <para>In <xref linkend="eq-nodelist-example"/> this means + control node 1 will be compared to test node 2 since they both + don't have any nested text at all. Then control node 2 will + be compared to test node 4. Control node 3 is compared to + test node 3 since they have the same nested text and control + node 4 to test node 4.</para> + </section> + + <section id="MultiLevelElementNameAndTextQualifier"> + <title><literal>org.custommonkey.xmlunit.examples.MultiLevelElementNameAndTextQualifier</literal></title> + + <para>All <literal>ElementQualifier</literal>s seen so far + only looked at the <literal>Element</literal>s themselves and + not at the structure nested into them at a deeper level. A + frequent user question has been which + <literal>ElementQualifier</literal> should be used if the + pieces of XML in <xref linkend="htmltable"/> should be + considered similar.</para> + + <example id="htmltable"> + <title>Example for + <literal>MultiLevelElementNameAndTextQualifier</literal> + (the comments are not part of the example)</title> + <programlisting language="HTML"><![CDATA[ +<!-- control --> +<table> + <tr> <!-- control row 1 --> + <td>foo</td> + </tr> + <tr> <!-- control row 2 --> + <td>bar</td> + </tr> +</table> + +<!-- test --> +<table> + <tr> <!-- test row 1 --> + <td>bar</td> + </tr> + <tr> <!-- test row 2 --> + <td>foo</td> + </tr> +</table> +]]></programlisting></example> + + <para>At first glance + <literal>ElementNameAndTextQualifier</literal> should work but + it doesn't. When <literal>DifferenceEngine</literal> + processed the children of <literal>table</literal> it would + compare control row 1 to test row 1 since both + <literal>tr</literal> elements have the same name and both + have no textual content at all.</para> + + <para>What is needed in this case is an + <literal>ElementQualifier</literal> that looks at the element's + name, as well as the name of the first child element and the + text nested into that first child element. This is what + <literal>MultiLevelElementNameAndTextQualifier</literal> does. + <literal>MultiLevelElementNameAndTextQualifier</literal>'s + constructor expects a single argument which is the nesting + level of the expected text. If you use an argument of 1, + <literal>MultiLevelElementNameAndTextQualifier</literal> is + identical to <literal>ElementNameAndTextQualifier</literal>. + In <xref linkend="htmltable"/> a value of 2 would be + needed.</para> + </section> + + </section> + <section id="Diff"> <title><literal>Diff</literal> and <literal>DetailedDiff</literal></title> @@ -1301,34 +1864,319 @@ is what <literal>Diff</literal> does) and finding all differences between them (this is what <literal>DetailedDiff</literal> does).</para> - </section> - <section id="ElementQualifier"> - <title><literal>ElementQualifier</literal></title> - </section> + <para><literal>DetailedDiff</literal> is a subclass of + <literal>Diff</literal> and can only be constructed by creating + a <literal>Diff</literal> instance first.</para> - <section id="DifferenceListener"> - <title><literal>DifferenceListener</literal></title> - </section> + <para>The major difference between them is their implementation + of the <literal>ComparisonController</literal> interface: + <literal>DetailedDiff</literal> will never stop the comparison + since it wants to collect all differences. + <literal>Diff</literal> in turn will halt the comparison as soon + as the first <literal>Difference</literal> is found that is not + recoverable. In addition <literal>DetailedDiff</literal> + collects all <literal>Difference</literal>s in a list and + provides access to it.</para> - <section id="ComparisonController"> - <title><literal>ComparisonController</literal></title> + <para>By default <literal>Diff</literal> will consider two + pieces of XML as identical if no differences have been found at + all, similar if all differences that have been found have been + recoverable (see <xref linkend="docleveldiff"/> to <xref + linkend="otherdiff"/>) and different as soon as any + non-recoverable difference has been found.</para> + + <para>It is possible to specify a + <literal>DifferenceListener</literal> to <literal>Diff</literal> + using the <literal>overrideDifferenceListener</literal> method. + In this case each <literal>Difference</literal> will be + evaluated by the passed in + <literal>DifferenceListener</literal>. By returning + <literal>RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL</literal> the + custom listener can make <literal>Diff</literal> ignore the + difference completely. Likewise any + <literal>Difference</literal> for which the custom listener + returns + <literal>RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR</literal> will + be treated as if the <literal>Difference</literal> was + recoverable.</para> + + <para>There are several overloads of the <literal>Diff</literal> + constructor that allow you to specify your piece of XML in many + ways. There are overloads that accept additional + <literal>DifferenceEngine</literal> and + <literal>ElementQualifier</literal> arguments. Passing in a + <literal>DifferenceEngine</literal> of your own is the only way + to use a <literal>ComparisonController</literal> other than + <literal>Diff</literal>.</para> + + <para>Note that <literal>Diff</literal> and + <literal>DetailedDiff</literal> use + <literal>ElementNameQualifier</literal> as their default + <literal>ElementQualifier</literal>. This is different from + <literal>DifferenceEngine</literal> which defaults to no + <literal>ElementQualifier</literal> at all.</para> + + <para>To use a custom <literal>ElementQualifier</literal> you + can also use the <literal>overrideElementQualifier</literal> + method. Use this with an argument of <literal>null</literal> to + unset the default <literal>ElementQualifier</literal> as + well.</para> + + <para>To compare two pieces of XML you'd create a + <literal>Diff</literal> instance from those two pieces and + invoke <literal>identical</literal> to check that there have + been no differences at all and <literal>similar</literal> to + check that any difference, if any, has been recoverable. If the + pieces are identical they are also similar. Likewise if they + are not similar they can't be identical either.</para> + + <example> + <title>Comparing Two Pieces of XML Using + <literal>Diff</literal></title> + <programlisting language="Java"><![CDATA[ +Diff d = new Diff("<a><b/><c/></a>", "<a><c/><b/></a>"); +assertFalse(d.identical()); // CHILD_NODELIST_SEQUENCE Difference +assertTrue(d.similar()); +]]></programlisting></example> + + <para>The result of the comparison is cached in + <literal>Diff</literal>, repeated invocations of + <literal>identical</literal> or <literal>similar</literal> will + not reevaluate the pieces of XML.</para> + + <para><literal>DetailedDiff</literal> provides only a single + constructor that expects a <literal>Diff</literal> as argument. + Don't use <literal>DetailedDiff</literal> if all you need to + know is whether two pieces of XML are identical/similar - use + <literal>Diff</literal> directly since its short-cut + <literal>ComparisonController</literal> implementation will save + time in this case.</para> + + <example> + <title>Finding All Differences Using + <literal>DetailedDiff</literal></title> + <programlisting language="Java"><![CDATA[ +Diff d = new Diff("<a><b/><c/></a>", "<a><c/><b/></a>"); +DetailedDiff dd = new DetailedDiff(d); +dd.overrideElementQualifier(null); +assertFalse(dd.similar()); +List l = dd.getAllDifferences(); +assertEquals(2, l.size()); // expected <b/> but was <c/> and vice versa +]]></programlisting></example> + </section> - <section id="comparing-junit3"> + <section id="Comparing: JUnit 3"> <title>JUnit 3.x Convenience Methods</title> + + <para><literal>XMLAssert</literal> and + <literal>XMLTestCase</literal> contain quite a few overloads of + methods for comparing two pieces of XML.</para> + + <para>The method's names use the word <literal>Equal</literal> + to mean the same as <literal>similar</literal> in the + <literal>Diff</literal> class (or throughout this guide). So + <literal>assertXMLEqual</literal> will assert that only + recoverable differences have been encountered where + <literal>assertXMLNotEqual</literal> asserts that some + differences have been non-recoverable. + <literal>assertXMLIdentical</literal> asserts that there haven't + been any differences at all while + <literal>assertXMLNotIdentical</literal> asserts that there have + been differences (recoverable or not).</para> + + <para>Most of the overloads of <literal>assertXMLEqual</literal> + just provide different means to specify the pieces of XML as + <literal>String</literal>s, <literal>InputSource</literal>s, + <literal>Reader</literal>s<footnote><para>See <xref + linkend="Providing Input to XMLUnit"/> for some advice on choosing your input + format.</para></footnote> or <literal>Document</literal>s. For each + method there is a version that takes an additional + <literal>err</literal> argument which is used to create the + message if the assertion fails.</para> + + <para>If you don't need any control over the + <literal>ElementQualifier</literal> or + <literal>DifferenceListener</literal> used by + <literal>Diff</literal> these methods will save some boilerplate + code. If <literal>CONTROL</literal> and <literal>TEST</literal> + are pieces of XML represented as one of the supported inputs + then</para> + + <programlisting language="Java"><![CDATA[ +Diff d = new Diff(CONTROL, TEST); +assertTrue("expected pieces to be similar, " + d.toString(), + d.similar()); +]]></programlisting> + + <para>and</para> + + <programlisting language="Java"><![CDATA[ +assertXMLEqual("expected pieces to be similar", CONTROL, TEST); +]]></programlisting> + + <para>are equivalent.</para> + + <para>If you need more control over the <literal>Diff</literal> + instance there is a version of <literal>assertXMLEqual</literal> + (and <literal>assertXMLIdentical</literal>) that accepts a + <literal>Diff</literal> instance as its argument as well as a + <literal>boolean</literal> indicating whether you expect the + <literal>Diff</literal> to be <literal>similar</literal> + (<literal>identical</literal>) or not.</para> + + <para><literal>XMLTestCase</literal> contains a couple of + <literal>compareXML</literal> methods that really are only + shortcuts to <literal>Diff</literal>'s constructors.</para> + + <para>There is no way to use <literal>DifferenceEngine</literal> + or <literal>DetailedDiff</literal> directly via the convenience + methods.</para> + </section> - <section id="comparing-config"> + <section id="Comparing: Configuration"> <title>Configuration Options</title> + + <para>Unless you are using <literal>Document</literal> or + <literal>DOMSource</literal> overrides when specifying your + pieces of XML, XMLUnit will use the configured XML parsers (see + <xref linkend="JAXP"/>) and <literal>EntityResolver</literal>s + (see <xref linkend="EntityResolver"/>). There configuration + options to use different settings for the control and test + pieces of XML.</para> + + <para>In addition some of the other configuration settings may + lead to XMLUnit using the configured XSLT transformer (see <xref + linkend="JAXP"/>) under the covers.</para> + + <section id="Whitespace Handling"> + <title>Whitespace Handling</title> + + <para>Two different configuration options affect how XMLUnit + treats whitespace in comparisons:</para> + + <itemizedlist> + + <listitem>Element Content Whitespace (see <xref + linkend="Basic: Element Content Whitespace"/>) + + <para>If XMLUnit has been configured to ignore element + content whitespace it will trim any text nodes found by + the parser. This means that there won't appear to be any + textual content in element <literal><foo></literal> + for the following example. If you don't set + <literal>XMLUnit.setIgnoreWhitespace</literal> there would + be textual content consisting of a new line + character.</para> + + <programlisting language="XML"><![CDATA[ +<foo> +</foo> +]]></programlisting> + + <para>At the same time the following two + <literal><foo></literal> elements will be considered + identical if the option has been enabled, though.</para> + + <programlisting language="XML"><![CDATA[ +<foo>bar</foo> +<foo> bar </foo> +]]></programlisting> + + <para>When this option is set to <literal>true</literal>, + <literal>Diff</literal> will use the XSLT transformer + under the covers.</para> + </listitem> + + <listitem>"Normalizing" Whitespace + + <para>If you set + <literal>XMLUnit.setNormalizeWhitespace</literal> to true + then XMLUnit will replace any kind of whitespace found in + character content with a SPACE character and collapse + consecutive whitespace characters to a single SPACE. It + will also trim the resulting character content on both + ends.</para> + + <para>The following two <literal><foo></literal> + elements will be considered identical if the option has + been set:</para> + + <programlisting language="XML"><![CDATA[ +<foo>bar baz</foo> +<foo> bar + baz</foo> +]]></programlisting> + + <para>Note that this is not related to "normalizing" the + document as a whole (see <xref + linkend="Normalizing Documents"/>).</para> + + </listitem> + + </itemizedlist> + </section> + + <section id="Normalizing Documents"> + <title>"Normalizing" <literal>Document</literal>s</title> + + <para>"Normalize" in this context corresponds to the + <literal>normalize</literal> method in DOM's + <literal>Document</literal> class. It is the process of + merging adjacent <literal>Text</literal> nodes and is not + related to "normalizing whitespace" as described in the + previous section.</para> + + <para>Usually you don't need to care about this option since + the XML parser is required to normalize the + <literal>Document</literal> when creating it. The only reason + you may want to change the option via + <literal>XMLUnit.setNormalize</literal> is that your + <literal>Document</literal> instances have not been created by + an XML parser but rather been put together in memory using the + DOM API directly.</para> + </section> + + <section id="Ignoring Comments"> + <title>Ignoring Comments</title> + + <para>Using <literal>XMLUnit.setIgnoreComments</literal> you + can make XMLUnit's difference engine ignore comments + completely.</para> + + <para>When this option is set to <literal>true</literal>, + <literal>Diff</literal> will use the XSLT transformer under + the covers.</para> + </section> + + <section id="Treating CDATA Sections and Text Nodes Alike"> + <title>Treating CDATA Sections and Text Nodes Alike</title> + + <para>It is not always necessary to know whether a text has + been put into a CDATA section or not. Using + <literal>XMLUnit.setIgnoreDiffBetweenTextAndCDATA</literal> + you can make XMLUnit consider the following two pieces of XML + identical:</para> + + <programlisting language="XML"><![CDATA[ +<foo><bar></foo> +]]></programlisting> + <programlisting language="XML"> +<foo><![CDATA[<bar>]]></foo> +</programlisting> + </section> + </section> </section> - <section id="Validating"><title>Validating XML documents</title> + <section id="Validating XML Documents"> + <title>Validating XML Documents</title> - <section id="validating-basics"> - <title>The <literal>Validator</literal> class</title> + <section id="The Validator Class"> + <title>The <literal>Validator</literal> Class</title> <para>The <literal>Validator</literal> class encapsulates XMLUnit's validation support. It will use the @@ -1346,7 +2194,7 @@ multiple) Schema(s) as well. Schema validation requires an XML parser that supports it, of course.</para> - <section id="validating-dtd"> + <section id="DTD Validation"> <title>DTD Validation</title> </section> @@ -1357,12 +2205,12 @@ object using one of the single argument constructors.</para> <example> - <title>Validating against the DTD defined in + <title>Validating Against the DTD Defined in <literal>DOCTYPE</literal></title> <programlisting language="Java"><![CDATA[ InputSource is = new InputSource(new FileInputStream(myXmlDocument)); Validator v = new Validator(is); -bool isValid = v.isValid(); +boolean isValid = v.isValid(); ]]></programlisting></example> <para>If the piece of XML doesn't contain any @@ -1379,14 +2227,14 @@ can be resolved by your parser.</para> <example> - <title>Validating a piece of XML that doesn't contain a + <title>Validating a Piece of XML that doesn't Contain a <literal>DOCTYPE</literal></title> <programlisting language="Java"><![CDATA[ InputSource is = new InputSource(new FileInputStream(myXmlDocument)); Validator v = new Validator(is, - (new File(myDTD)).toURI().toURL(), + (new File(myDTD)).toURI().toURL().toString(), myPublicId); -bool isValid = v.isValid(); +boolean isValid = v.isValid(); ]]></programlisting></example> <para>If the piece of XML already has the correct @@ -1401,12 +2249,12 @@ <literal>systemId</literal>. <example> - <title>Validating against a local DTD</title> + <title>Validating Against a Local DTD</title> <programlisting language="Java"><![CDATA[ InputSource is = new InputSource(new FileInputStream(myXmlDocument)); Validator v = new Validator(is, - (new File(myDTD)).toURI().toURL()); -bool isValid = v.isValid(); + (new File(myDTD)).toURI().toURL().toString()); +boolean isValid = v.isValid(); ]]></programlisting></example> </listitem> @@ -1416,22 +2264,22 @@ Validator. <para>This approach would allow you to use an OASIS - catalog<footnote><ulink - url="http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html">http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html</ulink></footnote> + catalog<footnote><para><ulink + url="http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html">http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html</ulink></para></footnote> in conjunction with the Apache XML Resolver - library<footnote><ulink - url="http://xml.apache.org/commons/components/resolver/index.html">http://xml.apache.org/commons/components/resolver/index.html</ulink></footnote> + library<footnote><para><ulink + url="http://xml.apache.org/commons/components/resolver/index.html">http://xml.apache.org/commons/components/resolver/index.html</ulink></para></footnote> to resolve the DTD location as well as the location of any ... [truncated message content] |