protected void testDirected(Graph graph) {
Node A = graph.addNode("A");
Node B = graph.addNode("B");
Node C = graph.addNode("C");
Edge AB = graph.addEdge("AB", "A", "B");
Edge BC = graph.addEdge("BC", "B", "C", true);
Edge CA = graph.addEdge("CA", "C", "A", false);
// A
// |\
// | \
// | \
// | \
// B--->C
assertFalse(AB.isDirected());
assertTrue(BC.isDirected());
assertFalse(CA.isDirected());
assertEquals(2, A.getDegree());
assertEquals(2, B.getDegree());
assertEquals(2, C.getDegree());
assertEquals(2, A.getInDegree());
assertEquals(2, A.getOutDegree());
assertEquals(1, B.getInDegree());
assertEquals(2, B.getOutDegree());
assertEquals(2, C.getInDegree());
assertEquals(1, C.getOutDegree());
assertEquals(AB, A.getEdgeFrom("B"));
assertEquals(CA, A.getEdgeFrom("C"));
assertEquals(AB, B.getEdgeFrom("A"));
assertNull(B.getEdgeFrom("C"));
assertEquals(CA, C.getEdgeFrom("A"));
assertEquals(BC, C.getEdgeFrom("B"));
assertEquals(AB, A.getEdgeToward("B"));
assertEquals(CA, A.getEdgeToward("C"));
assertEquals(AB, B.getEdgeToward("A"));
assertEquals(BC, B.getEdgeToward("C"));
assertEquals(CA, C.getEdgeToward("A"));
assertNull(C.getEdgeToward("B"));
// Now change things a little :
//
// A
// |\
// | \
// | \
// v \
// B<---C
//
// BC changes its direction, and AB becomes directed.
graph.removeEdge("BC");
BC = graph.addEdge("BC", "C", "B", true);
graph.removeEdge("AB");
AB = graph.addEdge("AB", "A", "B", true);
assertTrue(AB.isDirected());
assertTrue(BC.isDirected());
assertFalse(CA.isDirected());
assertEquals(2, A.getDegree());
assertEquals(2, B.getDegree());
assertEquals(2, C.getDegree());
assertEquals(1, A.getInDegree());
assertEquals(2, A.getOutDegree());
assertEquals(2, B.getInDegree());
assertEquals(0, B.getOutDegree());
assertEquals(1, C.getInDegree());
assertEquals(2, C.getOutDegree());
assertNull(A.getEdgeFrom("B"));
assertEquals(CA, A.getEdgeFrom("C"));
assertEquals(AB, B.getEdgeFrom("A"));
assertEquals(BC, B.getEdgeFrom("C"));
assertEquals(CA, C.getEdgeFrom("A"));
assertNull(C.getEdgeFrom("B"));
assertEquals(AB, A.getEdgeToward("B"));
assertEquals(CA, A.getEdgeToward("C"));
assertNull(B.getEdgeToward("A"));
assertNull(B.getEdgeToward("C"));
assertEquals(CA, C.getEdgeToward("A"));
assertEquals(BC, C.getEdgeToward("B"));
// Directed loop edges
assertFalse(A.hasEdgeBetween(A));
assertFalse(A.hasEdgeToward(A));
assertFalse(A.hasEdgeFrom(A));
assertNull(A.getEdgeBetween(A));
assertNull(A.getEdgeToward(A));
assertNull(A.getEdgeFrom(A));
Edge AA = graph.addEdge("AA", "A", "A", true);
assertEquals(4, graph.getEdgeCount());
assertEquals(3, A.getDegree());
assertEquals(2, A.getInDegree());
assertEquals(3, A.getOutDegree());
assertTrue(A.hasEdgeBetween(A));
assertTrue(A.hasEdgeToward(A));
assertTrue(A.hasEdgeFrom(A));
assertEquals(AA, A.getEdgeBetween(A));
assertEquals(AA, A.getEdgeToward(A));
assertEquals(AA, A.getEdgeFrom(A));
assertEquals(A, AA.getSourceNode());
assertEquals(A, AA.getTargetNode());
}