Mypal/python/altgraph/altgraph_tests/test_object_graph.py

350 lines
11 KiB
Python
Raw Permalink Normal View History

2019-03-11 10:26:37 +00:00
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()