Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/env python
      2 from nose.tools import *
      3 import networkx
      4 from test_multigraph import BaseMultiGraphTester, TestMultiGraph
      5 
      6 class BaseMultiDiGraphTester(BaseMultiGraphTester):
      7     def test_edges(self):
      8         G=self.K3
      9         assert_equal(sorted(G.edges()),[(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     10         assert_equal(sorted(G.edges(0)),[(0,1),(0,2)])
     11         assert_raises((KeyError,networkx.NetworkXError), G.edges,-1)
     12 
     13     def test_edges_data(self):
     14         G=self.K3
     15         assert_equal(sorted(G.edges(data=True)),
     16                      [(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}),(2,0,{}),(2,1,{})])
     17         assert_equal(sorted(G.edges(0,data=True)),[(0,1,{}),(0,2,{})])
     18         assert_raises((KeyError,networkx.NetworkXError), G.neighbors,-1)
     19 
     20 
     21     def test_edges_iter(self):
     22         G=self.K3
     23         assert_equal(sorted(G.edges_iter()),
     24                      [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     25         assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)])
     26         G.add_edge(0,1)
     27         assert_equal(sorted(G.edges_iter()),
     28                      [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     29 
     30     def test_out_edges(self):
     31         G=self.K3
     32         assert_equal(sorted(G.out_edges()),
     33                      [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     34         assert_equal(sorted(G.out_edges(0)),[(0,1),(0,2)])
     35         assert_raises((KeyError,networkx.NetworkXError), G.out_edges,-1)
     36         assert_equal(sorted(G.out_edges(0,keys=True)),[(0,1,0),(0,2,0)])
     37 
     38     def test_out_edges_iter(self):
     39         G=self.K3
     40         assert_equal(sorted(G.out_edges_iter()),
     41                      [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     42         assert_equal(sorted(G.out_edges_iter(0)),[(0,1),(0,2)])
     43         G.add_edge(0,1,2)
     44         assert_equal(sorted(G.out_edges_iter()),
     45                      [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     46 
     47     def test_in_edges(self):
     48         G=self.K3
     49         assert_equal(sorted(G.in_edges()),
     50                      [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     51         assert_equal(sorted(G.in_edges(0)),[(1,0),(2,0)])
     52         assert_raises((KeyError,networkx.NetworkXError), G.in_edges,-1)
     53         G.add_edge(0,1,2)
     54         assert_equal(sorted(G.in_edges()),
     55                      [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     56         assert_equal(sorted(G.in_edges(0,keys=True)),[(1,0,0),(2,0,0)])
     57 
     58     def test_in_edges_iter(self):
     59         G=self.K3
     60         assert_equal(sorted(G.in_edges_iter()),
     61                      [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     62         assert_equal(sorted(G.in_edges_iter(0)),[(1,0),(2,0)])
     63         G.add_edge(0,1,2)
     64         assert_equal(sorted(G.in_edges_iter()),
     65                      [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)])
     66 
     67         assert_equal(sorted(G.in_edges_iter(data=True,keys=False)),
     68                      [(0,1,{}),(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}),
     69                       (2,0,{}),(2,1,{})])
     70 
     71 
     72     def is_shallow(self,H,G):
     73         # graph
     74         assert_equal(G.graph['foo'],H.graph['foo'])
     75         G.graph['foo'].append(1)
     76         assert_equal(G.graph['foo'],H.graph['foo'])
     77         # node
     78         assert_equal(G.node[0]['foo'],H.node[0]['foo'])
     79         G.node[0]['foo'].append(1)
     80         assert_equal(G.node[0]['foo'],H.node[0]['foo'])
     81         # edge
     82         assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
     83         G[1][2][0]['foo'].append(1)
     84         assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
     85 
     86     def is_deep(self,H,G):
     87         # graph
     88         assert_equal(G.graph['foo'],H.graph['foo'])
     89         G.graph['foo'].append(1)
     90         assert_not_equal(G.graph['foo'],H.graph['foo'])
     91         # node
     92         assert_equal(G.node[0]['foo'],H.node[0]['foo'])
     93         G.node[0]['foo'].append(1)
     94         assert_not_equal(G.node[0]['foo'],H.node[0]['foo'])
     95         # edge
     96         assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
     97         G[1][2][0]['foo'].append(1)
     98         assert_not_equal(G[1][2][0]['foo'],H[1][2][0]['foo'])
     99 
    100     def test_to_undirected(self):
    101         # MultiDiGraph -> MultiGraph changes number of edges so it is
    102         # not a copy operation... use is_shallow, not is_shallow_copy
    103         G=self.K3
    104         self.add_attributes(G)
    105         H=networkx.MultiGraph(G)
    106         self.is_shallow(H,G)
    107         H=G.to_undirected()
    108         self.is_deep(H,G)
    109 
    110     def test_has_successor(self):
    111         G=self.K3
    112         assert_equal(G.has_successor(0,1),True)
    113         assert_equal(G.has_successor(0,-1),False)
    114 
    115     def test_successors(self):
    116         G=self.K3
    117         assert_equal(sorted(G.successors(0)),[1,2])
    118         assert_raises((KeyError,networkx.NetworkXError), G.successors,-1)
    119 
    120     def test_successors_iter(self):
    121         G=self.K3
    122         assert_equal(sorted(G.successors_iter(0)),[1,2])
    123         assert_raises((KeyError,networkx.NetworkXError), G.successors_iter,-1)
    124 
    125     def test_has_predecessor(self):
    126         G=self.K3
    127         assert_equal(G.has_predecessor(0,1),True)
    128         assert_equal(G.has_predecessor(0,-1),False)
    129 
    130     def test_predecessors(self):
    131         G=self.K3
    132         assert_equal(sorted(G.predecessors(0)),[1,2])
    133         assert_raises((KeyError,networkx.NetworkXError), G.predecessors,-1)
    134 
    135     def test_predecessors_iter(self):
    136         G=self.K3
    137         assert_equal(sorted(G.predecessors_iter(0)),[1,2])
    138         assert_raises((KeyError,networkx.NetworkXError), G.predecessors_iter,-1)
    139 
    140 
    141     def test_degree(self):
    142         G=self.K3
    143         assert_equal(list(G.degree().values()),[4,4,4])
    144         assert_equal(G.degree(),{0:4,1:4,2:4})
    145         assert_equal(G.degree(0),4)
    146         assert_equal(G.degree([0]),{0:4})
    147         assert_raises((KeyError,networkx.NetworkXError), G.degree,-1)
    148 
    149     def test_degree_iter(self):
    150         G=self.K3
    151         assert_equal(list(G.degree_iter()),[(0,4),(1,4),(2,4)])
    152         assert_equal(dict(G.degree_iter()),{0:4,1:4,2:4})
    153         assert_equal(list(G.degree_iter(0)),[(0,4)])
    154         G.add_edge(0,1,weight=0.3,other=1.2)
    155         assert_equal(list(G.degree_iter(weight='weight')),[(0,4.3),(1,4.3),(2,4)])
    156         assert_equal(list(G.degree_iter(weight='other')),[(0,5.2),(1,5.2),(2,4)])
    157 
    158 
    159     def test_in_degree(self):
    160         G=self.K3
    161         assert_equal(list(G.in_degree().values()),[2,2,2])
    162         assert_equal(G.in_degree(),{0:2,1:2,2:2})
    163         assert_equal(G.in_degree(0),2)
    164         assert_equal(G.in_degree([0]),{0:2})
    165         assert_raises((KeyError,networkx.NetworkXError), G.in_degree,-1)
    166 
    167     def test_in_degree_iter(self):
    168         G=self.K3
    169         assert_equal(list(G.in_degree_iter()),[(0,2),(1,2),(2,2)])
    170         assert_equal(dict(G.in_degree_iter()),{0:2,1:2,2:2})
    171         assert_equal(list(G.in_degree_iter(0)),[(0,2)])
    172         assert_equal(list(G.in_degree_iter(0,weight='weight')),[(0,2)])
    173 
    174     def test_out_degree(self):
    175         G=self.K3
    176         assert_equal(list(G.out_degree().values()),[2,2,2])
    177         assert_equal(G.out_degree(),{0:2,1:2,2:2})
    178         assert_equal(G.out_degree(0),2)
    179         assert_equal(G.out_degree([0]),{0:2})
    180         assert_raises((KeyError,networkx.NetworkXError), G.out_degree,-1)
    181 
    182     def test_out_degree_iter(self):
    183         G=self.K3
    184         assert_equal(list(G.out_degree_iter()),[(0,2),(1,2),(2,2)])
    185         assert_equal(dict(G.out_degree_iter()),{0:2,1:2,2:2})
    186         assert_equal(list(G.out_degree_iter(0)),[(0,2)])
    187         assert_equal(list(G.out_degree_iter(0,weight='weight')),[(0,2)])
    188 
    189 
    190     def test_size(self):
    191         G=self.K3
    192         assert_equal(G.size(),6)
    193         assert_equal(G.number_of_edges(),6)
    194         G.add_edge(0,1,weight=0.3,other=1.2)
    195         assert_equal(G.size(weight='weight'),6.3)
    196         assert_equal(G.size(weight='other'),7.2)
    197 
    198     def test_to_undirected_reciprocal(self):
    199         G=self.Graph()
    200         G.add_edge(1,2)
    201         assert_true(G.to_undirected().has_edge(1,2))
    202         assert_false(G.to_undirected(reciprocal=True).has_edge(1,2))
    203         G.add_edge(2,1)
    204         assert_true(G.to_undirected(reciprocal=True).has_edge(1,2))
    205 
    206     def test_reverse_copy(self):
    207         G=networkx.MultiDiGraph([(0,1),(0,1)])
    208         R=G.reverse()
    209         assert_equal(sorted(R.edges()),[(1,0),(1,0)])
    210         R.remove_edge(1,0)
    211         assert_equal(sorted(R.edges()),[(1,0)])
    212         assert_equal(sorted(G.edges()),[(0,1),(0,1)])
    213 
    214     def test_reverse_nocopy(self):
    215         G=networkx.MultiDiGraph([(0,1),(0,1)])
    216         R=G.reverse(copy=False)
    217         assert_equal(sorted(R.edges()),[(1,0),(1,0)])
    218         R.remove_edge(1,0)
    219         assert_equal(sorted(R.edges()),[(1,0)])
    220         assert_equal(sorted(G.edges()),[(1,0)])
    221 
    222 
    223 class TestMultiDiGraph(BaseMultiDiGraphTester,TestMultiGraph):
    224     def setUp(self):
    225         self.Graph=networkx.MultiDiGraph
    226         # build K3
    227         self.k3edges=[(0, 1), (0, 2), (1, 2)]
    228         self.k3nodes=[0, 1, 2]
    229         self.K3=self.Graph()
    230         self.K3.adj={0:{},1:{},2:{}}
    231         self.K3.succ=self.K3.adj
    232         self.K3.pred={0:{},1:{},2:{}}
    233         for u in self.k3nodes:
    234             for v in self.k3nodes:
    235                 if u==v: continue
    236                 d={0:{}}
    237                 self.K3.succ[u][v]=d
    238                 self.K3.pred[v][u]=d
    239         self.K3.adj=self.K3.succ
    240         self.K3.edge=self.K3.adj
    241         self.K3.node={}
    242         self.K3.node[0]={}
    243         self.K3.node[1]={}
    244         self.K3.node[2]={}
    245 
    246 
    247     def test_add_edge(self):
    248         G=self.Graph()
    249         G.add_edge(0,1)
    250         assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}})
    251         assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}})
    252         assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}})
    253         G=self.Graph()
    254         G.add_edge(*(0,1))
    255         assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}})
    256         assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}})
    257         assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}})
    258 
    259     def test_add_edges_from(self):
    260         G=self.Graph()
    261         G.add_edges_from([(0,1),(0,1,{'weight':3})])
    262         assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}}}, 1: {}})
    263         assert_equal(G.succ,{0: {1: {0:{},1:{'weight':3}}}, 1: {}})
    264         assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3}}}})
    265 
    266         G.add_edges_from([(0,1),(0,1,{'weight':3})],weight=2)
    267         assert_equal(G.succ,{0: {1: {0:{},
    268                                      1:{'weight':3},
    269                                      2:{'weight':2},
    270                                      3:{'weight':3}}},
    271                              1: {}})
    272         assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3},
    273                                            2:{'weight':2},
    274                                            3:{'weight':3}}}})
    275 
    276         assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)])  # too few in tuple
    277         assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3,4)])  # too many in tuple
    278         assert_raises(TypeError, G.add_edges_from,[0])  # not a tuple
    279 
    280     def test_remove_edge(self):
    281         G=self.K3
    282         G.remove_edge(0,1)
    283         assert_equal(G.succ,{0:{2:{0:{}}},
    284                              1:{0:{0:{}},2:{0:{}}},
    285                              2:{0:{0:{}},1:{0:{}}}})
    286         assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}},
    287                              1:{2:{0:{}}},
    288                              2:{0:{0:{}},1:{0:{}}}})
    289         assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0)
    290         assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,0,2,
    291                       key=1)
    292 
    293 
    294     def test_remove_multiedge(self):
    295         G=self.K3
    296         G.add_edge(0,1,key='parallel edge')
    297         G.remove_edge(0,1,key='parallel edge')
    298         assert_equal(G.adj,{0: {1: {0:{}}, 2: {0:{}}},
    299                            1: {0: {0:{}}, 2: {0:{}}},
    300                            2: {0: {0:{}}, 1: {0:{}}}})
    301 
    302         assert_equal(G.succ,{0: {1: {0:{}}, 2: {0:{}}},
    303                            1: {0: {0:{}}, 2: {0:{}}},
    304                            2: {0: {0:{}}, 1: {0:{}}}})
    305 
    306         assert_equal(G.pred,{0:{1: {0:{}},2:{0:{}}},
    307                              1:{0:{0:{}},2:{0:{}}},
    308                              2:{0:{0:{}},1:{0:{}}}})
    309         G.remove_edge(0,1)
    310         assert_equal(G.succ,{0:{2:{0:{}}},
    311                              1:{0:{0:{}},2:{0:{}}},
    312                              2:{0:{0:{}},1:{0:{}}}})
    313         assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}},
    314                              1:{2:{0:{}}},
    315                              2:{0:{0:{}},1:{0:{}}}})
    316         assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0)
    317 
    318     def test_remove_edges_from(self):
    319         G=self.K3
    320         G.remove_edges_from([(0,1)])
    321         assert_equal(G.succ,{0:{2:{0:{}}},
    322                              1:{0:{0:{}},2:{0:{}}},
    323                              2:{0:{0:{}},1:{0:{}}}})
    324         assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}},
    325                              1:{2:{0:{}}},
    326                              2:{0:{0:{}},1:{0:{}}}})
    327         G.remove_edges_from([(0,0)]) # silent fail
    328