85
85
(8, [0, 1, 4, 5, 6])]),
86
86
[0, 1, 2, 3, 4, 5, 6, 7, 8])
88
def test_tsort_unincluded_parent(self):
89
"""Sort nodes, but don't include some parents in the output"""
90
self.assertSortAndIterate([(0, [1]),
89
95
class MergeSortTests(TestCase):
91
97
def assertSortAndIterate(self, graph, branch_tip, result_list,
92
mainline_revisions=None):
98
generate_revno, mainline_revisions=None):
93
99
"""Check that merge based sorting and iter_topo_order on graph works."""
94
100
self.assertEquals(result_list,
95
merge_sort(graph, branch_tip, mainline_revisions=mainline_revisions))
101
merge_sort(graph, branch_tip, mainline_revisions=mainline_revisions,
102
generate_revno=generate_revno))
96
103
self.assertEqual(result_list,
100
mainline_revisions=mainline_revisions).iter_topo_order()))
107
mainline_revisions=mainline_revisions,
108
generate_revno=generate_revno,
109
).iter_topo_order()))
102
111
def test_merge_sort_empty(self):
103
112
# sorting of an emptygraph does not error
104
self.assertSortAndIterate({}, None, [])
113
self.assertSortAndIterate({}, None, [], False)
114
self.assertSortAndIterate({}, None, [], True)
106
116
def test_merge_sort_not_empty_no_tip(self):
107
117
# merge sorting of a branch starting with None should result
108
118
# in an empty list: no revisions are dragged in.
109
self.assertSortAndIterate({0: []}.items(), None, [])
119
self.assertSortAndIterate({0: []}.items(), None, [], False)
120
self.assertSortAndIterate({0: []}.items(), None, [], True)
111
122
def test_merge_sort_one_revision(self):
112
123
# sorting with one revision as the tip returns the correct fields:
113
124
# sequence - 0, revision id, merge depth - 0, end_of_merge
114
125
self.assertSortAndIterate({'id': []}.items(),
116
[(0, 'id', 0, True)])
127
[(0, 'id', 0, True)],
129
self.assertSortAndIterate({'id': []}.items(),
131
[(0, 'id', 0, (1,), True)],
118
134
def test_sequence_numbers_increase_no_merges(self):
119
135
# emit a few revisions with no merges to check the sequence
139
167
[(0, 'C', 0, False),
140
168
(1, 'B', 1, True),
141
169
(2, 'A', 0, True),
173
self.assertSortAndIterate(
176
'C': ['A', 'B']}.items(),
178
[(0, 'C', 0, (2,), False),
179
(1, 'B', 1, (1,1,1), True),
180
(2, 'A', 0, (1,), True),
145
185
def test_merge_depth_with_nested_merges(self):
173
213
(5, 'F', 2, True),
174
214
(6, 'G', 1, True),
175
215
(7, 'H', 0, True),
219
self.assertSortAndIterate(
230
[(0, 'A', 0, (3,), False),
231
(1, 'B', 1, (1,2,2), False),
232
(2, 'C', 1, (1,2,1), True),
233
(3, 'D', 0, (2,), False),
234
(4, 'E', 1, (1,1,2), False),
235
(5, 'F', 2, (1,1,1,1,1), True),
236
(6, 'G', 1, (1,1,1), True),
237
(7, 'H', 0, (1,), True),
179
242
def test_end_of_merge_not_last_revision_in_branch(self):
222
296
(5, 'F', 2, True),
223
297
(6, 'G', 1, True),
224
298
(7, 'H', 0, True),
302
self.assertSortAndIterate(
303
{'A': ['H', 'B', 'E'],
313
[(0, 'A', 0, (2,), False),
314
(1, 'B', 1, (1,2,2), False),
315
(2, 'C', 2, (1,2,1,1,1), True),
316
(3, 'D', 1, (1,2,1), True),
317
(4, 'E', 1, (1,1,2), False),
318
(5, 'F', 2, (1,1,1,1,1), True),
319
(6, 'G', 1, (1,1,1), True),
320
(7, 'H', 0, (1,), True),
228
325
def test_mainline_revs_partial(self):
264
362
(1, 'B', 0, False),
265
363
(2, 'C', 1, True),
366
mainline_revisions=['D', 'B', 'A']
368
self.assertSortAndIterate(
376
[(0, 'A', 0, (4,), False),
377
(1, 'B', 0, (3,), False),
378
(2, 'C', 1, (2,1,1), True),
267
381
mainline_revisions=['D', 'B', 'A']
277
391
[(0, 'A', 0, True),
394
mainline_revisions=[None, 'A']
396
self.assertSortAndIterate(
400
[(0, 'A', 0, (1,), True),
279
403
mainline_revisions=[None, 'A']
406
def test_parallel_root_sequence_numbers_increase_with_merges(self):
407
"""When there are parallel roots, check their revnos."""
408
self.assertSortAndIterate(
411
'C': ['A', 'B']}.items(),
413
[(0, 'C', 0, (2,), False),
414
(1, 'B', 1, (0,1,1), True),
415
(2, 'A', 0, (1,), True),
420
def test_revnos_are_globally_assigned(self):
421
"""revnos are assigned according to the revision they derive from."""
422
# in this test we setup a number of branches that all derive from
423
# the first revision, and then merge them one at a time, which
424
# should give the revisions as they merge numbers still deriving from
425
# the revision were based on.
426
# merge 3: J: ['G', 'I']
430
# merge 2: G: ['D', 'F']
434
# merge 1: D: ['A', 'C']
439
self.assertSortAndIterate(
452
[(0, 'J', 0, (4,), False),
453
(1, 'I', 1, (1,3,2), False),
454
(2, 'H', 1, (1,3,1), True),
455
(3, 'G', 0, (3,), False),
456
(4, 'F', 1, (1,2,2), False),
457
(5, 'E', 1, (1,2,1), True),
458
(6, 'D', 0, (2,), False),
459
(7, 'C', 1, (1,1,2), False),
460
(8, 'B', 1, (1,1,1), True),
461
(9, 'A', 0, (1,), True),