test_reportviews.py 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419
  1. import pickle
  2. from copy import deepcopy
  3. import pytest
  4. import networkx as nx
  5. from networkx.classes import reportviews as rv
  6. from networkx.classes.reportviews import NodeDataView
  7. # Nodes
  8. class TestNodeView:
  9. @classmethod
  10. def setup_class(cls):
  11. cls.G = nx.path_graph(9)
  12. cls.nv = cls.G.nodes # NodeView(G)
  13. def test_pickle(self):
  14. import pickle
  15. nv = self.nv
  16. pnv = pickle.loads(pickle.dumps(nv, -1))
  17. assert nv == pnv
  18. assert nv.__slots__ == pnv.__slots__
  19. def test_str(self):
  20. assert str(self.nv) == "[0, 1, 2, 3, 4, 5, 6, 7, 8]"
  21. def test_repr(self):
  22. assert repr(self.nv) == "NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
  23. def test_contains(self):
  24. G = self.G.copy()
  25. nv = G.nodes
  26. assert 7 in nv
  27. assert 9 not in nv
  28. G.remove_node(7)
  29. G.add_node(9)
  30. assert 7 not in nv
  31. assert 9 in nv
  32. def test_getitem(self):
  33. G = self.G.copy()
  34. nv = G.nodes
  35. G.nodes[3]["foo"] = "bar"
  36. assert nv[7] == {}
  37. assert nv[3] == {"foo": "bar"}
  38. # slicing
  39. with pytest.raises(nx.NetworkXError):
  40. G.nodes[0:5]
  41. def test_iter(self):
  42. nv = self.nv
  43. for i, n in enumerate(nv):
  44. assert i == n
  45. inv = iter(nv)
  46. assert next(inv) == 0
  47. assert iter(nv) != nv
  48. assert iter(inv) == inv
  49. inv2 = iter(nv)
  50. next(inv2)
  51. assert list(inv) == list(inv2)
  52. # odd case where NodeView calls NodeDataView with data=False
  53. nnv = nv(data=False)
  54. for i, n in enumerate(nnv):
  55. assert i == n
  56. def test_call(self):
  57. nodes = self.nv
  58. assert nodes is nodes()
  59. assert nodes is not nodes(data=True)
  60. assert nodes is not nodes(data="weight")
  61. class TestNodeDataView:
  62. @classmethod
  63. def setup_class(cls):
  64. cls.G = nx.path_graph(9)
  65. cls.nv = NodeDataView(cls.G)
  66. cls.ndv = cls.G.nodes.data(True)
  67. cls.nwv = cls.G.nodes.data("foo")
  68. def test_viewtype(self):
  69. nv = self.G.nodes
  70. ndvfalse = nv.data(False)
  71. assert nv is ndvfalse
  72. assert nv is not self.ndv
  73. def test_pickle(self):
  74. import pickle
  75. nv = self.nv
  76. pnv = pickle.loads(pickle.dumps(nv, -1))
  77. assert nv == pnv
  78. assert nv.__slots__ == pnv.__slots__
  79. def test_str(self):
  80. msg = str([(n, {}) for n in range(9)])
  81. assert str(self.ndv) == msg
  82. def test_repr(self):
  83. expected = "NodeDataView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
  84. assert repr(self.nv) == expected
  85. expected = (
  86. "NodeDataView({0: {}, 1: {}, 2: {}, 3: {}, "
  87. + "4: {}, 5: {}, 6: {}, 7: {}, 8: {}})"
  88. )
  89. assert repr(self.ndv) == expected
  90. expected = (
  91. "NodeDataView({0: None, 1: None, 2: None, 3: None, 4: None, "
  92. + "5: None, 6: None, 7: None, 8: None}, data='foo')"
  93. )
  94. assert repr(self.nwv) == expected
  95. def test_contains(self):
  96. G = self.G.copy()
  97. nv = G.nodes.data()
  98. nwv = G.nodes.data("foo")
  99. G.nodes[3]["foo"] = "bar"
  100. assert (7, {}) in nv
  101. assert (3, {"foo": "bar"}) in nv
  102. assert (3, "bar") in nwv
  103. assert (7, None) in nwv
  104. # default
  105. nwv_def = G.nodes(data="foo", default="biz")
  106. assert (7, "biz") in nwv_def
  107. assert (3, "bar") in nwv_def
  108. def test_getitem(self):
  109. G = self.G.copy()
  110. nv = G.nodes
  111. G.nodes[3]["foo"] = "bar"
  112. assert nv[3] == {"foo": "bar"}
  113. # default
  114. nwv_def = G.nodes(data="foo", default="biz")
  115. assert nwv_def[7], "biz"
  116. assert nwv_def[3] == "bar"
  117. # slicing
  118. with pytest.raises(nx.NetworkXError):
  119. G.nodes.data()[0:5]
  120. def test_iter(self):
  121. G = self.G.copy()
  122. nv = G.nodes.data()
  123. ndv = G.nodes.data(True)
  124. nwv = G.nodes.data("foo")
  125. for i, (n, d) in enumerate(nv):
  126. assert i == n
  127. assert d == {}
  128. inv = iter(nv)
  129. assert next(inv) == (0, {})
  130. G.nodes[3]["foo"] = "bar"
  131. # default
  132. for n, d in nv:
  133. if n == 3:
  134. assert d == {"foo": "bar"}
  135. else:
  136. assert d == {}
  137. # data=True
  138. for n, d in ndv:
  139. if n == 3:
  140. assert d == {"foo": "bar"}
  141. else:
  142. assert d == {}
  143. # data='foo'
  144. for n, d in nwv:
  145. if n == 3:
  146. assert d == "bar"
  147. else:
  148. assert d is None
  149. # data='foo', default=1
  150. for n, d in G.nodes.data("foo", default=1):
  151. if n == 3:
  152. assert d == "bar"
  153. else:
  154. assert d == 1
  155. def test_nodedataview_unhashable():
  156. G = nx.path_graph(9)
  157. G.nodes[3]["foo"] = "bar"
  158. nvs = [G.nodes.data()]
  159. nvs.append(G.nodes.data(True))
  160. H = G.copy()
  161. H.nodes[4]["foo"] = {1, 2, 3}
  162. nvs.append(H.nodes.data(True))
  163. # raise unhashable
  164. for nv in nvs:
  165. pytest.raises(TypeError, set, nv)
  166. pytest.raises(TypeError, eval, "nv | nv", locals())
  167. # no raise... hashable
  168. Gn = G.nodes.data(False)
  169. set(Gn)
  170. Gn | Gn
  171. Gn = G.nodes.data("foo")
  172. set(Gn)
  173. Gn | Gn
  174. class TestNodeViewSetOps:
  175. @classmethod
  176. def setup_class(cls):
  177. cls.G = nx.path_graph(9)
  178. cls.G.nodes[3]["foo"] = "bar"
  179. cls.nv = cls.G.nodes
  180. def n_its(self, nodes):
  181. return set(nodes)
  182. def test_len(self):
  183. G = self.G.copy()
  184. nv = G.nodes
  185. assert len(nv) == 9
  186. G.remove_node(7)
  187. assert len(nv) == 8
  188. G.add_node(9)
  189. assert len(nv) == 9
  190. def test_and(self):
  191. # print("G & H nodes:", gnv & hnv)
  192. nv = self.nv
  193. some_nodes = self.n_its(range(5, 12))
  194. assert nv & some_nodes == self.n_its(range(5, 9))
  195. assert some_nodes & nv == self.n_its(range(5, 9))
  196. def test_or(self):
  197. # print("G | H nodes:", gnv | hnv)
  198. nv = self.nv
  199. some_nodes = self.n_its(range(5, 12))
  200. assert nv | some_nodes == self.n_its(range(12))
  201. assert some_nodes | nv == self.n_its(range(12))
  202. def test_xor(self):
  203. # print("G ^ H nodes:", gnv ^ hnv)
  204. nv = self.nv
  205. some_nodes = self.n_its(range(5, 12))
  206. nodes = {0, 1, 2, 3, 4, 9, 10, 11}
  207. assert nv ^ some_nodes == self.n_its(nodes)
  208. assert some_nodes ^ nv == self.n_its(nodes)
  209. def test_sub(self):
  210. # print("G - H nodes:", gnv - hnv)
  211. nv = self.nv
  212. some_nodes = self.n_its(range(5, 12))
  213. assert nv - some_nodes == self.n_its(range(5))
  214. assert some_nodes - nv == self.n_its(range(9, 12))
  215. class TestNodeDataViewSetOps(TestNodeViewSetOps):
  216. @classmethod
  217. def setup_class(cls):
  218. cls.G = nx.path_graph(9)
  219. cls.G.nodes[3]["foo"] = "bar"
  220. cls.nv = cls.G.nodes.data("foo")
  221. def n_its(self, nodes):
  222. return {(node, "bar" if node == 3 else None) for node in nodes}
  223. class TestNodeDataViewDefaultSetOps(TestNodeDataViewSetOps):
  224. @classmethod
  225. def setup_class(cls):
  226. cls.G = nx.path_graph(9)
  227. cls.G.nodes[3]["foo"] = "bar"
  228. cls.nv = cls.G.nodes.data("foo", default=1)
  229. def n_its(self, nodes):
  230. return {(node, "bar" if node == 3 else 1) for node in nodes}
  231. # Edges Data View
  232. class TestEdgeDataView:
  233. @classmethod
  234. def setup_class(cls):
  235. cls.G = nx.path_graph(9)
  236. cls.eview = nx.reportviews.EdgeView
  237. def test_pickle(self):
  238. import pickle
  239. ev = self.eview(self.G)(data=True)
  240. pev = pickle.loads(pickle.dumps(ev, -1))
  241. assert list(ev) == list(pev)
  242. assert ev.__slots__ == pev.__slots__
  243. def modify_edge(self, G, e, **kwds):
  244. G._adj[e[0]][e[1]].update(kwds)
  245. def test_str(self):
  246. ev = self.eview(self.G)(data=True)
  247. rep = str([(n, n + 1, {}) for n in range(8)])
  248. assert str(ev) == rep
  249. def test_repr(self):
  250. ev = self.eview(self.G)(data=True)
  251. rep = (
  252. "EdgeDataView([(0, 1, {}), (1, 2, {}), "
  253. + "(2, 3, {}), (3, 4, {}), "
  254. + "(4, 5, {}), (5, 6, {}), "
  255. + "(6, 7, {}), (7, 8, {})])"
  256. )
  257. assert repr(ev) == rep
  258. def test_iterdata(self):
  259. G = self.G.copy()
  260. evr = self.eview(G)
  261. ev = evr(data=True)
  262. ev_def = evr(data="foo", default=1)
  263. for u, v, d in ev:
  264. pass
  265. assert d == {}
  266. for u, v, wt in ev_def:
  267. pass
  268. assert wt == 1
  269. self.modify_edge(G, (2, 3), foo="bar")
  270. for e in ev:
  271. assert len(e) == 3
  272. if set(e[:2]) == {2, 3}:
  273. assert e[2] == {"foo": "bar"}
  274. checked = True
  275. else:
  276. assert e[2] == {}
  277. assert checked
  278. for e in ev_def:
  279. assert len(e) == 3
  280. if set(e[:2]) == {2, 3}:
  281. assert e[2] == "bar"
  282. checked_wt = True
  283. else:
  284. assert e[2] == 1
  285. assert checked_wt
  286. def test_iter(self):
  287. evr = self.eview(self.G)
  288. ev = evr()
  289. for u, v in ev:
  290. pass
  291. iev = iter(ev)
  292. assert next(iev) == (0, 1)
  293. assert iter(ev) != ev
  294. assert iter(iev) == iev
  295. def test_contains(self):
  296. evr = self.eview(self.G)
  297. ev = evr()
  298. if self.G.is_directed():
  299. assert (1, 2) in ev and (2, 1) not in ev
  300. else:
  301. assert (1, 2) in ev and (2, 1) in ev
  302. assert (1, 4) not in ev
  303. assert (1, 90) not in ev
  304. assert (90, 1) not in ev
  305. def test_contains_with_nbunch(self):
  306. evr = self.eview(self.G)
  307. ev = evr(nbunch=[0, 2])
  308. if self.G.is_directed():
  309. assert (0, 1) in ev
  310. assert (1, 2) not in ev
  311. assert (2, 3) in ev
  312. else:
  313. assert (0, 1) in ev
  314. assert (1, 2) in ev
  315. assert (2, 3) in ev
  316. assert (3, 4) not in ev
  317. assert (4, 5) not in ev
  318. assert (5, 6) not in ev
  319. assert (7, 8) not in ev
  320. assert (8, 9) not in ev
  321. def test_len(self):
  322. evr = self.eview(self.G)
  323. ev = evr(data="foo")
  324. assert len(ev) == 8
  325. assert len(evr(1)) == 2
  326. assert len(evr([1, 2, 3])) == 4
  327. assert len(self.G.edges(1)) == 2
  328. assert len(self.G.edges()) == 8
  329. assert len(self.G.edges) == 8
  330. H = self.G.copy()
  331. H.add_edge(1, 1)
  332. assert len(H.edges(1)) == 3
  333. assert len(H.edges()) == 9
  334. assert len(H.edges) == 9
  335. class TestOutEdgeDataView(TestEdgeDataView):
  336. @classmethod
  337. def setup_class(cls):
  338. cls.G = nx.path_graph(9, create_using=nx.DiGraph())
  339. cls.eview = nx.reportviews.OutEdgeView
  340. def test_repr(self):
  341. ev = self.eview(self.G)(data=True)
  342. rep = (
  343. "OutEdgeDataView([(0, 1, {}), (1, 2, {}), "
  344. + "(2, 3, {}), (3, 4, {}), "
  345. + "(4, 5, {}), (5, 6, {}), "
  346. + "(6, 7, {}), (7, 8, {})])"
  347. )
  348. assert repr(ev) == rep
  349. def test_len(self):
  350. evr = self.eview(self.G)
  351. ev = evr(data="foo")
  352. assert len(ev) == 8
  353. assert len(evr(1)) == 1
  354. assert len(evr([1, 2, 3])) == 3
  355. assert len(self.G.edges(1)) == 1
  356. assert len(self.G.edges()) == 8
  357. assert len(self.G.edges) == 8
  358. H = self.G.copy()
  359. H.add_edge(1, 1)
  360. assert len(H.edges(1)) == 2
  361. assert len(H.edges()) == 9
  362. assert len(H.edges) == 9
  363. def test_contains_with_nbunch(self):
  364. evr = self.eview(self.G)
  365. ev = evr(nbunch=[0, 2])
  366. assert (0, 1) in ev
  367. assert (1, 2) not in ev
  368. assert (2, 3) in ev
  369. assert (3, 4) not in ev
  370. assert (4, 5) not in ev
  371. assert (5, 6) not in ev
  372. assert (7, 8) not in ev
  373. assert (8, 9) not in ev
  374. class TestInEdgeDataView(TestOutEdgeDataView):
  375. @classmethod
  376. def setup_class(cls):
  377. cls.G = nx.path_graph(9, create_using=nx.DiGraph())
  378. cls.eview = nx.reportviews.InEdgeView
  379. def test_repr(self):
  380. ev = self.eview(self.G)(data=True)
  381. rep = (
  382. "InEdgeDataView([(0, 1, {}), (1, 2, {}), "
  383. + "(2, 3, {}), (3, 4, {}), "
  384. + "(4, 5, {}), (5, 6, {}), "
  385. + "(6, 7, {}), (7, 8, {})])"
  386. )
  387. assert repr(ev) == rep
  388. def test_contains_with_nbunch(self):
  389. evr = self.eview(self.G)
  390. ev = evr(nbunch=[0, 2])
  391. assert (0, 1) not in ev
  392. assert (1, 2) in ev
  393. assert (2, 3) not in ev
  394. assert (3, 4) not in ev
  395. assert (4, 5) not in ev
  396. assert (5, 6) not in ev
  397. assert (7, 8) not in ev
  398. assert (8, 9) not in ev
  399. class TestMultiEdgeDataView(TestEdgeDataView):
  400. @classmethod
  401. def setup_class(cls):
  402. cls.G = nx.path_graph(9, create_using=nx.MultiGraph())
  403. cls.eview = nx.reportviews.MultiEdgeView
  404. def modify_edge(self, G, e, **kwds):
  405. G._adj[e[0]][e[1]][0].update(kwds)
  406. def test_repr(self):
  407. ev = self.eview(self.G)(data=True)
  408. rep = (
  409. "MultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
  410. + "(2, 3, {}), (3, 4, {}), "
  411. + "(4, 5, {}), (5, 6, {}), "
  412. + "(6, 7, {}), (7, 8, {})])"
  413. )
  414. assert repr(ev) == rep
  415. def test_contains_with_nbunch(self):
  416. evr = self.eview(self.G)
  417. ev = evr(nbunch=[0, 2])
  418. assert (0, 1) in ev
  419. assert (1, 2) in ev
  420. assert (2, 3) in ev
  421. assert (3, 4) not in ev
  422. assert (4, 5) not in ev
  423. assert (5, 6) not in ev
  424. assert (7, 8) not in ev
  425. assert (8, 9) not in ev
  426. class TestOutMultiEdgeDataView(TestOutEdgeDataView):
  427. @classmethod
  428. def setup_class(cls):
  429. cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
  430. cls.eview = nx.reportviews.OutMultiEdgeView
  431. def modify_edge(self, G, e, **kwds):
  432. G._adj[e[0]][e[1]][0].update(kwds)
  433. def test_repr(self):
  434. ev = self.eview(self.G)(data=True)
  435. rep = (
  436. "OutMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
  437. + "(2, 3, {}), (3, 4, {}), "
  438. + "(4, 5, {}), (5, 6, {}), "
  439. + "(6, 7, {}), (7, 8, {})])"
  440. )
  441. assert repr(ev) == rep
  442. def test_contains_with_nbunch(self):
  443. evr = self.eview(self.G)
  444. ev = evr(nbunch=[0, 2])
  445. assert (0, 1) in ev
  446. assert (1, 2) not in ev
  447. assert (2, 3) in ev
  448. assert (3, 4) not in ev
  449. assert (4, 5) not in ev
  450. assert (5, 6) not in ev
  451. assert (7, 8) not in ev
  452. assert (8, 9) not in ev
  453. class TestInMultiEdgeDataView(TestOutMultiEdgeDataView):
  454. @classmethod
  455. def setup_class(cls):
  456. cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
  457. cls.eview = nx.reportviews.InMultiEdgeView
  458. def test_repr(self):
  459. ev = self.eview(self.G)(data=True)
  460. rep = (
  461. "InMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
  462. + "(2, 3, {}), (3, 4, {}), "
  463. + "(4, 5, {}), (5, 6, {}), "
  464. + "(6, 7, {}), (7, 8, {})])"
  465. )
  466. assert repr(ev) == rep
  467. def test_contains_with_nbunch(self):
  468. evr = self.eview(self.G)
  469. ev = evr(nbunch=[0, 2])
  470. assert (0, 1) not in ev
  471. assert (1, 2) in ev
  472. assert (2, 3) not in ev
  473. assert (3, 4) not in ev
  474. assert (4, 5) not in ev
  475. assert (5, 6) not in ev
  476. assert (7, 8) not in ev
  477. assert (8, 9) not in ev
  478. # Edge Views
  479. class TestEdgeView:
  480. @classmethod
  481. def setup_class(cls):
  482. cls.G = nx.path_graph(9)
  483. cls.eview = nx.reportviews.EdgeView
  484. def test_pickle(self):
  485. import pickle
  486. ev = self.eview(self.G)
  487. pev = pickle.loads(pickle.dumps(ev, -1))
  488. assert ev == pev
  489. assert ev.__slots__ == pev.__slots__
  490. def modify_edge(self, G, e, **kwds):
  491. G._adj[e[0]][e[1]].update(kwds)
  492. def test_str(self):
  493. ev = self.eview(self.G)
  494. rep = str([(n, n + 1) for n in range(8)])
  495. assert str(ev) == rep
  496. def test_repr(self):
  497. ev = self.eview(self.G)
  498. rep = (
  499. "EdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
  500. + "(4, 5), (5, 6), (6, 7), (7, 8)])"
  501. )
  502. assert repr(ev) == rep
  503. def test_getitem(self):
  504. G = self.G.copy()
  505. ev = G.edges
  506. G.edges[0, 1]["foo"] = "bar"
  507. assert ev[0, 1] == {"foo": "bar"}
  508. # slicing
  509. with pytest.raises(nx.NetworkXError):
  510. G.edges[0:5]
  511. def test_call(self):
  512. ev = self.eview(self.G)
  513. assert id(ev) == id(ev())
  514. assert id(ev) == id(ev(data=False))
  515. assert id(ev) != id(ev(data=True))
  516. assert id(ev) != id(ev(nbunch=1))
  517. def test_data(self):
  518. ev = self.eview(self.G)
  519. assert id(ev) != id(ev.data())
  520. assert id(ev) == id(ev.data(data=False))
  521. assert id(ev) != id(ev.data(data=True))
  522. assert id(ev) != id(ev.data(nbunch=1))
  523. def test_iter(self):
  524. ev = self.eview(self.G)
  525. for u, v in ev:
  526. pass
  527. iev = iter(ev)
  528. assert next(iev) == (0, 1)
  529. assert iter(ev) != ev
  530. assert iter(iev) == iev
  531. def test_contains(self):
  532. ev = self.eview(self.G)
  533. edv = ev()
  534. if self.G.is_directed():
  535. assert (1, 2) in ev and (2, 1) not in ev
  536. assert (1, 2) in edv and (2, 1) not in edv
  537. else:
  538. assert (1, 2) in ev and (2, 1) in ev
  539. assert (1, 2) in edv and (2, 1) in edv
  540. assert (1, 4) not in ev
  541. assert (1, 4) not in edv
  542. # edge not in graph
  543. assert (1, 90) not in ev
  544. assert (90, 1) not in ev
  545. assert (1, 90) not in edv
  546. assert (90, 1) not in edv
  547. def test_contains_with_nbunch(self):
  548. ev = self.eview(self.G)
  549. evn = ev(nbunch=[0, 2])
  550. assert (0, 1) in evn
  551. assert (1, 2) in evn
  552. assert (2, 3) in evn
  553. assert (3, 4) not in evn
  554. assert (4, 5) not in evn
  555. assert (5, 6) not in evn
  556. assert (7, 8) not in evn
  557. assert (8, 9) not in evn
  558. def test_len(self):
  559. ev = self.eview(self.G)
  560. num_ed = 9 if self.G.is_multigraph() else 8
  561. assert len(ev) == num_ed
  562. H = self.G.copy()
  563. H.add_edge(1, 1)
  564. assert len(H.edges(1)) == 3 + H.is_multigraph() - H.is_directed()
  565. assert len(H.edges()) == num_ed + 1
  566. assert len(H.edges) == num_ed + 1
  567. def test_and(self):
  568. # print("G & H edges:", gnv & hnv)
  569. ev = self.eview(self.G)
  570. some_edges = {(0, 1), (1, 0), (0, 2)}
  571. if self.G.is_directed():
  572. assert some_edges & ev, {(0, 1)}
  573. assert ev & some_edges, {(0, 1)}
  574. else:
  575. assert ev & some_edges == {(0, 1), (1, 0)}
  576. assert some_edges & ev == {(0, 1), (1, 0)}
  577. return
  578. def test_or(self):
  579. # print("G | H edges:", gnv | hnv)
  580. ev = self.eview(self.G)
  581. some_edges = {(0, 1), (1, 0), (0, 2)}
  582. result1 = {(n, n + 1) for n in range(8)}
  583. result1.update(some_edges)
  584. result2 = {(n + 1, n) for n in range(8)}
  585. result2.update(some_edges)
  586. assert (ev | some_edges) in (result1, result2)
  587. assert (some_edges | ev) in (result1, result2)
  588. def test_xor(self):
  589. # print("G ^ H edges:", gnv ^ hnv)
  590. ev = self.eview(self.G)
  591. some_edges = {(0, 1), (1, 0), (0, 2)}
  592. if self.G.is_directed():
  593. result = {(n, n + 1) for n in range(1, 8)}
  594. result.update({(1, 0), (0, 2)})
  595. assert ev ^ some_edges == result
  596. else:
  597. result = {(n, n + 1) for n in range(1, 8)}
  598. result.update({(0, 2)})
  599. assert ev ^ some_edges == result
  600. return
  601. def test_sub(self):
  602. # print("G - H edges:", gnv - hnv)
  603. ev = self.eview(self.G)
  604. some_edges = {(0, 1), (1, 0), (0, 2)}
  605. result = {(n, n + 1) for n in range(8)}
  606. result.remove((0, 1))
  607. assert ev - some_edges, result
  608. class TestOutEdgeView(TestEdgeView):
  609. @classmethod
  610. def setup_class(cls):
  611. cls.G = nx.path_graph(9, nx.DiGraph())
  612. cls.eview = nx.reportviews.OutEdgeView
  613. def test_repr(self):
  614. ev = self.eview(self.G)
  615. rep = (
  616. "OutEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
  617. + "(4, 5), (5, 6), (6, 7), (7, 8)])"
  618. )
  619. assert repr(ev) == rep
  620. def test_contains_with_nbunch(self):
  621. ev = self.eview(self.G)
  622. evn = ev(nbunch=[0, 2])
  623. assert (0, 1) in evn
  624. assert (1, 2) not in evn
  625. assert (2, 3) in evn
  626. assert (3, 4) not in evn
  627. assert (4, 5) not in evn
  628. assert (5, 6) not in evn
  629. assert (7, 8) not in evn
  630. assert (8, 9) not in evn
  631. class TestInEdgeView(TestEdgeView):
  632. @classmethod
  633. def setup_class(cls):
  634. cls.G = nx.path_graph(9, nx.DiGraph())
  635. cls.eview = nx.reportviews.InEdgeView
  636. def test_repr(self):
  637. ev = self.eview(self.G)
  638. rep = (
  639. "InEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
  640. + "(4, 5), (5, 6), (6, 7), (7, 8)])"
  641. )
  642. assert repr(ev) == rep
  643. def test_contains_with_nbunch(self):
  644. ev = self.eview(self.G)
  645. evn = ev(nbunch=[0, 2])
  646. assert (0, 1) not in evn
  647. assert (1, 2) in evn
  648. assert (2, 3) not in evn
  649. assert (3, 4) not in evn
  650. assert (4, 5) not in evn
  651. assert (5, 6) not in evn
  652. assert (7, 8) not in evn
  653. assert (8, 9) not in evn
  654. class TestMultiEdgeView(TestEdgeView):
  655. @classmethod
  656. def setup_class(cls):
  657. cls.G = nx.path_graph(9, nx.MultiGraph())
  658. cls.G.add_edge(1, 2, key=3, foo="bar")
  659. cls.eview = nx.reportviews.MultiEdgeView
  660. def modify_edge(self, G, e, **kwds):
  661. if len(e) == 2:
  662. e = e + (0,)
  663. G._adj[e[0]][e[1]][e[2]].update(kwds)
  664. def test_str(self):
  665. ev = self.eview(self.G)
  666. replist = [(n, n + 1, 0) for n in range(8)]
  667. replist.insert(2, (1, 2, 3))
  668. rep = str(replist)
  669. assert str(ev) == rep
  670. def test_getitem(self):
  671. G = self.G.copy()
  672. ev = G.edges
  673. G.edges[0, 1, 0]["foo"] = "bar"
  674. assert ev[0, 1, 0] == {"foo": "bar"}
  675. # slicing
  676. with pytest.raises(nx.NetworkXError):
  677. G.edges[0:5]
  678. def test_repr(self):
  679. ev = self.eview(self.G)
  680. rep = (
  681. "MultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
  682. + "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
  683. )
  684. assert repr(ev) == rep
  685. def test_call(self):
  686. ev = self.eview(self.G)
  687. assert id(ev) == id(ev(keys=True))
  688. assert id(ev) == id(ev(data=False, keys=True))
  689. assert id(ev) != id(ev(keys=False))
  690. assert id(ev) != id(ev(data=True))
  691. assert id(ev) != id(ev(nbunch=1))
  692. def test_data(self):
  693. ev = self.eview(self.G)
  694. assert id(ev) != id(ev.data())
  695. assert id(ev) == id(ev.data(data=False, keys=True))
  696. assert id(ev) != id(ev.data(keys=False))
  697. assert id(ev) != id(ev.data(data=True))
  698. assert id(ev) != id(ev.data(nbunch=1))
  699. def test_iter(self):
  700. ev = self.eview(self.G)
  701. for u, v, k in ev:
  702. pass
  703. iev = iter(ev)
  704. assert next(iev) == (0, 1, 0)
  705. assert iter(ev) != ev
  706. assert iter(iev) == iev
  707. def test_iterkeys(self):
  708. G = self.G
  709. evr = self.eview(G)
  710. ev = evr(keys=True)
  711. for u, v, k in ev:
  712. pass
  713. assert k == 0
  714. ev = evr(keys=True, data="foo", default=1)
  715. for u, v, k, wt in ev:
  716. pass
  717. assert wt == 1
  718. self.modify_edge(G, (2, 3, 0), foo="bar")
  719. ev = evr(keys=True, data=True)
  720. for e in ev:
  721. assert len(e) == 4
  722. print("edge:", e)
  723. if set(e[:2]) == {2, 3}:
  724. print(self.G._adj[2][3])
  725. assert e[2] == 0
  726. assert e[3] == {"foo": "bar"}
  727. checked = True
  728. elif set(e[:3]) == {1, 2, 3}:
  729. assert e[2] == 3
  730. assert e[3] == {"foo": "bar"}
  731. checked_multi = True
  732. else:
  733. assert e[2] == 0
  734. assert e[3] == {}
  735. assert checked
  736. assert checked_multi
  737. ev = evr(keys=True, data="foo", default=1)
  738. for e in ev:
  739. if set(e[:2]) == {1, 2} and e[2] == 3:
  740. assert e[3] == "bar"
  741. if set(e[:2]) == {1, 2} and e[2] == 0:
  742. assert e[3] == 1
  743. if set(e[:2]) == {2, 3}:
  744. assert e[2] == 0
  745. assert e[3] == "bar"
  746. assert len(e) == 4
  747. checked_wt = True
  748. assert checked_wt
  749. ev = evr(keys=True)
  750. for e in ev:
  751. assert len(e) == 3
  752. elist = sorted([(i, i + 1, 0) for i in range(8)] + [(1, 2, 3)])
  753. assert sorted(ev) == elist
  754. # test order of arguments:graph, nbunch, data, keys, default
  755. ev = evr((1, 2), "foo", True, 1)
  756. for e in ev:
  757. if set(e[:2]) == {1, 2}:
  758. assert e[2] in {0, 3}
  759. if e[2] == 3:
  760. assert e[3] == "bar"
  761. else: # e[2] == 0
  762. assert e[3] == 1
  763. if G.is_directed():
  764. assert len(list(ev)) == 3
  765. else:
  766. assert len(list(ev)) == 4
  767. def test_or(self):
  768. # print("G | H edges:", gnv | hnv)
  769. ev = self.eview(self.G)
  770. some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
  771. result = {(n, n + 1, 0) for n in range(8)}
  772. result.update(some_edges)
  773. result.update({(1, 2, 3)})
  774. assert ev | some_edges == result
  775. assert some_edges | ev == result
  776. def test_sub(self):
  777. # print("G - H edges:", gnv - hnv)
  778. ev = self.eview(self.G)
  779. some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
  780. result = {(n, n + 1, 0) for n in range(8)}
  781. result.remove((0, 1, 0))
  782. result.update({(1, 2, 3)})
  783. assert ev - some_edges, result
  784. assert some_edges - ev, result
  785. def test_xor(self):
  786. # print("G ^ H edges:", gnv ^ hnv)
  787. ev = self.eview(self.G)
  788. some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
  789. if self.G.is_directed():
  790. result = {(n, n + 1, 0) for n in range(1, 8)}
  791. result.update({(1, 0, 0), (0, 2, 0), (1, 2, 3)})
  792. assert ev ^ some_edges == result
  793. assert some_edges ^ ev == result
  794. else:
  795. result = {(n, n + 1, 0) for n in range(1, 8)}
  796. result.update({(0, 2, 0), (1, 2, 3)})
  797. assert ev ^ some_edges == result
  798. assert some_edges ^ ev == result
  799. def test_and(self):
  800. # print("G & H edges:", gnv & hnv)
  801. ev = self.eview(self.G)
  802. some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
  803. if self.G.is_directed():
  804. assert ev & some_edges == {(0, 1, 0)}
  805. assert some_edges & ev == {(0, 1, 0)}
  806. else:
  807. assert ev & some_edges == {(0, 1, 0), (1, 0, 0)}
  808. assert some_edges & ev == {(0, 1, 0), (1, 0, 0)}
  809. def test_contains_with_nbunch(self):
  810. ev = self.eview(self.G)
  811. evn = ev(nbunch=[0, 2])
  812. assert (0, 1) in evn
  813. assert (1, 2) in evn
  814. assert (2, 3) in evn
  815. assert (3, 4) not in evn
  816. assert (4, 5) not in evn
  817. assert (5, 6) not in evn
  818. assert (7, 8) not in evn
  819. assert (8, 9) not in evn
  820. class TestOutMultiEdgeView(TestMultiEdgeView):
  821. @classmethod
  822. def setup_class(cls):
  823. cls.G = nx.path_graph(9, nx.MultiDiGraph())
  824. cls.G.add_edge(1, 2, key=3, foo="bar")
  825. cls.eview = nx.reportviews.OutMultiEdgeView
  826. def modify_edge(self, G, e, **kwds):
  827. if len(e) == 2:
  828. e = e + (0,)
  829. G._adj[e[0]][e[1]][e[2]].update(kwds)
  830. def test_repr(self):
  831. ev = self.eview(self.G)
  832. rep = (
  833. "OutMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0),"
  834. + " (3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
  835. )
  836. assert repr(ev) == rep
  837. def test_contains_with_nbunch(self):
  838. ev = self.eview(self.G)
  839. evn = ev(nbunch=[0, 2])
  840. assert (0, 1) in evn
  841. assert (1, 2) not in evn
  842. assert (2, 3) in evn
  843. assert (3, 4) not in evn
  844. assert (4, 5) not in evn
  845. assert (5, 6) not in evn
  846. assert (7, 8) not in evn
  847. assert (8, 9) not in evn
  848. class TestInMultiEdgeView(TestMultiEdgeView):
  849. @classmethod
  850. def setup_class(cls):
  851. cls.G = nx.path_graph(9, nx.MultiDiGraph())
  852. cls.G.add_edge(1, 2, key=3, foo="bar")
  853. cls.eview = nx.reportviews.InMultiEdgeView
  854. def modify_edge(self, G, e, **kwds):
  855. if len(e) == 2:
  856. e = e + (0,)
  857. G._adj[e[0]][e[1]][e[2]].update(kwds)
  858. def test_repr(self):
  859. ev = self.eview(self.G)
  860. rep = (
  861. "InMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
  862. + "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
  863. )
  864. assert repr(ev) == rep
  865. def test_contains_with_nbunch(self):
  866. ev = self.eview(self.G)
  867. evn = ev(nbunch=[0, 2])
  868. assert (0, 1) not in evn
  869. assert (1, 2) in evn
  870. assert (2, 3) not in evn
  871. assert (3, 4) not in evn
  872. assert (4, 5) not in evn
  873. assert (5, 6) not in evn
  874. assert (7, 8) not in evn
  875. assert (8, 9) not in evn
  876. # Degrees
  877. class TestDegreeView:
  878. GRAPH = nx.Graph
  879. dview = nx.reportviews.DegreeView
  880. @classmethod
  881. def setup_class(cls):
  882. cls.G = nx.path_graph(6, cls.GRAPH())
  883. cls.G.add_edge(1, 3, foo=2)
  884. cls.G.add_edge(1, 3, foo=3)
  885. def test_pickle(self):
  886. import pickle
  887. deg = self.G.degree
  888. pdeg = pickle.loads(pickle.dumps(deg, -1))
  889. assert dict(deg) == dict(pdeg)
  890. def test_str(self):
  891. dv = self.dview(self.G)
  892. rep = str([(0, 1), (1, 3), (2, 2), (3, 3), (4, 2), (5, 1)])
  893. assert str(dv) == rep
  894. dv = self.G.degree()
  895. assert str(dv) == rep
  896. def test_repr(self):
  897. dv = self.dview(self.G)
  898. rep = "DegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
  899. assert repr(dv) == rep
  900. def test_iter(self):
  901. dv = self.dview(self.G)
  902. for n, d in dv:
  903. pass
  904. idv = iter(dv)
  905. assert iter(dv) != dv
  906. assert iter(idv) == idv
  907. assert next(idv) == (0, dv[0])
  908. assert next(idv) == (1, dv[1])
  909. # weighted
  910. dv = self.dview(self.G, weight="foo")
  911. for n, d in dv:
  912. pass
  913. idv = iter(dv)
  914. assert iter(dv) != dv
  915. assert iter(idv) == idv
  916. assert next(idv) == (0, dv[0])
  917. assert next(idv) == (1, dv[1])
  918. def test_nbunch(self):
  919. dv = self.dview(self.G)
  920. dvn = dv(0)
  921. assert dvn == 1
  922. dvn = dv([2, 3])
  923. assert sorted(dvn) == [(2, 2), (3, 3)]
  924. def test_getitem(self):
  925. dv = self.dview(self.G)
  926. assert dv[0] == 1
  927. assert dv[1] == 3
  928. assert dv[2] == 2
  929. assert dv[3] == 3
  930. dv = self.dview(self.G, weight="foo")
  931. assert dv[0] == 1
  932. assert dv[1] == 5
  933. assert dv[2] == 2
  934. assert dv[3] == 5
  935. def test_weight(self):
  936. dv = self.dview(self.G)
  937. dvw = dv(0, weight="foo")
  938. assert dvw == 1
  939. dvw = dv(1, weight="foo")
  940. assert dvw == 5
  941. dvw = dv([2, 3], weight="foo")
  942. assert sorted(dvw) == [(2, 2), (3, 5)]
  943. dvd = dict(dv(weight="foo"))
  944. assert dvd[0] == 1
  945. assert dvd[1] == 5
  946. assert dvd[2] == 2
  947. assert dvd[3] == 5
  948. def test_len(self):
  949. dv = self.dview(self.G)
  950. assert len(dv) == 6
  951. class TestDiDegreeView(TestDegreeView):
  952. GRAPH = nx.DiGraph
  953. dview = nx.reportviews.DiDegreeView
  954. def test_repr(self):
  955. dv = self.G.degree()
  956. rep = "DiDegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
  957. assert repr(dv) == rep
  958. class TestOutDegreeView(TestDegreeView):
  959. GRAPH = nx.DiGraph
  960. dview = nx.reportviews.OutDegreeView
  961. def test_str(self):
  962. dv = self.dview(self.G)
  963. rep = str([(0, 1), (1, 2), (2, 1), (3, 1), (4, 1), (5, 0)])
  964. assert str(dv) == rep
  965. dv = self.G.out_degree()
  966. assert str(dv) == rep
  967. def test_repr(self):
  968. dv = self.G.out_degree()
  969. rep = "OutDegreeView({0: 1, 1: 2, 2: 1, 3: 1, 4: 1, 5: 0})"
  970. assert repr(dv) == rep
  971. def test_nbunch(self):
  972. dv = self.dview(self.G)
  973. dvn = dv(0)
  974. assert dvn == 1
  975. dvn = dv([2, 3])
  976. assert sorted(dvn) == [(2, 1), (3, 1)]
  977. def test_getitem(self):
  978. dv = self.dview(self.G)
  979. assert dv[0] == 1
  980. assert dv[1] == 2
  981. assert dv[2] == 1
  982. assert dv[3] == 1
  983. dv = self.dview(self.G, weight="foo")
  984. assert dv[0] == 1
  985. assert dv[1] == 4
  986. assert dv[2] == 1
  987. assert dv[3] == 1
  988. def test_weight(self):
  989. dv = self.dview(self.G)
  990. dvw = dv(0, weight="foo")
  991. assert dvw == 1
  992. dvw = dv(1, weight="foo")
  993. assert dvw == 4
  994. dvw = dv([2, 3], weight="foo")
  995. assert sorted(dvw) == [(2, 1), (3, 1)]
  996. dvd = dict(dv(weight="foo"))
  997. assert dvd[0] == 1
  998. assert dvd[1] == 4
  999. assert dvd[2] == 1
  1000. assert dvd[3] == 1
  1001. class TestInDegreeView(TestDegreeView):
  1002. GRAPH = nx.DiGraph
  1003. dview = nx.reportviews.InDegreeView
  1004. def test_str(self):
  1005. dv = self.dview(self.G)
  1006. rep = str([(0, 0), (1, 1), (2, 1), (3, 2), (4, 1), (5, 1)])
  1007. assert str(dv) == rep
  1008. dv = self.G.in_degree()
  1009. assert str(dv) == rep
  1010. def test_repr(self):
  1011. dv = self.G.in_degree()
  1012. rep = "InDegreeView({0: 0, 1: 1, 2: 1, 3: 2, 4: 1, 5: 1})"
  1013. assert repr(dv) == rep
  1014. def test_nbunch(self):
  1015. dv = self.dview(self.G)
  1016. dvn = dv(0)
  1017. assert dvn == 0
  1018. dvn = dv([2, 3])
  1019. assert sorted(dvn) == [(2, 1), (3, 2)]
  1020. def test_getitem(self):
  1021. dv = self.dview(self.G)
  1022. assert dv[0] == 0
  1023. assert dv[1] == 1
  1024. assert dv[2] == 1
  1025. assert dv[3] == 2
  1026. dv = self.dview(self.G, weight="foo")
  1027. assert dv[0] == 0
  1028. assert dv[1] == 1
  1029. assert dv[2] == 1
  1030. assert dv[3] == 4
  1031. def test_weight(self):
  1032. dv = self.dview(self.G)
  1033. dvw = dv(0, weight="foo")
  1034. assert dvw == 0
  1035. dvw = dv(1, weight="foo")
  1036. assert dvw == 1
  1037. dvw = dv([2, 3], weight="foo")
  1038. assert sorted(dvw) == [(2, 1), (3, 4)]
  1039. dvd = dict(dv(weight="foo"))
  1040. assert dvd[0] == 0
  1041. assert dvd[1] == 1
  1042. assert dvd[2] == 1
  1043. assert dvd[3] == 4
  1044. class TestMultiDegreeView(TestDegreeView):
  1045. GRAPH = nx.MultiGraph
  1046. dview = nx.reportviews.MultiDegreeView
  1047. def test_str(self):
  1048. dv = self.dview(self.G)
  1049. rep = str([(0, 1), (1, 4), (2, 2), (3, 4), (4, 2), (5, 1)])
  1050. assert str(dv) == rep
  1051. dv = self.G.degree()
  1052. assert str(dv) == rep
  1053. def test_repr(self):
  1054. dv = self.G.degree()
  1055. rep = "MultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
  1056. assert repr(dv) == rep
  1057. def test_nbunch(self):
  1058. dv = self.dview(self.G)
  1059. dvn = dv(0)
  1060. assert dvn == 1
  1061. dvn = dv([2, 3])
  1062. assert sorted(dvn) == [(2, 2), (3, 4)]
  1063. def test_getitem(self):
  1064. dv = self.dview(self.G)
  1065. assert dv[0] == 1
  1066. assert dv[1] == 4
  1067. assert dv[2] == 2
  1068. assert dv[3] == 4
  1069. dv = self.dview(self.G, weight="foo")
  1070. assert dv[0] == 1
  1071. assert dv[1] == 7
  1072. assert dv[2] == 2
  1073. assert dv[3] == 7
  1074. def test_weight(self):
  1075. dv = self.dview(self.G)
  1076. dvw = dv(0, weight="foo")
  1077. assert dvw == 1
  1078. dvw = dv(1, weight="foo")
  1079. assert dvw == 7
  1080. dvw = dv([2, 3], weight="foo")
  1081. assert sorted(dvw) == [(2, 2), (3, 7)]
  1082. dvd = dict(dv(weight="foo"))
  1083. assert dvd[0] == 1
  1084. assert dvd[1] == 7
  1085. assert dvd[2] == 2
  1086. assert dvd[3] == 7
  1087. class TestDiMultiDegreeView(TestMultiDegreeView):
  1088. GRAPH = nx.MultiDiGraph
  1089. dview = nx.reportviews.DiMultiDegreeView
  1090. def test_repr(self):
  1091. dv = self.G.degree()
  1092. rep = "DiMultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
  1093. assert repr(dv) == rep
  1094. class TestOutMultiDegreeView(TestDegreeView):
  1095. GRAPH = nx.MultiDiGraph
  1096. dview = nx.reportviews.OutMultiDegreeView
  1097. def test_str(self):
  1098. dv = self.dview(self.G)
  1099. rep = str([(0, 1), (1, 3), (2, 1), (3, 1), (4, 1), (5, 0)])
  1100. assert str(dv) == rep
  1101. dv = self.G.out_degree()
  1102. assert str(dv) == rep
  1103. def test_repr(self):
  1104. dv = self.G.out_degree()
  1105. rep = "OutMultiDegreeView({0: 1, 1: 3, 2: 1, 3: 1, 4: 1, 5: 0})"
  1106. assert repr(dv) == rep
  1107. def test_nbunch(self):
  1108. dv = self.dview(self.G)
  1109. dvn = dv(0)
  1110. assert dvn == 1
  1111. dvn = dv([2, 3])
  1112. assert sorted(dvn) == [(2, 1), (3, 1)]
  1113. def test_getitem(self):
  1114. dv = self.dview(self.G)
  1115. assert dv[0] == 1
  1116. assert dv[1] == 3
  1117. assert dv[2] == 1
  1118. assert dv[3] == 1
  1119. dv = self.dview(self.G, weight="foo")
  1120. assert dv[0] == 1
  1121. assert dv[1] == 6
  1122. assert dv[2] == 1
  1123. assert dv[3] == 1
  1124. def test_weight(self):
  1125. dv = self.dview(self.G)
  1126. dvw = dv(0, weight="foo")
  1127. assert dvw == 1
  1128. dvw = dv(1, weight="foo")
  1129. assert dvw == 6
  1130. dvw = dv([2, 3], weight="foo")
  1131. assert sorted(dvw) == [(2, 1), (3, 1)]
  1132. dvd = dict(dv(weight="foo"))
  1133. assert dvd[0] == 1
  1134. assert dvd[1] == 6
  1135. assert dvd[2] == 1
  1136. assert dvd[3] == 1
  1137. class TestInMultiDegreeView(TestDegreeView):
  1138. GRAPH = nx.MultiDiGraph
  1139. dview = nx.reportviews.InMultiDegreeView
  1140. def test_str(self):
  1141. dv = self.dview(self.G)
  1142. rep = str([(0, 0), (1, 1), (2, 1), (3, 3), (4, 1), (5, 1)])
  1143. assert str(dv) == rep
  1144. dv = self.G.in_degree()
  1145. assert str(dv) == rep
  1146. def test_repr(self):
  1147. dv = self.G.in_degree()
  1148. rep = "InMultiDegreeView({0: 0, 1: 1, 2: 1, 3: 3, 4: 1, 5: 1})"
  1149. assert repr(dv) == rep
  1150. def test_nbunch(self):
  1151. dv = self.dview(self.G)
  1152. dvn = dv(0)
  1153. assert dvn == 0
  1154. dvn = dv([2, 3])
  1155. assert sorted(dvn) == [(2, 1), (3, 3)]
  1156. def test_getitem(self):
  1157. dv = self.dview(self.G)
  1158. assert dv[0] == 0
  1159. assert dv[1] == 1
  1160. assert dv[2] == 1
  1161. assert dv[3] == 3
  1162. dv = self.dview(self.G, weight="foo")
  1163. assert dv[0] == 0
  1164. assert dv[1] == 1
  1165. assert dv[2] == 1
  1166. assert dv[3] == 6
  1167. def test_weight(self):
  1168. dv = self.dview(self.G)
  1169. dvw = dv(0, weight="foo")
  1170. assert dvw == 0
  1171. dvw = dv(1, weight="foo")
  1172. assert dvw == 1
  1173. dvw = dv([2, 3], weight="foo")
  1174. assert sorted(dvw) == [(2, 1), (3, 6)]
  1175. dvd = dict(dv(weight="foo"))
  1176. assert dvd[0] == 0
  1177. assert dvd[1] == 1
  1178. assert dvd[2] == 1
  1179. assert dvd[3] == 6
  1180. @pytest.mark.parametrize(
  1181. ("reportview", "err_msg_terms"),
  1182. (
  1183. (rv.NodeView, "list(G.nodes"),
  1184. (rv.NodeDataView, "list(G.nodes.data"),
  1185. (rv.EdgeView, "list(G.edges"),
  1186. # Directed EdgeViews
  1187. (rv.InEdgeView, "list(G.in_edges"),
  1188. (rv.OutEdgeView, "list(G.edges"),
  1189. # Multi EdgeViews
  1190. (rv.MultiEdgeView, "list(G.edges"),
  1191. (rv.InMultiEdgeView, "list(G.in_edges"),
  1192. (rv.OutMultiEdgeView, "list(G.edges"),
  1193. ),
  1194. )
  1195. def test_slicing_reportviews(reportview, err_msg_terms):
  1196. G = nx.complete_graph(3)
  1197. view = reportview(G)
  1198. with pytest.raises(nx.NetworkXError) as exc:
  1199. view[0:2]
  1200. errmsg = str(exc.value)
  1201. assert type(view).__name__ in errmsg
  1202. assert err_msg_terms in errmsg
  1203. @pytest.mark.parametrize(
  1204. "graph", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
  1205. )
  1206. def test_cache_dict_get_set_state(graph):
  1207. G = nx.path_graph(5, graph())
  1208. G.nodes, G.edges, G.adj, G.degree
  1209. if G.is_directed():
  1210. G.pred, G.succ, G.in_edges, G.out_edges, G.in_degree, G.out_degree
  1211. cached_dict = G.__dict__
  1212. assert "nodes" in cached_dict
  1213. assert "edges" in cached_dict
  1214. assert "adj" in cached_dict
  1215. assert "degree" in cached_dict
  1216. if G.is_directed():
  1217. assert "pred" in cached_dict
  1218. assert "succ" in cached_dict
  1219. assert "in_edges" in cached_dict
  1220. assert "out_edges" in cached_dict
  1221. assert "in_degree" in cached_dict
  1222. assert "out_degree" in cached_dict
  1223. # Raises error if the cached properties and views do not work
  1224. pickle.loads(pickle.dumps(G, -1))
  1225. deepcopy(G)