217
217
def test_heads_null(self):
218
218
graph = self.make_known_graph(test_graph.ancestry_1)
219
self.assertEqual({'null:'}, graph.heads(['null:']))
220
self.assertEqual({'rev1'}, graph.heads(['null:', 'rev1']))
221
self.assertEqual({'rev1'}, graph.heads(['rev1', 'null:']))
222
self.assertEqual({'rev1'}, graph.heads({'rev1', 'null:'}))
223
self.assertEqual({'rev1'}, graph.heads(('rev1', 'null:')))
219
self.assertEqual(set(['null:']), graph.heads(['null:']))
220
self.assertEqual(set(['rev1']), graph.heads(['null:', 'rev1']))
221
self.assertEqual(set(['rev1']), graph.heads(['rev1', 'null:']))
222
self.assertEqual(set(['rev1']), graph.heads(set(['rev1', 'null:'])))
223
self.assertEqual(set(['rev1']), graph.heads(('rev1', 'null:')))
225
225
def test_heads_one(self):
226
226
# A single node will always be a head
227
227
graph = self.make_known_graph(test_graph.ancestry_1)
228
self.assertEqual({'null:'}, graph.heads(['null:']))
229
self.assertEqual({'rev1'}, graph.heads(['rev1']))
230
self.assertEqual({'rev2a'}, graph.heads(['rev2a']))
231
self.assertEqual({'rev2b'}, graph.heads(['rev2b']))
232
self.assertEqual({'rev3'}, graph.heads(['rev3']))
233
self.assertEqual({'rev4'}, graph.heads(['rev4']))
228
self.assertEqual(set(['null:']), graph.heads(['null:']))
229
self.assertEqual(set(['rev1']), graph.heads(['rev1']))
230
self.assertEqual(set(['rev2a']), graph.heads(['rev2a']))
231
self.assertEqual(set(['rev2b']), graph.heads(['rev2b']))
232
self.assertEqual(set(['rev3']), graph.heads(['rev3']))
233
self.assertEqual(set(['rev4']), graph.heads(['rev4']))
235
235
def test_heads_single(self):
236
236
graph = self.make_known_graph(test_graph.ancestry_1)
237
self.assertEqual({'rev4'}, graph.heads(['null:', 'rev4']))
238
self.assertEqual({'rev2a'}, graph.heads(['rev1', 'rev2a']))
239
self.assertEqual({'rev2b'}, graph.heads(['rev1', 'rev2b']))
240
self.assertEqual({'rev3'}, graph.heads(['rev1', 'rev3']))
241
self.assertEqual({'rev3'}, graph.heads(['rev3', 'rev2a']))
242
self.assertEqual({'rev4'}, graph.heads(['rev1', 'rev4']))
243
self.assertEqual({'rev4'}, graph.heads(['rev2a', 'rev4']))
244
self.assertEqual({'rev4'}, graph.heads(['rev2b', 'rev4']))
245
self.assertEqual({'rev4'}, graph.heads(['rev3', 'rev4']))
237
self.assertEqual(set(['rev4']), graph.heads(['null:', 'rev4']))
238
self.assertEqual(set(['rev2a']), graph.heads(['rev1', 'rev2a']))
239
self.assertEqual(set(['rev2b']), graph.heads(['rev1', 'rev2b']))
240
self.assertEqual(set(['rev3']), graph.heads(['rev1', 'rev3']))
241
self.assertEqual(set(['rev3']), graph.heads(['rev3', 'rev2a']))
242
self.assertEqual(set(['rev4']), graph.heads(['rev1', 'rev4']))
243
self.assertEqual(set(['rev4']), graph.heads(['rev2a', 'rev4']))
244
self.assertEqual(set(['rev4']), graph.heads(['rev2b', 'rev4']))
245
self.assertEqual(set(['rev4']), graph.heads(['rev3', 'rev4']))
247
247
def test_heads_two_heads(self):
248
248
graph = self.make_known_graph(test_graph.ancestry_1)
249
self.assertEqual({'rev2a', 'rev2b'},
249
self.assertEqual(set(['rev2a', 'rev2b']),
250
250
graph.heads(['rev2a', 'rev2b']))
251
self.assertEqual({'rev3', 'rev2b'},
251
self.assertEqual(set(['rev3', 'rev2b']),
252
252
graph.heads(['rev3', 'rev2b']))
254
254
def test_heads_criss_cross(self):
255
255
graph = self.make_known_graph(test_graph.criss_cross)
256
self.assertEqual({'rev2a'},
256
self.assertEqual(set(['rev2a']),
257
257
graph.heads(['rev2a', 'rev1']))
258
self.assertEqual({'rev2b'},
258
self.assertEqual(set(['rev2b']),
259
259
graph.heads(['rev2b', 'rev1']))
260
self.assertEqual({'rev3a'},
260
self.assertEqual(set(['rev3a']),
261
261
graph.heads(['rev3a', 'rev1']))
262
self.assertEqual({'rev3b'},
262
self.assertEqual(set(['rev3b']),
263
263
graph.heads(['rev3b', 'rev1']))
264
self.assertEqual({'rev2a', 'rev2b'},
264
self.assertEqual(set(['rev2a', 'rev2b']),
265
265
graph.heads(['rev2a', 'rev2b']))
266
self.assertEqual({'rev3a'},
266
self.assertEqual(set(['rev3a']),
267
267
graph.heads(['rev3a', 'rev2a']))
268
self.assertEqual({'rev3a'},
268
self.assertEqual(set(['rev3a']),
269
269
graph.heads(['rev3a', 'rev2b']))
270
self.assertEqual({'rev3a'},
270
self.assertEqual(set(['rev3a']),
271
271
graph.heads(['rev3a', 'rev2a', 'rev2b']))
272
self.assertEqual({'rev3b'},
272
self.assertEqual(set(['rev3b']),
273
273
graph.heads(['rev3b', 'rev2a']))
274
self.assertEqual({'rev3b'},
274
self.assertEqual(set(['rev3b']),
275
275
graph.heads(['rev3b', 'rev2b']))
276
self.assertEqual({'rev3b'},
276
self.assertEqual(set(['rev3b']),
277
277
graph.heads(['rev3b', 'rev2a', 'rev2b']))
278
self.assertEqual({'rev3a', 'rev3b'},
278
self.assertEqual(set(['rev3a', 'rev3b']),
279
279
graph.heads(['rev3a', 'rev3b']))
280
self.assertEqual({'rev3a', 'rev3b'},
280
self.assertEqual(set(['rev3a', 'rev3b']),
281
281
graph.heads(['rev3a', 'rev3b', 'rev2a', 'rev2b']))
283
283
def test_heads_shortcut(self):
284
284
graph = self.make_known_graph(test_graph.history_shortcut)
285
self.assertEqual({'rev2a', 'rev2b', 'rev2c'},
285
self.assertEqual(set(['rev2a', 'rev2b', 'rev2c']),
286
286
graph.heads(['rev2a', 'rev2b', 'rev2c']))
287
self.assertEqual({'rev3a', 'rev3b'},
287
self.assertEqual(set(['rev3a', 'rev3b']),
288
288
graph.heads(['rev3a', 'rev3b']))
289
self.assertEqual({'rev3a', 'rev3b'},
289
self.assertEqual(set(['rev3a', 'rev3b']),
290
290
graph.heads(['rev2a', 'rev3a', 'rev3b']))
291
self.assertEqual({'rev2a', 'rev3b'},
291
self.assertEqual(set(['rev2a', 'rev3b']),
292
292
graph.heads(['rev2a', 'rev3b']))
293
self.assertEqual({'rev2c', 'rev3a'},
293
self.assertEqual(set(['rev2c', 'rev3a']),
294
294
graph.heads(['rev2c', 'rev3a']))
296
296
def test_heads_linear(self):
297
297
graph = self.make_known_graph(test_graph.racing_shortcuts)
298
self.assertEqual({'w'}, graph.heads(['w', 's']))
299
self.assertEqual({'z'}, graph.heads(['w', 's', 'z']))
300
self.assertEqual({'w', 'q'}, graph.heads(['w', 's', 'q']))
301
self.assertEqual({'z'}, graph.heads(['s', 'z']))
298
self.assertEqual(set(['w']), graph.heads(['w', 's']))
299
self.assertEqual(set(['z']), graph.heads(['w', 's', 'z']))
300
self.assertEqual(set(['w', 'q']), graph.heads(['w', 's', 'q']))
301
self.assertEqual(set(['z']), graph.heads(['s', 'z']))
303
303
def test_heads_alt_merge(self):
304
304
graph = self.make_known_graph(alt_merge)
305
self.assertEqual({'c'}, graph.heads(['a', 'c']))
305
self.assertEqual(set(['c']), graph.heads(['a', 'c']))
307
307
def test_heads_with_ghost(self):
308
308
graph = self.make_known_graph(test_graph.with_ghost)
309
self.assertEqual({'e', 'g'}, graph.heads(['e', 'g']))
310
self.assertEqual({'a', 'c'}, graph.heads(['a', 'c']))
311
self.assertEqual({'a', 'g'}, graph.heads(['a', 'g']))
312
self.assertEqual({'f', 'g'}, graph.heads(['f', 'g']))
313
self.assertEqual({'c'}, graph.heads(['c', 'g']))
314
self.assertEqual({'c'}, graph.heads(['c', 'b', 'd', 'g']))
315
self.assertEqual({'a', 'c'}, graph.heads(['a', 'c', 'e', 'g']))
316
self.assertEqual({'a', 'c'}, graph.heads(['a', 'c', 'f']))
309
self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
310
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c']))
311
self.assertEqual(set(['a', 'g']), graph.heads(['a', 'g']))
312
self.assertEqual(set(['f', 'g']), graph.heads(['f', 'g']))
313
self.assertEqual(set(['c']), graph.heads(['c', 'g']))
314
self.assertEqual(set(['c']), graph.heads(['c', 'b', 'd', 'g']))
315
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'e', 'g']))
316
self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'f']))
318
318
def test_filling_in_ghosts_resets_head_cache(self):
319
319
graph = self.make_known_graph(test_graph.with_ghost)
320
self.assertEqual({'e', 'g'}, graph.heads(['e', 'g']))
320
self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
321
321
# 'g' is filled in, and decends from 'e', so the heads result is now
323
323
graph.add_node('g', ['e'])
324
self.assertEqual({'g'}, graph.heads(['e', 'g']))
324
self.assertEqual(set(['g']), graph.heads(['e', 'g']))
327
327
class TestKnownGraphTopoSort(TestCaseWithKnownGraph):
773
773
[('R', 0, (6,), False),
774
('Q', 1, (0, 4, 5), False),
775
('P', 2, (0, 6, 1), True),
776
('O', 1, (0, 4, 4), False),
777
('N', 1, (0, 4, 3), False),
778
('M', 2, (0, 5, 1), True),
779
('L', 1, (0, 4, 2), False),
780
('K', 1, (0, 4, 1), True),
774
('Q', 1, (0,4,5), False),
775
('P', 2, (0,6,1), True),
776
('O', 1, (0,4,4), False),
777
('N', 1, (0,4,3), False),
778
('M', 2, (0,5,1), True),
779
('L', 1, (0,4,2), False),
780
('K', 1, (0,4,1), True),
781
781
('J', 0, (5,), False),
782
('I', 1, (0, 3, 1), True),
782
('I', 1, (0,3,1), True),
783
783
('H', 0, (4,), False),
784
('G', 1, (0, 1, 3), False),
785
('F', 2, (0, 2, 1), True),
786
('E', 1, (0, 1, 2), False),
787
('D', 1, (0, 1, 1), True),
784
('G', 1, (0,1,3), False),
785
('F', 2, (0,2,1), True),
786
('E', 1, (0,1,2), False),
787
('D', 1, (0,1,1), True),
788
788
('C', 0, (3,), False),
789
789
('B', 0, (2,), False),
790
790
('A', 0, (1,), True),