100
100
def test_children_ancestry1(self):
101
101
graph = self.make_known_graph(test_graph.ancestry_1)
102
self.assertEqual(['rev1'], graph._nodes[NULL_REVISION].child_keys)
102
self.assertEqual(['rev1'], graph.get_child_keys(NULL_REVISION))
103
103
self.assertEqual(['rev2a', 'rev2b'],
104
sorted(graph._nodes['rev1'].child_keys))
105
self.assertEqual(['rev3'], sorted(graph._nodes['rev2a'].child_keys))
106
self.assertEqual(['rev4'], sorted(graph._nodes['rev3'].child_keys))
107
self.assertEqual(['rev4'], sorted(graph._nodes['rev2b'].child_keys))
104
sorted(graph.get_child_keys('rev1')))
105
self.assertEqual(['rev3'], graph.get_child_keys('rev2a'))
106
self.assertEqual(['rev4'], graph.get_child_keys('rev3'))
107
self.assertEqual(['rev4'], graph.get_child_keys('rev2b'))
108
self.assertRaises(KeyError, graph.get_child_keys, 'not_in_graph')
110
def test_parent_ancestry1(self):
111
graph = self.make_known_graph(test_graph.ancestry_1)
112
self.assertEqual([NULL_REVISION], graph.get_parent_keys('rev1'))
113
self.assertEqual(['rev1'], graph.get_parent_keys('rev2a'))
114
self.assertEqual(['rev1'], graph.get_parent_keys('rev2b'))
115
self.assertEqual(['rev2a'], graph.get_parent_keys('rev3'))
116
self.assertEqual(['rev2b', 'rev3'],
117
sorted(graph.get_parent_keys('rev4')))
118
self.assertRaises(KeyError, graph.get_child_keys, 'not_in_graph')
120
def test_parent_with_ghost(self):
121
graph = self.make_known_graph(test_graph.with_ghost)
122
self.assertEqual(None, graph.get_parent_keys('g'))
109
124
def test_gdfo_ancestry_1(self):
110
125
graph = self.make_known_graph(test_graph.ancestry_1)
139
154
self.assertGDFO(graph, 'a', 5)
140
155
self.assertGDFO(graph, 'c', 5)
157
def test_add_existing_node(self):
158
graph = self.make_known_graph(test_graph.ancestry_1)
159
# Add a node that already exists with identical content
161
self.assertGDFO(graph, 'rev4', 5)
162
graph.add_node('rev4', ['rev3', 'rev2b'])
163
self.assertGDFO(graph, 'rev4', 5)
164
# This also works if we use a tuple rather than a list
165
graph.add_node('rev4', ('rev3', 'rev2b'))
167
def test_add_existing_node_mismatched_parents(self):
168
graph = self.make_known_graph(test_graph.ancestry_1)
169
self.assertRaises(ValueError, graph.add_node, 'rev4',
172
def test_add_node_with_ghost_parent(self):
173
graph = self.make_known_graph(test_graph.ancestry_1)
174
graph.add_node('rev5', ['rev2b', 'revGhost'])
175
self.assertGDFO(graph, 'rev5', 4)
176
self.assertGDFO(graph, 'revGhost', 1)
178
def test_add_new_root(self):
179
graph = self.make_known_graph(test_graph.ancestry_1)
180
graph.add_node('rev5', [])
181
self.assertGDFO(graph, 'rev5', 1)
183
def test_add_with_all_ghost_parents(self):
184
graph = self.make_known_graph(test_graph.ancestry_1)
185
graph.add_node('rev5', ['ghost'])
186
self.assertGDFO(graph, 'rev5', 2)
187
self.assertGDFO(graph, 'ghost', 1)
189
def test_gdfo_after_add_node(self):
190
graph = self.make_known_graph(test_graph.ancestry_1)
191
self.assertEqual([], graph.get_child_keys('rev4'))
192
graph.add_node('rev5', ['rev4'])
193
self.assertEqual(['rev4'], graph.get_parent_keys('rev5'))
194
self.assertEqual(['rev5'], graph.get_child_keys('rev4'))
195
self.assertEqual([], graph.get_child_keys('rev5'))
196
self.assertGDFO(graph, 'rev5', 6)
197
graph.add_node('rev6', ['rev2b'])
198
graph.add_node('rev7', ['rev6'])
199
graph.add_node('rev8', ['rev7', 'rev5'])
200
self.assertGDFO(graph, 'rev5', 6)
201
self.assertGDFO(graph, 'rev6', 4)
202
self.assertGDFO(graph, 'rev7', 5)
203
self.assertGDFO(graph, 'rev8', 7)
205
def test_fill_in_ghost(self):
206
graph = self.make_known_graph(test_graph.with_ghost)
207
# Add in a couple nodes and then fill in the 'ghost' so that it should
208
# cause renumbering of children nodes
209
graph.add_node('x', [])
210
graph.add_node('y', ['x'])
211
graph.add_node('z', ['y'])
212
graph.add_node('g', ['z'])
213
self.assertGDFO(graph, 'f', 2)
214
self.assertGDFO(graph, 'e', 3)
215
self.assertGDFO(graph, 'x', 1)
216
self.assertGDFO(graph, 'y', 2)
217
self.assertGDFO(graph, 'z', 3)
218
self.assertGDFO(graph, 'g', 4)
219
self.assertGDFO(graph, 'b', 4)
220
self.assertGDFO(graph, 'd', 5)
221
self.assertGDFO(graph, 'a', 5)
222
self.assertGDFO(graph, 'c', 6)
143
225
class TestKnownGraphHeads(TestCaseWithKnownGraph):
245
327
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'e', 'g']))
246
328
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'f']))
330
def test_filling_in_ghosts_resets_head_cache(self):
331
graph = self.make_known_graph(test_graph.with_ghost)
332
self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
333
# 'g' is filled in, and decends from 'e', so the heads result is now
335
graph.add_node('g', ['e'])
336
self.assertEqual(set(['g']), graph.heads(['e', 'g']))
249
339
class TestKnownGraphTopoSort(TestCaseWithKnownGraph):