package io.selendroid.server.model.internal;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import io.selendroid.server.model.internal.JsonXmlUtil;
import io.selendroid.server.util.SelendroidLogger;
import org.apache.commons.io.FileUtils;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class JsonXmlUtilTest {
private Document document;
@Before
public void setup() throws Exception {
String json =
new FileUtils().readFileToString(new File("src/test/resources/source.json"), "UTF-8");
JSONObject source = new JSONObject(new JSONTokener(json));
JsonXmlUtil util = new JsonXmlUtil();
document = util.buildXmlDocument(source);
}
@Test
public void shouldFindSingleElement() throws Exception {
List<Node> nodes = validateXPath("(//InternalListView)[1]", document);
Assert.assertEquals(nodes.size(), 1);
}
/**
* the <code>source.json</code> file contains two entries where the type contains the dollar sign.
* Both scenarios (simple and full class name e.g.
* <code>PullToRefreshListView$InternalListView</code>) are supported and both can be used.
*
* @throws Exception
*/
@Test
public void shouldFindElementWithFullClassName() throws Exception {
List<Node> nodes = validateXPath("//InternalListView", document);
Assert.assertEquals(nodes.size(), 2);
}
private List<Node> validateXPath(String expression, Document xmlDocument) {
List<Node> elements = new ArrayList<Node>();
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodeList;
try {
// read a nodelist using xpath
nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
SelendroidLogger.error("Failed to get NodeList from xPath", e);
return elements;
}
if (nodeList != null && nodeList.getLength() > 0) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getAttributes() == null) {
continue;
}
elements.add(node);
}
}
return elements;
}
}