diff options
Diffstat (limited to 'python/altgraph/altgraph_tests/test_object_graph.py')
-rw-r--r-- | python/altgraph/altgraph_tests/test_object_graph.py | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/python/altgraph/altgraph_tests/test_object_graph.py b/python/altgraph/altgraph_tests/test_object_graph.py new file mode 100644 index 000000000..9035607e7 --- /dev/null +++ b/python/altgraph/altgraph_tests/test_object_graph.py @@ -0,0 +1,349 @@ +import unittest +import sys +from altgraph.ObjectGraph import ObjectGraph +from altgraph.Graph import Graph + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + + +class Node (object): + def __init__(self, graphident): + self.graphident = graphident + +class SubNode (Node): + pass + +class ArgNode (object): + def __init__(self, graphident, *args, **kwds): + self.graphident = graphident + self.args = args + self.kwds = kwds + + def __repr__(self): + return '<ArgNode %s>'%(self.graphident,) + +class TestObjectGraph (unittest.TestCase): + + def test_constructor(self): + graph = ObjectGraph() + self.assertTrue(isinstance(graph, ObjectGraph)) + + g = Graph() + graph = ObjectGraph(g) + self.assertTrue(graph.graph is g) + self.assertEqual(graph.debug, 0) + self.assertEqual(graph.indent, 0) + + graph = ObjectGraph(debug=5) + self.assertEqual(graph.debug, 5) + + def test_repr(self): + graph = ObjectGraph() + self.assertEqual(repr(graph), '<ObjectGraph>') + + + def testNodes(self): + graph = ObjectGraph() + n1 = Node("n1") + n2 = Node("n2") + n3 = Node("n3") + n4 = Node("n4") + + n1b = Node("n1") + + self.assertTrue(graph.getIdent(graph) is graph) + self.assertTrue(graph.getRawIdent(graph) is graph) + + graph.addNode(n1) + graph.addNode(n2) + graph.addNode(n3) + + self.assertTrue(n1 in graph) + self.assertFalse(n4 in graph) + self.assertTrue("n1" in graph) + self.assertFalse("n4" in graph) + + self.assertTrue(graph.findNode(n1) is n1) + self.assertTrue(graph.findNode(n1b) is n1) + self.assertTrue(graph.findNode(n2) is n2) + self.assertTrue(graph.findNode(n4) is None) + self.assertTrue(graph.findNode("n1") is n1) + self.assertTrue(graph.findNode("n2") is n2) + self.assertTrue(graph.findNode("n4") is None) + + self.assertEqual(graph.getRawIdent(n1), "n1") + self.assertEqual(graph.getRawIdent(n1b), "n1") + self.assertEqual(graph.getRawIdent(n4), "n4") + self.assertEqual(graph.getRawIdent("n1"), None) + + self.assertEqual(graph.getIdent(n1), "n1") + self.assertEqual(graph.getIdent(n1b), "n1") + self.assertEqual(graph.getIdent(n4), "n4") + self.assertEqual(graph.getIdent("n1"), "n1") + + self.assertTrue(n3 in graph) + graph.removeNode(n3) + self.assertTrue(n3 not in graph) + graph.addNode(n3) + self.assertTrue(n3 in graph) + + n = graph.createNode(SubNode, "n1") + self.assertTrue(n is n1) + + n = graph.createNode(SubNode, "n8") + self.assertTrue(isinstance(n, SubNode)) + self.assertTrue(n in graph) + self.assertTrue(graph.findNode("n8") is n) + + n = graph.createNode(ArgNode, "args", 1, 2, 3, a='a', b='b') + self.assertTrue(isinstance(n, ArgNode)) + self.assertTrue(n in graph) + self.assertTrue(graph.findNode("args") is n) + self.assertEqual(n.args, (1, 2, 3)) + self.assertEqual(n.kwds, {'a':'a', 'b':'b'}) + + def testEdges(self): + graph = ObjectGraph() + n1 = graph.createNode(ArgNode, "n1", 1) + n2 = graph.createNode(ArgNode, "n2", 1) + n3 = graph.createNode(ArgNode, "n3", 1) + n4 = graph.createNode(ArgNode, "n4", 1) + + graph.createReference(n1, n2, "n1-n2") + graph.createReference("n1", "n3", "n1-n3") + graph.createReference("n2", n3) + + g = graph.graph + e = g.edge_by_node("n1", "n2") + self.assertTrue(e is not None) + self.assertEqual(g.edge_data(e), "n1-n2") + + e = g.edge_by_node("n1", "n3") + self.assertTrue(e is not None) + self.assertEqual(g.edge_data(e), "n1-n3") + + e = g.edge_by_node("n2", "n3") + self.assertTrue(e is not None) + self.assertEqual(g.edge_data(e), None) + + e = g.edge_by_node("n1", "n4") + self.assertTrue(e is None) + + graph.removeReference(n1, n2) + e = g.edge_by_node("n1", "n2") + self.assertTrue(e is None) + + graph.removeReference("n1", "n3") + e = g.edge_by_node("n1", "n3") + self.assertTrue(e is None) + + graph.createReference(n1, n2, "foo") + e = g.edge_by_node("n1", "n2") + self.assertTrue(e is not None) + self.assertEqual(g.edge_data(e), "foo") + + + def test_flatten(self): + graph = ObjectGraph() + n1 = graph.createNode(ArgNode, "n1", 1) + n2 = graph.createNode(ArgNode, "n2", 2) + n3 = graph.createNode(ArgNode, "n3", 3) + n4 = graph.createNode(ArgNode, "n4", 4) + n5 = graph.createNode(ArgNode, "n5", 5) + n6 = graph.createNode(ArgNode, "n6", 6) + n7 = graph.createNode(ArgNode, "n7", 7) + n8 = graph.createNode(ArgNode, "n8", 8) + + graph.createReference(graph, n1) + graph.createReference(graph, n7) + graph.createReference(n1, n2) + graph.createReference(n1, n4) + graph.createReference(n2, n3) + graph.createReference(n2, n5) + graph.createReference(n5, n6) + graph.createReference(n4, n6) + graph.createReference(n4, n2) + + self.assertFalse(isinstance(graph.flatten(), list)) + + fl = list(graph.flatten()) + self.assertTrue(n1 in fl) + self.assertTrue(n2 in fl) + self.assertTrue(n3 in fl) + self.assertTrue(n4 in fl) + self.assertTrue(n5 in fl) + self.assertTrue(n6 in fl) + self.assertTrue(n7 in fl) + self.assertFalse(n8 in fl) + + fl = list(graph.flatten(start=n2)) + self.assertFalse(n1 in fl) + self.assertTrue(n2 in fl) + self.assertTrue(n3 in fl) + self.assertFalse(n4 in fl) + self.assertTrue(n5 in fl) + self.assertTrue(n6 in fl) + self.assertFalse(n7 in fl) + self.assertFalse(n8 in fl) + + graph.createReference(n1, n5) + fl = list(graph.flatten(lambda n: n.args[0] % 2 != 0)) + self.assertTrue(n1 in fl) + self.assertFalse(n2 in fl) + self.assertFalse(n3 in fl) + self.assertFalse(n4 in fl) + self.assertTrue(n5 in fl) + self.assertFalse(n6 in fl) + self.assertTrue(n7 in fl) + self.assertFalse(n8 in fl) + + def test_iter_nodes(self): + graph = ObjectGraph() + n1 = graph.createNode(ArgNode, "n1", 1) + n2 = graph.createNode(ArgNode, "n2", 2) + n3 = graph.createNode(ArgNode, "n3", 3) + n4 = graph.createNode(ArgNode, "n4", 4) + n5 = graph.createNode(ArgNode, "n5", 5) + n6 = graph.createNode(ArgNode, "n6", 5) + + nodes = graph.nodes() + if sys.version[0] == '2': + self.assertTrue(hasattr(nodes, 'next')) + else: + self.assertTrue(hasattr(nodes, '__next__')) + self.assertTrue(hasattr(nodes, '__iter__')) + + nodes = list(nodes) + self.assertEqual(len(nodes), 6) + self.assertTrue(n1 in nodes) + self.assertTrue(n2 in nodes) + self.assertTrue(n3 in nodes) + self.assertTrue(n4 in nodes) + self.assertTrue(n5 in nodes) + self.assertTrue(n6 in nodes) + + def test_get_edges(self): + graph = ObjectGraph() + n1 = graph.createNode(ArgNode, "n1", 1) + n2 = graph.createNode(ArgNode, "n2", 2) + n3 = graph.createNode(ArgNode, "n3", 3) + n4 = graph.createNode(ArgNode, "n4", 4) + n5 = graph.createNode(ArgNode, "n5", 5) + n6 = graph.createNode(ArgNode, "n6", 5) + + graph.createReference(n1, n2) + graph.createReference(n1, n3) + graph.createReference(n3, n1) + graph.createReference(n5, n1) + graph.createReference(n2, n4) + graph.createReference(n2, n5) + graph.createReference(n6, n2) + + outs, ins = graph.get_edges(n1) + + self.assertFalse(isinstance(outs, list)) + self.assertFalse(isinstance(ins, list)) + + ins = list(ins) + outs = list(outs) + + + self.assertTrue(n1 not in outs) + self.assertTrue(n2 in outs) + self.assertTrue(n3 in outs) + self.assertTrue(n4 not in outs) + self.assertTrue(n5 not in outs) + self.assertTrue(n6 not in outs) + + self.assertTrue(n1 not in ins) + self.assertTrue(n2 not in ins) + self.assertTrue(n3 in ins) + self.assertTrue(n4 not in ins) + self.assertTrue(n5 in ins) + self.assertTrue(n6 not in ins) + + def test_filterStack(self): + graph = ObjectGraph() + n1 = graph.createNode(ArgNode, "n1", 0) + n11 = graph.createNode(ArgNode, "n1.1", 1) + n12 = graph.createNode(ArgNode, "n1.2", 0) + n111 = graph.createNode(ArgNode, "n1.1.1", 0) + n112 = graph.createNode(ArgNode, "n1.1.2",2) + n2 = graph.createNode(ArgNode, "n2", 0) + n3 = graph.createNode(ArgNode, "n2", 0) + + graph.createReference(None, n1) + graph.createReference(None, n2) + graph.createReference(n1, n11) + graph.createReference(n1, n12) + graph.createReference(n11, n111) + graph.createReference(n11, n112) + + self.assertTrue(n1 in graph) + self.assertTrue(n2 in graph) + self.assertTrue(n11 in graph) + self.assertTrue(n12 in graph) + self.assertTrue(n111 in graph) + self.assertTrue(n112 in graph) + self.assertTrue(n2 in graph) + self.assertTrue(n3 in graph) + + visited, removes, orphans = graph.filterStack( + [lambda n: n.args[0] != 1, lambda n: n.args[0] != 2]) + + self.assertEqual(visited, 6) + self.assertEqual(removes, 2) + self.assertEqual(orphans, 1) + + e = graph.graph.edge_by_node(n1.graphident, n111.graphident) + self.assertEqual(graph.graph.edge_data(e), "orphan") + + self.assertTrue(n1 in graph) + self.assertTrue(n2 in graph) + self.assertTrue(n11 not in graph) + self.assertTrue(n12 in graph) + self.assertTrue(n111 in graph) + self.assertTrue(n112 not in graph) + self.assertTrue(n2 in graph) + self.assertTrue(n3 in graph) + + +class TestObjectGraphIO (unittest.TestCase): + def setUp(self): + self._stdout = sys.stdout + + def tearDown(self): + sys.stdout = self._stdout + + def test_msg(self): + graph = ObjectGraph() + + sys.stdout = fp = StringIO() + graph.msg(0, "foo") + self.assertEqual(fp.getvalue(), "foo \n") + + sys.stdout = fp = StringIO() + graph.msg(5, "foo") + self.assertEqual(fp.getvalue(), "") + + sys.stdout = fp = StringIO() + graph.debug = 10 + graph.msg(5, "foo") + self.assertEqual(fp.getvalue(), "foo \n") + + sys.stdout = fp = StringIO() + graph.msg(0, "foo", 1, "a") + self.assertEqual(fp.getvalue(), "foo 1 'a'\n") + + sys.stdout = fp = StringIO() + graph.msgin(0, "hello", "world") + graph.msg(0, "test me") + graph.msgout(0, "bye bye") + self.assertEqual(fp.getvalue(), "hello 'world'\n test me \nbye bye \n") + + +if __name__ == "__main__": # pragma: no cover + unittest.main() |