X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fxml%2FXmlUtils.java;fp=support%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fxml%2FXmlUtils.java;h=fc894251eb0aedf0429a6bb0ec609759edec3182;hb=32a62ca2c752e33a7873ac868a7a1f289caedcd4;hp=0000000000000000000000000000000000000000;hpb=d2bdf4e813c6a3964958c87b2ce56eaadf8a1f0a;p=utils diff --git a/support/general/src/test/java/org/wamblee/xml/XmlUtils.java b/support/general/src/test/java/org/wamblee/xml/XmlUtils.java new file mode 100644 index 00000000..fc894251 --- /dev/null +++ b/support/general/src/test/java/org/wamblee/xml/XmlUtils.java @@ -0,0 +1,162 @@ +/* + * Copyright 2005 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.wamblee.xml; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import junit.framework.TestCase; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; + +/** + * XML test support utilities. + * + * @author Erik Brakkee + */ +public final class XmlUtils { + + /** + * Disabled constructor. + * + */ + private XmlUtils() { + // Empty + } + + /** + * Checks equality of two XML documents excluding comment and processing + * nodes and trimming the text of the elements. In case of problems, it + * provides an xpath-like expression describing where the problem is. + * + * @param aMsg + * @param aExpected + * @param aActual + */ + public static void assertEquals(String aMsg, + org.w3c.dom.Document aExpected, org.w3c.dom.Document aActual) { + assertEquals(aMsg, DomUtils.convert(aExpected), DomUtils + .convert(aActual)); + } + + /** + * Checks equality of two XML documents excluding comment and processing + * nodes and trimming the text of the elements. In case of problems, it + * provides an xpath-like expression describing where the problem is. + * + * @param aMsg + * @param aExpected + * @param aActual + */ + public static void assertEquals(String aMsg, Document aExpected, + Document aActual) { + assertEquals(aMsg + "/" + aExpected.getRootElement().getName(), aExpected.getRootElement(), aActual.getRootElement()); + } + + /** + * Checks equality of two XML elements excluding comment and processing + * nodes and trimming the text of the elements. In case of problems, it + * provides an xpath-like expression describing where the problem is. + * + * @param aMsg + * @param aExpected + * @param aActual + */ + public static void assertEquals(String aMsg, Element aExpected, + Element aActual) { + + // Name. + TestCase.assertEquals(aMsg + "/name()", aExpected.getName(), aActual + .getName()); + + // Text + TestCase.assertEquals(aMsg + "/text()", aExpected.getTextTrim(), + aActual.getTextTrim()); + + // Attributes + List expectedAttrs = aExpected.attributes(); + Collections.sort(expectedAttrs, new AttributeComparator()); + List actualAttrs = aActual.attributes(); + Collections.sort(actualAttrs, new AttributeComparator()); + + TestCase.assertEquals("count(" + aMsg + "/@*)", expectedAttrs.size(), + actualAttrs.size()); + for (int i = 0; i < expectedAttrs.size(); i++) { + String msg = aMsg + "/@" + expectedAttrs.get(i).getName(); + assertEquals(msg, expectedAttrs.get(i), actualAttrs.get(i)); + } + + // Nested elements. + List expectedElems = aExpected.elements(); + List actualElems = aActual.elements(); + TestCase.assertEquals("count(" + aMsg + "/*)", expectedElems.size(), + actualElems.size()); + // determine the how-manyth element of the given name we are at. + // Maps element name to the last used index (or null if not yet used) + Map elementIndex = new TreeMap(); + for (int i = 0; i < expectedElems.size(); i++) { + String elemName = expectedElems.get(i).getName(); + Integer index = elementIndex.get(elemName); + if (index == null) { + index = 1; + } else { + index++; + } + elementIndex.put(elemName, index); + String msg = aMsg + "/" + expectedElems.get(i).getName() + "[" + + index + "]"; + + assertEquals(msg, expectedElems.get(i), actualElems.get(i)); + } + } + + /** + * Checks equality of two attributes. In case of problems, it + * provides an xpath-like expression describing where the problem is. + * + * @param aMsg + * @param aExpected + * @param aActual + */ + public static void assertEquals(String aMsg, Attribute aExpected, + Attribute aActual) { + TestCase.assertEquals(aMsg + ":name", aExpected.getName(), aActual + .getName()); + TestCase.assertEquals(aMsg + ":value", aExpected.getValue(), aActual + .getValue()); + } + + /** + * Comparator which compares attributes by name. + */ + private static final class AttributeComparator implements + Comparator { + /* + * (non-Javadoc) + * + * @see java.util.Comparator#compare(T, T) + */ + public int compare(Attribute aAttribute1, Attribute aAttribute2) { + return aAttribute1.getName().compareTo(aAttribute2.getName()); + } + } +}