summaryrefslogtreecommitdiff
path: root/test/git/async/test_graph.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/git/async/test_graph.py')
-rw-r--r--test/git/async/test_graph.py82
1 files changed, 81 insertions, 1 deletions
diff --git a/test/git/async/test_graph.py b/test/git/async/test_graph.py
index 18d6997c..400e92cd 100644
--- a/test/git/async/test_graph.py
+++ b/test/git/async/test_graph.py
@@ -7,4 +7,84 @@ import time
class TestGraph(TestBase):
def test_base(self):
- pass
+ g = Graph()
+ nn = 10
+ assert nn > 2, "need at least 3 nodes"
+
+ # add unconnected nodes
+ for i in range(nn):
+ assert isinstance(g.add_node(Node()), Node)
+ # END add nodes
+ assert len(g.nodes) == nn
+
+ # delete unconnected nodes
+ for n in g.nodes[:]:
+ g.del_node(n)
+ # END del nodes
+
+ # add a chain of connected nodes
+ last = None
+ for i in range(nn):
+ n = g.add_node(Node())
+ if last:
+ assert not last.out_nodes
+ assert not n.in_nodes
+ assert g.add_edge(last, n) is g
+ assert last.out_nodes[0] is n
+ assert n.in_nodes[0] is last
+ last = n
+ # END for each node to connect
+
+ # try to connect a node with itself
+ self.failUnlessRaises(ValueError, g.add_edge, last, last)
+
+ # try to create a cycle
+ self.failUnlessRaises(ValueError, g.add_edge, g.nodes[0], g.nodes[-1])
+ self.failUnlessRaises(ValueError, g.add_edge, g.nodes[-1], g.nodes[0])
+
+ # we have undirected edges, readding the same edge, but the other way
+ # around does not change anything
+ n1, n2, n3 = g.nodes[0], g.nodes[1], g.nodes[2]
+ g.add_edge(n1, n2) # already connected
+ g.add_edge(n2, n1) # same thing
+ assert len(n1.out_nodes) == 1
+ assert len(n1.in_nodes) == 0
+ assert len(n2.in_nodes) == 1
+ assert len(n2.out_nodes) == 1
+
+ # deleting a connected node clears its neighbour connections
+ assert n3.in_nodes[0] is n2
+ g.del_node(n2)
+ assert len(g.nodes) == nn - 1
+ assert len(n3.in_nodes) == 0
+ assert len(n1.out_nodes) == 0
+
+ # check the history from the last node
+ last = g.nodes[-1]
+ class Visitor(object):
+ def __init__(self, origin):
+ self.origin_seen = False
+ self.origin = origin
+ self.num_seen = 0
+
+ def __call__(self, n):
+ if n is self.origin:
+ self.origin_seen = True
+ else:
+ assert not self.origin_seen, "should see origin last"
+ # END check origin
+ self.num_seen += 1
+ return True
+
+ def _assert(self, num_expected):
+ assert self.origin_seen
+ assert self.num_seen == num_expected
+ # END visitor helper
+
+ end = g.nodes[-1]
+ visitor = Visitor(end)
+ g.visit_input_inclusive_depth_first(end, visitor)
+
+ num_nodes_seen = nn - 2 # deleted second, which leaves first one disconnected
+ visitor._assert(num_nodes_seen)
+