1253
1253
['h', 'i', 'j', 'y'], 'j', ['z'])
1256
class TestGraphFindRevno(TestGraphBase):
1256
class TestGraphFindDistanceToNull(TestGraphBase):
1257
1257
"""Test an api that should be able to compute a revno"""
1259
def assertFindRevno(self, revno, graph, target_id, known_ids):
1260
"""Assert the output of Graph.find_revno()"""
1261
actual = graph.find_revno(target_id, known_ids)
1259
def assertFindDistance(self, revno, graph, target_id, known_ids):
1260
"""Assert the output of Graph.find_distance_to_null()"""
1261
actual = graph.find_distance_to_null(target_id, known_ids)
1262
1262
self.assertEqual(revno, actual)
1264
1264
def test_nothing_known(self):
1265
1265
graph = self.make_graph(ancestry_1)
1266
self.assertFindRevno(0, graph, NULL_REVISION, [])
1267
self.assertFindRevno(1, graph, 'rev1', [])
1268
self.assertFindRevno(2, graph, 'rev2a', [])
1269
self.assertFindRevno(2, graph, 'rev2b', [])
1270
self.assertFindRevno(3, graph, 'rev3', [])
1271
self.assertFindRevno(4, graph, 'rev4', [])
1266
self.assertFindDistance(0, graph, NULL_REVISION, [])
1267
self.assertFindDistance(1, graph, 'rev1', [])
1268
self.assertFindDistance(2, graph, 'rev2a', [])
1269
self.assertFindDistance(2, graph, 'rev2b', [])
1270
self.assertFindDistance(3, graph, 'rev3', [])
1271
self.assertFindDistance(4, graph, 'rev4', [])
1273
1273
def test_rev_is_ghost(self):
1274
1274
graph = self.make_graph(ancestry_1)
1275
1275
e = self.assertRaises(errors.GhostRevisionsHaveNoRevno,
1276
graph.find_revno, 'rev_missing', [])
1276
graph.find_distance_to_null, 'rev_missing', [])
1277
1277
self.assertEqual('rev_missing', e.revision_id)
1278
1278
self.assertEqual('rev_missing', e.ghost_revision_id)
1280
1280
def test_ancestor_is_ghost(self):
1281
1281
graph = self.make_graph({'rev':['parent']})
1282
1282
e = self.assertRaises(errors.GhostRevisionsHaveNoRevno,
1283
graph.find_revno, 'rev', [])
1283
graph.find_distance_to_null, 'rev', [])
1284
1284
self.assertEqual('rev', e.revision_id)
1285
1285
self.assertEqual('parent', e.ghost_revision_id)
1287
1287
def test_known_in_ancestry(self):
1288
1288
graph = self.make_graph(ancestry_1)
1289
self.assertFindRevno(2, graph, 'rev2a', [('rev1', 1)])
1290
self.assertFindRevno(3, graph, 'rev3', [('rev2a', 2)])
1289
self.assertFindDistance(2, graph, 'rev2a', [('rev1', 1)])
1290
self.assertFindDistance(3, graph, 'rev3', [('rev2a', 2)])
1292
1292
def test_known_in_ancestry_limits(self):
1293
1293
graph = self.make_breaking_graph(ancestry_1, ['rev1'])
1294
self.assertFindRevno(4, graph, 'rev4', [('rev3', 3)])
1294
self.assertFindDistance(4, graph, 'rev4', [('rev3', 3)])
1296
1296
def test_target_is_ancestor(self):
1297
1297
graph = self.make_graph(ancestry_1)
1298
self.assertFindRevno(2, graph, 'rev2a', [('rev3', 3)])
1298
self.assertFindDistance(2, graph, 'rev2a', [('rev3', 3)])
1300
1300
def test_target_is_ancestor_limits(self):
1301
1301
"""We shouldn't search all history if we run into ourselves"""
1302
1302
graph = self.make_breaking_graph(ancestry_1, ['rev1'])
1303
self.assertFindRevno(3, graph, 'rev3', [('rev4', 4)])
1303
self.assertFindDistance(3, graph, 'rev3', [('rev4', 4)])
1305
1305
def test_target_parallel_to_known_limits(self):
1306
1306
# Even though the known revision isn't part of the other ancestry, the
1307
1307
# eventually converge
1308
1308
graph = self.make_breaking_graph(with_tail, ['a'])
1309
self.assertFindRevno(6, graph, 'f', [('g', 6)])
1310
self.assertFindRevno(7, graph, 'h', [('g', 6)])
1311
self.assertFindRevno(8, graph, 'i', [('g', 6)])
1312
self.assertFindRevno(6, graph, 'g', [('i', 8)])
1309
self.assertFindDistance(6, graph, 'f', [('g', 6)])
1310
self.assertFindDistance(7, graph, 'h', [('g', 6)])
1311
self.assertFindDistance(8, graph, 'i', [('g', 6)])
1312
self.assertFindDistance(6, graph, 'g', [('i', 8)])
1315
1315
class TestCachingParentsProvider(tests.TestCase):