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