/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. Copyright 2011 Gephi Consortium. All rights reserved. The contents of this file are subject to the terms of either the GNU General Public License Version 3 only ("GPL") or the Common Development and Distribution License("CDDL") (collectively, the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the License at http://gephi.org/about/legal/license-notice/ or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the specific language governing permissions and limitations under the License. When distributing the software, include this License Header Notice in each file and include the License files at /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the License Header, with the fields enclosed by brackets [] replaced by your own identifying information: "Portions Copyrighted [year] [name of copyright owner]" If you wish your version of this file to be governed by only the CDDL or only the GPL Version 3, indicate your decision by adding "[Contributor] elects to include this software in this distribution under the [CDDL or GPL Version 3] license." If you do not indicate a single choice of license, a recipient has the option to distribute your version of this file under either the CDDL, the GPL Version 3 or to extend the choice of license to its licensees as provided above. However, if you add GPL Version 3 code and therefore, elected the GPL Version 3 license, then the option applies only if the new code is made subject to such option by the copyright holder. Contributor(s): Portions Copyrighted 2011 Gephi Consortium. */ package org.gephi.graph.dhns.core; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.gephi.graph.api.HierarchicalGraph; import org.gephi.graph.api.Edge; import org.gephi.graph.api.GraphEvent; import org.gephi.graph.api.GraphListener; import org.gephi.graph.api.Node; import org.gephi.graph.dhns.DhnsGraphController; import org.gephi.graph.dhns.edge.AbstractEdge; import org.gephi.graph.dhns.edge.MetaEdgeImpl; import org.gephi.graph.dhns.graph.HierarchicalDirectedGraphImpl; import org.gephi.graph.dhns.graph.HierarchicalUndirectedGraphImpl; import org.gephi.graph.dhns.node.AbstractNode; import org.gephi.graph.dhns.node.iterators.LevelIterator; import org.gephi.graph.dhns.node.iterators.TreeListIterator; import org.gephi.graph.dhns.predicate.Tautology; import org.gephi.utils.collection.avl.ParamAVLIterator; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; import org.openide.util.Exceptions; /** * * @author Mathieu */ public class DhnsTestClusteredGraph { private Dhns dhnsGlobal; private HierarchicalDirectedGraphImpl graphGlobal; private Dhns dhnsGlobal2; private HierarchicalDirectedGraphImpl graphGlobal2Directed; private HierarchicalUndirectedGraphImpl graphGlobal2Undirected; private Map<String, AbstractNode> nodeMap; private Map<String, Edge> edgeMap; @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() { DhnsGraphController controller = new DhnsGraphController(); dhnsGlobal = new Dhns(controller, null); graphGlobal = new HierarchicalDirectedGraphImpl(dhnsGlobal, dhnsGlobal.getGraphStructure().getMainView()); nodeMap = new HashMap<String, AbstractNode>(); edgeMap = new HashMap<String, Edge>(); TreeStructure treeStructure = dhnsGlobal.getGraphStructure().getMainView().getStructure(); GraphFactoryImpl factory = dhnsGlobal.factory(); //Nodes for (int i = 0; i < 15; i++) { AbstractNode node = factory.newNode(); node.getNodeData().setLabel("Node " + i); graphGlobal.addNode(node); nodeMap.put(node.getNodeData().getLabel(), node); } //2 controller = new DhnsGraphController(); dhnsGlobal2 = new Dhns(controller, null); graphGlobal2Directed = new HierarchicalDirectedGraphImpl(dhnsGlobal2, dhnsGlobal2.getGraphStructure().getMainView()); graphGlobal2Undirected = new HierarchicalUndirectedGraphImpl(dhnsGlobal2, dhnsGlobal2.getGraphStructure().getMainView()); treeStructure = dhnsGlobal2.getGraphStructure().getMainView().getStructure(); factory = dhnsGlobal2.factory(); //Nodes for (int i = 0; i < 3; i++) { Node node = factory.newNode(); graphGlobal2Directed.addNode(node); } int i = 0; for (Node n : graphGlobal2Directed.getTopNodes().toArray()) { AbstractNode newC = factory.newNode(); graphGlobal2Directed.addNode(newC, n); nodeMap.put("Leaf " + (i++), newC); newC = factory.newNode(); graphGlobal2Directed.addNode(newC, n); nodeMap.put("Leaf " + (i++), newC); } Node leaf2 = nodeMap.get("Leaf 0"); Node leaf3 = nodeMap.get("Leaf 1"); Node leaf5 = nodeMap.get("Leaf 2"); Node leaf6 = nodeMap.get("Leaf 3"); Node leaf8 = nodeMap.get("Leaf 4"); Node leaf9 = nodeMap.get("Leaf 5"); graphGlobal2Directed.addEdge(leaf2, leaf5); graphGlobal2Directed.addEdge(leaf2, leaf6); graphGlobal2Directed.addEdge(leaf3, leaf2); graphGlobal2Directed.addEdge(leaf3, leaf5); graphGlobal2Directed.addEdge(leaf6, leaf8); graphGlobal2Directed.addEdge(leaf9, leaf8); graphGlobal2Directed.addEdge(leaf8, leaf9); graphGlobal2Directed.addEdge(leaf9, leaf5); graphGlobal2Directed.addEdge(leaf5, leaf9); graphGlobal2Directed.addEdge(leaf9, leaf9); } @After public void tearDown() { nodeMap.clear(); dhnsGlobal = null; graphGlobal = null; dhnsGlobal2 = null; graphGlobal2Directed = null; graphGlobal2Undirected = null; } @Test public void testMoveDurableTreeList() { TreeStructure treeStructure = new TreeStructure(null); AbstractNode p0 = treeStructure.getRoot(); AbstractNode p1 = new AbstractNode(1, 0, 0, 0, 0, null); AbstractNode p2 = new AbstractNode(2, 0, 0, 0, 0, null); AbstractNode p3 = new AbstractNode(3, 0, 0, 0, 0, null); AbstractNode p4 = new AbstractNode(4, 0, 0, 0, 0, null); AbstractNode p5 = new AbstractNode(5, 0, 0, 0, 0, null); AbstractNode p6 = new AbstractNode(6, 0, 0, 0, 0, null); AbstractNode p7 = new AbstractNode(7, 0, 0, 0, 0, null); treeStructure.insertAsChild(p1, p0); treeStructure.insertAsChild(p2, p1); treeStructure.insertAsChild(p4, p0); treeStructure.insertAsChild(p5, p4); treeStructure.insertAsChild(p6, p4); treeStructure.insertAsChild(p3, p1); treeStructure.insertAsChild(p7, p0); //Test if ID = pre for (Iterator<AbstractNode> itr = treeStructure.getTree().iterator(1); itr.hasNext();) { AbstractNode n = itr.next(); assertEquals(n.getId(), n.getPre()); } //Move p1 -> p4 treeStructure.move(p1, p4); //Write expected array int[] expected = new int[treeStructure.getTreeSize() - 1]; int index = 0; for (Iterator<AbstractNode> itr = treeStructure.getTree().iterator(1); itr.hasNext();) { AbstractNode n = itr.next(); expected[index] = n.getId(); } treeStructure.move(p1, p0); treeStructure.move(p1, p4); int[] actual = new int[treeStructure.getTreeSize() - 1]; for (Iterator<AbstractNode> itr = treeStructure.getTree().iterator(1); itr.hasNext();) { AbstractNode n = itr.next(); actual[index] = n.getId(); } assertArrayEquals(expected, actual); treeStructure.move(p3, p4); treeStructure.move(p3, p5); //treeStructure.showTreeAsTable(); } @Test public void testMoveToGroup() { TreeStructure treeStructure = dhnsGlobal.getGraphStructure().getMainView().getStructure(); AbstractNode target = (AbstractNode) nodeMap.get("Node 10"); for (int i = 1; i < 5; i++) { AbstractNode ch = (AbstractNode) nodeMap.get("Node " + i); int oldSize = target.size; graphGlobal.moveToGroup(ch, target); assertEquals(oldSize + 1, target.size); assertEquals(ch.parent, target); assertEquals(target.getPre() + target.size, ch.getPre()); } for (int i = 1; i < 5; i++) { AbstractNode ch = (AbstractNode) nodeMap.get("Node " + i); int oldSize = target.size; graphGlobal.removeFromGroup(ch); assertEquals(oldSize - 1, target.size); assertEquals(ch.parent, target.parent); } //Hierarchy consistency try { checkHierarchy(treeStructure); } catch (Exception e) { fail(e.getMessage()); } //treeStructure.showTreeAsTable(); } @Test public void testGroup() { TreeStructure treeStructure = dhnsGlobal.getGraphStructure().getMainView().getStructure(); int oldSize = graphGlobal.getNodeCount(); Node[] groupArray = new Node[5]; for (int i = 1; i < 6; i++) { groupArray[i - 1] = nodeMap.get("Node " + i); } AbstractNode group = (AbstractNode) graphGlobal.groupNodes(groupArray); assertEquals(oldSize + 1 - groupArray.length, graphGlobal.getNodeCount()); assertEquals(groupArray.length, group.size); assertEquals(graphGlobal.getHeight(), 1); int i = 0; for (TreeListIterator itr = new TreeListIterator(treeStructure.getTree(), group.getPre()); itr.hasNext();) { AbstractNode node = itr.next(); assertEquals(group.pre + i, node.getPre()); i++; } try { checkHierarchy(treeStructure); } catch (Exception ex) { fail(ex.getMessage()); } //treeStructure.showTreeAsTable(); } @Test public void testUnGroup() { TreeStructure treeStructure = dhnsGlobal.getGraphStructure().getMainView().getStructure(); int oldSize = graphGlobal.getNodeCount(); Node[] groupArray = new Node[5]; for (int i = 1; i < 6; i++) { groupArray[i - 1] = nodeMap.get("Node " + i); } AbstractNode group = (AbstractNode) graphGlobal.groupNodes(groupArray); graphGlobal.ungroupNodes(group); assertEquals(0, group.size); for (Node n : groupArray) { AbstractNode pn = (AbstractNode) n; assertEquals(1, pn.level); assertSame(treeStructure.getRoot(), pn.parent); } //treeStructure.showTreeAsTable(); assertEquals(oldSize, graphGlobal.getNodeCount()); try { checkHierarchy(treeStructure); } catch (Exception ex) { fail(ex.getMessage()); } //treeStructure.showTreeAsTable(); } @Test public void testView() { DhnsGraphController controller = new DhnsGraphController(); Dhns dhns = new Dhns(controller, null); HierarchicalGraph graph = new HierarchicalDirectedGraphImpl(dhns, dhns.getGraphStructure().getMainView()); TreeStructure treeStructure = dhns.getGraphStructure().getMainView().getStructure(); GraphFactoryImpl factory = dhns.factory(); //Nodes for (int i = 0; i < 5; i++) { Node node = factory.newNode(); node.getNodeData().setLabel("Node " + i); graph.addNode(node); } for (Node n : graph.getTopNodes().toArray()) { Node newC = factory.newNode(); graph.addNode(newC, n); } //treeStructure.showTreeAsTable(); //Test getNodes() for (Node n : graph.getNodes()) { assertEquals(1, graph.getChildrenCount(n)); } //Test isInView for (Node n : graph.getNodes()) { assertTrue(graph.isInView(n)); assertFalse(graph.isInView(graph.getChildren(n).toArray()[0])); } //Test resetView //treeStructure.showTreeAsTable(); graph.resetViewToLeaves(); for (Node n : graph.getNodes()) { assertEquals(1, graph.getLevel(n)); assertFalse(graph.isInView(graph.getParent(n))); } graph.resetViewToTopNodes(); for (Node n : graph.getNodes()) { assertEquals(0, graph.getLevel(n)); } graph.resetViewToLevel(1); for (Node n : graph.getNodes()) { assertEquals(1, graph.getLevel(n)); assertFalse(graph.isInView(graph.getParent(n))); } for (Node n : graph.getNodes(1).toArray()) { graph.removeFromGroup(n); } //treeStructure.showTreeAsTable(); try { checkHierarchy(treeStructure); } catch (Exception ex) { fail(ex.getMessage()); } } @Test public void testMetaEdgesDirected() { TreeStructure treeStructure = dhnsGlobal2.getGraphStructure().getMainView().getStructure(); Node metaNode0 = graphGlobal2Directed.getTopNodes().toArray()[0]; Node metaNode1 = graphGlobal2Directed.getTopNodes().toArray()[1]; Node metaNode2 = graphGlobal2Directed.getTopNodes().toArray()[2]; Node leaf2 = graphGlobal2Directed.getChildren(metaNode0).toArray()[0]; Node leaf3 = graphGlobal2Directed.getChildren(metaNode0).toArray()[1]; Node leaf5 = graphGlobal2Directed.getChildren(metaNode1).toArray()[0]; Node leaf6 = graphGlobal2Directed.getChildren(metaNode1).toArray()[1]; Node leaf8 = graphGlobal2Directed.getChildren(metaNode2).toArray()[0]; Node leaf9 = graphGlobal2Directed.getChildren(metaNode2).toArray()[1]; //Get meta edges Edge[] metaEdges = graphGlobal2Directed.getMetaEdges().toArray(); assertEquals(3, metaEdges.length); MetaEdgeImpl metaEdge01 = (MetaEdgeImpl) metaEdges[0]; MetaEdgeImpl metaEdge12 = (MetaEdgeImpl) metaEdges[1]; MetaEdgeImpl metaEdge21 = (MetaEdgeImpl) metaEdges[2]; assertSame(metaNode0, metaEdge01.getSource()); assertSame(metaNode1, metaEdge01.getTarget()); assertSame(metaNode1, metaEdge12.getSource()); assertSame(metaNode2, metaEdge12.getTarget()); assertSame(metaNode2, metaEdge21.getSource()); assertSame(metaNode1, metaEdge21.getTarget()); //Meta edge content /*Edge[] metaEdge01content = graphGlobal2Directed.getMetaEdgeContent(metaEdge01).toArray(); assertEquals(3, metaEdge01content.length); assertSame(metaEdge01content[0], graphGlobal2Directed.getEdge(leaf2, leaf5)); assertSame(metaEdge01content[1], graphGlobal2Directed.getEdge(leaf2, leaf6)); assertSame(metaEdge01content[2], graphGlobal2Directed.getEdge(leaf3, leaf5)); Edge[] metaEdge12content = graphGlobal2Directed.getMetaEdgeContent(metaEdge12).toArray(); assertEquals(2, metaEdge12content.length); assertSame(metaEdge12content[0], graphGlobal2Directed.getEdge(leaf6, leaf8)); assertSame(metaEdge12content[1], graphGlobal2Directed.getEdge(leaf5, leaf9)); Edge[] metaEdge21content = graphGlobal2Directed.getMetaEdgeContent(metaEdge21).toArray(); assertEquals(1, metaEdge21content.length); assertSame(metaEdge21content[0], graphGlobal2Directed.getEdge(leaf9, leaf5));*/ //Degree assertEquals(2, graphGlobal2Directed.getMetaInDegree(metaNode1)); assertEquals(1, graphGlobal2Directed.getMetaOutDegree(metaNode1)); assertEquals(1, graphGlobal2Directed.getMetaOutDegree(metaNode0)); assertEquals(3, graphGlobal2Directed.getMetaDegree(metaNode1)); Edge[] metaInEdges1 = graphGlobal2Directed.getMetaInEdges(metaNode1).toArray(); assertEquals(2, metaInEdges1.length); assertSame(metaInEdges1[0], metaEdge01); assertSame(metaInEdges1[1], metaEdge21); Edge[] metaOutEdges1 = graphGlobal2Directed.getMetaOutEdges(metaNode1).toArray(); assertEquals(1, metaOutEdges1.length); assertSame(metaOutEdges1[0], metaEdge12); Edge[] metaEdges1 = graphGlobal2Directed.getMetaEdges(metaNode1).toArray(); assertEquals(3, metaEdges1.length); assertSame(metaEdges1[0], metaEdge12); assertSame(metaEdges1[1], metaEdge01); assertSame(metaEdges1[2], metaEdge21); //Remove edge graphGlobal2Directed.removeEdge(graphGlobal2Directed.getEdge(leaf2, leaf5)); // assertEquals(2, graphGlobal2Directed.getMetaEdgeContent(metaEdge01).toArray().length); graphGlobal2Directed.removeEdge(graphGlobal2Directed.getEdge(leaf3, leaf2)); // assertEquals(2, graphGlobal2Directed.getMetaEdgeContent(metaEdge01).toArray().length); graphGlobal2Directed.removeEdge(graphGlobal2Directed.getEdge(leaf3, leaf5)); graphGlobal2Directed.removeEdge(graphGlobal2Directed.getEdge(leaf2, leaf6)); assertEquals(0, graphGlobal2Directed.getMetaEdges(metaNode0).toArray().length); graphGlobal2Directed.clearMetaEdges(metaNode1); graphGlobal2Directed.clearMetaEdges(metaNode2); assertEquals(0, graphGlobal2Directed.getMetaEdges().toArray().length); assertEquals(0, graphGlobal2Directed.getMetaEdges(metaNode1).toArray().length); assertEquals(0, graphGlobal2Directed.getMetaEdges(metaNode2).toArray().length); //treeStructure.showTreeAsTable(); try { checkHierarchy(treeStructure); } catch (Exception ex) { Exceptions.printStackTrace(ex); } } @Test public void testMetaEdgesUndirected() { TreeStructure treeStructure = dhnsGlobal2.getGraphStructure().getMainView().getStructure(); Node metaNode0 = graphGlobal2Undirected.getTopNodes().toArray()[0]; Node metaNode1 = graphGlobal2Undirected.getTopNodes().toArray()[1]; Node metaNode2 = graphGlobal2Undirected.getTopNodes().toArray()[2]; Node leaf2 = graphGlobal2Undirected.getChildren(metaNode0).toArray()[0]; Node leaf3 = graphGlobal2Undirected.getChildren(metaNode0).toArray()[1]; Node leaf5 = graphGlobal2Undirected.getChildren(metaNode1).toArray()[0]; Node leaf6 = graphGlobal2Undirected.getChildren(metaNode1).toArray()[1]; Node leaf8 = graphGlobal2Undirected.getChildren(metaNode2).toArray()[0]; Node leaf9 = graphGlobal2Undirected.getChildren(metaNode2).toArray()[1]; //Get meta edges Edge[] metaEdges = graphGlobal2Undirected.getMetaEdges().toArray(); assertEquals(2, metaEdges.length); MetaEdgeImpl metaEdge01 = (MetaEdgeImpl) metaEdges[0]; MetaEdgeImpl metaEdge12 = (MetaEdgeImpl) metaEdges[1]; assertSame(metaNode0, metaEdge01.getSource()); assertSame(metaNode1, metaEdge01.getTarget()); assertSame(metaNode1, metaEdge12.getSource()); assertSame(metaNode2, metaEdge12.getTarget()); //Degree assertEquals(2, graphGlobal2Undirected.getMetaDegree(metaNode1)); assertEquals(1, graphGlobal2Undirected.getMetaDegree(metaNode0)); assertEquals(1, graphGlobal2Undirected.getMetaDegree(metaNode2)); Edge[] metaEdges1 = graphGlobal2Undirected.getMetaEdges(metaNode1).toArray(); assertEquals(2, metaEdges1.length); assertSame(metaEdges1[0], metaEdge12); assertSame(metaEdges1[1], metaEdge01); //Meta edge content /*Edge[] metaEdge01content = graphGlobal2Undirected.getMetaEdgeContent(metaEdge01).toArray(); assertEquals(3, metaEdge01content.length); assertSame(metaEdge01content[0], graphGlobal2Undirected.getEdge(leaf2, leaf5)); assertSame(metaEdge01content[1], graphGlobal2Undirected.getEdge(leaf2, leaf6)); assertSame(metaEdge01content[2], graphGlobal2Undirected.getEdge(leaf3, leaf5)); Edge[] metaEdge12content = graphGlobal2Undirected.getMetaEdgeContent(metaEdge12).toArray(); assertEquals(2, metaEdge12content.length); assertSame(metaEdge12content[0], graphGlobal2Undirected.getEdge(leaf6, leaf8)); assertSame(metaEdge12content[1], graphGlobal2Undirected.getEdge(leaf5, leaf9));*/ //Remove edge graphGlobal2Undirected.removeEdge(graphGlobal2Undirected.getEdge(leaf2, leaf5)); // assertEquals(2, graphGlobal2Undirected.getMetaEdgeContent(metaEdge01).toArray().length); graphGlobal2Undirected.removeEdge(graphGlobal2Undirected.getEdge(leaf3, leaf2)); // assertEquals(2, graphGlobal2Undirected.getMetaEdgeContent(metaEdge01).toArray().length); graphGlobal2Undirected.removeEdge(graphGlobal2Undirected.getEdge(leaf3, leaf5)); graphGlobal2Undirected.removeEdge(graphGlobal2Undirected.getEdge(leaf2, leaf6)); assertEquals(0, graphGlobal2Undirected.getMetaEdges(metaNode0).toArray().length); graphGlobal2Undirected.removeEdge(graphGlobal2Undirected.getEdge(leaf5, leaf9)); // assertEquals(1, graphGlobal2Undirected.getMetaEdgeContent(metaEdge12).toArray().length); graphGlobal2Undirected.clearMetaEdges(metaNode1); graphGlobal2Undirected.clearMetaEdges(metaNode2); assertEquals(0, graphGlobal2Undirected.getMetaEdges().toArray().length); assertEquals(0, graphGlobal2Undirected.getMetaEdges(metaNode1).toArray().length); assertEquals(0, graphGlobal2Undirected.getMetaEdges(metaNode2).toArray().length); //treeStructure.showTreeAsTable(); try { checkHierarchy(treeStructure); } catch (Exception ex) { Exceptions.printStackTrace(ex); } } @Test public void testInnerOuterEdgesDirected() { Node metaNode0 = graphGlobal2Directed.getTopNodes().toArray()[0]; Node metaNode1 = graphGlobal2Directed.getTopNodes().toArray()[1]; Node metaNode2 = graphGlobal2Directed.getTopNodes().toArray()[2]; Node leaf2 = graphGlobal2Directed.getChildren(metaNode0).toArray()[0]; Node leaf3 = graphGlobal2Directed.getChildren(metaNode0).toArray()[1]; Node leaf5 = graphGlobal2Directed.getChildren(metaNode1).toArray()[0]; Node leaf6 = graphGlobal2Directed.getChildren(metaNode1).toArray()[1]; Node leaf8 = graphGlobal2Directed.getChildren(metaNode2).toArray()[0]; Node leaf9 = graphGlobal2Directed.getChildren(metaNode2).toArray()[1]; //Inner Edge[] innerEdges = graphGlobal2Directed.getInnerEdges(metaNode0).toArray(); assertEquals(1, innerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf3, leaf2), innerEdges[0]); //Outer Edge[] outerEdges = graphGlobal2Directed.getOuterEdges(metaNode0).toArray(); assertEquals(3, outerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf2, leaf5), outerEdges[0]); assertSame(graphGlobal2Directed.getEdge(leaf2, leaf6), outerEdges[1]); assertSame(graphGlobal2Directed.getEdge(leaf3, leaf5), outerEdges[2]); //Inner with self loop innerEdges = graphGlobal2Directed.getInnerEdges(metaNode2).toArray(); assertEquals(3, innerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf8, leaf9), innerEdges[0]); assertSame(graphGlobal2Directed.getEdge(leaf9, leaf8), innerEdges[1]); assertSame(graphGlobal2Directed.getEdge(leaf9, leaf9), innerEdges[2]); //Inner from self loop node innerEdges = graphGlobal2Directed.getInnerEdges(leaf9).toArray(); assertEquals(1, innerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf9, leaf9), innerEdges[0]); //Outer with mutual System.out.println(); outerEdges = graphGlobal2Directed.getOuterEdges(metaNode2).toArray(); assertEquals(3, outerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf6, leaf8), outerEdges[0]); assertSame(graphGlobal2Directed.getEdge(leaf9, leaf5), outerEdges[1]); assertSame(graphGlobal2Directed.getEdge(leaf5, leaf9), outerEdges[2]); } @Test public void testInnerOuterEdgesUndirected() { Node metaNode0 = graphGlobal2Undirected.getTopNodes().toArray()[0]; Node metaNode1 = graphGlobal2Undirected.getTopNodes().toArray()[1]; Node metaNode2 = graphGlobal2Undirected.getTopNodes().toArray()[2]; Node leaf2 = graphGlobal2Undirected.getChildren(metaNode0).toArray()[0]; Node leaf3 = graphGlobal2Undirected.getChildren(metaNode0).toArray()[1]; Node leaf5 = graphGlobal2Undirected.getChildren(metaNode1).toArray()[0]; Node leaf6 = graphGlobal2Undirected.getChildren(metaNode1).toArray()[1]; Node leaf8 = graphGlobal2Undirected.getChildren(metaNode2).toArray()[0]; Node leaf9 = graphGlobal2Undirected.getChildren(metaNode2).toArray()[1]; //Inner Edge[] innerEdges = graphGlobal2Undirected.getInnerEdges(metaNode0).toArray(); assertEquals(1, innerEdges.length); assertSame(graphGlobal2Directed.getEdge(leaf3, leaf2), innerEdges[0]); //Outer Edge[] outerEdges = graphGlobal2Undirected.getOuterEdges(metaNode0).toArray(); assertEquals(3, outerEdges.length); assertSame(graphGlobal2Undirected.getEdge(leaf2, leaf5), outerEdges[0]); assertSame(graphGlobal2Undirected.getEdge(leaf2, leaf6), outerEdges[1]); assertSame(graphGlobal2Undirected.getEdge(leaf3, leaf5), outerEdges[2]); //Inner with self loop innerEdges = graphGlobal2Undirected.getInnerEdges(metaNode2).toArray(); assertEquals(2, innerEdges.length); assertSame(graphGlobal2Undirected.getEdge(leaf8, leaf9), innerEdges[0]); assertSame(graphGlobal2Undirected.getEdge(leaf9, leaf9), innerEdges[1]); //Inner from self loop node innerEdges = graphGlobal2Undirected.getInnerEdges(leaf9).toArray(); assertEquals(1, innerEdges.length); assertSame(graphGlobal2Undirected.getEdge(leaf9, leaf9), innerEdges[0]); //Outer with mutual outerEdges = graphGlobal2Undirected.getOuterEdges(metaNode2).toArray(); assertEquals(2, outerEdges.length); assertSame(graphGlobal2Undirected.getEdge(leaf6, leaf8), outerEdges[0]); assertSame(graphGlobal2Undirected.getEdge(leaf5, leaf9), outerEdges[1]); } @Test public void testLevel() { //Height assertEquals(1, graphGlobal2Directed.getHeight()); //Level Node nodeLevel0 = graphGlobal2Directed.getTopNodes().toArray()[0]; Node nodeLevel1 = graphGlobal2Directed.getChildren(nodeLevel0).toArray()[0]; assertEquals(0, graphGlobal2Directed.getLevel(nodeLevel0)); assertEquals(1, graphGlobal2Directed.getLevel(nodeLevel1)); //getNodes(level) 0 assertArrayEquals(graphGlobal2Directed.getTopNodes().toArray(), graphGlobal2Directed.getNodes(0).toArray()); //getNodes(level) 1 ArrayList<Node> nodesLevel1 = new ArrayList<Node>(); nodesLevel1.addAll(Arrays.asList(graphGlobal2Directed.getChildren(graphGlobal2Directed.getTopNodes().toArray()[0]).toArray())); nodesLevel1.addAll(Arrays.asList(graphGlobal2Directed.getChildren(graphGlobal2Directed.getTopNodes().toArray()[1]).toArray())); nodesLevel1.addAll(Arrays.asList(graphGlobal2Directed.getChildren(graphGlobal2Directed.getTopNodes().toArray()[2]).toArray())); assertArrayEquals(nodesLevel1.toArray(), graphGlobal2Directed.getNodes(1).toArray()); //Levelsize assertEquals(graphGlobal2Directed.getLevelSize(0), 3); assertEquals(graphGlobal2Directed.getLevelSize(1), 6); assertEquals(graphGlobal.getLevelSize(0), 15); //Level after move graphGlobal2Directed.moveToGroup(nodeLevel0, graphGlobal2Directed.getTopNodes().toArray()[1]); assertEquals(2, graphGlobal2Directed.getHeight()); //Level after cancel the last move graphGlobal2Directed.moveToGroup(nodeLevel0, dhnsGlobal2.getGraphStructure().getMainView().getStructure().getRoot()); assertEquals(1, graphGlobal2Directed.getHeight()); } @Test public void testMetaEdgesAfterGrouping() { DhnsGraphController controller = new DhnsGraphController(); Dhns dhns = new Dhns(controller, null); TreeStructure treeStructure = dhns.getGraphStructure().getMainView().getStructure(); HierarchicalDirectedGraphImpl graph = new HierarchicalDirectedGraphImpl(dhns, dhns.getGraphStructure().getMainView()); GraphFactoryImpl factory = dhns.factory(); //Add Node Node node1 = factory.newNode(); Node node2 = factory.newNode(); Node node3 = factory.newNode(); Node node4 = factory.newNode(); Node node5 = factory.newNode(); Node node6 = factory.newNode(); graph.addNode(node1); graph.addNode(node4); graph.addNode(node2, node1); graph.addNode(node3, node1); graph.addNode(node5, node4); graph.addNode(node6); //Add edge Edge edge23 = factory.newEdge(node2, node3); Edge edge35 = factory.newEdge(node3, node5); Edge edge34 = factory.newEdge(node3, node4); Edge edge15 = factory.newEdge(node1, node5); Edge edge36 = factory.newEdge(node3, node6); graph.addEdge(edge23); graph.addEdge(edge35); graph.addEdge(edge34); graph.addEdge(edge15); graph.addEdge(edge36); //Check before all presence of meta edge /*MetaEdge metaEdge14 = graph.getMetaEdge(node1, node4); assertNotNull(metaEdge14); Edge[] metaEdgeContent14 = graph.getMetaEdgeContent(metaEdge14).toArray(); assertEquals(3, metaEdgeContent14.length); assertSame(metaEdgeContent14[0], edge35); assertSame(metaEdgeContent14[1], edge34); assertSame(metaEdgeContent14[2], edge15); assertNotNull(graph.getMetaEdge(node1, node6)); //Move node3 to node5 graph.moveToGroup(node3, node5); assertSame(metaEdge14, graph.getMetaEdge(node1, node4)); metaEdge14 = graph.getMetaEdge(node1, node4); assertNotNull(metaEdge14); Edge[] metaEdgeContent14_2 = graph.getMetaEdgeContent(metaEdge14).toArray(); assertEquals(2, metaEdgeContent14_2.length); assertSame(metaEdgeContent14_2[0], edge23); assertSame(metaEdgeContent14_2[1], edge15); assertNotNull(graph.getMetaEdge(node4, node6)); //Inverse operation, move node3 to node1 graph.moveToGroup(node3, node1); assertSame(metaEdge14, graph.getMetaEdge(node1, node4)); metaEdge14 = graph.getMetaEdge(node1, node4); assertNotNull(metaEdge14); assertArrayEquals(metaEdgeContent14, graph.getMetaEdgeContent(metaEdge14).toArray()); assertNull(graph.getMetaEdge(node4, node6)); assertNotNull(graph.getMetaEdge(node1, node6)); //Move an enabled node to an enabled parent, move node1 to node4 graph.moveToGroup(node1, node4); assertFalse(graph.isInView(node1)); AbstractNode AbstractNode1 = (AbstractNode) node1; assertEquals(0, AbstractNode1.getMetaEdgesInTree().getCount()); assertEquals(0, AbstractNode1.getMetaEdgesOutTree().getCount()); Edge[] metaEdges4 = graph.getMetaEdges(node4).toArray(); assertEquals(1, metaEdges4.length); Edge metaEdge46 = metaEdges4[0]; assertSame(metaEdge46, graph.getMetaEdge(node4, node6)); Edge[] metaEdgeContent46 = graph.getMetaEdgeContent(metaEdge46).toArray(); assertEquals(1, metaEdgeContent46.length); assertSame(metaEdgeContent46[0], edge36); //Expand node4 and check meta edges graph.expand(node4); Edge[] metaEdges1 = graph.getMetaEdges(node1).toArray(); assertEquals(2, metaEdges1.length); assertEquals(graph.getMetaEdge(node1, node5), metaEdges1[0]); assertEquals(graph.getMetaEdge(node1, node6), metaEdges1[1]); //Expand node1 and check meta edges graph.expand(node1); assertEquals(0, graph.getMetaEdges().toArray().length); Edge[] metaEdges2 = graph.getMetaEdges(node2).toArray(); assertEquals(0, metaEdges2.length); Edge[] metaEdges3 = graph.getMetaEdges(node3).toArray(); assertEquals(0, metaEdges3.length); //Move a node with enabled descendants to an enabled parent, move node1 to node6 graph.moveToGroup(node1, node6); Edge[] metaEdges = graph.getMetaEdges().toArray(); assertEquals(1, metaEdges.length); assertSame(metaEdges[0], graph.getMetaEdge(node6, node5)); Edge[] metaEdgesContent65 = graph.getMetaEdgeContent(metaEdges[0]).toArray(); assertEquals(2, metaEdgesContent65.length); assertSame(edge35, metaEdgesContent65[0]); assertSame(edge15, metaEdgesContent65[1]); //Test after retract graph.retract(node4); metaEdges = graph.getMetaEdges().toArray(); assertEquals(1, metaEdges.length); assertSame(metaEdges[0], graph.getMetaEdge(node6, node4)); Edge[] metaEdgesContent64 = graph.getMetaEdgeContent(metaEdges[0]).toArray(); assertEquals(3, metaEdgesContent64.length); assertSame(edge35, metaEdgesContent64[0]); assertSame(edge34, metaEdgesContent64[1]); assertSame(edge15, metaEdgesContent64[2]); //treeStructure.showTreeAsTable(); try { checkHierarchy(treeStructure); } catch (Exception ex) { Exceptions.printStackTrace(ex); } //Grouping for (Node n : graphGlobal2Directed.getTopNodes().toArray()) { graphGlobal2Directed.ungroupNodes(n); } assertEquals(0, graphGlobal2Directed.getMetaEdges().toArray().length); graphGlobal2Directed.resetViewToLeaves(); Node[] allNodes = graphGlobal2Directed.getNodes().toArray(); Node newGroup9 = graphGlobal2Directed.groupNodes(new Node[]{allNodes[3], allNodes[4]}); Edge[] allMetaEdges = graphGlobal2Directed.getMetaEdges().toArray(); assertEquals(3, allMetaEdges.length); assertSame(graphGlobal2Directed.getMetaEdge(nodeMap.get("Leaf 0"), newGroup9), allMetaEdges[0]); assertSame(graphGlobal2Directed.getMetaEdge(nodeMap.get("Leaf 5"), newGroup9), allMetaEdges[1]); assertSame(graphGlobal2Directed.getMetaEdge(newGroup9, nodeMap.get("Leaf 5")), allMetaEdges[2]); graphGlobal2Directed.ungroupNodes(newGroup9); assertEquals(0, graphGlobal2Directed.getMetaEdges().toArray().length); //dhnsGlobal2.getGraphStructure().getStructure().showTreeAsTable(); try { checkHierarchy(dhnsGlobal2.getGraphStructure().getStructure()); } catch (Exception ex) { Exceptions.printStackTrace(ex); }*/ } @Test public void testEdgesAndMetaEdges() { //dhnsGlobal2.getGraphStructure().getMainView().getStructure().showTreeAsTable(); Edge[] metaedges = graphGlobal2Directed.getMetaEdges().toArray(); int metaEdgesCount = metaedges.length; assertEquals(3, metaEdgesCount); Node parent0 = graphGlobal2Directed.getTopNodes().toArray()[0]; graphGlobal2Directed.expand(parent0); assertEquals(4, graphGlobal2Directed.getMetaEdges().toArray().length); assertEquals(1, graphGlobal2Directed.getMetaEdges(nodeMap.get("Leaf 0")).toArray().length); assertEquals(1, graphGlobal2Directed.getMetaEdges(nodeMap.get("Leaf 1")).toArray().length); assertEquals(1, graphGlobal2Directed.getEdges().toArray().length); Edge uniqueEdge = graphGlobal2Directed.getEdges().toArray()[0]; assertSame(nodeMap.get("Leaf 0"), uniqueEdge.getTarget()); assertSame(nodeMap.get("Leaf 1"), uniqueEdge.getSource()); assertEquals(5, graphGlobal2Directed.getEdgesAndMetaEdges().toArray().length); } @Test public void testFlattenTopNodes() { GraphViewImpl view = dhnsGlobal2.getGraphStructure().getMainView(); //view.getStructure().showTreeAsTable(); view.getStructureModifier().flatten(); assertEquals(0, graphGlobal2Directed.getHeight()); assertEquals(3, view.getEdgesCountTotal()); assertEquals(3, view.getEdgesCountEnabled()); assertEquals(1, view.getMutualEdgesEnabled()); assertEquals(1, view.getMutualEdgesTotal()); assertEquals(3, view.getNodesEnabled()); Node n1 = graphGlobal2Directed.getTopNodes().toArray()[0]; Node n4 = graphGlobal2Directed.getTopNodes().toArray()[1]; Node n7 = graphGlobal2Directed.getTopNodes().toArray()[2]; AbstractEdge edge14 = (AbstractEdge) graphGlobal.getEdge(n1, n4); AbstractEdge edge47 = (AbstractEdge) graphGlobal.getEdge(n4, n7); AbstractEdge edge74 = (AbstractEdge) graphGlobal.getEdge(n7, n4); assertNotNull(edge14); assertNotNull(edge47); assertNotNull(edge74); assertEquals(0, graphGlobal2Directed.getMetaEdges().toArray().length); assertEquals(3, graphGlobal2Directed.getLevelSize(0)); //dhnsGlobal2.getGraphStructure().getMainView().getStructure().showTreeAsTable(); } @Test public void testFlattenLeaves() { GraphViewImpl view = dhnsGlobal2.getGraphStructure().getMainView(); Node n1 = graphGlobal2Directed.getTopNodes().toArray()[0]; Node n4 = graphGlobal2Directed.getTopNodes().toArray()[1]; Node n7 = graphGlobal2Directed.getTopNodes().toArray()[2]; graphGlobal2Directed.expand(n1); graphGlobal2Directed.expand(n4); graphGlobal2Directed.expand(n7); view.getStructure().showTreeAsTable(); view.getStructureModifier().flatten(); assertEquals(0, graphGlobal2Directed.getHeight()); assertEquals(6, graphGlobal2Directed.getLevelSize(0)); assertEquals(6, view.getNodesEnabled()); dhnsGlobal2.getGraphStructure().getMainView().getStructure().showTreeAsTable(); } @Test public void testEdgesCountingExpandRetract() { GraphViewImpl view = dhnsGlobal2.getGraphStructure().getMainView(); assertEquals(0, view.getEdgesCountEnabled()); assertEquals(10, view.getEdgesCountTotal()); Node n1 = graphGlobal2Directed.getTopNodes().toArray()[0]; graphGlobal2Directed.expand(n1); assertEquals(1, view.getEdgesCountEnabled()); assertEquals(0, view.getMutualEdgesEnabled()); assertEquals(1, nodeMap.get("Leaf 0").getEnabledInDegree()); assertEquals(1, nodeMap.get("Leaf 1").getEnabledOutDegree()); graphGlobal2Directed.retract(n1); assertEquals(0, view.getEdgesCountEnabled()); assertEquals(0, nodeMap.get("Leaf 0").getEnabledInDegree()); assertEquals(0, nodeMap.get("Leaf 1").getEnabledOutDegree()); assertEquals(0, nodeMap.get("Leaf 0").getEnabledOutDegree()); assertEquals(0, nodeMap.get("Leaf 1").getEnabledInDegree()); assertEquals(0, view.getMutualEdgesEnabled()); Node n7 = graphGlobal2Directed.getTopNodes().toArray()[2]; graphGlobal2Directed.expand(n7); assertEquals(3, view.getEdgesCountEnabled()); assertEquals(1, nodeMap.get("Leaf 4").getEnabledInDegree()); assertEquals(1, nodeMap.get("Leaf 4").getEnabledOutDegree()); assertEquals(2, nodeMap.get("Leaf 5").getEnabledOutDegree()); assertEquals(2, nodeMap.get("Leaf 5").getEnabledInDegree()); assertEquals(1, nodeMap.get("Leaf 4").getEnabledMutualDegree()); assertEquals(1, nodeMap.get("Leaf 5").getEnabledMutualDegree()); assertEquals(1, view.getMutualEdgesEnabled()); graphGlobal2Directed.retract(n7); assertEquals(0, view.getEdgesCountEnabled()); assertEquals(0, nodeMap.get("Leaf 4").getEnabledInDegree()); assertEquals(0, nodeMap.get("Leaf 4").getEnabledOutDegree()); assertEquals(0, nodeMap.get("Leaf 5").getEnabledOutDegree()); assertEquals(0, nodeMap.get("Leaf 5").getEnabledInDegree()); assertEquals(0, nodeMap.get("Leaf 4").getEnabledMutualDegree()); assertEquals(0, nodeMap.get("Leaf 5").getEnabledMutualDegree()); assertEquals(0, view.getMutualEdgesEnabled()); Node n4 = graphGlobal2Directed.getTopNodes().toArray()[1]; graphGlobal2Directed.expand(n4); graphGlobal2Directed.expand(n7); assertEquals(1, nodeMap.get("Leaf 2").getEnabledInDegree()); assertEquals(1, nodeMap.get("Leaf 2").getEnabledOutDegree()); assertEquals(1, nodeMap.get("Leaf 2").getEnabledMutualDegree()); assertEquals(1, nodeMap.get("Leaf 3").getEnabledOutDegree()); assertEquals(0, nodeMap.get("Leaf 3").getEnabledInDegree()); assertEquals(1, nodeMap.get("Leaf 4").getEnabledOutDegree()); assertEquals(2, nodeMap.get("Leaf 4").getEnabledInDegree()); assertEquals(3, nodeMap.get("Leaf 5").getEnabledOutDegree()); assertEquals(3, nodeMap.get("Leaf 5").getEnabledInDegree()); assertEquals(2, nodeMap.get("Leaf 5").getEnabledMutualDegree()); assertEquals(1, nodeMap.get("Leaf 4").getEnabledMutualDegree()); assertEquals(2, view.getMutualEdgesEnabled()); assertEquals(6, view.getEdgesCountEnabled()); graphGlobal2Directed.expand(n1); assertEquals(2, view.getMutualEdgesEnabled()); assertEquals(10, view.getEdgesCountEnabled()); } @Test public void testEdgesCountingReseting() { GraphViewImpl view = dhnsGlobal2.getGraphStructure().getMainView(); graphGlobal2Directed.resetViewToLeaves(); assertEquals(2, view.getMutualEdgesEnabled()); assertEquals(10, view.getEdgesCountEnabled()); LevelIterator lvlIterator = new LevelIterator(view.getStructure(), 2, Tautology.instance); for (; lvlIterator.hasNext();) { AbstractNode node = lvlIterator.next(); assertEquals(node.getEdgesInTree().getCount(), node.getEnabledInDegree()); assertEquals(node.getEdgesOutTree().getCount(), node.getEnabledOutDegree()); int expectedMutual = 0; ParamAVLIterator<AbstractEdge> edgeIterator = new ParamAVLIterator<AbstractEdge>(); for (edgeIterator.setNode(node.getEdgesOutTree()); edgeIterator.hasNext();) { AbstractEdge edge = edgeIterator.next(); AbstractNode target = edge.getTarget(view.getViewId()); if (node != target && target.getEdgesOutTree().hasNeighbour(node)) { expectedMutual++; } } assertEquals(expectedMutual, node.getEnabledMutualDegree()); } graphGlobal2Directed.resetViewToTopNodes(); assertEquals(0, view.getMutualEdgesEnabled()); assertEquals(0, view.getEdgesCountEnabled()); graphGlobal2Directed.resetViewToLevel(1); assertEquals(2, view.getMutualEdgesEnabled()); assertEquals(10, view.getEdgesCountEnabled()); LevelIterator lvlIterator2 = new LevelIterator(view.getStructure(), 2, Tautology.instance); for (; lvlIterator2.hasNext();) { AbstractNode node = lvlIterator2.next(); assertEquals(node.getEdgesInTree().getCount(), node.getEnabledInDegree()); assertEquals(node.getEdgesOutTree().getCount(), node.getEnabledOutDegree()); int expectedMutual = 0; ParamAVLIterator<AbstractEdge> edgeIterator = new ParamAVLIterator<AbstractEdge>(); for (edgeIterator.setNode(node.getEdgesOutTree()); edgeIterator.hasNext();) { AbstractEdge edge = edgeIterator.next(); AbstractNode target = edge.getTarget(view.getViewId()); if (node != target && target.getEdgesOutTree().hasNeighbour(node)) { expectedMutual++; } } assertEquals(expectedMutual, node.getEnabledMutualDegree()); } } @Test public void testEdgesCountingGrouping() { GraphViewImpl view = dhnsGlobal2.getGraphStructure().getMainView(); Node n1 = graphGlobal2Directed.getTopNodes().toArray()[0]; graphGlobal2Directed.ungroupNodes(n1); assertEquals(0, view.getMutualEdgesEnabled()); assertEquals(1, view.getEdgesCountEnabled()); graphGlobal2Directed.groupNodes(new Node[]{nodeMap.get("Leaf 0"), nodeMap.get("Leaf 1")}); n1 = graphGlobal2Directed.getTopNodes().toArray()[2]; graphGlobal2Directed.expand(n1); assertEquals(0, view.getMutualEdgesEnabled()); assertEquals(1, view.getEdgesCountEnabled()); } @Test public void testEvents() { GraphListener gl = new GraphListener() { public void graphChanged(GraphEvent event) { System.out.println("graph changed " + event.getEventType()); } }; dhnsGlobal.addGraphListener(gl); } public void checkHierarchy(TreeStructure treeStructure) throws Exception { int count = 0; AbstractNode[] array = new AbstractNode[treeStructure.getTreeSize()]; //Pre test for (TreeListIterator itr = new TreeListIterator(treeStructure.getTree()); itr.hasNext();) { AbstractNode node = itr.next(); assertEquals("node pre test", node.pre, count); array[count] = node; count++; } //Post test Arrays.sort(array, new Comparator<AbstractNode>() { public int compare(AbstractNode o1, AbstractNode o2) { if (o1.post > o2.post) { return 1; } else if (o1.post < o2.post) { return -1; } throw new IllegalArgumentException("duplicated post numbers"); } }); for (int i = 0; i < array.length; i++) { assertEquals(i, array[i].post); } } }