/** * Copyright (c) 2002-2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation */ package org.eclipse.emf.test.xml.xmi; import java.io.ByteArrayInputStream; import javax.xml.parsers.DocumentBuilder; import junit.framework.TestCase; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; /** * A helper class that provides methods that allow comparing two XML instances. */ public class CompareXML extends TestCase { public static void compareFiles(DocumentBuilder builder, String expectedOutput, ByteArrayInputStream currentOutput) throws Exception { Document doc = builder.parse(currentOutput); Document doc2 = builder.parse(expectedOutput); compareNodes(expectedOutput, doc2.getDocumentElement(), doc.getDocumentElement()); } public static void compareDocuments(String uri, Document expected, Document document) throws Exception { compareNodes(uri, expected.getDocumentElement(), document.getDocumentElement()); } protected static void compareNodes(String uri, Node node1, Node node2) { compareData(uri, node1, node2); switch (node1.getNodeType()) { case Node.ELEMENT_NODE: { boolean hasAttrs = node1.hasAttributes(); assertEquals(uri+": HasAttributes: " + node1 + "!=" + node2, hasAttrs, ((Element)node2).hasAttributes()); if (hasAttrs) { NamedNodeMap map1 = node1.getAttributes(); NamedNodeMap map2 = ((Element)node2).getAttributes(); int len = map1.getLength(); assertEquals(uri+": MissingAttr: " + node1 + "!=" + node2, len, map2.getLength()); for (int i = 0; i < len; i++) { Node n1 = map1.item(i); if (n1.getLocalName() == null) { // DOM Level 1 Node Node n2 = map2.getNamedItem(n1.getNodeName()); assertNotNull(uri+": AttrNull: " + n1, n2); compareData(uri, n1, n2); } else { Node n2 = map2.getNamedItemNS(n1.getNamespaceURI(), n1.getLocalName()); assertNotNull(uri+": AttrNull: " + n1, n2); compareData(uri, n1, n2); } } } } } Node child1 = node1.getFirstChild(); Node child2 = node2.getFirstChild(); while (child1 != null && child2 != null) { compareNodes(uri, child1, child2); child1 = child1.getNextSibling(); child2 = child2.getNextSibling(); } assertEquals(uri+": NotEquals: " + node1 + "!=" + node2, child1, child2); } protected static void compareData(String uri, Node node1, Node node2) { assertEquals(uri+": NodeType error: " + node1 + "!=" + node2, node1.getNodeType(), node2.getNodeType()); assertEquals(uri+": NodeName: " + node1 + "!=" + node2, node1.getNodeName(), node2.getNodeName()); assertEquals(uri+": NodeLocalName: " + node1 + "!=" + node2, node1.getLocalName(), node2.getLocalName()); assertEquals(uri+": NodeNamespaceURI: " + node1 + "!=" + node2, node1.getNamespaceURI(), node2.getNamespaceURI()); assertEquals(uri+": NodeValue: " + node1 + "!=" + node2, node1.getNodeValue(), node2.getNodeValue()); } }