/*
* Copyright (C) 2004, 2005 Joe Walnes.
* 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 05. September 2004 by Joe Walnes
*/
package com.thoughtworks.xstream.io.xml;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import junit.framework.TestCase;
public abstract class AbstractXMLWriterTest extends TestCase {
protected HierarchicalStreamWriter writer;
protected abstract void assertXmlProducedIs(String expected);
// String.replaceAll is JDK 1.4
protected String replaceAll(String s, final String occurance, final String replacement) {
final int len = occurance.length();
final int inc = len - replacement.length();
int i = -inc;
final StringBuffer buff = new StringBuffer(s);
// StringBuffer has no indexOf in JDK 1.3
while((i = buff.toString().indexOf(occurance, i + inc)) >= 0) {
buff.replace(i, i + len, replacement);
}
return buff.toString();
}
public void testProducesXmlElements() {
writer.startNode("hello");
writer.setValue("world");
writer.endNode();
assertXmlProducedIs("<hello>world</hello>");
}
public void testSupportsNestedElements() {
writer.startNode("a");
writer.startNode("b");
writer.setValue("one");
writer.endNode();
writer.startNode("b");
writer.setValue("two");
writer.endNode();
writer.startNode("c");
writer.startNode("d");
writer.setValue("three");
writer.endNode();
writer.endNode();
writer.endNode();
assertXmlProducedIs("<a><b>one</b><b>two</b><c><d>three</d></c></a>");
}
public void testSupportsEmptyTags() {
writer.startNode("empty");
writer.endNode();
assertXmlProducedIs("<empty/>");
}
public void testSupportsAttributes() {
writer.startNode("person");
writer.addAttribute("firstname", "Joe");
writer.addAttribute("lastname", "Walnes");
writer.endNode();
assertXmlProducedIs("<person firstname=\"Joe\" lastname=\"Walnes\"/>");
}
public void testAttributesAreResettedForNewNode() {
writer.startNode("work");
writer.startNode("person");
writer.addAttribute("firstname", "Joe");
writer.addAttribute("lastname", "Walnes");
writer.endNode();
writer.startNode("project");
writer.addAttribute("XStream", "Codehaus");
writer.endNode();
writer.endNode();
assertXmlProducedIs("<work><person firstname=\"Joe\" lastname=\"Walnes\"/><project XStream=\"Codehaus\"/></work>");
}
public void testEscapesXmlUnfriendlyCharacters() {
writer.startNode("evil");
writer.addAttribute("attr", "w0000 $ <x\"x> &!;");
writer.setValue("w0000 $ <xx> &!;");
writer.endNode();
assertXmlProducedIs("<evil attr=\"w0000 $ <x"x> &!;\">w0000 $ <xx> &!;</evil>");
}
public void testEscapesWhitespaceCharacters() {
writer.startNode("evil");
writer.setValue("one\ntwo\rthree\r\nfour\n\rfive\tsix");
writer.endNode();
assertXmlProducedIs("<evil>one\n"
+ "two
three
\n"
+ "four\n"
+ "
five\tsix</evil>");
}
public void testSupportsEmptyNestedTags() {
writer.startNode("parent");
writer.startNode("child");
writer.endNode();
writer.endNode();
assertXmlProducedIs("<parent><child/></parent>");
}
}