diff --git a/src/main/org/insa/graph/Graph.java b/src/main/org/insa/graph/Graph.java index 09986b6..11dadb5 100644 --- a/src/main/org/insa/graph/Graph.java +++ b/src/main/org/insa/graph/Graph.java @@ -1,5 +1,6 @@ package org.insa.graph; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -71,8 +72,28 @@ public class Graph { * @return Transpose graph of this graph. */ public Graph transpose() { - // TODO: - return null; + ArrayList trNodes = new ArrayList<>(nodes.size()); + for (Node node: nodes) { + trNodes.add(new Node(node.getId(), node.getPoint())); + } + for (Node node: nodes) { + Node orig = trNodes.get(node.getId()); + for (Arc arc: node.getSuccessors()) { + if (arc.getRoadInformation().isOneWay()) { + Node dest = trNodes.get(arc.getDestination().getId()); + dest.addSuccessor(new ArcBackward(new ArcForward(orig, dest, arc.getLength(), + arc.getRoadInformation(), arc.getPoints()))); + } + else if (arc instanceof ArcForward) { + Node dest = trNodes.get(arc.getDestination().getId()); + Arc newArc = new ArcForward(orig, dest, arc.getLength(), + arc.getRoadInformation(), arc.getPoints()); + dest.addSuccessor(new ArcBackward(newArc)); + orig.addSuccessor(newArc); + } + } + } + return new Graph("R/" + mapId, mapName, trNodes, graphStatistics); } } diff --git a/src/test/org/insa/graph/GraphTest.java b/src/test/org/insa/graph/GraphTest.java new file mode 100644 index 0000000..915eaf2 --- /dev/null +++ b/src/test/org/insa/graph/GraphTest.java @@ -0,0 +1,128 @@ +package org.insa.graph; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.insa.graph.RoadInformation.RoadType; +import org.junit.BeforeClass; +import org.junit.Test; + +public class GraphTest { + + // Small graph use for tests + private static Graph graph; + + // List of nodes + private static Node[] nodes; + + @BeforeClass + public static void initAll() throws IOException { + + // Create nodes + nodes = new Node[5]; + for (int i = 0; i < nodes.length; ++i) { + nodes[i] = new Node(i, null); + } + + Node.linkNodes(nodes[0], nodes[1], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[0], nodes[2], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[0], nodes[4], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[1], nodes[2], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[3], nodes[0], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[3], nodes[4], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[4], nodes[0], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + + graph = new Graph("ID", "", Arrays.asList(nodes), null); + + } + + /** + * @return List of arcs between a and b. + */ + private List getArcsBetween(Node a, Node b) { + List arcs = new ArrayList<>(); + for (Arc arc: a.getSuccessors()) { + if (arc.getDestination().equals(b)) { + arcs.add(arc); + } + } + return arcs; + } + + @Test + public void testTranspose() { + Graph transpose = graph.transpose(); + + // Basic asserts... + assertEquals("R/" + graph.getMapId(), transpose.getMapId()); + assertEquals(graph.getNodes().size(), transpose.getNodes().size()); + + final int expNbSucc[] = { 4, 2, 2, 4, 2 }; + for (int i = 0; i < expNbSucc.length; ++i) { + assertEquals(expNbSucc[i], transpose.getNodes().get(i).getSuccessors().size()); + } + + assertEquals( + getArcsBetween(transpose.getNodes().get(0), transpose.getNodes().get(1)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(0), transpose.getNodes().get(2)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(0), transpose.getNodes().get(3)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(0), transpose.getNodes().get(4)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(1), transpose.getNodes().get(0)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(1), transpose.getNodes().get(2)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(1), transpose.getNodes().get(3)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(1), transpose.getNodes().get(4)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(2), transpose.getNodes().get(0)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(2), transpose.getNodes().get(1)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(2), transpose.getNodes().get(3)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(2), transpose.getNodes().get(4)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(3), transpose.getNodes().get(0)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(3), transpose.getNodes().get(1)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(3), transpose.getNodes().get(2)).size(), 3); + assertEquals( + getArcsBetween(transpose.getNodes().get(3), transpose.getNodes().get(4)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(4), transpose.getNodes().get(0)).size(), 1); + assertEquals( + getArcsBetween(transpose.getNodes().get(4), transpose.getNodes().get(1)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(4), transpose.getNodes().get(2)).size(), 0); + assertEquals( + getArcsBetween(transpose.getNodes().get(4), transpose.getNodes().get(3)).size(), 1); + + } +} diff --git a/src/test/org/insa/graph/NodeTest.java b/src/test/org/insa/graph/NodeTest.java new file mode 100644 index 0000000..eeba7ef --- /dev/null +++ b/src/test/org/insa/graph/NodeTest.java @@ -0,0 +1,77 @@ +package org.insa.graph; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.ArrayList; + +import org.insa.graph.RoadInformation.RoadType; +import org.junit.Before; +import org.junit.Test; + +public class NodeTest { + + // List of nodes + private Node[] nodes; + + @Before + public void initAll() throws IOException { + + // Create nodes + nodes = new Node[5]; + for (int i = 0; i < nodes.length; ++i) { + nodes[i] = new Node(i, null); + } + + Node.linkNodes(nodes[0], nodes[1], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[0], nodes[2], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[0], nodes[4], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[1], nodes[2], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[2], nodes[3], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[3], nodes[0], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null), + new ArrayList<>()); + Node.linkNodes(nodes[3], nodes[4], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + Node.linkNodes(nodes[4], nodes[0], 0, + new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>()); + + } + + /** + * @return The first arc between from a to b, or null. + */ + private Arc getFirstArcBetween(Node a, Node b) { + for (Arc arc: a.getSuccessors()) { + if (arc.getDestination().equals(b)) { + return arc; + } + } + return null; + } + + @Test + public void testLinkNodes() { + final int[] expNbSucc = { 4, 2, 5, 2, 1 }; + assertEquals(nodes.length, expNbSucc.length); + for (int i = 0; i < expNbSucc.length; ++i) { + assertEquals(nodes[i].getSuccessors().size(), expNbSucc[i]); + } + + assertEquals(getFirstArcBetween(nodes[0], nodes[1]).getRoadInformation(), + getFirstArcBetween(nodes[1], nodes[0]).getRoadInformation()); + } + +}