package com.googlecode.gwt.test.xml;
import com.google.gwt.xml.client.*;
import com.googlecode.gwt.test.GwtTestTest;
import com.googlecode.gwt.test.internal.utils.XmlUtils;
import org.junit.Test;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.InputStream;
import java.io.StringWriter;
import static org.assertj.core.api.Assertions.assertThat;
public class XMLParserTest extends GwtTestTest {
@Test
public void parse() throws Exception {
// Given
String xmlContent = convertXMLFileToString("/someXML.xml");
// When
Document document = XMLParser.parse(xmlContent);
// Then
Element documentElement = document.getDocumentElement();
assertThat(documentElement.getTagName()).isEqualTo("beans");
Element beans = (Element) document.getFirstChild();
assertThat(beans.getTagName()).isEqualTo("beans");
assertThat(beans.getNextSibling()).isNull();
assertThat(beans.getPreviousSibling()).isNull();
Element testBean = document.getElementById("testBean");
NodeList beanList = document.getElementsByTagName("bean");
assertThat(beanList.getLength()).isEqualTo(2);
assertThat(beanList.item(0).getAttributes().getNamedItem("id").getNodeValue()).isEqualTo("testBean");
assertThat(testBean.getTagName()).isEqualTo("bean");
assertThat(testBean.getNodeName()).isEqualTo("bean");
assertThat(testBean.getNamespaceURI()).isEqualTo("http://www.springframework.org/schema/beans");
assertThat(testBean.getAttribute("class")).isEqualTo("org.springframework.beans.TestBean");
assertThat(testBean.hasAttribute("class")).isTrue();
assertThat(testBean.hasAttribute("fooAttr")).isFalse();
Attr classAttr = testBean.getAttributeNode("class");
assertThat(classAttr.getName()).isEqualTo("class");
assertThat(classAttr.getValue()).isEqualTo("org.springframework.beans.TestBean");
assertThat(classAttr.getNamespaceURI()).isEqualTo("http://www.springframework.org/schema/beans");
assertThat(classAttr.getNodeName()).isEqualTo("class");
// CDATA attribute
Element ageProperty = (Element) testBean.getChildNodes().item(0);
assertThat(ageProperty.getAttributes().getLength()).isEqualTo(1);
assertThat(ageProperty.getAttribute("name")).isEqualTo("age");
assertThat(ageProperty.getNodeValue()).isEqualTo("<10>");
// TODO : pass this assertion
// ThenEquals("#cdata-section",
// ageProperty.getFirstChild().getNodeName());
// "spouse" child bean assertions
NamedNodeMap innerBeanAgePropertyAttributes = beanList.item(1).getChildNodes().item(0).getAttributes();
assertThat(innerBeanAgePropertyAttributes.getNamedItem("name").getNodeValue()).isEqualTo("age");
assertThat(innerBeanAgePropertyAttributes.getNamedItem("value").getNodeValue()).isEqualTo("11");
// bean from "util" namespace
Element name = (Element) testBean.getNextSibling();
assertThat(name.getTagName()).isEqualTo("property-path");
assertThat(name.getNodeName()).isEqualTo("property-path");
assertThat(name.getNamespaceURI()).isEqualTo("http://www.springframework.org/schema/util");
}
@Test
public void parseSimple() {
// Given
String simpleXML = "<tags><tag>value</tag></tags>";
// When
Document doc = XMLParser.parse(simpleXML);
// Then
NodeList tags = doc.getElementsByTagName("tag");
assertThat(tags.item(0).toString()).isEqualTo("<tag>value</tag>");
Text text = (Text) tags.item(0).getChildNodes().item(0);
assertThat(text.getData()).isEqualTo("value");
assertThat(tags.item(0).getFirstChild().getNodeName()).isEqualTo("#text");
assertThat(doc.getDocumentElement().toString()).isEqualTo("<tags><tag>value</tag></tags>");
assertThat(tags.item(0).getOwnerDocument().getDocumentElement()).isEqualTo(doc.getDocumentElement());
}
@Test
public void removeWhitespace() throws Exception {
// Given
Document document = XMLParser.createDocument();
Element child = document.createElement("child");
child.setNodeValue(" ");
document.appendChild(child);
Element child2 = document.createElement("child");
child2.appendChild(document.createCDATASection(" "));
document.appendChild(child2);
// Preconditions : empty TextNode should exists
assertThat(child.getChildNodes().getLength()).isEqualTo(1);
assertThat(child2.getChildNodes().getLength()).isEqualTo(1);
// When
XMLParser.removeWhitespace(document);
// Then
assertThat(child.getChildNodes().getLength()).isEqualTo(0);
// empty cdata is not removed
assertThat(child2.getChildNodes().getLength()).isEqualTo(1);
}
private String convertXMLFileToString(String fileName) {
try {
InputStream inputStream = this.getClass().getResourceAsStream(fileName);
org.w3c.dom.Document doc = XmlUtils.newDocumentBuilder().parse(inputStream);
StringWriter stw = new StringWriter();
Transformer serializer = TransformerFactory.newInstance().newTransformer();
serializer.transform(new DOMSource(doc), new StreamResult(stw));
return stw.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}