From: <bo...@us...> - 2007-08-10 07:30:51
|
Revision: 229 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=229&view=rev Author: bodewig Date: 2007-08-10 00:30:53 -0700 (Fri, 10 Aug 2007) Log Message: ----------- optionally ignore element content whitespace in MultiLevelElementNameAndTextQualifier Modified Paths: -------------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/MultiLevelElementNameAndTextQualifier.java trunk/xmlunit/src/user-guide/XMLUnit-Java.xml trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_MultiLevelElementNameAndTextQualifier.java Modified: trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/MultiLevelElementNameAndTextQualifier.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/MultiLevelElementNameAndTextQualifier.java 2007-08-01 07:50:24 UTC (rev 228) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/MultiLevelElementNameAndTextQualifier.java 2007-08-10 07:30:53 UTC (rev 229) @@ -52,7 +52,7 @@ * ElementNameQualifier} and MultiLevelElementNameQualifier(1) should * lead to the same results.</p> * - * <p>Any attribute values ar completely ignored. Only works on + * <p>Any attribute values are completely ignored. Only works on * elements with exactly one child element at each level.</p> * * <p>This class mostly exists as an example for custom ElementQualifiers.</p> @@ -61,6 +61,7 @@ implements ElementQualifier { private final int levels; + private final boolean ignoreEmptyTexts; private static final ElementNameQualifier NAME_QUALIFIER = new ElementNameQualifier(); @@ -70,13 +71,28 @@ /** * Uses element names and the text nested <code>levels</code> * child elements deeper into the element to compare elements. + * + * <p>Does not ignore empty text nodes. */ public MultiLevelElementNameAndTextQualifier(int levels) { + this(levels, false); + } + + /** + * Uses element names and the text nested <code>levels</code> + * child elements deeper into the element to compare elements. + * + * @param ignoreEmptyTexts whether whitespace-only textnodes + * should be ignored. + */ + public MultiLevelElementNameAndTextQualifier(int levels, + boolean ignoreEmptyTexts) { if (levels < 1) { throw new IllegalArgumentException("levels must be equal or" + " greater than one"); } this.levels = levels; + this.ignoreEmptyTexts = ignoreEmptyTexts; } public boolean qualifyForComparison(Element control, Element test) { @@ -89,11 +105,12 @@ currentLevel++) { stillSimilar = NAME_QUALIFIER.qualifyForComparison(currentControl, currentTest); + if (stillSimilar) { if (currentControl.hasChildNodes() && currentTest.hasChildNodes()) { - Node n1 = currentControl.getFirstChild(); - Node n2 = currentTest.getFirstChild(); + Node n1 = getFirstEligibleChild(currentControl); + Node n2 = getFirstEligibleChild(currentTest); if (n1.getNodeType() == Node.ELEMENT_NODE && n2.getNodeType() == Node.ELEMENT_NODE) { currentControl = (Element) n1; @@ -115,5 +132,17 @@ return stillSimilar; } - + + private Node getFirstEligibleChild(Node parent) { + Node n1 = parent.getFirstChild(); + if (ignoreEmptyTexts) { + while (n1.getNodeType() == Node.TEXT_NODE + && n1.getNodeValue().trim().length() == 0) { + Node n2 = n1.getNextSibling(); + if (n2 == null) break; + n1 = n2; + } + } + return n1; + } } Modified: trunk/xmlunit/src/user-guide/XMLUnit-Java.xml =================================================================== --- trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-08-01 07:50:24 UTC (rev 228) +++ trunk/xmlunit/src/user-guide/XMLUnit-Java.xml 2007-08-10 07:30:53 UTC (rev 229) @@ -14,8 +14,6 @@ <firstname>Tim</firstname> <surname>Bacon</surname> </author> - </authorgroup> - <authorgroup> <author> <firstname>Stefan</firstname> <surname>Bodewig</surname> @@ -36,6 +34,11 @@ <date>April 2007</date> <revremark>Documentation for XMLUnit Java 1.1</revremark> </revision> + <revision> + <revnumber>1.2</revnumber> + <date>...</date> + <revremark>Documentation for XMLUnit Java 1.2</revremark> + </revision> </revhistory> </articleinfo> @@ -1911,6 +1914,21 @@ identical to <literal>ElementNameAndTextQualifier</literal>. In <xref linkend="htmltable"/> a value of 2 would be needed.</para> + + <para>By default + <literal>MultiLevelElementNameAndTextQualifier</literal> will + not ignore whitespace between the elements leading up to the + nested text. If your piece of XML contains this sort of + whitespace (like <xref linkend="htmltable"/> which contains a + newline and several space characters between + <literal><tr></literal> and + <literal><td></literal>) you can either instruct XMLUnit + to ignore whitespace completely (see + <xref linkend="Whitespace Handling"/>) or use the two-arg + constructor of + <literal>MultiLevelElementNameAndTextQualifier</literal> + introduced with XMLUnit 1.2 and set the + <literal>ignoreEmptyTexts</literal> argument to true.</para> </section> </section> @@ -3215,6 +3233,11 @@ </itemizedlist> </section> </section> + + <section id="Changes 1.2"> + <title>Changes from XMLUnit 1.1 to 1.2</title> + </section> + </appendix> </article> Modified: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_MultiLevelElementNameAndTextQualifier.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_MultiLevelElementNameAndTextQualifier.java 2007-08-01 07:50:24 UTC (rev 228) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_MultiLevelElementNameAndTextQualifier.java 2007-08-10 07:30:53 UTC (rev 229) @@ -140,7 +140,7 @@ } - public void XtestUserGuideExample() throws Exception { + public void testUserGuideExample() throws Exception { String control = "<table>\n" + " <tr>\n" @@ -162,16 +162,21 @@ Diff d = new Diff(control, test); d.overrideElementQualifier(new MultiLevelElementNameAndTextQualifier(2)); - //assertTrue(d.toString(), d.similar()); + assertFalse(d.toString(), d.similar()); - d = new Diff(control, test); - d.overrideElementQualifier(new MultiLevelElementNameAndTextQualifier(2)); try { XMLUnit.setIgnoreWhitespace(true); + d = new Diff(control, test); + d.overrideElementQualifier(new MultiLevelElementNameAndTextQualifier(2)); assertTrue(d.toString(), d.similar()); } finally { XMLUnit.setIgnoreWhitespace(false); } + + d = new Diff(control, test); + d.overrideElementQualifier(new MultiLevelElementNameAndTextQualifier(2, + true)); + assertTrue(d.toString(), d.similar()); } public void setUp() throws Exception { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |