package org.cytoscape.d3; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.cytoscape.d3.internal.serializer.D3jsModule; import org.cytoscape.d3.internal.writer.D3NetworkViewWriter; import org.cytoscape.d3.internal.writer.D3NetworkWriter; import org.cytoscape.ding.NetworkViewTestSupport; import org.cytoscape.model.CyEdge; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNode; import org.cytoscape.view.model.CyNetworkView; import org.cytoscape.view.model.View; import org.cytoscape.view.presentation.property.BasicVisualLexicon; import org.cytoscape.work.TaskMonitor; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class D3WriterTest { private final NetworkViewTestSupport support = new NetworkViewTestSupport(); protected TaskMonitor tm; protected Map<Long, CyNode> suid2nodeMap; protected Map<Long, CyEdge> suid2edgeMap; protected CyNetworkView view; @Before public void setUp() throws Exception { this.tm = mock(TaskMonitor.class); suid2nodeMap = new HashMap<Long, CyNode>(); suid2edgeMap = new HashMap<Long, CyEdge>(); this.view = generateNetworkView(); assertNotNull(view); } @After public void tearDown() throws Exception { } protected CyNetworkView generateNetworkView() throws Exception { final CyNetwork network1 = support.getNetwork(); CyNode n1 = network1.addNode(); CyNode n2 = network1.addNode(); CyNode n3 = network1.addNode(); // Not connected CyNode n4 = network1.addNode(); CyNode n5 = network1.addNode(); suid2nodeMap.put(n1.getSUID(), n1); suid2nodeMap.put(n2.getSUID(), n2); suid2nodeMap.put(n3.getSUID(), n3); suid2nodeMap.put(n4.getSUID(), n4); suid2nodeMap.put(n5.getSUID(), n5); CyEdge e1 = network1.addEdge(n1, n2, true); CyEdge e2 = network1.addEdge(n2, n3, true); CyEdge e3 = network1.addEdge(n1, n3, true); CyEdge e1self = network1.addEdge(n1, n1, true); suid2edgeMap.put(e1.getSUID(), e1); suid2edgeMap.put(e2.getSUID(), e2); suid2edgeMap.put(e3.getSUID(), e3); suid2edgeMap.put(e1self.getSUID(), e1self); network1.getRow(n1).set(CyNetwork.NAME, "n1"); network1.getRow(n2).set(CyNetwork.NAME, "n2: 日本語テスト"); network1.getRow(n3).set(CyNetwork.NAME, "n3"); network1.getRow(n4).set(CyNetwork.NAME, "n4: Alone"); network1.getRow(n5).set(CyNetwork.NAME, "n5"); network1.getDefaultNodeTable().createColumn("DoubleTest", Double.class, false); network1.getDefaultNodeTable().createColumn("IntTest", Integer.class, false); network1.getDefaultNodeTable().createListColumn("StringListTest", String.class, false); network1.getRow(n1).set("DoubleTest", 10.2d); network1.getRow(n1).set("IntTest", 3); List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); network1.getRow(n1).set("StringListTest", list); network1.getRow(e1).set(CyNetwork.NAME, "e1"); network1.getRow(e2).set(CyNetwork.NAME, "エッジ2"); network1.getRow(e3).set(CyNetwork.NAME, "e3"); network1.getRow(e1self).set(CyNetwork.NAME, "e1self"); final CyNetworkView view = support.getNetworkViewFactory().createNetworkView(network1); // Create some visual properties final View<CyNode> view1 = view.getNodeView(n1); view1.setVisualProperty(BasicVisualLexicon.NODE_X_LOCATION, 50d); view1.setVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION, 50d); assertEquals(5, view.getModel().getNodeCount()); assertEquals(4, view.getModel().getEdgeCount()); return view; } @Test public void testViewWriter() throws Exception { final ObjectMapper jsMapper = new ObjectMapper(); jsMapper.registerModule(new D3jsModule()); File temp = new File("target/d3Network1.json"); OutputStream os = new FileOutputStream(temp); final D3NetworkViewWriter writer = new D3NetworkViewWriter(os, view, jsMapper); writer.run(tm); readAndTest(temp, view.getModel()); os.close(); } @Test public void testWriter() throws Exception { final ObjectMapper jsMapper = new ObjectMapper(); jsMapper.registerModule(new D3jsModule()); File temp = new File("target/d3Network1.json"); OutputStream os = new FileOutputStream(temp); final D3NetworkWriter writer = new D3NetworkWriter(os, view.getModel(), jsMapper); writer.run(tm); readAndTest(temp, view.getModel()); os.close(); } private void readAndTest(final File outFile, CyNetwork network) throws IOException { final FileInputStream fileInputStream = new FileInputStream(outFile); final BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); final ObjectMapper mapper = new ObjectMapper(); final JsonNode rootNode = mapper.readValue(reader, JsonNode.class); assertNotNull(rootNode); final JsonNode nodes = rootNode.get("nodes"); final JsonNode edges = rootNode.get("links"); assertNotNull(nodes); assertTrue(nodes.isArray()); assertNotNull(edges); assertTrue(edges.isArray()); assertEquals(5, nodes.size()); assertEquals(4, edges.size()); } }