package org.neo4j.shell.tools.imp;
import org.junit.Before;
import org.junit.Test;
import org.neo4j.cypher.export.DatabaseSubGraph;
import org.neo4j.graphdb.*;
import org.neo4j.shell.ShellException;
import org.neo4j.shell.tools.imp.util.Config;
import org.neo4j.shell.tools.imp.format.graphml.XmlGraphMLReader;
import org.neo4j.shell.tools.imp.format.graphml.XmlGraphMLWriter;
import org.neo4j.shell.tools.imp.util.ElementCounter;
import org.neo4j.shell.tools.imp.util.ProgressReporter;
import org.neo4j.test.TestGraphDatabaseFactory;
import javax.xml.stream.XMLStreamException;
import java.io.IOException;
import java.io.StringWriter;
import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.Random;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
/**
* Created by mh on 04.07.13.
*/
public class ExportXmlGraphMLWriterTest {
static final Label LABEL = DynamicLabel.label("FOO");
static final DynamicRelationshipType TYPE = DynamicRelationshipType.withName("BAR");
public static final String GRAPH = "<graph id=\"G\" edgedefault=\"directed\">\n";
static final String TEST_XML_HEADER =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n";
static final String TEST_XML_KEYS =
"<key id=\"na<>me\" for=\"node\" attr.name=\"na<>me\" attr.type=\"string\"/>\n" +
"<key id=\"count\" for=\"edge\" attr.name=\"count\" attr.type=\"double\"/>\n";
public static final String TEST_XML_DATA_NODE =
"<node id=\"n0\" labels=\":FOO\"><data key=\"labels\">:FOO</data><data key=\"na<>me\">John & Dö</data></node>\n";
public static final String TEST_XML_DATA_EDGE =
"<edge id=\"e0\" source=\"n0\" target=\"n0\" label=\"BAR\"><data key=\"label\">BAR</data><data key=\"count\">0.01</data></edge>\n";
static final String TEST_XML_DATA = TEST_XML_DATA_NODE + TEST_XML_DATA_EDGE;
static final String TEST_XML_FOOTER =
"</graph>\n" +
"</graphml>";
private final Random random = new Random();
private GraphDatabaseService db;
@Test
public void testExportGraphML() throws Exception {
createData(1000);
ProgressReporter reporter = new ProgressReporter(null, null);
doExport(reporter, false);
assertEquals(new ElementCounter().update(1000, 1000, 2000), reporter.getTotal());
}
private String doExport(ProgressReporter reporter, boolean types) throws IOException, XMLStreamException {
try (Transaction tx = db.beginTx()) {
StringWriter writer = new StringWriter();
XmlGraphMLWriter xmlGraphMLWriter = new XmlGraphMLWriter();
Config config = Config.config();
xmlGraphMLWriter.write(new DatabaseSubGraph(db), writer, reporter, types ? config.withTypes() : config);
tx.success();
return writer.toString().trim();
}
}
@Test
public void testSplitLabels() throws Exception {
String labels=":Label1 :Label2 :Label3:Label4 ";
String[] parts = labels.trim().split(XmlGraphMLReader.LABEL_SPLIT);
assertArrayEquals("mismatch "+ Arrays.toString(parts),new String[]{"","Label1","Label2","Label3","Label4"},parts);
}
@Test
public void testExportTinyGraph() throws Exception {
createData(1);
ProgressReporter reporter = new ProgressReporter(null, null);
String xml = doExport(reporter, false);
assertEquals(new ElementCounter().update(1, 1, 2), reporter.getTotal());
assertEquals(TEST_XML_HEADER+TEST_XML_DATA+TEST_XML_FOOTER,xml);
}
@Test
public void testExportTinyGraphWithKeys() throws Exception {
createData(1);
ProgressReporter reporter = new ProgressReporter(null, null);
String xml = doExport(reporter,true);
assertEquals(new ElementCounter().update(1, 1, 2), reporter.getTotal());
assertEquals(TEST_XML_HEADER+TEST_XML_KEYS+TEST_XML_DATA+TEST_XML_FOOTER,xml);
}
private void createData(int nodes) {
try (Transaction tx = db.beginTx()) {
for (int i=0;i< nodes;i++) {
Node node = db.createNode(LABEL);
node.setProperty("na<>me","John & Dö");
}
for (int i=0;i< nodes;i++) {
Node from = db.getNodeById(random.nextInt(nodes));
Node to = db.getNodeById(random.nextInt(nodes));
Relationship rel = from.createRelationshipTo(to, TYPE);
rel.setProperty("count",((double)i+1)/100);
}
tx.success();
}
}
@Before
public void setUp() throws RemoteException, ShellException {
db = new TestGraphDatabaseFactory().newImpermanentDatabase();
}
}