mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 18:55:30 +00:00
be8a00060c
MozReview-Commit-ID: 7mjFYfEGlHS
350 lines
11 KiB
Python
350 lines
11 KiB
Python
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()
|