123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419 |
- import pickle
- from copy import deepcopy
- import pytest
- import networkx as nx
- from networkx.classes import reportviews as rv
- from networkx.classes.reportviews import NodeDataView
- # Nodes
- class TestNodeView:
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.nv = cls.G.nodes # NodeView(G)
- def test_pickle(self):
- import pickle
- nv = self.nv
- pnv = pickle.loads(pickle.dumps(nv, -1))
- assert nv == pnv
- assert nv.__slots__ == pnv.__slots__
- def test_str(self):
- assert str(self.nv) == "[0, 1, 2, 3, 4, 5, 6, 7, 8]"
- def test_repr(self):
- assert repr(self.nv) == "NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
- def test_contains(self):
- G = self.G.copy()
- nv = G.nodes
- assert 7 in nv
- assert 9 not in nv
- G.remove_node(7)
- G.add_node(9)
- assert 7 not in nv
- assert 9 in nv
- def test_getitem(self):
- G = self.G.copy()
- nv = G.nodes
- G.nodes[3]["foo"] = "bar"
- assert nv[7] == {}
- assert nv[3] == {"foo": "bar"}
- # slicing
- with pytest.raises(nx.NetworkXError):
- G.nodes[0:5]
- def test_iter(self):
- nv = self.nv
- for i, n in enumerate(nv):
- assert i == n
- inv = iter(nv)
- assert next(inv) == 0
- assert iter(nv) != nv
- assert iter(inv) == inv
- inv2 = iter(nv)
- next(inv2)
- assert list(inv) == list(inv2)
- # odd case where NodeView calls NodeDataView with data=False
- nnv = nv(data=False)
- for i, n in enumerate(nnv):
- assert i == n
- def test_call(self):
- nodes = self.nv
- assert nodes is nodes()
- assert nodes is not nodes(data=True)
- assert nodes is not nodes(data="weight")
- class TestNodeDataView:
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.nv = NodeDataView(cls.G)
- cls.ndv = cls.G.nodes.data(True)
- cls.nwv = cls.G.nodes.data("foo")
- def test_viewtype(self):
- nv = self.G.nodes
- ndvfalse = nv.data(False)
- assert nv is ndvfalse
- assert nv is not self.ndv
- def test_pickle(self):
- import pickle
- nv = self.nv
- pnv = pickle.loads(pickle.dumps(nv, -1))
- assert nv == pnv
- assert nv.__slots__ == pnv.__slots__
- def test_str(self):
- msg = str([(n, {}) for n in range(9)])
- assert str(self.ndv) == msg
- def test_repr(self):
- expected = "NodeDataView((0, 1, 2, 3, 4, 5, 6, 7, 8))"
- assert repr(self.nv) == expected
- expected = (
- "NodeDataView({0: {}, 1: {}, 2: {}, 3: {}, "
- + "4: {}, 5: {}, 6: {}, 7: {}, 8: {}})"
- )
- assert repr(self.ndv) == expected
- expected = (
- "NodeDataView({0: None, 1: None, 2: None, 3: None, 4: None, "
- + "5: None, 6: None, 7: None, 8: None}, data='foo')"
- )
- assert repr(self.nwv) == expected
- def test_contains(self):
- G = self.G.copy()
- nv = G.nodes.data()
- nwv = G.nodes.data("foo")
- G.nodes[3]["foo"] = "bar"
- assert (7, {}) in nv
- assert (3, {"foo": "bar"}) in nv
- assert (3, "bar") in nwv
- assert (7, None) in nwv
- # default
- nwv_def = G.nodes(data="foo", default="biz")
- assert (7, "biz") in nwv_def
- assert (3, "bar") in nwv_def
- def test_getitem(self):
- G = self.G.copy()
- nv = G.nodes
- G.nodes[3]["foo"] = "bar"
- assert nv[3] == {"foo": "bar"}
- # default
- nwv_def = G.nodes(data="foo", default="biz")
- assert nwv_def[7], "biz"
- assert nwv_def[3] == "bar"
- # slicing
- with pytest.raises(nx.NetworkXError):
- G.nodes.data()[0:5]
- def test_iter(self):
- G = self.G.copy()
- nv = G.nodes.data()
- ndv = G.nodes.data(True)
- nwv = G.nodes.data("foo")
- for i, (n, d) in enumerate(nv):
- assert i == n
- assert d == {}
- inv = iter(nv)
- assert next(inv) == (0, {})
- G.nodes[3]["foo"] = "bar"
- # default
- for n, d in nv:
- if n == 3:
- assert d == {"foo": "bar"}
- else:
- assert d == {}
- # data=True
- for n, d in ndv:
- if n == 3:
- assert d == {"foo": "bar"}
- else:
- assert d == {}
- # data='foo'
- for n, d in nwv:
- if n == 3:
- assert d == "bar"
- else:
- assert d is None
- # data='foo', default=1
- for n, d in G.nodes.data("foo", default=1):
- if n == 3:
- assert d == "bar"
- else:
- assert d == 1
- def test_nodedataview_unhashable():
- G = nx.path_graph(9)
- G.nodes[3]["foo"] = "bar"
- nvs = [G.nodes.data()]
- nvs.append(G.nodes.data(True))
- H = G.copy()
- H.nodes[4]["foo"] = {1, 2, 3}
- nvs.append(H.nodes.data(True))
- # raise unhashable
- for nv in nvs:
- pytest.raises(TypeError, set, nv)
- pytest.raises(TypeError, eval, "nv | nv", locals())
- # no raise... hashable
- Gn = G.nodes.data(False)
- set(Gn)
- Gn | Gn
- Gn = G.nodes.data("foo")
- set(Gn)
- Gn | Gn
- class TestNodeViewSetOps:
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.G.nodes[3]["foo"] = "bar"
- cls.nv = cls.G.nodes
- def n_its(self, nodes):
- return set(nodes)
- def test_len(self):
- G = self.G.copy()
- nv = G.nodes
- assert len(nv) == 9
- G.remove_node(7)
- assert len(nv) == 8
- G.add_node(9)
- assert len(nv) == 9
- def test_and(self):
- # print("G & H nodes:", gnv & hnv)
- nv = self.nv
- some_nodes = self.n_its(range(5, 12))
- assert nv & some_nodes == self.n_its(range(5, 9))
- assert some_nodes & nv == self.n_its(range(5, 9))
- def test_or(self):
- # print("G | H nodes:", gnv | hnv)
- nv = self.nv
- some_nodes = self.n_its(range(5, 12))
- assert nv | some_nodes == self.n_its(range(12))
- assert some_nodes | nv == self.n_its(range(12))
- def test_xor(self):
- # print("G ^ H nodes:", gnv ^ hnv)
- nv = self.nv
- some_nodes = self.n_its(range(5, 12))
- nodes = {0, 1, 2, 3, 4, 9, 10, 11}
- assert nv ^ some_nodes == self.n_its(nodes)
- assert some_nodes ^ nv == self.n_its(nodes)
- def test_sub(self):
- # print("G - H nodes:", gnv - hnv)
- nv = self.nv
- some_nodes = self.n_its(range(5, 12))
- assert nv - some_nodes == self.n_its(range(5))
- assert some_nodes - nv == self.n_its(range(9, 12))
- class TestNodeDataViewSetOps(TestNodeViewSetOps):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.G.nodes[3]["foo"] = "bar"
- cls.nv = cls.G.nodes.data("foo")
- def n_its(self, nodes):
- return {(node, "bar" if node == 3 else None) for node in nodes}
- class TestNodeDataViewDefaultSetOps(TestNodeDataViewSetOps):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.G.nodes[3]["foo"] = "bar"
- cls.nv = cls.G.nodes.data("foo", default=1)
- def n_its(self, nodes):
- return {(node, "bar" if node == 3 else 1) for node in nodes}
- # Edges Data View
- class TestEdgeDataView:
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.eview = nx.reportviews.EdgeView
- def test_pickle(self):
- import pickle
- ev = self.eview(self.G)(data=True)
- pev = pickle.loads(pickle.dumps(ev, -1))
- assert list(ev) == list(pev)
- assert ev.__slots__ == pev.__slots__
- def modify_edge(self, G, e, **kwds):
- G._adj[e[0]][e[1]].update(kwds)
- def test_str(self):
- ev = self.eview(self.G)(data=True)
- rep = str([(n, n + 1, {}) for n in range(8)])
- assert str(ev) == rep
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "EdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_iterdata(self):
- G = self.G.copy()
- evr = self.eview(G)
- ev = evr(data=True)
- ev_def = evr(data="foo", default=1)
- for u, v, d in ev:
- pass
- assert d == {}
- for u, v, wt in ev_def:
- pass
- assert wt == 1
- self.modify_edge(G, (2, 3), foo="bar")
- for e in ev:
- assert len(e) == 3
- if set(e[:2]) == {2, 3}:
- assert e[2] == {"foo": "bar"}
- checked = True
- else:
- assert e[2] == {}
- assert checked
- for e in ev_def:
- assert len(e) == 3
- if set(e[:2]) == {2, 3}:
- assert e[2] == "bar"
- checked_wt = True
- else:
- assert e[2] == 1
- assert checked_wt
- def test_iter(self):
- evr = self.eview(self.G)
- ev = evr()
- for u, v in ev:
- pass
- iev = iter(ev)
- assert next(iev) == (0, 1)
- assert iter(ev) != ev
- assert iter(iev) == iev
- def test_contains(self):
- evr = self.eview(self.G)
- ev = evr()
- if self.G.is_directed():
- assert (1, 2) in ev and (2, 1) not in ev
- else:
- assert (1, 2) in ev and (2, 1) in ev
- assert (1, 4) not in ev
- assert (1, 90) not in ev
- assert (90, 1) not in ev
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- if self.G.is_directed():
- assert (0, 1) in ev
- assert (1, 2) not in ev
- assert (2, 3) in ev
- else:
- assert (0, 1) in ev
- assert (1, 2) in ev
- assert (2, 3) in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- def test_len(self):
- evr = self.eview(self.G)
- ev = evr(data="foo")
- assert len(ev) == 8
- assert len(evr(1)) == 2
- assert len(evr([1, 2, 3])) == 4
- assert len(self.G.edges(1)) == 2
- assert len(self.G.edges()) == 8
- assert len(self.G.edges) == 8
- H = self.G.copy()
- H.add_edge(1, 1)
- assert len(H.edges(1)) == 3
- assert len(H.edges()) == 9
- assert len(H.edges) == 9
- class TestOutEdgeDataView(TestEdgeDataView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, create_using=nx.DiGraph())
- cls.eview = nx.reportviews.OutEdgeView
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "OutEdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_len(self):
- evr = self.eview(self.G)
- ev = evr(data="foo")
- assert len(ev) == 8
- assert len(evr(1)) == 1
- assert len(evr([1, 2, 3])) == 3
- assert len(self.G.edges(1)) == 1
- assert len(self.G.edges()) == 8
- assert len(self.G.edges) == 8
- H = self.G.copy()
- H.add_edge(1, 1)
- assert len(H.edges(1)) == 2
- assert len(H.edges()) == 9
- assert len(H.edges) == 9
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- assert (0, 1) in ev
- assert (1, 2) not in ev
- assert (2, 3) in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- class TestInEdgeDataView(TestOutEdgeDataView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, create_using=nx.DiGraph())
- cls.eview = nx.reportviews.InEdgeView
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "InEdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- assert (0, 1) not in ev
- assert (1, 2) in ev
- assert (2, 3) not in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- class TestMultiEdgeDataView(TestEdgeDataView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, create_using=nx.MultiGraph())
- cls.eview = nx.reportviews.MultiEdgeView
- def modify_edge(self, G, e, **kwds):
- G._adj[e[0]][e[1]][0].update(kwds)
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "MultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- assert (0, 1) in ev
- assert (1, 2) in ev
- assert (2, 3) in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- class TestOutMultiEdgeDataView(TestOutEdgeDataView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
- cls.eview = nx.reportviews.OutMultiEdgeView
- def modify_edge(self, G, e, **kwds):
- G._adj[e[0]][e[1]][0].update(kwds)
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "OutMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- assert (0, 1) in ev
- assert (1, 2) not in ev
- assert (2, 3) in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- class TestInMultiEdgeDataView(TestOutMultiEdgeDataView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
- cls.eview = nx.reportviews.InMultiEdgeView
- def test_repr(self):
- ev = self.eview(self.G)(data=True)
- rep = (
- "InMultiEdgeDataView([(0, 1, {}), (1, 2, {}), "
- + "(2, 3, {}), (3, 4, {}), "
- + "(4, 5, {}), (5, 6, {}), "
- + "(6, 7, {}), (7, 8, {})])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- evr = self.eview(self.G)
- ev = evr(nbunch=[0, 2])
- assert (0, 1) not in ev
- assert (1, 2) in ev
- assert (2, 3) not in ev
- assert (3, 4) not in ev
- assert (4, 5) not in ev
- assert (5, 6) not in ev
- assert (7, 8) not in ev
- assert (8, 9) not in ev
- # Edge Views
- class TestEdgeView:
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9)
- cls.eview = nx.reportviews.EdgeView
- def test_pickle(self):
- import pickle
- ev = self.eview(self.G)
- pev = pickle.loads(pickle.dumps(ev, -1))
- assert ev == pev
- assert ev.__slots__ == pev.__slots__
- def modify_edge(self, G, e, **kwds):
- G._adj[e[0]][e[1]].update(kwds)
- def test_str(self):
- ev = self.eview(self.G)
- rep = str([(n, n + 1) for n in range(8)])
- assert str(ev) == rep
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "EdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
- + "(4, 5), (5, 6), (6, 7), (7, 8)])"
- )
- assert repr(ev) == rep
- def test_getitem(self):
- G = self.G.copy()
- ev = G.edges
- G.edges[0, 1]["foo"] = "bar"
- assert ev[0, 1] == {"foo": "bar"}
- # slicing
- with pytest.raises(nx.NetworkXError):
- G.edges[0:5]
- def test_call(self):
- ev = self.eview(self.G)
- assert id(ev) == id(ev())
- assert id(ev) == id(ev(data=False))
- assert id(ev) != id(ev(data=True))
- assert id(ev) != id(ev(nbunch=1))
- def test_data(self):
- ev = self.eview(self.G)
- assert id(ev) != id(ev.data())
- assert id(ev) == id(ev.data(data=False))
- assert id(ev) != id(ev.data(data=True))
- assert id(ev) != id(ev.data(nbunch=1))
- def test_iter(self):
- ev = self.eview(self.G)
- for u, v in ev:
- pass
- iev = iter(ev)
- assert next(iev) == (0, 1)
- assert iter(ev) != ev
- assert iter(iev) == iev
- def test_contains(self):
- ev = self.eview(self.G)
- edv = ev()
- if self.G.is_directed():
- assert (1, 2) in ev and (2, 1) not in ev
- assert (1, 2) in edv and (2, 1) not in edv
- else:
- assert (1, 2) in ev and (2, 1) in ev
- assert (1, 2) in edv and (2, 1) in edv
- assert (1, 4) not in ev
- assert (1, 4) not in edv
- # edge not in graph
- assert (1, 90) not in ev
- assert (90, 1) not in ev
- assert (1, 90) not in edv
- assert (90, 1) not in edv
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) in evn
- assert (1, 2) in evn
- assert (2, 3) in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- def test_len(self):
- ev = self.eview(self.G)
- num_ed = 9 if self.G.is_multigraph() else 8
- assert len(ev) == num_ed
- H = self.G.copy()
- H.add_edge(1, 1)
- assert len(H.edges(1)) == 3 + H.is_multigraph() - H.is_directed()
- assert len(H.edges()) == num_ed + 1
- assert len(H.edges) == num_ed + 1
- def test_and(self):
- # print("G & H edges:", gnv & hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1), (1, 0), (0, 2)}
- if self.G.is_directed():
- assert some_edges & ev, {(0, 1)}
- assert ev & some_edges, {(0, 1)}
- else:
- assert ev & some_edges == {(0, 1), (1, 0)}
- assert some_edges & ev == {(0, 1), (1, 0)}
- return
- def test_or(self):
- # print("G | H edges:", gnv | hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1), (1, 0), (0, 2)}
- result1 = {(n, n + 1) for n in range(8)}
- result1.update(some_edges)
- result2 = {(n + 1, n) for n in range(8)}
- result2.update(some_edges)
- assert (ev | some_edges) in (result1, result2)
- assert (some_edges | ev) in (result1, result2)
- def test_xor(self):
- # print("G ^ H edges:", gnv ^ hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1), (1, 0), (0, 2)}
- if self.G.is_directed():
- result = {(n, n + 1) for n in range(1, 8)}
- result.update({(1, 0), (0, 2)})
- assert ev ^ some_edges == result
- else:
- result = {(n, n + 1) for n in range(1, 8)}
- result.update({(0, 2)})
- assert ev ^ some_edges == result
- return
- def test_sub(self):
- # print("G - H edges:", gnv - hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1), (1, 0), (0, 2)}
- result = {(n, n + 1) for n in range(8)}
- result.remove((0, 1))
- assert ev - some_edges, result
- class TestOutEdgeView(TestEdgeView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, nx.DiGraph())
- cls.eview = nx.reportviews.OutEdgeView
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "OutEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
- + "(4, 5), (5, 6), (6, 7), (7, 8)])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) in evn
- assert (1, 2) not in evn
- assert (2, 3) in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- class TestInEdgeView(TestEdgeView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, nx.DiGraph())
- cls.eview = nx.reportviews.InEdgeView
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "InEdgeView([(0, 1), (1, 2), (2, 3), (3, 4), "
- + "(4, 5), (5, 6), (6, 7), (7, 8)])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) not in evn
- assert (1, 2) in evn
- assert (2, 3) not in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- class TestMultiEdgeView(TestEdgeView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, nx.MultiGraph())
- cls.G.add_edge(1, 2, key=3, foo="bar")
- cls.eview = nx.reportviews.MultiEdgeView
- def modify_edge(self, G, e, **kwds):
- if len(e) == 2:
- e = e + (0,)
- G._adj[e[0]][e[1]][e[2]].update(kwds)
- def test_str(self):
- ev = self.eview(self.G)
- replist = [(n, n + 1, 0) for n in range(8)]
- replist.insert(2, (1, 2, 3))
- rep = str(replist)
- assert str(ev) == rep
- def test_getitem(self):
- G = self.G.copy()
- ev = G.edges
- G.edges[0, 1, 0]["foo"] = "bar"
- assert ev[0, 1, 0] == {"foo": "bar"}
- # slicing
- with pytest.raises(nx.NetworkXError):
- G.edges[0:5]
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "MultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
- + "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
- )
- assert repr(ev) == rep
- def test_call(self):
- ev = self.eview(self.G)
- assert id(ev) == id(ev(keys=True))
- assert id(ev) == id(ev(data=False, keys=True))
- assert id(ev) != id(ev(keys=False))
- assert id(ev) != id(ev(data=True))
- assert id(ev) != id(ev(nbunch=1))
- def test_data(self):
- ev = self.eview(self.G)
- assert id(ev) != id(ev.data())
- assert id(ev) == id(ev.data(data=False, keys=True))
- assert id(ev) != id(ev.data(keys=False))
- assert id(ev) != id(ev.data(data=True))
- assert id(ev) != id(ev.data(nbunch=1))
- def test_iter(self):
- ev = self.eview(self.G)
- for u, v, k in ev:
- pass
- iev = iter(ev)
- assert next(iev) == (0, 1, 0)
- assert iter(ev) != ev
- assert iter(iev) == iev
- def test_iterkeys(self):
- G = self.G
- evr = self.eview(G)
- ev = evr(keys=True)
- for u, v, k in ev:
- pass
- assert k == 0
- ev = evr(keys=True, data="foo", default=1)
- for u, v, k, wt in ev:
- pass
- assert wt == 1
- self.modify_edge(G, (2, 3, 0), foo="bar")
- ev = evr(keys=True, data=True)
- for e in ev:
- assert len(e) == 4
- print("edge:", e)
- if set(e[:2]) == {2, 3}:
- print(self.G._adj[2][3])
- assert e[2] == 0
- assert e[3] == {"foo": "bar"}
- checked = True
- elif set(e[:3]) == {1, 2, 3}:
- assert e[2] == 3
- assert e[3] == {"foo": "bar"}
- checked_multi = True
- else:
- assert e[2] == 0
- assert e[3] == {}
- assert checked
- assert checked_multi
- ev = evr(keys=True, data="foo", default=1)
- for e in ev:
- if set(e[:2]) == {1, 2} and e[2] == 3:
- assert e[3] == "bar"
- if set(e[:2]) == {1, 2} and e[2] == 0:
- assert e[3] == 1
- if set(e[:2]) == {2, 3}:
- assert e[2] == 0
- assert e[3] == "bar"
- assert len(e) == 4
- checked_wt = True
- assert checked_wt
- ev = evr(keys=True)
- for e in ev:
- assert len(e) == 3
- elist = sorted([(i, i + 1, 0) for i in range(8)] + [(1, 2, 3)])
- assert sorted(ev) == elist
- # test order of arguments:graph, nbunch, data, keys, default
- ev = evr((1, 2), "foo", True, 1)
- for e in ev:
- if set(e[:2]) == {1, 2}:
- assert e[2] in {0, 3}
- if e[2] == 3:
- assert e[3] == "bar"
- else: # e[2] == 0
- assert e[3] == 1
- if G.is_directed():
- assert len(list(ev)) == 3
- else:
- assert len(list(ev)) == 4
- def test_or(self):
- # print("G | H edges:", gnv | hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
- result = {(n, n + 1, 0) for n in range(8)}
- result.update(some_edges)
- result.update({(1, 2, 3)})
- assert ev | some_edges == result
- assert some_edges | ev == result
- def test_sub(self):
- # print("G - H edges:", gnv - hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
- result = {(n, n + 1, 0) for n in range(8)}
- result.remove((0, 1, 0))
- result.update({(1, 2, 3)})
- assert ev - some_edges, result
- assert some_edges - ev, result
- def test_xor(self):
- # print("G ^ H edges:", gnv ^ hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
- if self.G.is_directed():
- result = {(n, n + 1, 0) for n in range(1, 8)}
- result.update({(1, 0, 0), (0, 2, 0), (1, 2, 3)})
- assert ev ^ some_edges == result
- assert some_edges ^ ev == result
- else:
- result = {(n, n + 1, 0) for n in range(1, 8)}
- result.update({(0, 2, 0), (1, 2, 3)})
- assert ev ^ some_edges == result
- assert some_edges ^ ev == result
- def test_and(self):
- # print("G & H edges:", gnv & hnv)
- ev = self.eview(self.G)
- some_edges = {(0, 1, 0), (1, 0, 0), (0, 2, 0)}
- if self.G.is_directed():
- assert ev & some_edges == {(0, 1, 0)}
- assert some_edges & ev == {(0, 1, 0)}
- else:
- assert ev & some_edges == {(0, 1, 0), (1, 0, 0)}
- assert some_edges & ev == {(0, 1, 0), (1, 0, 0)}
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) in evn
- assert (1, 2) in evn
- assert (2, 3) in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- class TestOutMultiEdgeView(TestMultiEdgeView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, nx.MultiDiGraph())
- cls.G.add_edge(1, 2, key=3, foo="bar")
- cls.eview = nx.reportviews.OutMultiEdgeView
- def modify_edge(self, G, e, **kwds):
- if len(e) == 2:
- e = e + (0,)
- G._adj[e[0]][e[1]][e[2]].update(kwds)
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "OutMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0),"
- + " (3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) in evn
- assert (1, 2) not in evn
- assert (2, 3) in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- class TestInMultiEdgeView(TestMultiEdgeView):
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(9, nx.MultiDiGraph())
- cls.G.add_edge(1, 2, key=3, foo="bar")
- cls.eview = nx.reportviews.InMultiEdgeView
- def modify_edge(self, G, e, **kwds):
- if len(e) == 2:
- e = e + (0,)
- G._adj[e[0]][e[1]][e[2]].update(kwds)
- def test_repr(self):
- ev = self.eview(self.G)
- rep = (
- "InMultiEdgeView([(0, 1, 0), (1, 2, 0), (1, 2, 3), (2, 3, 0), "
- + "(3, 4, 0), (4, 5, 0), (5, 6, 0), (6, 7, 0), (7, 8, 0)])"
- )
- assert repr(ev) == rep
- def test_contains_with_nbunch(self):
- ev = self.eview(self.G)
- evn = ev(nbunch=[0, 2])
- assert (0, 1) not in evn
- assert (1, 2) in evn
- assert (2, 3) not in evn
- assert (3, 4) not in evn
- assert (4, 5) not in evn
- assert (5, 6) not in evn
- assert (7, 8) not in evn
- assert (8, 9) not in evn
- # Degrees
- class TestDegreeView:
- GRAPH = nx.Graph
- dview = nx.reportviews.DegreeView
- @classmethod
- def setup_class(cls):
- cls.G = nx.path_graph(6, cls.GRAPH())
- cls.G.add_edge(1, 3, foo=2)
- cls.G.add_edge(1, 3, foo=3)
- def test_pickle(self):
- import pickle
- deg = self.G.degree
- pdeg = pickle.loads(pickle.dumps(deg, -1))
- assert dict(deg) == dict(pdeg)
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 1), (1, 3), (2, 2), (3, 3), (4, 2), (5, 1)])
- assert str(dv) == rep
- dv = self.G.degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.dview(self.G)
- rep = "DegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
- assert repr(dv) == rep
- def test_iter(self):
- dv = self.dview(self.G)
- for n, d in dv:
- pass
- idv = iter(dv)
- assert iter(dv) != dv
- assert iter(idv) == idv
- assert next(idv) == (0, dv[0])
- assert next(idv) == (1, dv[1])
- # weighted
- dv = self.dview(self.G, weight="foo")
- for n, d in dv:
- pass
- idv = iter(dv)
- assert iter(dv) != dv
- assert iter(idv) == idv
- assert next(idv) == (0, dv[0])
- assert next(idv) == (1, dv[1])
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 1
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 2), (3, 3)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 1
- assert dv[1] == 3
- assert dv[2] == 2
- assert dv[3] == 3
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 1
- assert dv[1] == 5
- assert dv[2] == 2
- assert dv[3] == 5
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 1
- dvw = dv(1, weight="foo")
- assert dvw == 5
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 2), (3, 5)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 1
- assert dvd[1] == 5
- assert dvd[2] == 2
- assert dvd[3] == 5
- def test_len(self):
- dv = self.dview(self.G)
- assert len(dv) == 6
- class TestDiDegreeView(TestDegreeView):
- GRAPH = nx.DiGraph
- dview = nx.reportviews.DiDegreeView
- def test_repr(self):
- dv = self.G.degree()
- rep = "DiDegreeView({0: 1, 1: 3, 2: 2, 3: 3, 4: 2, 5: 1})"
- assert repr(dv) == rep
- class TestOutDegreeView(TestDegreeView):
- GRAPH = nx.DiGraph
- dview = nx.reportviews.OutDegreeView
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 1), (1, 2), (2, 1), (3, 1), (4, 1), (5, 0)])
- assert str(dv) == rep
- dv = self.G.out_degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.G.out_degree()
- rep = "OutDegreeView({0: 1, 1: 2, 2: 1, 3: 1, 4: 1, 5: 0})"
- assert repr(dv) == rep
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 1
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 1), (3, 1)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 1
- assert dv[1] == 2
- assert dv[2] == 1
- assert dv[3] == 1
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 1
- assert dv[1] == 4
- assert dv[2] == 1
- assert dv[3] == 1
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 1
- dvw = dv(1, weight="foo")
- assert dvw == 4
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 1), (3, 1)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 1
- assert dvd[1] == 4
- assert dvd[2] == 1
- assert dvd[3] == 1
- class TestInDegreeView(TestDegreeView):
- GRAPH = nx.DiGraph
- dview = nx.reportviews.InDegreeView
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 0), (1, 1), (2, 1), (3, 2), (4, 1), (5, 1)])
- assert str(dv) == rep
- dv = self.G.in_degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.G.in_degree()
- rep = "InDegreeView({0: 0, 1: 1, 2: 1, 3: 2, 4: 1, 5: 1})"
- assert repr(dv) == rep
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 0
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 1), (3, 2)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 0
- assert dv[1] == 1
- assert dv[2] == 1
- assert dv[3] == 2
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 0
- assert dv[1] == 1
- assert dv[2] == 1
- assert dv[3] == 4
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 0
- dvw = dv(1, weight="foo")
- assert dvw == 1
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 1), (3, 4)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 0
- assert dvd[1] == 1
- assert dvd[2] == 1
- assert dvd[3] == 4
- class TestMultiDegreeView(TestDegreeView):
- GRAPH = nx.MultiGraph
- dview = nx.reportviews.MultiDegreeView
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 1), (1, 4), (2, 2), (3, 4), (4, 2), (5, 1)])
- assert str(dv) == rep
- dv = self.G.degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.G.degree()
- rep = "MultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
- assert repr(dv) == rep
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 1
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 2), (3, 4)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 1
- assert dv[1] == 4
- assert dv[2] == 2
- assert dv[3] == 4
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 1
- assert dv[1] == 7
- assert dv[2] == 2
- assert dv[3] == 7
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 1
- dvw = dv(1, weight="foo")
- assert dvw == 7
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 2), (3, 7)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 1
- assert dvd[1] == 7
- assert dvd[2] == 2
- assert dvd[3] == 7
- class TestDiMultiDegreeView(TestMultiDegreeView):
- GRAPH = nx.MultiDiGraph
- dview = nx.reportviews.DiMultiDegreeView
- def test_repr(self):
- dv = self.G.degree()
- rep = "DiMultiDegreeView({0: 1, 1: 4, 2: 2, 3: 4, 4: 2, 5: 1})"
- assert repr(dv) == rep
- class TestOutMultiDegreeView(TestDegreeView):
- GRAPH = nx.MultiDiGraph
- dview = nx.reportviews.OutMultiDegreeView
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 1), (1, 3), (2, 1), (3, 1), (4, 1), (5, 0)])
- assert str(dv) == rep
- dv = self.G.out_degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.G.out_degree()
- rep = "OutMultiDegreeView({0: 1, 1: 3, 2: 1, 3: 1, 4: 1, 5: 0})"
- assert repr(dv) == rep
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 1
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 1), (3, 1)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 1
- assert dv[1] == 3
- assert dv[2] == 1
- assert dv[3] == 1
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 1
- assert dv[1] == 6
- assert dv[2] == 1
- assert dv[3] == 1
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 1
- dvw = dv(1, weight="foo")
- assert dvw == 6
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 1), (3, 1)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 1
- assert dvd[1] == 6
- assert dvd[2] == 1
- assert dvd[3] == 1
- class TestInMultiDegreeView(TestDegreeView):
- GRAPH = nx.MultiDiGraph
- dview = nx.reportviews.InMultiDegreeView
- def test_str(self):
- dv = self.dview(self.G)
- rep = str([(0, 0), (1, 1), (2, 1), (3, 3), (4, 1), (5, 1)])
- assert str(dv) == rep
- dv = self.G.in_degree()
- assert str(dv) == rep
- def test_repr(self):
- dv = self.G.in_degree()
- rep = "InMultiDegreeView({0: 0, 1: 1, 2: 1, 3: 3, 4: 1, 5: 1})"
- assert repr(dv) == rep
- def test_nbunch(self):
- dv = self.dview(self.G)
- dvn = dv(0)
- assert dvn == 0
- dvn = dv([2, 3])
- assert sorted(dvn) == [(2, 1), (3, 3)]
- def test_getitem(self):
- dv = self.dview(self.G)
- assert dv[0] == 0
- assert dv[1] == 1
- assert dv[2] == 1
- assert dv[3] == 3
- dv = self.dview(self.G, weight="foo")
- assert dv[0] == 0
- assert dv[1] == 1
- assert dv[2] == 1
- assert dv[3] == 6
- def test_weight(self):
- dv = self.dview(self.G)
- dvw = dv(0, weight="foo")
- assert dvw == 0
- dvw = dv(1, weight="foo")
- assert dvw == 1
- dvw = dv([2, 3], weight="foo")
- assert sorted(dvw) == [(2, 1), (3, 6)]
- dvd = dict(dv(weight="foo"))
- assert dvd[0] == 0
- assert dvd[1] == 1
- assert dvd[2] == 1
- assert dvd[3] == 6
- @pytest.mark.parametrize(
- ("reportview", "err_msg_terms"),
- (
- (rv.NodeView, "list(G.nodes"),
- (rv.NodeDataView, "list(G.nodes.data"),
- (rv.EdgeView, "list(G.edges"),
- # Directed EdgeViews
- (rv.InEdgeView, "list(G.in_edges"),
- (rv.OutEdgeView, "list(G.edges"),
- # Multi EdgeViews
- (rv.MultiEdgeView, "list(G.edges"),
- (rv.InMultiEdgeView, "list(G.in_edges"),
- (rv.OutMultiEdgeView, "list(G.edges"),
- ),
- )
- def test_slicing_reportviews(reportview, err_msg_terms):
- G = nx.complete_graph(3)
- view = reportview(G)
- with pytest.raises(nx.NetworkXError) as exc:
- view[0:2]
- errmsg = str(exc.value)
- assert type(view).__name__ in errmsg
- assert err_msg_terms in errmsg
- @pytest.mark.parametrize(
- "graph", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
- )
- def test_cache_dict_get_set_state(graph):
- G = nx.path_graph(5, graph())
- G.nodes, G.edges, G.adj, G.degree
- if G.is_directed():
- G.pred, G.succ, G.in_edges, G.out_edges, G.in_degree, G.out_degree
- cached_dict = G.__dict__
- assert "nodes" in cached_dict
- assert "edges" in cached_dict
- assert "adj" in cached_dict
- assert "degree" in cached_dict
- if G.is_directed():
- assert "pred" in cached_dict
- assert "succ" in cached_dict
- assert "in_edges" in cached_dict
- assert "out_edges" in cached_dict
- assert "in_degree" in cached_dict
- assert "out_degree" in cached_dict
- # Raises error if the cached properties and views do not work
- pickle.loads(pickle.dumps(G, -1))
- deepcopy(G)
|