"""Unit tests for the :mod:`networkx.generators.duplication` module.""" import pytest import networkx as nx class TestDuplicationDivergenceGraph: """Unit tests for the :func:`networkx.generators.duplication.duplication_divergence_graph` function. """ def test_final_size(self): G = nx.duplication_divergence_graph(3, p=1) assert len(G) == 3 G = nx.duplication_divergence_graph(3, p=1, seed=42) assert len(G) == 3 def test_probability_too_large(self): with pytest.raises(nx.NetworkXError): nx.duplication_divergence_graph(3, p=2) def test_probability_too_small(self): with pytest.raises(nx.NetworkXError): nx.duplication_divergence_graph(3, p=-1) def test_non_extreme_probability_value(self): G = nx.duplication_divergence_graph(6, p=0.3, seed=42) assert len(G) == 6 assert list(G.degree()) == [(0, 2), (1, 3), (2, 2), (3, 3), (4, 1), (5, 1)] def test_minimum_desired_nodes(self): with pytest.raises( nx.NetworkXError, match=".*n must be greater than or equal to 2" ): nx.duplication_divergence_graph(1, p=1) def test_create_using(self): class DummyGraph(nx.Graph): pass class DummyDiGraph(nx.DiGraph): pass G = nx.duplication_divergence_graph(6, 0.3, seed=42, create_using=DummyGraph) assert isinstance(G, DummyGraph) with pytest.raises(nx.NetworkXError, match="create_using must not be directed"): nx.duplication_divergence_graph(6, 0.3, seed=42, create_using=DummyDiGraph) class TestPartialDuplicationGraph: """Unit tests for the :func:`networkx.generators.duplication.partial_duplication_graph` function. """ def test_final_size(self): N = 10 n = 5 p = 0.5 q = 0.5 G = nx.partial_duplication_graph(N, n, p, q) assert len(G) == N G = nx.partial_duplication_graph(N, n, p, q, seed=42) assert len(G) == N def test_initial_clique_size(self): N = 10 n = 10 p = 0.5 q = 0.5 G = nx.partial_duplication_graph(N, n, p, q) assert len(G) == n def test_invalid_initial_size(self): with pytest.raises(nx.NetworkXError): N = 5 n = 10 p = 0.5 q = 0.5 G = nx.partial_duplication_graph(N, n, p, q) def test_invalid_probabilities(self): N = 1 n = 1 for p, q in [(0.5, 2), (0.5, -1), (2, 0.5), (-1, 0.5)]: args = (N, n, p, q) pytest.raises(nx.NetworkXError, nx.partial_duplication_graph, *args) def test_create_using(self): class DummyGraph(nx.Graph): pass class DummyDiGraph(nx.DiGraph): pass G = nx.partial_duplication_graph(10, 5, 0.5, 0.5, create_using=DummyGraph) assert isinstance(G, DummyGraph) with pytest.raises(nx.NetworkXError, match="create_using must not be directed"): nx.partial_duplication_graph(10, 5, 0.5, 0.5, create_using=DummyDiGraph)