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.HashMap; import java.util.Map; import org.cytoscape.d3.internal.serializer.D3TreeModule; import org.cytoscape.d3.internal.writer.D3NetworkViewWriter; 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.work.TaskMonitor; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class D3TreeWiterTest { private final NetworkViewTestSupport support = new NetworkViewTestSupport(); protected TaskMonitor tm; protected Map<Long, CyNode> suid2nodeMap; protected Map<Long, CyEdge> suid2edgeMap; protected CyNetworkView view; private CyNode root; @Before public void setUp() throws Exception { this.tm = mock(TaskMonitor.class); suid2nodeMap = new HashMap<Long, CyNode>(); suid2edgeMap = new HashMap<Long, CyEdge>(); this.view = generateTreeView(); assertNotNull(view); } @After public void tearDown() throws Exception { } /** * Create a simple tree for testing * * @return * @throws Exception */ private CyNetworkView generateTreeView() throws Exception { final CyNetwork tree = support.getNetwork(); root = tree.addNode(); // Level 1 CyNode c1 = tree.addNode(); CyNode c2 = tree.addNode(); // Level 2 CyNode c3 = tree.addNode(); CyNode c4 = tree.addNode(); CyNode c5 = tree.addNode(); // Level 3 CyNode c6 = tree.addNode(); CyNode c7 = tree.addNode(); suid2nodeMap.put(root.getSUID(), root); suid2nodeMap.put(c1.getSUID(), c1); suid2nodeMap.put(c2.getSUID(), c2); suid2nodeMap.put(c3.getSUID(), c3); suid2nodeMap.put(c4.getSUID(), c4); suid2nodeMap.put(c5.getSUID(), c5); suid2nodeMap.put(c6.getSUID(), c6); suid2nodeMap.put(c7.getSUID(), c7); CyEdge e1 = tree.addEdge(root, c1, true); CyEdge e2 = tree.addEdge(root, c2, true); CyEdge e3 = tree.addEdge(c1, c3, true); CyEdge e4 = tree.addEdge(c1, c4, true); CyEdge e5 = tree.addEdge(c2, c5, true); CyEdge e6 = tree.addEdge(c3, c6, true); CyEdge e7 = tree.addEdge(c3, c7, true); suid2edgeMap.put(e1.getSUID(), e1); suid2edgeMap.put(e2.getSUID(), e2); suid2edgeMap.put(e3.getSUID(), e3); suid2edgeMap.put(e4.getSUID(), e4); suid2edgeMap.put(e5.getSUID(), e5); suid2edgeMap.put(e6.getSUID(), e6); suid2edgeMap.put(e7.getSUID(), e7); tree.getRow(root).set(CyNetwork.NAME, "root"); tree.getRow(c1).set(CyNetwork.NAME, "c1"); tree.getRow(c2).set(CyNetwork.NAME, "c2"); tree.getRow(c3).set(CyNetwork.NAME, "c3"); tree.getRow(c4).set(CyNetwork.NAME, "c4"); tree.getRow(c5).set(CyNetwork.NAME, "c5"); tree.getRow(c6).set(CyNetwork.NAME, "c6"); tree.getRow(c7).set(CyNetwork.NAME, "c7"); final CyNetworkView view = support.getNetworkViewFactory().createNetworkView(tree); assertEquals(8, view.getModel().getNodeCount()); assertEquals(7, view.getModel().getEdgeCount()); return view; } private final File readTree(final String outFileName) throws Exception { final ObjectMapper treeMapper = new ObjectMapper(); treeMapper.registerModule(new D3TreeModule()); File temp = new File(outFileName); OutputStream os = new FileOutputStream(temp); final D3NetworkViewWriter writer = new D3NetworkViewWriter(os, view, treeMapper); writer.run(tm); os.close(); return temp; } @Test(expected = JsonMappingException.class) public void testNoRoot() throws Exception { readTree("target/d3NoRoot.json"); } @Test public void testTree() throws Exception { view.getModel().getRow(root).set(CyNetwork.SELECTED, true); File temp = readTree("target/d3Tree.json"); readAndTest(temp, view.getModel()); } 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); assertEquals(4, rootNode.size()); final JsonNode rootName = rootNode.get(CyNetwork.NAME); final JsonNode rootSelected = rootNode.get(CyNetwork.SELECTED); final JsonNode rootSUID = rootNode.get(CyNetwork.SUID); final JsonNode children = rootNode.get("children"); assertNotNull(rootName); assertEquals(true, rootSelected.asBoolean()); assertNotNull(rootSUID.asLong()); assertTrue(children.isArray()); } }