def test_in_dict(self): # Undirected graph with vertices and unweighted edges g = graph.Graph(edges=[[1, 2], [2, 3]]) expected_in_mapping = { 1: {2: None}, 2: {1: None, 3: None}, 3: {2: None} } for key in expected_in_mapping: self.assertEqual(g.in_dict(key), expected_in_mapping[key]) # Undirected graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]]) expected_in_mapping = { 1: {2: 10}, 2: {1: 10, 3: 5}, 3: {2: 5} } for key in expected_in_mapping: self.assertEqual(g.in_dict(key), expected_in_mapping[key]) # Directed graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]], directed=True) expected_in_mapping = { 2: {1: 10}, 3: {2: 5} } for key in expected_in_mapping: self.assertEqual(g.in_dict(key), expected_in_mapping[key])
def test_init(self): # Undirected graph with no vertices g = graph.Graph() self.assertFalse(g.directed) self.assertIsInstance(g.out_mapping, defaultdict) self.assertIsInstance(g.in_mapping, defaultdict) self.assertEqual(g._edges, []) # Directed graph with no vertices g = graph.Graph(directed=True) self.assertTrue(g.directed) self.assertIsInstance(g.out_mapping, defaultdict) self.assertIsInstance(g.in_mapping, defaultdict) self.assertEqual(g._edges, []) # Undirected graph with vertices and unweighted edges g = graph.Graph(edges=[[1, 2], [2, 3]]) expected_edges = [(1, 2), (2, 1), (2, 3), (3, 2)] expected_out_mapping = {1: {2: None}, 2: {1: None, 3: None}, 3: {2: None}} expected_in_mapping = {1: {2: None}, 2: {1: None, 3: None}, 3: {2: None}} self.assertFalse(g.directed) self.assertEqual(len(g.out_mapping), len(expected_out_mapping)) for node in expected_out_mapping: self.assertEqual(g.out_mapping[node], expected_out_mapping[node]) self.assertEqual(len(g.in_mapping), len(expected_in_mapping)) for node in expected_in_mapping: self.assertEqual(g.in_mapping[node], expected_in_mapping[node]) self.assertEqual(g._edges, expected_edges) # Undirected graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]]) expected_edges = [(1, 2), (2, 1), (2, 3), (3, 2)] expected_out_mapping = {1: {2: 10}, 2: {1: 10, 3: 5}, 3: {2: 5}} expected_in_mapping = {1: {2: 10}, 2: {1: 10, 3: 5}, 3: {2: 5}} self.assertFalse(g.directed) self.assertEqual(len(g.out_mapping), len(expected_out_mapping)) for node in expected_out_mapping: self.assertEqual(g.out_mapping[node], expected_out_mapping[node]) self.assertEqual(len(g.in_mapping), len(expected_in_mapping)) for node in expected_in_mapping: self.assertEqual(g.in_mapping[node], expected_in_mapping[node]) self.assertEqual(g._edges, expected_edges) # Directed graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]], directed=True) expected_edges = [(1, 2), (2, 3)] expected_out_mapping = {1: {2: 10}, 2: {3: 5}} expected_in_mapping = {2: {1: 10}, 3: {2: 5}} self.assertTrue(g.directed) self.assertEqual(len(g.out_mapping), len(expected_out_mapping)) for node in expected_out_mapping: self.assertEqual(g.out_mapping[node], expected_out_mapping[node]) self.assertEqual(len(g.in_mapping), len(expected_in_mapping)) for node in expected_in_mapping: self.assertEqual(g.in_mapping[node], expected_in_mapping[node]) self.assertEqual(g._edges, expected_edges)
def test_undirected_graph_with_vertices_and_unweighted_edges(self): g = graph.Graph(edges=[[1, 2], [2, 3]]) self.assertFalse(g.directed) self.assertEqual(str(g), "<Graph: [[1, 2], [2, 3]]>") self.assertEqual(g._edges, [(1, 2), (2, 1), (2, 3), (3, 2)]) self.assert_out_mapping(g, { 1: { 2: None }, 2: { 1: None, 3: None }, 3: { 2: None } }) self.assert_in_mapping(g, { 1: { 2: None }, 2: { 1: None, 3: None }, 3: { 2: None } })
def test_directed_graph_with_no_vertices(self): g = graph.Graph(directed=True) self.assertTrue(g.directed) self.assertIsInstance(g.out_mapping, defaultdict) self.assertIsInstance(g.in_mapping, defaultdict) self.assertEqual(g._edges, []) self.assertEqual(str(g), "<Graph: None>")
def test_directed_graph_vertices_and_weighted_edges(self): g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]], directed=True) self.assertTrue(g.directed) self.assertEqual(str(g), "<Graph: [[1, 2, 10], [2, 3, 5]]>") self.assertEqual(g._edges, [(1, 2), (2, 3)]) self.assert_out_mapping(g, {1: {2: 10}, 2: {3: 5}}) self.assert_in_mapping(g, {2: {1: 10}, 3: {2: 5}})
def test_add_loops(self): edges = [(0, 1), (0, 2), (1, 2)] g = graph.Graph(edges) g.add_loops() self.assertEqual( list(sorted(g._edges)), list(sorted([(0, 1), (1, 0), (0, 2), (2, 0), (1, 2), (2, 1), (0, 0), (1, 1), (2, 2)])) )
def test_add_loops_with_existing_loop_and_using_strings(self): """In this case there is already a loop present; also uses strings instead of integers as the hashable.""" edges = [("a", "b"), ("b", "a"), ("c", "c")] g = graph.Graph(edges) g.add_loops() self.assertEqual( list(sorted(g._edges)), list(sorted([("a", "b"), ("b", "a"), ("c", "c"), ("a", "a"), ("b", "b")])), )
def test_add_loops2(self): """In this case there is already a loop present; also uses strings instead of integers as the hashable.""" edges = [('a', 'b'), ('b', 'a'), ('c', 'c')] g = graph.Graph(edges) g.add_loops() self.assertEqual( list(sorted(g._edges)), list(sorted( [('a', 'b'), ('b', 'a'), ('c', 'c'), ('a', 'a'), ('b', 'b')])) )
def test_repr(self): # Undirected graph with no vertices g = graph.Graph() self.assertEqual(str(g), '<Graph: None>') # Directed graph with no vertices g = graph.Graph(directed=True) self.assertEqual(str(g), '<Graph: None>') # Undirected graph with vertices and unweighted edges g = graph.Graph(edges=[[1, 2], [2, 3]]) self.assertEqual(str(g), '<Graph: [[1, 2], [2, 3]]>') # Undirected graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]]) self.assertEqual(str(g), '<Graph: [[1, 2, 10], [2, 3, 5]]>') # Directed graph with vertices and weighted edges g = graph.Graph(edges=[[1, 2, 10], [2, 3, 5]], directed=True) self.assertEqual(str(g), '<Graph: [[1, 2, 10], [2, 3, 5]]>')
def test_add_loops(self): edges = [(0, 1), (0, 2), (1, 2)] g = graph.Graph(edges) g.add_loops() self.assertEqual(g._edges, [(0, 1), (1, 0), (0, 2), (2, 0), (1, 2), (2, 1), (0, 0), (1, 1), (2, 2)])