@Test public void twoSeparateTreesToRoots() { final LayeredGraph graph = new LayeredGraph(Graphs.TwoSeparateTreesToRoots); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); Assertions.assertThat(result.size()) .as("TwoSeparateTreesToRoots graph vertices should be placed into three layers") .isEqualTo(3); match(new String[]{"A1", "A2"}, result.get(2)); match(new String[]{"B1", "C1", "B2", "C2", "D2"}, result.get(1)); match(new String[]{"D1", "E1", "E2", "F2"}, result.get(0)); }
@Test public void twoSeparateTreesFromRoots() { final LayeredGraph graph = new LayeredGraph(Graphs.TwoSeparateTreesFromRoots); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); Assertions.assertThat(result.size()) .as("TwoSeparateTreesFromRoots graph vertices should be placed into three layers") .isEqualTo(3); match(new String[]{"A1", "A2"}, result.get(0)); match(new String[]{"C1", "B2", "D2"}, result.get(1)); match(new String[]{"B1", "D1", "E1", "E2", "C2", "F2"}, result.get(2)); }
@Test public void testAcyclicGraphs() { final LayeredGraph graph = new LayeredGraph(Graphs.SIMPLE_ACYCLIC); final ReverseEdgesCycleBreaker breaker = new ReverseEdgesCycleBreaker(); breaker.breakCycle(graph); assertTrue(graph.isAcyclic()); }
@Test public void testCyclicGraph1() { final LayeredGraph graph = new LayeredGraph(Graphs.CYCLIC_GRAPH_1); final ReverseEdgesCycleBreaker breaker = new ReverseEdgesCycleBreaker(); breaker.breakCycle(graph); assertTrue(graph.isAcyclic()); }
@Test public void singleLineLayered() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "B"); graph.addEdge("B", "C"); graph.addEdge("C", "D"); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); assertEquals(4, result.size()); // 4 = layered = vertical line }
@Test public void simple2LayersTest() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "E"); graph.addEdge("A", "G"); graph.addEdge("A", "H"); graph.addEdge("B", "F"); graph.addEdge("C", "H"); graph.addEdge("D", "H"); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); assertEquals(2, result.size()); final GraphLayer layer01 = result.get(0); match(new String[]{"A", "B", "C", "D"}, layer01); final GraphLayer layer02 = result.get(1); match(new String[]{"E", "F", "G", "H"}, layer02); }
@Test public void testCyclicGraphFull() { final LayeredGraph graph = new LayeredGraph(Graphs.Full); assertFalse(graph.isAcyclic()); final ReverseEdgesCycleBreaker breaker = new ReverseEdgesCycleBreaker(); breaker.breakCycle(graph); assertTrue(graph.isAcyclic()); } }
@Test public void simple3Layers() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "B"); graph.addEdge("A", "C"); graph.addEdge("B", "F"); graph.addEdge("C", "E"); graph.addEdge("C", "G"); graph.addEdge("C", "H"); graph.addEdge("D", "F"); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); assertEquals(3, result.size()); final GraphLayer layer01 = result.get(0); match(new String[]{"A"}, layer01); final GraphLayer layer02 = result.get(1); match(new String[]{"D", "B", "C"}, layer02); final GraphLayer layer03 = result.get(2); match(new String[]{"E", "F", "G", "H"}, layer03); }
public Layout createLayout(final Graph<?, ?> graph) { final HashMap<String, Node> indexByUuid = new HashMap<>(); final LayeredGraph reorderedGraph = new LayeredGraph();
@Test public void testTwoSeparateTrees() { final LayeredGraph graph = new LayeredGraph(Graphs.TwoSeparateTreesFromRoots); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assertions.assertThat(graph.getLayers()) .as("TwoSeparateTreesFromRoots graph vertices should be placed into three layers") .hasSize(3); }
@Test public void testFullGraph() { final LayeredGraph graph = new LayeredGraph(Graphs.Full); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assertions.assertThat(graph.getLayers()) .as("Full graph vertices should be in 4 layers") .hasSize(4); } }
@Test public void simple4Layers() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "B"); graph.addEdge("A", "C"); graph.addEdge("B", "F"); graph.addEdge("C", "E"); graph.addEdge("C", "G"); graph.addEdge("C", "H"); graph.addEdge("B", "I"); graph.addEdge("H", "I"); graph.addEdge("G", "I"); final LongestPathVertexLayerer layerer = new LongestPathVertexLayerer(); layerer.createLayers(graph); final List<GraphLayer> result = graph.getLayers(); assertEquals(4, result.size()); /* We're ensuring that the default algorithm behaviour is "good enough" and is not break by some change, * but If we changed it to a better one we'll have to modify this test to the new better expected result. */ final GraphLayer layer01 = result.get(0); match(new String[]{"A"}, layer01); final GraphLayer layer02 = result.get(1); match(new String[]{"C"}, layer02); final GraphLayer layer03 = result.get(2); match(new String[]{"B", "G", "H"}, layer03); final GraphLayer layer04 = result.get(3); match(new String[]{"F", "I", "E"}, layer04); }
@Test public void testSimpleReorder() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "D"); graph.addEdge("B", "C"); final GraphLayerImpl layer01 = new GraphLayerImpl(1); layer01.addNewVertex("A"); layer01.addNewVertex("B"); graph.getLayers().add(layer01); final GraphLayerImpl layer02 = new GraphLayerImpl(2); layer02.addNewVertex("C"); layer02.addNewVertex("D"); graph.getLayers().add(layer02); final MedianVertexLayerPositioning median = new MedianVertexLayerPositioning(); final LayerCrossingCount layersCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(layersCount); final DefaultVertexOrdering ordering = new DefaultVertexOrdering(median, layersCount, verticesTransposer); ordering.orderVertices(graph); Assertions.assertThat(graph.getLayers().get(0).getVertices()) .extracting(Vertex::getId) .containsExactly("A", "B"); Assertions.assertThat(graph.getLayers().get(1).getVertices()) .extracting(Vertex::getId) .containsExactly("D", "C"); }
@Test public void testSimpleCyclicGraph() { final LayeredGraph graph = new LayeredGraph(Graphs.SIMPLE_CYCLIC); graph.addEdge("A", "B"); graph.addEdge("B", "C"); graph.addEdge("C", "D"); graph.addEdge("D", "A"); assertFalse(graph.isAcyclic()); final ReverseEdgesCycleBreaker breaker = new ReverseEdgesCycleBreaker(); breaker.breakCycle(graph); assertTrue(graph.isAcyclic()); }
@Test public void testRealCase1() { final LayeredGraph graph = new LayeredGraph(Graphs.REAL_CASE_1); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assert.assertEquals(6, graph.getLayers().size()); final DefaultVertexPositioning defaultVertexPositioning = new DefaultVertexPositioning(); defaultVertexPositioning.calculateVerticesPositions(graph, LayerArrangement.TopDown); }
@Test public void testReorder() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "B"); graph.addEdge("A", "C");