/* * Copyright (C) 2006, 2007, 2008 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 19. October 2006 by Joerg Schaible */ package com.thoughtworks.xstream.io.xml; import com.thoughtworks.xstream.io.copy.HierarchicalStreamCopier; import com.thoughtworks.xstream.io.xml.xppdom.Xpp3Dom; import junit.framework.TestCase; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public abstract class AbstractDocumentWriterTest extends TestCase { private final HierarchicalStreamCopier copier = new HierarchicalStreamCopier(); protected DocumentWriter writer; protected abstract DocumentReader createDocumentReaderFor(Object node); protected void assertDocumentProducedIs(final Xpp3Dom expected) { assertDocumentProducedIs(new Xpp3Dom[]{expected}); } protected boolean equals(final Xpp3Dom node1, final Xpp3Dom node2) { if (node1.getName().equals(node2.getName())) { final String value1 = node1.getValue(); final String value2 = node2.getValue(); if ((value1 == null && value2 == null) || value1.equals(value2)) { final Set set1 = new HashSet(Arrays.asList(node1.getAttributeNames())); final Set set2 = new HashSet(Arrays.asList(node2.getAttributeNames())); if (set1.equals(set2)) { final Xpp3Dom[] children1 = node1.getChildren(); final Xpp3Dom[] children2 = node2.getChildren(); if (children1.length == children2.length) { for (int i = 0; i < children1.length; i++) { if (!equals(children1[i], children2[i])) { return false; } } return true; } } } } return false; } protected void assertDocumentProducedIs(final Xpp3Dom[] expected) { for (int i = 0; i < expected.length; i++) { copier.copy(new XppDomReader(expected[i]), writer); } final Object[] nodes = writer.getTopLevelNodes().toArray(new Object[0]); assertEquals(expected.length, nodes.length); for (int i = 0; i < nodes.length; i++) { final XppDomWriter xpp3 = new XppDomWriter(); copier.copy(createDocumentReaderFor(nodes[i]), xpp3); assertTrue(equals(expected[i], xpp3.getConfiguration())); } } public void testProducesDomElements() { final Xpp3Dom root = new Xpp3Dom("hello"); root.setValue("world"); assertDocumentProducedIs(root); } public void testSupportsNestedElements() { final Xpp3Dom a = new Xpp3Dom("a"); Xpp3Dom b = new Xpp3Dom("b"); b.setValue("one"); a.addChild(b); b = new Xpp3Dom("b"); b.setValue("two"); a.addChild(b); final Xpp3Dom c = new Xpp3Dom("c"); a.addChild(c); final Xpp3Dom d = new Xpp3Dom("d"); d.setValue("three"); c.addChild(d); assertDocumentProducedIs(a); } public void testSupportsAttributes() { final Xpp3Dom person = new Xpp3Dom("person"); person.setAttribute("firstname", "Joe"); person.setAttribute("lastname", "Walnes"); assertDocumentProducedIs(person); } public void testAttributesAreResettedForNewNode() { final Xpp3Dom[] roots = new Xpp3Dom[2]; final Xpp3Dom person = roots[0] = new Xpp3Dom("person"); person.setAttribute("firstname", "Joe"); person.setAttribute("lastname", "Walnes"); final Xpp3Dom project = roots[1] = new Xpp3Dom("project"); project.setAttribute("XStream", "Codehaus"); assertDocumentProducedIs(roots); } public void testSupportsEmptyNestedTags() { final Xpp3Dom parent = new Xpp3Dom("parent"); parent.addChild(new Xpp3Dom("child")); assertDocumentProducedIs(parent); } protected void assertDocumentProducedIs(final Xpp3Dom expected, final Xpp3Dom tree) { copier.copy(new XppDomReader(tree), writer); final Object[] nodes = writer.getTopLevelNodes().toArray(new Object[0]); assertEquals(1, nodes.length); for (int i = 0; i < nodes.length; i++) { final XppDomWriter xpp3 = new XppDomWriter(); copier.copy(createDocumentReaderFor(nodes[i]), xpp3); assertTrue(equals(expected, xpp3.getConfiguration())); } } }