638d64e4e98e79e789893221acac89fb30c0c39e
[utils] /
1 /*
2  * Copyright 2005 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.wamblee.xml;
18
19 import java.util.Collections;
20 import java.util.Comparator;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.TreeMap;
24
25 import junit.framework.TestCase;
26
27 import org.dom4j.Attribute;
28 import org.dom4j.Document;
29 import org.dom4j.Element;
30
31 /**
32  * XML test support utilities.
33  */
34 public final class XmlUtils {
35
36     /**
37      * Disabled constructor.
38      * 
39      */
40     private XmlUtils() {
41         // Empty
42     }
43
44     /**
45      * Checks equality of two XML documents excluding comment and processing
46      * nodes and trimming the text of the elements. In case of problems, it
47      * provides an xpath-like expression describing where the problem is.  
48      * 
49      * @param aMsg
50      * @param aExpected
51      * @param aActual
52      */
53     public static void assertEquals(String aMsg,
54             org.w3c.dom.Document aExpected, org.w3c.dom.Document aActual) {
55         assertEquals(aMsg, DomUtils.convert(aExpected), DomUtils
56                 .convert(aActual));
57     }
58
59     /**
60      * Checks equality of two XML documents excluding comment and processing
61      * nodes and trimming the text of the elements.  In case of problems, it
62      * provides an xpath-like expression describing where the problem is.  
63      * 
64      * @param aMsg
65      * @param aExpected
66      * @param aActual
67      */
68     public static void assertEquals(String aMsg, Document aExpected,
69             Document aActual) {
70         assertEquals(aMsg + "/" + aExpected.getRootElement().getName(), aExpected.getRootElement(), aActual.getRootElement());
71     }
72
73     /**
74      * Checks equality of two XML elements excluding comment and processing
75      * nodes and trimming the text of the elements. In case of problems, it
76      * provides an xpath-like expression describing where the problem is.  
77      * 
78      * @param aMsg
79      * @param aExpected
80      * @param aActual
81      */
82     public static void assertEquals(String aMsg, Element aExpected,
83             Element aActual) {
84
85         // Name.
86         TestCase.assertEquals(aMsg + "/name()", aExpected.getName(), aActual
87                 .getName());
88
89         // Text
90         TestCase.assertEquals(aMsg + "/text()", aExpected.getTextTrim(),
91                 aActual.getTextTrim());
92
93         // Attributes
94         List<Attribute> expectedAttrs = aExpected.attributes();
95         Collections.sort(expectedAttrs, new AttributeComparator());
96         List<Attribute> actualAttrs = aActual.attributes();
97         Collections.sort(actualAttrs, new AttributeComparator());
98
99         TestCase.assertEquals("count(" + aMsg + "/@*)", expectedAttrs.size(),
100                 actualAttrs.size());
101         for (int i = 0; i < expectedAttrs.size(); i++) {
102             String msg = aMsg + "/@" + expectedAttrs.get(i).getName();
103             assertEquals(msg, expectedAttrs.get(i), actualAttrs.get(i));
104         }
105
106         // Nested elements.
107         List<Element> expectedElems = aExpected.elements();
108         List<Element> actualElems = aActual.elements();
109         TestCase.assertEquals("count(" + aMsg + "/*)", expectedElems.size(),
110                 actualElems.size());
111         // determine the how-manyth element of the given name we are at.
112         // Maps element name to the last used index (or null if not yet used)
113         Map<String, Integer> elementIndex = new TreeMap<String, Integer>();
114         for (int i = 0; i < expectedElems.size(); i++) {
115             String elemName = expectedElems.get(i).getName();
116             Integer index = elementIndex.get(elemName);
117             if (index == null) {
118                 index = 1;
119             } else {
120                 index++;
121             }
122             elementIndex.put(elemName, index);
123             String msg = aMsg + "/" + expectedElems.get(i).getName() + "["
124                     + index + "]";
125
126             assertEquals(msg, expectedElems.get(i), actualElems.get(i));
127         }
128     }
129
130     /**
131      * Checks equality of two attributes. In case of problems, it
132      * provides an xpath-like expression describing where the problem is.  
133      * 
134      * @param aMsg
135      * @param aExpected
136      * @param aActual
137      */
138     public static void assertEquals(String aMsg, Attribute aExpected,
139             Attribute aActual) {
140         TestCase.assertEquals(aMsg + ":name", aExpected.getName(), aActual
141                 .getName());
142         TestCase.assertEquals(aMsg + ":value", aExpected.getValue(), aActual
143                 .getValue());
144     }
145
146     /**
147      * Comparator which compares attributes by name.
148      */
149     private static final class AttributeComparator implements
150             Comparator<Attribute> {
151         /*
152          * (non-Javadoc)
153          * 
154          * @see java.util.Comparator#compare(T, T)
155          */
156         public int compare(Attribute aAttribute1, Attribute aAttribute2) {
157             return aAttribute1.getName().compareTo(aAttribute2.getName());
158         }
159     }
160 }