/networkx/classes/tests/test_multigraph.py

https://github.com/eidus/polarbear
Python | 230 lines | 179 code | 35 blank | 16 comment | 0 complexity | 9a66571848a2058f148b21fe7ea9f2c5 MD5 | raw file
  1. #!/usr/bin/env python
  2. from nose.tools import *
  3. import networkx
  4. from test_graph import TestGraph
  5. class TestMultiGraph(TestGraph):
  6. def setUp(self):
  7. self.Graph=networkx.MultiGraph
  8. # build K3
  9. ed1,ed2,ed3 = ({0:{}},{0:{}},{0:{}})
  10. self.k3adj={0: {1: ed1, 2: ed2},
  11. 1: {0: ed1, 2: ed3},
  12. 2: {0: ed2, 1: ed3}}
  13. self.k3edges=[(0, 1), (0, 2), (1, 2)]
  14. self.k3nodes=[0, 1, 2]
  15. self.K3=self.Graph()
  16. self.K3.adj = self.K3.edge = self.k3adj
  17. self.K3.node={}
  18. self.K3.node[0]={}
  19. self.K3.node[1]={}
  20. self.K3.node[2]={}
  21. def test_data_input(self):
  22. pass
  23. # G=self.Graph(data={1:[2],2:[1]}, name="test")
  24. # assert_equal(G.name,"test")
  25. # assert_equal(sorted(G.adj.items()),[(1, {2: [1]}), (2, {1: [1]})])
  26. def test_contains(self):
  27. G=self.K3
  28. assert(1 in G )
  29. assert(4 not in G )
  30. assert('b' not in G )
  31. assert([] not in G ) # no exception for nonhashable
  32. assert({1:1} not in G) # no exception for nonhashable
  33. def test_order(self):
  34. G=self.K3
  35. assert_equal(len(G),3)
  36. assert_equal(G.order(),3)
  37. assert_equal(G.number_of_nodes(),3)
  38. def test_getitem(self):
  39. G=self.K3
  40. assert_equal(G[0],{1: {0:{}}, 2: {0:{}}})
  41. assert_raises(KeyError, G.__getitem__, 'j')
  42. assert_raises((TypeError,networkx.NetworkXError), G.__getitem__, ['A'])
  43. def test_remove_node(self):
  44. G=self.K3
  45. G.remove_node(0)
  46. assert_equal(G.adj,{1:{2:{0:{}}},2:{1:{0:{}}}})
  47. assert_raises((KeyError,networkx.NetworkXError), G.remove_node,-1)
  48. def test_add_edge(self):
  49. G=self.Graph()
  50. G.add_edge(0,1)
  51. assert_equal(G.adj,{0: {1: {0:{}}}, 1: {0: {0:{}}}})
  52. G=self.Graph()
  53. G.add_edge(*(0,1))
  54. assert_equal(G.adj,{0: {1: {0:{}}}, 1: {0: {0:{}}}})
  55. def test_add_edges_from(self):
  56. G=self.Graph()
  57. G.add_edges_from([(0,1),(0,1,{'weight':3})])
  58. assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}}},
  59. 1: {0: {0:{},1:{'weight':3}}}})
  60. G.add_edges_from([(0,1),(0,1,{'weight':3})],weight=2)
  61. assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3},
  62. 2:{'weight':2},3:{'weight':3}}},
  63. 1: {0: {0:{},1:{'weight':3},
  64. 2:{'weight':2},3:{'weight':3}}}})
  65. # too few in tuple
  66. assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)])
  67. # too many in tuple
  68. assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3,4)])
  69. assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple
  70. def test_remove_edge(self):
  71. G=self.K3
  72. G.remove_edge(0,1)
  73. assert_equal(G.adj,{0: {2: {0: {}}},
  74. 1: {2: {0: {}}},
  75. 2: {0: {0: {}},
  76. 1: {0: {}}}})
  77. assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0)
  78. def test_remove_edges_from(self):
  79. G=self.K3
  80. G.remove_edges_from([(0,1)])
  81. assert_equal(G.adj,{0:{2:{0:{}}},1:{2:{0:{}}},2:{0:{0:{}},1:{0:{}}}})
  82. G.remove_edges_from([(0,0)]) # silent fail
  83. def test_remove_multiedge(self):
  84. G=self.K3
  85. G.add_edge(0,1,key='parallel edge')
  86. G.remove_edge(0,1,key='parallel edge')
  87. assert_equal(G.adj,{0: {1: {0:{}}, 2: {0:{}}},
  88. 1: {0: {0:{}}, 2: {0:{}}},
  89. 2: {0: {0:{}}, 1: {0:{}}}})
  90. G.remove_edge(0,1)
  91. assert_equal(G.adj,{0:{2:{0:{}}},1:{2:{0:{}}},2:{0:{0:{}},1:{0:{}}}})
  92. assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0)
  93. def test_get_edge_data(self):
  94. G=self.K3
  95. assert_equal(G.get_edge_data(0,1),{0:{}})
  96. assert_equal(G[0][1],{0:{}})
  97. assert_equal(G[0][1][0],{})
  98. assert_equal(G.get_edge_data(10,20),None)
  99. # assert_raises((KeyError,networkx.NetworkXError), G.get_edge,-1,0)
  100. def test_adjacency_iter(self):
  101. G=self.K3
  102. assert_equal(dict(G.adjacency_iter()),
  103. {0: {1: {0:{}}, 2: {0:{}}},
  104. 1: {0: {0:{}}, 2: {0:{}}},
  105. 2: {0: {0:{}}, 1: {0:{}}}})
  106. def deepcopy_edge_attr(self,H,G):
  107. assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
  108. G[1][2][0]['foo'].append(1)
  109. assert_not_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
  110. def shallow_copy_edge_attr(self,H,G):
  111. assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
  112. G[1][2][0]['foo'].append(1)
  113. assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
  114. def same_attrdict(self, H, G):
  115. # same attrdict in the edgedata
  116. old_foo=H[1][2][0]['foo']
  117. H.add_edge(1,2,0,foo='baz')
  118. assert_equal(G.edge,H.edge)
  119. H.add_edge(1,2,0,foo=old_foo)
  120. assert_equal(G.edge,H.edge)
  121. # but not same edgedata dict
  122. H.add_edge(1,2,foo='baz')
  123. assert_not_equal(G.edge,H.edge)
  124. old_foo=H.node[0]['foo']
  125. H.node[0]['foo']='baz'
  126. assert_equal(G.node,H.node)
  127. H.node[0]['foo']=old_foo
  128. assert_equal(G.node,H.node)
  129. def different_attrdict(self, H, G):
  130. # used by graph_equal_but_different
  131. old_foo=H[1][2][0]['foo']
  132. H.add_edge(1,2,0,foo='baz')
  133. assert_not_equal(G.edge,H.edge)
  134. H.add_edge(1,2,0,foo=old_foo)
  135. assert_equal(G.edge,H.edge)
  136. HH=H.copy()
  137. H.add_edge(1,2,foo='baz')
  138. assert_not_equal(G.edge,H.edge)
  139. H=HH
  140. old_foo=H.node[0]['foo']
  141. H.node[0]['foo']='baz'
  142. assert_not_equal(G.node,H.node)
  143. H.node[0]['foo']=old_foo
  144. assert_equal(G.node,H.node)
  145. def test_to_undirected(self):
  146. G=self.K3
  147. self.add_attributes(G)
  148. H=networkx.MultiGraph(G)
  149. self.is_shallow_copy(H,G)
  150. H=G.to_undirected()
  151. self.is_deepcopy(H,G)
  152. def test_to_directed(self):
  153. G=self.K3
  154. self.add_attributes(G)
  155. H=networkx.MultiDiGraph(G)
  156. self.is_shallow_copy(H,G)
  157. H=G.to_directed()
  158. self.is_deepcopy(H,G)
  159. def test_selfloops(self):
  160. G=self.K3
  161. G.add_edge(0,0)
  162. assert_equal(G.nodes_with_selfloops(),[0])
  163. assert_equal(G.selfloop_edges(),[(0,0)])
  164. assert_equal(G.selfloop_edges(data=True),[(0,0,{})])
  165. assert_equal(G.number_of_selfloops(),1)
  166. def test_selfloops2(self):
  167. G=self.K3
  168. G.add_edge(0,0)
  169. G.add_edge(0,0)
  170. G.add_edge(0,0,key='parallel edge')
  171. G.remove_edge(0,0,key='parallel edge')
  172. assert_equal(G.number_of_edges(0,0),2)
  173. G.remove_edge(0,0)
  174. assert_equal(G.number_of_edges(0,0),1)
  175. # G.add_edge(1,1)
  176. # G.remove_node(1)
  177. # G.add_edge(0,0)
  178. # G.add_edge(1,1)
  179. # G.remove_nodes_from([0,1])
  180. def test_edge_attr4(self):
  181. G=self.Graph()
  182. G.add_edge(1,2,key=0,data=7,spam='bar',bar='foo')
  183. assert_equal(G.edges(data=True),
  184. [(1,2,{'data':7,'spam':'bar','bar':'foo'})])
  185. G[1][2][0]['data']=10 # OK to set data like this
  186. assert_equal(G.edges(data=True),
  187. [(1,2,{'data':10,'spam':'bar','bar':'foo'})])
  188. G.edge[1][2][0]['data']=20 # another spelling, "edge"
  189. assert_equal(G.edges(data=True),
  190. [(1,2,{'data':20,'spam':'bar','bar':'foo'})])
  191. G.edge[1][2][0]['listdata']=[20,200]
  192. G.edge[1][2][0]['weight']=20
  193. assert_equal(G.edges(data=True),
  194. [(1,2,{'data':20,'spam':'bar',
  195. 'bar':'foo','listdata':[20,200],'weight':20})])