/** * Constructor. * @param edgesMatrix Each row is an edge, each column is a vertex. */ public LayeredGraph(final String[][] edgesMatrix) { this(); for (final String[] edge : edgesMatrix) { addEdge(edge[0], edge[1]); } }
public void addEdge(final String from, final String to) { addEdge(new OrientedEdgeImpl(from, to)); }
@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 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); }
@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 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 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 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"); }