X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=support%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fxml%2FXmlUtils.java;h=fd49a8a239f9ca858d953bcc58775d69e1132c8d;hb=36320098ebdbe884869a9e04682a8a0291d25600;hp=f35b50cfcfbd0992faacdcc6cd91d1f9265693f3;hpb=ddd261f331280640c5b53c7128230b629ebcd268;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 index f35b50cf..fd49a8a2 100644 --- a/support/general/src/test/java/org/wamblee/xml/XmlUtils.java +++ b/support/general/src/test/java/org/wamblee/xml/XmlUtils.java @@ -1,12 +1,12 @@ /* - * Copyright 2005 the original author or authors. - * + * Copyright 2005-2010 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. @@ -15,28 +15,33 @@ */ package org.wamblee.xml; -import junit.framework.TestCase; - -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.Element; - +import java.io.Serializable; +import java.util.ArrayList; 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.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; /** * XML test support utilities. - * + * * @author Erik Brakkee */ public final class XmlUtils { /** * Disabled constructor. - * + * */ private XmlUtils() { // Empty @@ -46,56 +51,83 @@ public final class XmlUtils { * 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()); + assertEquals( + aMsg + "/" + aExpected.getDocumentElement().getLocalName(), + aExpected.getDocumentElement(), aActual.getDocumentElement()); + } + + private static List convertMap(NamedNodeMap aMap, Class aType) { + List result = new ArrayList(); + for (int i = 0; i < aMap.getLength(); i++) { + result.add((T) aMap.item(i)); + } + return result; + } + + private static List getChildElements(Element aElement) { + List result = new ArrayList(); + NodeList children = aElement.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node node = children.item(i); + if (node instanceof Element) { + result.add((Element) node); + } + } + return result; + } + + private static String getDirectText(Element aElement) { + String res = ""; + NodeList children = aElement.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node node = children.item(i); + if (node instanceof Text) { + res += node.getTextContent() + " "; + } + } + return trim(res); + } + + private static String trim(String aText) { + return aText.trim().replaceAll("\\n", " ").replaceAll("\\s+", " "); } /** * Checks equality of two XML elements excluding comment and processing - * nodes and trimming the text of the elements. In case of problems, it + * nodes and trimming the text of the elements (including whitespace in the middle). + * 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, + private static void assertEquals(String aMsg, Element aExpected, Element aActual) { // Name. - TestCase.assertEquals(aMsg + "/name()", aExpected.getName(), - aActual.getName()); + TestCase.assertEquals(aMsg + "/name()", aExpected.getLocalName(), + aActual.getLocalName()); + TestCase.assertEquals(aMsg + "/namespace()", + aExpected.getNamespaceURI(), aActual.getNamespaceURI()); // Text - TestCase.assertEquals(aMsg + "/text()", aExpected.getTextTrim(), - aActual.getTextTrim()); + TestCase.assertEquals(aMsg + "/text()", getDirectText(aExpected) + , getDirectText(aActual)); // Attributes - List expectedAttrs = aExpected.attributes(); + List expectedAttrs = convertMap(aExpected.getAttributes(), + Attr.class); + Collections.sort(expectedAttrs, new AttributeComparator()); - List actualAttrs = aActual.attributes(); + List actualAttrs = convertMap(aActual.getAttributes(), Attr.class); Collections.sort(actualAttrs, new AttributeComparator()); TestCase.assertEquals("count(" + aMsg + "/@*)", expectedAttrs.size(), @@ -107,8 +139,8 @@ public final class XmlUtils { } // Nested elements. - List expectedElems = aExpected.elements(); - List actualElems = aActual.elements(); + List expectedElems = getChildElements(aExpected); + List actualElems = getChildElements(aActual); TestCase.assertEquals("count(" + aMsg + "/*)", expectedElems.size(), actualElems.size()); @@ -117,7 +149,7 @@ public final class XmlUtils { Map elementIndex = new TreeMap(); for (int i = 0; i < expectedElems.size(); i++) { - String elemName = expectedElems.get(i).getName(); + String elemName = expectedElems.get(i).getLocalName(); Integer index = elementIndex.get(elemName); if (index == null) { @@ -128,7 +160,7 @@ public final class XmlUtils { elementIndex.put(elemName, index); - String msg = aMsg + "/" + expectedElems.get(i).getName() + "[" + + String msg = aMsg + "/" + expectedElems.get(i).getLocalName() + "[" + index + "]"; assertEquals(msg, expectedElems.get(i), actualElems.get(i)); @@ -136,15 +168,14 @@ public final class XmlUtils { } /** - * Checks equality of two attributes. In case of problems, it - * provides an xpath-like expression describing where the problem is. - * + * 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) { + private static void assertEquals(String aMsg, Attr aExpected, Attr aActual) { TestCase.assertEquals(aMsg + ":name", aExpected.getName(), aActual.getName()); TestCase.assertEquals(aMsg + ":value", aExpected.getValue(), @@ -154,13 +185,17 @@ public final class XmlUtils { /** * Comparator which compares attributes by name. */ - private static final class AttributeComparator implements Comparator { + private static final class AttributeComparator implements Comparator, + Serializable { + + private static final long serialVersionUID = 7897287273519886301L; + /* * (non-Javadoc) - * + * * @see java.util.Comparator#compare(T, T) */ - public int compare(Attribute aAttribute1, Attribute aAttribute2) { + public int compare(Attr aAttribute1, Attr aAttribute2) { return aAttribute1.getName().compareTo(aAttribute2.getName()); } }