/
test_graph_search.py
120 lines (90 loc) · 4.14 KB
/
test_graph_search.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import unittest
from graph_search import breadth_first_search, depth_first_search, connected_components, Graph
class TestGraphSearch(unittest.TestCase):
def __get_visited_values(self, g, node_ids):
return map(lambda id : g.get_node(id).visited, node_ids)
def test_bfs_simple_connected(self):
g = Graph([[0,1],[1,2],[2,0]])
breadth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_bfs_parallel_edges(self):
g = Graph([[0,1],[1,2],[1,2],[2,1],[0,1],[0,2]])
breadth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_bfs_self_edges(self):
g = Graph([[0,0],[0,1],[1,1],[2,2],[2,0]])
breadth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_bfs_disconnected(self):
g = Graph([[0,1],[2,3]])
breadth_first_search(g, 0)
for i in range(2):
self.assertTrue(g.get_node(i).visited)
for i in range(2,4):
self.assertFalse(g.get_node(i).visited)
breadth_first_search(g, 2)
for i in range(2,4):
self.assertTrue(g.get_node(i).visited)
def test_bfs_check_order(self):
g = Graph([[0,1], [0,2], [1,3], [1,4], [2,5], [2,6]])
breadth_first_search(g, 0)
self.assertTrue(g.get_node(0).visited < min(self.__get_visited_values(g, [1,2])))
self.assertTrue(g.get_node(1).visited < min(self.__get_visited_values(g, [3,4,5,6])))
self.assertTrue(g.get_node(2).visited < min(self.__get_visited_values(g, [3,4,5,6])))
def test_dfs_simple_connected(self):
g = Graph([[0,1],[1,2],[2,0]])
depth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_dfs_parallel_edges(self):
g = Graph([[0,1],[1,2],[1,2],[2,1],[0,1],[0,2]])
depth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_dfs_self_edges(self):
g = Graph([[0,0],[0,1],[1,1],[2,2],[2,0]])
depth_first_search(g, 0)
for i in range(3):
self.assertTrue(g.get_node(i).visited)
def test_dfs_disconnected(self):
g = Graph([[0,1],[2,3]])
depth_first_search(g, 0)
for i in range(2):
self.assertTrue(g.get_node(i).visited)
for i in range(2,4):
self.assertFalse(g.get_node(i).visited)
depth_first_search(g, 2)
for i in range(2,4):
self.assertTrue(g.get_node(i).visited)
def test_dfs_check_order(self):
g = Graph([[0,1], [0,2], [1,3], [1,4], [2,5], [2,6]])
depth_first_search(g, 0)
if g.get_node(1).visited < g.get_node(2).visited:
self.assertTrue(g.get_node(3).visited < g.get_node(2).visited)
self.assertTrue(g.get_node(4).visited < g.get_node(2).visited)
else:
self.assertTrue(g.get_node(5).visited < g.get_node(1).visited)
self.assertTrue(g.get_node(6).visited < g.get_node(1).visited)
self.assertTrue(g.get_node(0).visited < g.get_node(1).visited)
self.assertTrue(g.get_node(0).visited < g.get_node(2).visited)
self.assertTrue(g.get_node(1).visited < g.get_node(3).visited)
self.assertTrue(g.get_node(1).visited < g.get_node(4).visited)
self.assertTrue(g.get_node(2).visited < g.get_node(5).visited)
self.assertTrue(g.get_node(2).visited < g.get_node(6).visited)
def test_connected_components_fully_connected(self):
graph = Graph([[0,1],[1,2],[2,0]])
result = connected_components(graph)
self.assertEqual(len(result), 1)
self.assertTrue(result[0].id in [0,1,2])
def test_connected_components_disconnected(self):
graph = Graph([[0,1],[1,2],[2,0],[3,4],[3,5],[3,6],[7,8]])
result = connected_components(graph)
self.assertEqual(len(result), 3)
self.assertTrue(result[0].id in [0,1,2])
self.assertTrue(result[1].id in [3,4,5,6])
self.assertTrue(result[2].id in [7,8])
if __name__ == '__main__':
unittest.main()