154
154
self.assertGDFO(graph, 'a', 5)
155
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)
158
225
class TestKnownGraphHeads(TestCaseWithKnownGraph):
260
327
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'e', 'g']))
261
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']))
264
339
class TestKnownGraphTopoSort(TestCaseWithKnownGraph):