package com.tinkerpop.blueprints.util.io.graphson;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory;
import org.junit.Assert;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class GraphSONReaderTest {
@Test
public void inputGraphModeExtended() throws IOException {
TinkerGraph graph = new TinkerGraph();
String json = "{ \"mode\":\"EXTENDED\", \"vertices\": [ {\"_id\":1, \"_type\":\"vertex\", \"test\": { \"type\":\"string\", \"value\":\"please work\"}, \"testlist\":{\"type\":\"list\", \"value\":[{\"type\":\"int\", \"value\":1}, {\"type\":\"int\",\"value\":2}, {\"type\":\"int\",\"value\":3}]}, \"testmap\":{\"type\":\"map\", \"value\":{\"big\":{\"type\":\"long\", \"value\":10000000000}, \"small\":{\"type\":\"double\", \"value\":0.4954959595959}}}}, {\"_id\":2, \"_type\":\"vertex\", \"testagain\":{\"type\":\"string\", \"value\":\"please work again\"}}], \"edges\":[{\"_id\":100, \"_type\":\"edge\", \"_outV\":1, \"_inV\":2, \"_label\":\"works\", \"teste\": {\"type\":\"string\", \"value\":\"please worke\"}}]}";
byte[] bytes = json.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
GraphSONReader.inputGraph(graph, inputStream);
Assert.assertEquals(2, getIterableCount(graph.getVertices()));
Assert.assertEquals(1, getIterableCount(graph.getEdges()));
Vertex v1 = graph.getVertex(1);
Assert.assertNotNull(v1);
Assert.assertEquals("please work", v1.getProperty("test"));
Map map = (Map) v1.getProperty("testmap");
Assert.assertNotNull(map);
Assert.assertEquals(10000000000l, Long.parseLong(map.get("big").toString()));
Assert.assertEquals(0.4954959595959, Double.parseDouble(map.get("small").toString()), 0);
//Assert.assertNull(map.get("nullKey"));
List list = (List) v1.getProperty("testlist");
Assert.assertEquals(3, list.size());
boolean foundNull = false;
for (int ix = 0; ix < list.size(); ix++) {
if (list.get(ix) == null) {
foundNull = true;
break;
}
}
Assert.assertTrue(foundNull);
Vertex v2 = graph.getVertex(2);
Assert.assertNotNull(v2);
Assert.assertEquals("please work again", v2.getProperty("testagain"));
Edge e = graph.getEdge(100);
Assert.assertNotNull(e);
Assert.assertEquals("works", e.getLabel());
Assert.assertEquals(v1, e.getVertex(Direction.OUT));
Assert.assertEquals(v2, e.getVertex(Direction.IN));
Assert.assertEquals("please worke", e.getProperty("teste"));
//Assert.assertNull(e.getProperty("keyNull"));
}
@Test
public void inputGraphModeNormal() throws IOException {
TinkerGraph graph = new TinkerGraph();
String json = "{ \"mode\":\"NORMAL\",\"vertices\": [ {\"_id\":1, \"_type\":\"vertex\", \"test\": \"please work\", \"testlist\":[1, 2, 3, null], \"testmap\":{\"big\":10000000000, \"small\":0.4954959595959}}, {\"_id\":2, \"_type\":\"vertex\", \"testagain\":\"please work again\"}], \"edges\":[{\"_id\":100, \"_type\":\"edge\", \"_outV\":1, \"_inV\":2, \"_label\":\"works\", \"teste\": \"please worke\"}]}";
byte[] bytes = json.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
GraphSONReader.inputGraph(graph, inputStream);
Assert.assertEquals(2, getIterableCount(graph.getVertices()));
Assert.assertEquals(1, getIterableCount(graph.getEdges()));
Vertex v1 = graph.getVertex(1);
Assert.assertNotNull(v1);
Assert.assertEquals("please work", v1.getProperty("test"));
Map map = (Map) v1.getProperty("testmap");
Assert.assertNotNull(map);
Assert.assertEquals(10000000000l, Long.parseLong(map.get("big").toString()));
Assert.assertEquals(0.4954959595959, Double.parseDouble(map.get("small").toString()), 0);
Assert.assertNull(map.get("nullKey"));
List list = (List) v1.getProperty("testlist");
Assert.assertEquals(4, list.size());
boolean foundNull = false;
for (int ix = 0; ix < list.size(); ix++) {
if (list.get(ix) == null) {
foundNull = true;
break;
}
}
Assert.assertTrue(foundNull);
Vertex v2 = graph.getVertex(2);
Assert.assertNotNull(v2);
Assert.assertEquals("please work again", v2.getProperty("testagain"));
Edge e = graph.getEdge(100);
Assert.assertNotNull(e);
Assert.assertEquals("works", e.getLabel());
Assert.assertEquals(v1, e.getVertex(Direction.OUT));
Assert.assertEquals(v2, e.getVertex(Direction.IN));
Assert.assertEquals("please worke", e.getProperty("teste"));
Assert.assertNull(e.getProperty("keyNull"));
}
@Test
public void inputGraphModeCompact() throws IOException {
TinkerGraph graph = new TinkerGraph();
String json = "{ \"mode\":\"COMPACT\",\"vertices\": [ {\"_id\":1, \"test\": \"please work\", \"testlist\":[1, 2, 3, null], \"testmap\":{\"big\":10000000000, \"small\":0.4954959595959}}, {\"_id\":2, \"testagain\":\"please work again\"}], \"edges\":[{\"_id\":100, \"_outV\":1, \"_inV\":2, \"_label\":\"works\", \"teste\": \"please worke\"}]}";
byte[] bytes = json.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
GraphSONReader.inputGraph(graph, inputStream);
Assert.assertEquals(2, getIterableCount(graph.getVertices()));
Assert.assertEquals(1, getIterableCount(graph.getEdges()));
Vertex v1 = graph.getVertex(1);
Assert.assertNotNull(v1);
Assert.assertEquals("please work", v1.getProperty("test"));
Map map = (Map) v1.getProperty("testmap");
Assert.assertNotNull(map);
Assert.assertEquals(10000000000l, Long.parseLong(map.get("big").toString()));
Assert.assertEquals(0.4954959595959, Double.parseDouble(map.get("small").toString()), 0);
// Assert.assertNull(map.get("nullKey"));
List list = (List) v1.getProperty("testlist");
Assert.assertEquals(4, list.size());
boolean foundNull = false;
for (int ix = 0; ix < list.size(); ix++) {
if (list.get(ix) == null) {
foundNull = true;
break;
}
}
Assert.assertTrue(foundNull);
Vertex v2 = graph.getVertex(2);
Assert.assertNotNull(v2);
Assert.assertEquals("please work again", v2.getProperty("testagain"));
Edge e = graph.getEdge(100);
Assert.assertNotNull(e);
Assert.assertEquals("works", e.getLabel());
Assert.assertEquals(v1, e.getVertex(Direction.OUT));
Assert.assertEquals(v2, e.getVertex(Direction.IN));
Assert.assertEquals("please worke", e.getProperty("teste"));
Assert.assertNull(e.getProperty("keyNull"));
}
@Test
public void inputGraphExtendedFullCycle() throws IOException {
TinkerGraph graph = TinkerGraphFactory.createTinkerGraph();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
GraphSONWriter writer = new GraphSONWriter(graph);
writer.outputGraph(stream, null, null, GraphSONMode.EXTENDED);
stream.flush();
stream.close();
String jsonString = new String(stream.toByteArray());
byte[] bytes = jsonString.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
TinkerGraph emptyGraph = new TinkerGraph();
GraphSONReader.inputGraph(emptyGraph, inputStream);
Assert.assertEquals(6, getIterableCount(emptyGraph.getVertices()));
Assert.assertEquals(6, getIterableCount(emptyGraph.getEdges()));
for (Vertex v : graph.getVertices()) {
Vertex found = emptyGraph.getVertex(v.getId());
Assert.assertNotNull(v);
for (String key : found.getPropertyKeys()) {
Assert.assertEquals(v.getProperty(key), found.getProperty(key));
}
}
for (Edge e : graph.getEdges()) {
Edge found = emptyGraph.getEdge(e.getId());
Assert.assertNotNull(e);
for (String key : found.getPropertyKeys()) {
Assert.assertEquals(e.getProperty(key), found.getProperty(key));
}
}
}
@Test
public void inputGraphCompactFullCycle() throws IOException {
TinkerGraph graph = TinkerGraphFactory.createTinkerGraph();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Set<String> edgeKeys = new HashSet<String>();
edgeKeys.add(GraphSONTokens._ID);
edgeKeys.add(GraphSONTokens._IN_V);
edgeKeys.add(GraphSONTokens._OUT_V);
edgeKeys.add(GraphSONTokens._LABEL);
Set<String> vertexKeys = new HashSet<String>();
vertexKeys.add(GraphSONTokens._ID);
GraphSONWriter writer = new GraphSONWriter(graph);
writer.outputGraph(stream, vertexKeys, edgeKeys, GraphSONMode.COMPACT);
stream.flush();
stream.close();
String jsonString = new String(stream.toByteArray());
byte[] bytes = jsonString.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
TinkerGraph emptyGraph = new TinkerGraph();
GraphSONReader.inputGraph(emptyGraph, inputStream);
Assert.assertEquals(6, getIterableCount(emptyGraph.getVertices()));
Assert.assertEquals(6, getIterableCount(emptyGraph.getEdges()));
for (Vertex v : graph.getVertices()) {
Vertex found = emptyGraph.getVertex(v.getId());
Assert.assertNotNull(v);
for (String key : found.getPropertyKeys()) {
Assert.assertEquals(v.getProperty(key), found.getProperty(key));
}
// no properties should be here
Assert.assertEquals(null, found.getProperty("name"));
}
for (Edge e : graph.getEdges()) {
Edge found = emptyGraph.getEdge(e.getId());
Assert.assertNotNull(e);
for (String key : found.getPropertyKeys()) {
Assert.assertEquals(e.getProperty(key), found.getProperty(key));
}
// no properties should be here
Assert.assertEquals(null, found.getProperty("weight"));
}
}
@Test(expected = IllegalArgumentException.class)
public void inputGraphCompactFullCycleBroken() throws IOException {
TinkerGraph graph = TinkerGraphFactory.createTinkerGraph();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Set<String> edgeKeys = new HashSet<String>();
edgeKeys.add(GraphSONTokens._IN_V);
edgeKeys.add(GraphSONTokens._OUT_V);
edgeKeys.add(GraphSONTokens._LABEL);
Set<String> vertexKeys = new HashSet<String>();
GraphSONWriter writer = new GraphSONWriter(graph);
writer.outputGraph(stream, vertexKeys, edgeKeys, GraphSONMode.COMPACT);
stream.flush();
stream.close();
String jsonString = new String(stream.toByteArray());
byte[] bytes = jsonString.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
TinkerGraph emptyGraph = new TinkerGraph();
GraphSONReader.inputGraph(emptyGraph, inputStream);
}
@Test(expected = IllegalArgumentException.class)
public void inputStreamIsNull() throws IOException {
TinkerGraph graph = new TinkerGraph();
InputStream inputStream = null;
GraphSONReader.inputGraph(graph, inputStream);
}
private int getIterableCount(Iterable elements) {
int counter = 0;
Iterator iterator = elements.iterator();
while (iterator.hasNext()) {
iterator.next();
counter++;
}
return counter;
}
}