import unittest import dot2tex.dotparsing as dotp testgraph = """ digraph G { a_1-> a_2 -> a_3 -> a_1; } """ ##class InterfaceTest(unittest.TestCase): ## ## def test_grammarcreate(self): ## grammar = dotp.graph_definition() ## self.failUnless(grammar) ## ## def test_parsebasic(self): ## """parse_dot_data should return a DotGraph instance""" ## g = dotp.parse_dot_data(testgraph) ## self.failUnless(isinstance(g,dotp.DotGraph)) class DotNodeTest(unittest.TestCase): def test_create(self): node = dotp.DotNode("a") self.failUnless(node.name=="a") self.assertEqual(len(node.attr),0) def test_createwithattributes(self): node = dotp.DotNode("a",label='a_1',style='filled') self.failUnless(node.name=="a") self.assertEqual(len(node.attr),2) self.assertEqual(node.attr['label'],'a_1') self.assertEqual(node.attr['style'],'filled') def test_createwithdict(self): attr = dict(label="a_1",style='filled') node = dotp.DotNode("a",**attr) self.assertEqual(len(node.attr),2) self.assertEqual(node.attr['label'],'a_1') self.assertEqual(node.attr['style'],'filled') def test_createwithdictandnamed(self): attr = dict(label="a_1",style='filled') node = dotp.DotNode("a",texmode="math",**attr) self.assertEqual(len(node.attr),3) self.assertEqual(node.attr['label'],'a_1') self.assertEqual(node.attr['style'],'filled') self.assertEqual(node.attr['texmode'],'math') def test_cmp(self): node = dotp.DotNode("a") self.failUnless(node.name=="a") self.assertEqual(node,'a') class DotGraphTest(unittest.TestCase): def test_create(self): g = dotp.DotGraph('mygraph',strict=False, directed=True) self.failUnless(g.name=="mygraph") self.assertEqual(g.strict,False) self.assertEqual(g.directed,True) def test_create_with_attributes(self): g = dotp.DotGraph(style='fancy',label='testgraph') self.assertEqual(len(g.attr),2) self.assertEqual(g.attr['style'],'fancy') self.assertEqual(g.attr['label'],'testgraph') def test_add_node(self): g = dotp.DotGraph() na = g.add_node('a') nb = g.add_node('b') self.assertEqual(len(g.nodes),2) ## def test_addequalnodes(self): g = dotp.DotGraph() g.add_node('a',label="test1") g.add_node('a',style="filled") g.add_node('a',label="test2",texmode="math") n = g.get_node('a') self.assertEqual(len(g.nodes),1) self.assertEqual(len(n.attr),3) self.assertEqual(n.attr['label'],'test2') self.assertEqual(set(n.attr.keys()),set(['label','style','texmode'])) def test_add_nonstring_nodes(self): g = dotp.DotGraph() n = g.add_node(1) self.assertEqual(n.name,'1') n = g.add_node(3.14) self.assertEqual(n.name,'3.14') def test_add_edge(self): g = dotp.DotGraph() e = g.add_edge('a','b',label='test') e2 = g.add_edge('a','d',label='test2') self.assertEqual(len(g),3) self.assertEqual(len(g.edges),2) class DotSubgraphsTest(unittest.TestCase): def test_add_subgraph(self): g = dotp.DotGraph() s = g.add_subgraph('subG') self.assertEqual(s.name, 'subG') def test_add_edge_to_subgraph(self): g = dotp.DotGraph() s = g.add_subgraph('subG') self.assertEqual(len(g),0) s.add_edge(1,2) self.assertEqual(len(s),2) self.assertEqual(len(g),2) g.add_edge(3,4) self.assertEqual(len(s),2) self.assertEqual(len(g),4) class DotDefaultAttrTest(unittest.TestCase): """Test default attributes""" def test_add_default(self): g = dotp.DotGraph() g.add_default_node_attr(color="red", label="a") self.assertEqual(len(g.default_node_attr),2) g.add_default_edge_attr(color="red") self.assertEqual(len(g.default_edge_attr),1) g.add_default_graph_attr(color="red") self.assertEqual(len(g.default_graph_attr),1) def test_add_default_node(self): g = dotp.DotGraph() g.add_default_node_attr(color="red") n = g.add_node('a') self.failUnless('color' in n.attr) self.assertEqual(n.attr['color'],"red") g.add_default_node_attr(color="blue",label="b") n = g.add_node(2) self.failUnless('color' in n.attr) self.assertEqual(n.attr['color'],"blue") self.failUnless('label' in n.attr) self.assertEqual(n.attr['label'],"b") def test_add_default_node_subgraph(self): g = dotp.DotGraph() g.add_default_node_attr(color="red") g.add_node('a') s = g.add_subgraph('S') s.add_default_node_attr(style='test') n = s.add_node('b') self.failUnless('color' in n.attr) self.assertEqual(n.attr['color'],"red") self.failUnless('style' in n.attr) nn = g.add_node(2) self.failIf('style' in nn.attr) ## ## ## def test_addequalnodes2(self): ## g = dotp.DotGraph() ## n = dotp.DotNode('a',label="test1") ## g.add_node(n) ## n = dotp.DotNode('a',style="filled") ## g.add_node(n) ## g.add_node('a',label="test2",texmode="math") ## n = g.get_node('a') ## self.assertEqual(len(g.nodes),1) ## self.assertEqual(len(n.attributes),3) ## self.assertEqual(n.attributes['label'],'test2') ## self.assertEqual(set(n.attributes.keys()),set(['label','style','texmode'])) ## ## def test_getnodes(self): ## g = dotp.DotGraph() ## n = g.get_node('a') ## self.assertEqual(n,None) ## g.add_node('a') ## n = g.get_node('a') ## self.assertEqual(n.name,'a') ## ## def test_addedge(self): ## g = dotp.DotGraph(graph_type='digraph') ## e1 = g.add_edge('a','b',label='a->b') ## e2 = g.add_edge('b','a',label='b->a') ## self.assertEqual(len(g.nodes),2) ## self.assertEqual(len(g.edges),2) ## self.assertEqual(e1.attributes['label'],'a->b') ## self.assertEqual(e2.attributes['label'],'b->a') ## ## ## ## ## ## ## def test_strictgraph(self): ## """A strict graph have to ignore duplicate edges""" ## g = dotp.DotGraph(strict=True) ## g.add_edge('a','b') ## g.add_edge('a','b') ## self.assertEqual(len(g.edges),1) ## ## def test_addsubgraphs(self): ## g = dotp.DotGraph() ## g.add_edge('a','b') ## n = g.get_node('a') ## self.assertEqual(n.parent,g) ## gs = g.add_subgraph('clusterG') ## gs.add_edge('a','b') ## #n = g.get_node('a') ## self.assertEqual(n.parent,gs) ## n = g.add_node('a',label="test") ## ## self.assertEqual(n.parent,gs) ## ## def test_graphlevels(self): ## g = dotp.DotGraph() ## e = g.add_edge('a','b') ## self.assertEqual(g.level,0) ## gs1 = g.add_subgraph('clusterG') ## self.assertEqual(gs1.level,1) ## gs2 = g.add_subgraph('clusterGG') ## self.assertEqual(gs2.level,1) ## gs12 = gs1.add_subgraph('ClusterG2') ## self.assertEqual(gs12.level,2) ## e = gs12.add_edge('c','d') ## self.assertEqual(e.src.parent.level,2) ## self.assertEqual(e.parent.level,2) ## ## def test_addedgesubgraphs(self): ## """ ## digraph G { ## a -> b; ## subgraph clusterG { ## a -> b; ## } ## subgraph clusterGG { ## a -> b; ## } ## ##strict digraph G { ## node [label="\N"]; ## graph [bb="0,0,86,140"]; ## subgraph clusterG { ## graph [bb="8,8,78,132"]; ## a [pos="43,106", width="0.75", height="0.50"]; ## b [pos="43,34", width="0.75", height="0.50"]; ## a -> b [pos="e,43,52 43,88 43,80 43,71 43,62"]; ## } ##} ## }""" ## g = dotp.DotGraph() ## e1 = g.add_edge('a','b') ## self.assertEqual(e1.parent.name,g.name) ## gs = g.add_subgraph('clusterG') ## e2 = gs.add_edge('a','b') ## self.assertEqual(e2.parent.name,gs.name) ## self.assertEqual(e1.parent.name,gs.name) ## gs2 = g.add_subgraph('clusterGG') ## e3 = gs2.add_edge('a','b') ## self.assertEqual(e2.parent.name,gs.name) ## self.assertEqual(e3.parent.name,gs.name) ## self.assertEqual(len(gs2.edges),3) ## ## def test_add_single_edge_to_subgraph(self): ## """Edge should belong to subgraph""" ## g = dotp.DotGraph() ## gs = g.add_subgraph('clusterG') ## na = gs.add_node('a') ## nb = gs.add_node('b') ## edge = g.add_edge('a','b') ## self.assertEqual(na.parent,gs) ## self.assertEqual(nb.parent,gs) ## self.assertEqual(edge.parent.name,gs.name) ## ## def test_add_multiple_edges_to_subgraph(self): ## """Edges should belong to subgraph""" ## g = dotp.DotGraph() ## gs = g.add_subgraph('clusterG') ## na = gs.add_node('a') ## nb = gs.add_node('b') ## edge = g.add_edge('a','b') ## self.assertEqual(edge.parent.name,gs.name) ## edge2 = g.add_edge('a','b') ## self.assertEqual(edge2.parent.name,gs.name) ## ## def test_change_edge_parent(self): ## """If edge nodes change parents, so should the edge""" ## g = dotp.DotGraph() ## edge = g.add_edge('a','b') ## gs = g.add_subgraph('clusterG') ## na = gs.add_node('a') ## nb = gs.add_node('b') ## self.assertEqual(edge.parent.name,gs.name) ## ## ## ## ## ## ## ## ## ## ## if __name__ == '__main__': unittest.main()