blob: 83993dad542d3acad524a2b8c1b4e33396f992c7 [file] [log] [blame]
import unittest
import os
from altgraph import Dot
from altgraph import Graph
from altgraph import GraphError
class TestDot (unittest.TestCase):
def test_constructor(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g)
self.assertEqual(dot.name, 'G')
self.assertEqual(dot.attr, {})
self.assertEqual(dot.temp_dot, 'tmp_dot.dot')
self.assertEqual(dot.temp_neo, 'tmp_neo.dot')
self.assertEqual(dot.dot, 'dot')
self.assertEqual(dot.dotty, 'dotty')
self.assertEqual(dot.neato, 'neato')
self.assertEqual(dot.type, 'digraph')
self.assertEqual(dot.nodes, dict([(x, {}) for x in g]))
edges = {}
for head in g:
edges[head] = {}
for tail in g.out_nbrs(head):
edges[head][tail] = {}
self.assertEqual(dot.edges[1], edges[1])
self.assertEqual(dot.edges, edges)
dot = Dot.Dot(g, nodes=[1,2],
edgefn=lambda node: list(sorted(g.out_nbrs(node)))[:-1],
nodevisitor=lambda node: {'label': node},
edgevisitor=lambda head, tail: {'label': (head, tail) },
name="testgraph",
dot='/usr/local/bin/dot',
dotty='/usr/local/bin/dotty',
neato='/usr/local/bin/neato',
graphtype="graph")
self.assertEqual(dot.name, 'testgraph')
self.assertEqual(dot.attr, {})
self.assertEqual(dot.temp_dot, 'tmp_dot.dot')
self.assertEqual(dot.temp_neo, 'tmp_neo.dot')
self.assertEqual(dot.dot, '/usr/local/bin/dot')
self.assertEqual(dot.dotty, '/usr/local/bin/dotty')
self.assertEqual(dot.neato, '/usr/local/bin/neato')
self.assertEqual(dot.type, 'graph')
self.assertEqual(dot.nodes, dict([(x, {'label': x}) for x in [1,2]]))
edges = {}
for head in [1,2]:
edges[head] = {}
for tail in list(sorted(g.out_nbrs(head)))[:-1]:
if tail not in [1,2]: continue
edges[head][tail] = {'label': (head, tail) }
self.assertEqual(dot.edges[1], edges[1])
self.assertEqual(dot.edges, edges)
self.assertRaises(GraphError, Dot.Dot, g, nodes=[1,2, 9])
def test_style(self):
g = Graph.Graph([])
dot = Dot.Dot(g)
self.assertEqual(dot.attr, {})
dot.style(key='value')
self.assertEqual(dot.attr, {'key': 'value'})
dot.style(key2='value2')
self.assertEqual(dot.attr, {'key2': 'value2'})
def test_node_style(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g)
self.assertEqual(dot.nodes[1], {})
dot.node_style(1, key='value')
self.assertEqual(dot.nodes[1], {'key': 'value'})
dot.node_style(1, key2='value2')
self.assertEqual(dot.nodes[1], {'key2': 'value2'})
self.assertEqual(dot.nodes[2], {})
dot.all_node_style(key3='value3')
for n in g:
self.assertEqual(dot.nodes[n], {'key3': 'value3'})
self.assertTrue(9 not in dot.nodes)
dot.node_style(9, key='value')
self.assertEqual(dot.nodes[9], {'key': 'value'})
def test_edge_style(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g)
self.assertEqual(dot.edges[1][2], {})
dot.edge_style(1,2, foo='bar')
self.assertEqual(dot.edges[1][2], {'foo': 'bar'})
dot.edge_style(1,2, foo2='2bar')
self.assertEqual(dot.edges[1][2], {'foo2': '2bar'})
self.assertEqual(dot.edges[1][3], {})
self.assertFalse(6 in dot.edges[1])
dot.edge_style(1,6, foo2='2bar')
self.assertEqual(dot.edges[1][6], {'foo2': '2bar'})
self.assertRaises(GraphError, dot.edge_style, 1, 9, a=1)
self.assertRaises(GraphError, dot.edge_style, 9, 1, a=1)
def test_iter(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g)
dot.style(graph="foobar")
dot.node_style(1, key='value')
dot.node_style(2, key='another', key2='world')
dot.edge_style(1,4, key1='value1', key2='value2')
dot.edge_style(2,4, key1='valueA')
self.assertEqual(list(iter(dot)), list(dot.iterdot()))
for item in dot.iterdot():
self.assertTrue(isinstance(item, str))
first = list(dot.iterdot())[0]
self.assertEqual(first, "digraph %s {\n"%(dot.name,))
dot.type = 'graph'
first = list(dot.iterdot())[0]
self.assertEqual(first, "graph %s {\n"%(dot.name,))
dot.type = 'foo'
self.assertRaises(GraphError, list, dot.iterdot())
dot.type = 'digraph'
self.assertEqual(list(dot), [
'digraph G {\n',
'graph="foobar";',
'\n',
'\t"1" [',
'key="value",',
'];\n',
'\t"2" [',
'key="another",',
'key2="world",',
'];\n',
'\t"3" [',
'];\n',
'\t"4" [',
'];\n',
'\t"6" [',
'];\n',
'\t"7" [',
'];\n',
'\t"1" -> "2" [',
'];\n',
'\t"1" -> "3" [',
'];\n',
'\t"1" -> "4" [',
'key1="value1",',
'key2="value2",',
'];\n',
'\t"2" -> "4" [',
'key1="valueA",',
'];\n',
'\t"2" -> "6" [',
'];\n',
'\t"2" -> "7" [',
'];\n',
'\t"6" -> "1" [',
'];\n',
'\t"7" -> "4" [',
'];\n',
'}\n'])
def test_save(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g)
dot.style(graph="foobar")
dot.node_style(1, key='value')
dot.node_style(2, key='another', key2='world')
dot.edge_style(1,4, key1='value1', key2='value2')
dot.edge_style(2,4, key1='valueA')
fn = 'test_dot.dot'
self.assertTrue(not os.path.exists(fn))
try:
dot.save_dot(fn)
fp = open(fn, 'r')
data = fp.read()
fp.close()
self.assertEqual(data, ''.join(dot))
finally:
if os.path.exists(fn):
os.unlink(fn)
def test_img(self):
g = Graph.Graph([
(1,2),
(1,3),
(1,4),
(2,4),
(2,6),
(2,7),
(7,4),
(6,1),
]
)
dot = Dot.Dot(g, dot='/usr/local/bin/!!dot', dotty='/usr/local/bin/!!dotty', neato='/usr/local/bin/!!neato')
dot.style(size='10,10', rankdir='RL', page='5, 5' , ranksep=0.75)
dot.node_style(1, label='BASE_NODE',shape='box', color='blue')
dot.node_style(2, style='filled', fillcolor='red')
dot.edge_style(1,4, style='dotted')
dot.edge_style(2,4, arrowhead='dot', label='binds', labelangle='90')
system_cmds = []
def fake_system(cmd):
system_cmds.append(cmd)
return None
try:
real_system = os.system
os.system = fake_system
system_cmds = []
dot.save_img('foo')
self.assertEqual(system_cmds, ['/usr/local/bin/!!dot -Tgif tmp_dot.dot -o foo.gif'])
system_cmds = []
dot.save_img('foo', file_type='jpg')
self.assertEqual(system_cmds, ['/usr/local/bin/!!dot -Tjpg tmp_dot.dot -o foo.jpg'])
system_cmds = []
dot.save_img('bar', file_type='jpg', mode='neato')
self.assertEqual(system_cmds, [
'/usr/local/bin/!!neato -o tmp_dot.dot tmp_neo.dot',
'/usr/local/bin/!!dot -Tjpg tmp_dot.dot -o bar.jpg',
])
system_cmds = []
dot.display()
self.assertEqual(system_cmds, [
'/usr/local/bin/!!dotty tmp_dot.dot'
])
system_cmds = []
dot.display(mode='neato')
self.assertEqual(system_cmds, [
'/usr/local/bin/!!neato -o tmp_dot.dot tmp_neo.dot',
'/usr/local/bin/!!dotty tmp_dot.dot'
])
finally:
if os.path.exists(dot.temp_dot):
os.unlink(dot.temp_dot)
if os.path.exists(dot.temp_neo):
os.unlink(dot.temp_neo)
os.system = real_system
if os.path.exists('/usr/local/bin/dot') and os.path.exists('/usr/local/bin/neato'):
try:
dot.dot='/usr/local/bin/dot'
dot.neato='/usr/local/bin/neato'
self.assertFalse(os.path.exists('foo.gif'))
dot.save_img('foo')
self.assertTrue(os.path.exists('foo.gif'))
os.unlink('foo.gif')
self.assertFalse(os.path.exists('foo.gif'))
dot.save_img('foo', mode='neato')
self.assertTrue(os.path.exists('foo.gif'))
os.unlink('foo.gif')
finally:
if os.path.exists(dot.temp_dot):
os.unlink(dot.temp_dot)
if os.path.exists(dot.temp_neo):
os.unlink(dot.temp_neo)
if __name__ == "__main__": # pragma: no cover
unittest.main()