package er.xiss.test;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashSet;
import java.util.Set;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.apache.commons.lang3.CharEncoding;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import er.xiss.ERXML;
import er.xiss.ERXML.Item;
import er.xiss.ERXML.Visitor;
public class DocTest extends TestCase {
public void testBlank() {
ERXML.Doc doc = ERXML.doc();
assertNull(doc.root());
assertNotNull(doc.declaration());
assertEquals(1, doc.children().size());
assertEquals(doc.declaration(), doc.children().get(0));
}
public void testDeclaration() {
ERXML.Doc doc = ERXML.doc();
assertNotNull(doc.declaration());
assertEquals(1, doc.children().size());
assertEquals(doc.declaration(), doc.children().get(0));
doc.setDeclaration(null);
assertNull(doc.declaration());
assertEquals(0, doc.children().size());
ERXML.Declaration declaration = ERXML.declaration("1.0", CharEncoding.UTF_8);
doc.setDeclaration(declaration);
assertNotNull(doc.declaration());
assertEquals(declaration, doc.declaration());
assertEquals(1, doc.children().size());
assertEquals(declaration, doc.children().get(0));
doc.setDeclaration(null);
doc.root("root");
ERXML.Declaration declaration2 = ERXML.declaration("1.0", CharEncoding.UTF_8);
doc.setDeclaration(declaration2);
assertNotNull(doc.declaration());
assertEquals(declaration2, doc.declaration());
assertEquals(2, doc.children().size());
assertEquals(declaration2, doc.children().get(0));
assertEquals(doc.root(), doc.children().get(1));
ERXML.Declaration declaration3 = ERXML.declaration("1.0", CharEncoding.UTF_8);
doc.setDeclaration(declaration3);
assertNotNull(doc.declaration());
assertEquals(declaration3, doc.declaration());
assertEquals(2, doc.children().size());
assertEquals(declaration3, doc.children().get(0));
assertEquals(doc.root(), doc.children().get(1));
doc.setDeclaration(null);
assertNull(doc.declaration());
assertEquals(null, doc.declaration());
assertEquals(1, doc.children().size());
assertEquals(doc.root(), doc.children().get(0));
}
public void testRoot() {
ERXML.Doc doc = ERXML.doc();
assertNull(doc.root());
ERXML.E root = doc.root("test");
assertEquals(root, doc.root());
assertEquals(2, doc.children().size());
assertEquals(root, doc.children().get(1));
try {
doc.root("test2");
throw new AssertionFailedError("should have failed");
}
catch (IllegalStateException e) {
// EXPECTED
}
}
public void testSetRoot() {
ERXML.Doc doc = ERXML.doc();
ERXML.E root = ERXML.e("test");
doc.setRoot(root);
assertEquals("test", root.name());
assertEquals(root, doc.root());
assertEquals(2, doc.children().size());
ERXML.E root2 = ERXML.e("test2");
doc.setRoot(root2);
assertEquals(root2, doc.root());
assertEquals(2, doc.children().size());
assertEquals(root2, doc.children().get(1));
doc.setRoot(null);
assertEquals(null, doc.root());
assertEquals(1, doc.children().size());
assertEquals(doc.declaration(), doc.children().get(0));
}
public void testComment() {
ERXML.Doc doc = ERXML.doc();
doc.comment("This is a comment");
assertEquals(2, doc.children().size());
assertEquals(doc.declaration(), doc.children().get(0));
assertEquals(ERXML.Comment.class, doc.children().get(1).getClass());
assertEquals("This is a comment", ((ERXML.Comment) doc.children().get(1)).text());
}
public void testAdd() {
ERXML.Doc doc = ERXML.doc();
doc.comment("comment1");
doc.comment("comment2");
doc.comment("comment3");
assertEquals(doc.declaration(), doc.children().get(0));
assertEquals("comment1", ((ERXML.Comment) doc.children().get(1)).text());
assertEquals("comment2", ((ERXML.Comment) doc.children().get(2)).text());
assertEquals("comment3", ((ERXML.Comment) doc.children().get(3)).text());
}
public void testRemove() {
ERXML.Doc doc = ERXML.doc();
doc.comment("comment1");
doc.comment("comment2");
doc.comment("comment3");
assertEquals(4, doc.children().size());
ERXML.Comment comment = (ERXML.Comment) doc.children().get(2);
assertEquals("comment2", comment.text());
doc.remove(comment);
assertEquals(3, doc.children().size());
assertEquals(doc.declaration(), doc.children().get(0));
assertEquals("comment1", ((ERXML.Comment) doc.children().get(1)).text());
assertEquals("comment3", ((ERXML.Comment) doc.children().get(2)).text());
}
public void testChildren() {
ERXML.Doc doc = ERXML.doc();
doc.comment("comment1");
doc.comment("comment2");
doc.comment("comment3");
assertNotNull(doc.children());
assertEquals(4, doc.children().size());
}
public void testWrite() {
ERXML.Doc doc = ERXML.doc();
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", doc.toString());
doc.comment("comment1");
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- comment1 -->\n", doc.toString());
doc.root("parent");
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- comment1 -->\n<parent />\n", doc.toString());
}
public void testVisit() {
ERXML.Doc doc = ERXML.doc();
doc.comment("comment1");
doc.root("parent");
final Set<ERXML.Item> shouldVisit = new HashSet<ERXML.Item>();
shouldVisit.add(doc);
shouldVisit.addAll(doc.children());
final Set<ERXML.Item> visited = new HashSet<ERXML.Item>();
doc.visit(new Visitor() {
public boolean visit(Item item) {
visited.add(item);
return true;
}
});
assertEquals(shouldVisit, visited);
}
public void testW3CToXISS() throws SAXException, IOException, ParserConfigurationException {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader("<person><first-name>Mike</first-name><last-name>Schrag</last-name><addresses><address location=\"home\"><address>100 Main St</address><city>Richmond</city></address></addresses></person>")));
ERXML.Doc doc = ERXML.doc(document);
assertEquals("person", doc.root().name());
assertEquals(((ERXML.E) doc.root().children().get(0)).name(), "first-name");
assertEquals(((ERXML.E) doc.root().children().get(0)).text(), "Mike");
assertEquals(((ERXML.E) doc.root().children().get(2)).name(), "addresses");
assertEquals(((ERXML.E) ((ERXML.E) doc.root().children().get(2)).children().get(0)).name(), "address");
assertEquals(((ERXML.E) ((ERXML.E) doc.root().children().get(2)).children().get(0)).get("location"), "home");
}
public void testXISSToW3C() throws SAXException, IOException, ParserConfigurationException, TransformerFactoryConfigurationError, TransformerException {
org.w3c.dom.Document document1 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader("<person><first-name>Mike</first-name><last-name>Schrag</last-name><addresses><address location=\"home\"><address>100 Main St</address><city>Richmond</city></address></addresses></person>")));
ERXML.Doc doc = ERXML.doc(document1);
org.w3c.dom.Document document2 = doc.w3c();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StreamResult result1 = new StreamResult(new StringWriter());
transformer.transform(new DOMSource(document1), result1);
String xmlString1 = result1.getWriter().toString();
StreamResult result2 = new StreamResult(new StringWriter());
transformer.transform(new DOMSource(document2), result2);
String xmlString2 = result2.getWriter().toString();
assertEquals(xmlString1, xmlString2);
}
public void testEscapedValues() {
ERXML.Doc doc = ERXML.doc();
doc.root("person").set("name", "<M & M>");
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person name=\"<M & M>\" />\n", doc.toString());
}
}