From: <bo...@us...> - 2008-03-12 16:57:54
|
Revision: 248 http://xmlunit.svn.sourceforge.net/xmlunit/?rev=248&view=rev Author: bodewig Date: 2008-03-12 09:57:59 -0700 (Wed, 12 Mar 2008) Log Message: ----------- Add simplistic DifferenceListener that ignores case Added Paths: ----------- trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/CaseInsensitiveDifferenceListener.java trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/TextDifferenceListenerBase.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_CaseInsensitiveDifferenceListener.java trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_TextDifferenceListenerBase.java Added: trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/CaseInsensitiveDifferenceListener.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/CaseInsensitiveDifferenceListener.java (rev 0) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/CaseInsensitiveDifferenceListener.java 2008-03-12 16:57:59 UTC (rev 248) @@ -0,0 +1,65 @@ +/* +****************************************************************** +Copyright (c) 2008, Jeff Martin, Tim Bacon +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the xmlunit.sourceforge.net nor the names + of its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +****************************************************************** +*/ +package org.custommonkey.xmlunit.examples; + +import java.util.Locale; +import org.custommonkey.xmlunit.Difference; +import org.custommonkey.xmlunit.DifferenceListener; + +/** + * Ignores case for all textual content. + */ +public class CaseInsensitiveDifferenceListener + extends TextDifferenceListenerBase { + + public CaseInsensitiveDifferenceListener(DifferenceListener delegateTo) { + super(delegateTo); + } + + protected int textualDifference(Difference d) { + String control = d.getControlNodeDetail().getValue(); + if (control != null) { + control = control.toLowerCase(Locale.US); + if (d.getTestNodeDetail().getValue() != null + && control.equals(d.getTestNodeDetail().getValue() + .toLowerCase(Locale.US))) { + return + DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; + } + } + return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; + } +} \ No newline at end of file Property changes on: trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/CaseInsensitiveDifferenceListener.java ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/TextDifferenceListenerBase.java =================================================================== --- trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/TextDifferenceListenerBase.java (rev 0) +++ trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/TextDifferenceListenerBase.java 2008-03-12 16:57:59 UTC (rev 248) @@ -0,0 +1,124 @@ +/* +****************************************************************** +Copyright (c) 2006-2008, Jeff Martin, Tim Bacon +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the xmlunit.sourceforge.net nor the names + of its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +****************************************************************** +*/ +package org.custommonkey.xmlunit.examples; + +import org.custommonkey.xmlunit.Difference; +import org.custommonkey.xmlunit.DifferenceConstants; +import org.custommonkey.xmlunit.DifferenceListener; +import org.w3c.dom.Node; + +/** + * Base class that delegates all differences to another DifferenceListener. + * + * <p>Subclasses get a chance to hook into special methods that will + * be invoked for differences in textual values of attributes, CDATA + * sections, Text or comment nodes.</p> + */ +public abstract class TextDifferenceListenerBase + implements DifferenceListener { + + private final DifferenceListener delegateTo; + + protected TextDifferenceListenerBase(DifferenceListener delegateTo) { + this.delegateTo = delegateTo; + } + + /** + * Delegates to the nested DifferenceListener unless the + * Difference is of type {@link DifferenceConstants#ATTR_VALUE_ID + * ATTR_VALUE_ID}, {@link DifferenceConstants#CDATA_VALUE_ID + * CDATA_VALUE_ID}, {@link DifferenceConstants#COMMENT_VALUE_ID + * COMMENT_VALUE_ID} or {@link DifferenceConstants#TEXT_VALUE_ID + * TEXT_VALUE_ID} - for those special differences {@link + * #attributeDifference attributeDifference}, {@link + * #cdataDifference cdataDifference}, {@link #commentDifference + * commentDifference} or {@link #textDifference textDifference} + * are invoked respectively. + */ + public int differenceFound(Difference difference) { + switch (difference.getId()) { + case DifferenceConstants.ATTR_VALUE_ID: + return attributeDifference(difference); + case DifferenceConstants.CDATA_VALUE_ID: + return cdataDifference(difference); + case DifferenceConstants.COMMENT_VALUE_ID: + return commentDifference(difference); + case DifferenceConstants.TEXT_VALUE_ID: + return textDifference(difference); + } + return delegateTo.differenceFound(difference); + } + + /** + * Delegates to {@link #textualDifference textualDifference}. + */ + protected int attributeDifference(Difference d) { + return textualDifference(d); + } + + /** + * Delegates to {@link #textualDifference textualDifference}. + */ + protected int cdataDifference(Difference d) { + return textualDifference(d); + } + + /** + * Delegates to {@link #textualDifference textualDifference}. + */ + protected int commentDifference(Difference d) { + return textualDifference(d); + } + + /** + * Delegates to {@link #textualDifference textualDifference}. + */ + protected int textDifference(Difference d) { + return textualDifference(d); + } + + /** + * Delegates to the nested DifferenceListener. + */ + protected int textualDifference(Difference d) { + return delegateTo.differenceFound(d); + } + + public void skippedComparison(Node control, Node test) { + delegateTo.skippedComparison(control, test); + } + +} \ No newline at end of file Property changes on: trunk/xmlunit/src/java/org/custommonkey/xmlunit/examples/TextDifferenceListenerBase.java ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_CaseInsensitiveDifferenceListener.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_CaseInsensitiveDifferenceListener.java (rev 0) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_CaseInsensitiveDifferenceListener.java 2008-03-12 16:57:59 UTC (rev 248) @@ -0,0 +1,83 @@ +/* +****************************************************************** +Copyright (c) 2008, Jeff Martin, Tim Bacon +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the xmlunit.sourceforge.net nor the names + of its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +****************************************************************** +*/ +package org.custommonkey.xmlunit.examples; + +import java.util.Locale; +import junit.framework.TestCase; + +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.Difference; +import org.custommonkey.xmlunit.DifferenceListener; +import org.w3c.dom.Node; + +public class test_CaseInsensitiveDifferenceListener extends TestCase { + + private static final String ATTR = "aTtr"; + private static final String CDATA = "C Data"; + private static final String CMMT = "a Comment"; + private static final String TEXT = "some Text"; + + public void testCaseInsensitive() throws Exception { + String control = getDoc(ATTR, CDATA, CMMT, TEXT); + String test = getDoc(ATTR.toUpperCase(Locale.US), + CDATA.toUpperCase(Locale.US), + CMMT.toUpperCase(Locale.US), + TEXT.toUpperCase(Locale.US)); + Diff d = new Diff(control, test); + + CaseInsensitiveDifferenceListener c = + new CaseInsensitiveDifferenceListener(new DifferenceListener() { + public int differenceFound(Difference d) { + fail("differenceFound shouldn't get invoked, but" + + " was with type " + d.getId()); + return -42; + } + public void skippedComparison(Node c, Node t) { + fail("skippedComparison shouldn't get invoked"); + } + }); + + d.overrideDifferenceListener(c); + assertTrue(d.identical()); + } + + private static String getDoc(String attr, String cdata, String comment, + String text) { + return "<root><first attr=\"" + attr + "\"/><!--" + comment + "-->" + + "<second><![CDATA[" + cdata + "]]></second><third>" + text + + "</third></root>"; + } +} \ No newline at end of file Property changes on: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_CaseInsensitiveDifferenceListener.java ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_TextDifferenceListenerBase.java =================================================================== --- trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_TextDifferenceListenerBase.java (rev 0) +++ trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_TextDifferenceListenerBase.java 2008-03-12 16:57:59 UTC (rev 248) @@ -0,0 +1,151 @@ +/* +****************************************************************** +Copyright (c) 2008, Jeff Martin, Tim Bacon +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the xmlunit.sourceforge.net nor the names + of its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +****************************************************************** +*/ +package org.custommonkey.xmlunit.examples; + +import junit.framework.TestCase; + +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.Difference; +import org.custommonkey.xmlunit.DifferenceListener; +import org.w3c.dom.Node; + +public class test_TextDifferenceListenerBase extends TestCase { + private static final String C_ATTR = "controlAttr"; + private static final String T_ATTR = "testAttr"; + private static final String C_CDATA = "controlCdata"; + private static final String T_CDATA = "testCdata"; + private static final String C_CMMT = "controlComment"; + private static final String T_CMMT = "testComment"; + private static final String C_TEXT = "controlText"; + private static final String T_TEXT = "testText"; + + public void testTextDifferenceDelegations() throws Exception { + final int[] invocations = new int[4]; + + String control = getDoc(C_ATTR, C_CDATA, C_CMMT, C_TEXT); + String test = getDoc(T_ATTR, T_CDATA, T_CMMT, T_TEXT); + + TextDifferenceListenerBase b = new TextDifferenceListenerBase(null) { + protected int attributeDifference(Difference d) { + assertEquals(C_ATTR, d.getControlNodeDetail().getValue()); + assertEquals(T_ATTR, d.getTestNodeDetail().getValue()); + invocations[0]++; + return 1; + } + + protected int cdataDifference(Difference d) { + assertEquals(C_CDATA, d.getControlNodeDetail().getValue()); + assertEquals(T_CDATA, d.getTestNodeDetail().getValue()); + invocations[1]++; + return 1; + } + + protected int commentDifference(Difference d) { + assertEquals(C_CMMT, d.getControlNodeDetail().getValue()); + assertEquals(T_CMMT, d.getTestNodeDetail().getValue()); + invocations[2]++; + return 1; + } + + protected int textDifference(Difference d) { + assertEquals(C_TEXT, d.getControlNodeDetail().getValue()); + assertEquals(T_TEXT, d.getTestNodeDetail().getValue()); + invocations[3]++; + return 1; + } + }; + + Diff d = new Diff(control, test); + d.overrideDifferenceListener(b); + + assertTrue(d.identical()); + + for (int i = 0; i < invocations.length; i++) { + assertEquals(1, invocations[i]); + } + } + + public void testTextualDifference() throws Exception { + final int[] invocations = new int[1]; + + String control = getDoc(C_ATTR, C_CDATA, C_CMMT, C_TEXT); + String test = getDoc(T_ATTR, T_CDATA, T_CMMT, T_TEXT); + + TextDifferenceListenerBase b = new TextDifferenceListenerBase(null) { + protected int textualDifference(Difference d) { + invocations[0]++; + return 1; + } + }; + + Diff d = new Diff(control, test); + d.overrideDifferenceListener(b); + + assertTrue(d.identical()); + assertEquals(4, invocations[0]); + } + + public void testFullDelegation() throws Exception { + final int[] invocations = new int[1]; + + String control = getDoc(C_ATTR, C_CDATA, C_CMMT, C_TEXT); + String test = getDoc(T_ATTR, T_CDATA, T_CMMT, T_TEXT); + + TextDifferenceListenerBase b = + new TextDifferenceListenerBase(new DifferenceListener() { + public int differenceFound(Difference d) { + invocations[0]++; + return 1; + } + public void skippedComparison(Node c, Node t) { + fail("skippedComparison shouldn't get invoked"); + } + }) {}; + + Diff d = new Diff(control, test); + d.overrideDifferenceListener(b); + + assertTrue(d.identical()); + assertEquals(4, invocations[0]); + } + + private static String getDoc(String attr, String cdata, String comment, + String text) { + return "<root><first attr=\"" + attr + "\"/><!--" + comment + "-->" + + "<second><![CDATA[" + cdata + "]]></second><third>" + text + + "</third></root>"; + } +} \ No newline at end of file Property changes on: trunk/xmlunit/tests/java/org/custommonkey/xmlunit/examples/test_TextDifferenceListenerBase.java ___________________________________________________________________ Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |