123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- import tempfile
- from io import BytesIO
- import pytest
- import networkx as nx
- from networkx.utils import edges_equal, nodes_equal
- class TestSparseGraph6:
- def test_from_sparse6_bytes(self):
- data = b":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM"
- G = nx.from_sparse6_bytes(data)
- assert nodes_equal(
- sorted(G.nodes()),
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
- )
- assert edges_equal(
- G.edges(),
- [
- (0, 1),
- (0, 2),
- (0, 3),
- (1, 12),
- (1, 14),
- (2, 13),
- (2, 15),
- (3, 16),
- (3, 17),
- (4, 7),
- (4, 9),
- (4, 11),
- (5, 6),
- (5, 8),
- (5, 9),
- (6, 10),
- (6, 11),
- (7, 8),
- (7, 10),
- (8, 12),
- (9, 15),
- (10, 14),
- (11, 13),
- (12, 16),
- (13, 17),
- (14, 17),
- (15, 16),
- ],
- )
- def test_from_bytes_multigraph_graph(self):
- graph_data = b":An"
- G = nx.from_sparse6_bytes(graph_data)
- assert type(G) == nx.Graph
- multigraph_data = b":Ab"
- M = nx.from_sparse6_bytes(multigraph_data)
- assert type(M) == nx.MultiGraph
- def test_read_sparse6(self):
- data = b":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM"
- G = nx.from_sparse6_bytes(data)
- fh = BytesIO(data)
- Gin = nx.read_sparse6(fh)
- assert nodes_equal(G.nodes(), Gin.nodes())
- assert edges_equal(G.edges(), Gin.edges())
- def test_read_many_graph6(self):
- # Read many graphs into list
- data = b":Q___eDcdFcDeFcE`GaJ`IaHbKNbLM\n" b":Q___dCfDEdcEgcbEGbFIaJ`JaHN`IM"
- fh = BytesIO(data)
- glist = nx.read_sparse6(fh)
- assert len(glist) == 2
- for G in glist:
- assert nodes_equal(
- G.nodes(),
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
- )
- class TestWriteSparse6:
- """Unit tests for writing graphs in the sparse6 format.
- Most of the test cases were checked against the sparse6 encoder in Sage.
- """
- def test_null_graph(self):
- G = nx.null_graph()
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:?\n"
- def test_trivial_graph(self):
- G = nx.trivial_graph()
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:@\n"
- def test_empty_graph(self):
- G = nx.empty_graph(5)
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:D\n"
- def test_large_empty_graph(self):
- G = nx.empty_graph(68)
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:~?@C\n"
- def test_very_large_empty_graph(self):
- G = nx.empty_graph(258049)
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:~~???~?@\n"
- def test_complete_graph(self):
- G = nx.complete_graph(4)
- result = BytesIO()
- nx.write_sparse6(G, result)
- assert result.getvalue() == b">>sparse6<<:CcKI\n"
- def test_no_header(self):
- G = nx.complete_graph(4)
- result = BytesIO()
- nx.write_sparse6(G, result, header=False)
- assert result.getvalue() == b":CcKI\n"
- def test_padding(self):
- codes = (b":Cdv", b":DaYn", b":EaYnN", b":FaYnL", b":GaYnLz")
- for n, code in enumerate(codes, start=4):
- G = nx.path_graph(n)
- result = BytesIO()
- nx.write_sparse6(G, result, header=False)
- assert result.getvalue() == code + b"\n"
- def test_complete_bipartite(self):
- G = nx.complete_bipartite_graph(6, 9)
- result = BytesIO()
- nx.write_sparse6(G, result)
- # Compared with sage
- expected = b">>sparse6<<:Nk" + b"?G`cJ" * 9 + b"\n"
- assert result.getvalue() == expected
- def test_read_write_inverse(self):
- for i in list(range(13)) + [31, 47, 62, 63, 64, 72]:
- m = min(2 * i, i * i // 2)
- g = nx.random_graphs.gnm_random_graph(i, m, seed=i)
- gstr = BytesIO()
- nx.write_sparse6(g, gstr, header=False)
- # Strip the trailing newline.
- gstr = gstr.getvalue().rstrip()
- g2 = nx.from_sparse6_bytes(gstr)
- assert g2.order() == g.order()
- assert edges_equal(g2.edges(), g.edges())
- def test_no_directed_graphs(self):
- with pytest.raises(nx.NetworkXNotImplemented):
- nx.write_sparse6(nx.DiGraph(), BytesIO())
- def test_write_path(self):
- # On Windows, we can't reopen a file that is open
- # So, for test we get a valid name from tempfile but close it.
- with tempfile.NamedTemporaryFile() as f:
- fullfilename = f.name
- # file should be closed now, so write_sparse6 can open it
- nx.write_sparse6(nx.null_graph(), fullfilename)
- fh = open(fullfilename, mode="rb")
- assert fh.read() == b">>sparse6<<:?\n"
- fh.close()
- import os
- os.remove(fullfilename)
|