140
141
except NotImplementedError:
144
def test_add_reserved(self):
146
self.assertRaises(errors.ReservedId,
147
vf.add_lines, 'a:', [], ['a\n', 'b\n', 'c\n'])
149
self.assertRaises(errors.ReservedId,
150
vf.add_delta, 'a:', [], None, 'sha1', False, ((0, 0, 0, []),))
152
def test_get_reserved(self):
154
self.assertRaises(errors.ReservedId, vf.get_delta, 'b:')
155
self.assertRaises(errors.ReservedId, vf.get_texts, ['b:'])
156
self.assertRaises(errors.ReservedId, vf.get_lines, 'b:')
157
self.assertRaises(errors.ReservedId, vf.get_text, 'b:')
143
159
def test_get_delta(self):
144
160
f = self.get_file()
145
161
sha1s = self._setup_for_deltas(f)
198
214
self.assertEqual(expected_delta, deltas['noeol'])
199
215
# smoke tests for eol support - two noeol in a row same content
200
216
expected_deltas = (('noeol', '3ad7ee82dbd8f29ecba073f96e43e414b3f70a4d', True,
201
[(0, 1, 2, [(u'noeolsecond', 'line\n'), (u'noeolsecond', 'line\n')])]),
217
[(0, 1, 2, [('noeolsecond', 'line\n'), ('noeolsecond', 'line\n')])]),
202
218
('noeol', '3ad7ee82dbd8f29ecba073f96e43e414b3f70a4d', True,
203
219
[(0, 0, 1, [('noeolsecond', 'line\n')]), (1, 1, 0, [])]))
204
220
self.assertEqual(['line\n', 'line'], f.get_lines('noeolsecond'))
205
221
self.assertTrue(deltas['noeolsecond'] in expected_deltas)
206
222
# two no-eol in a row, different content
207
223
expected_delta = ('noeolsecond', '8bb553a84e019ef1149db082d65f3133b195223b', True,
208
[(1, 2, 1, [(u'noeolnotshared', 'phone\n')])])
224
[(1, 2, 1, [('noeolnotshared', 'phone\n')])])
209
225
self.assertEqual(['line\n', 'phone'], f.get_lines('noeolnotshared'))
210
226
self.assertEqual(expected_delta, deltas['noeolnotshared'])
211
227
# eol folling a no-eol with content change
212
228
expected_delta = ('noeol', 'a61f6fb6cfc4596e8d88c34a308d1e724caf8977', False,
213
[(0, 1, 1, [(u'eol', 'phone\n')])])
229
[(0, 1, 1, [('eol', 'phone\n')])])
214
230
self.assertEqual(['phone\n'], f.get_lines('eol'))
215
231
self.assertEqual(expected_delta, deltas['eol'])
216
232
# eol folling a no-eol with content change
217
233
expected_delta = ('noeol', '6bfa09d82ce3e898ad4641ae13dd4fdb9cf0d76b', False,
218
[(0, 1, 1, [(u'eolline', 'line\n')])])
234
[(0, 1, 1, [('eolline', 'line\n')])])
219
235
self.assertEqual(['line\n'], f.get_lines('eolline'))
220
236
self.assertEqual(expected_delta, deltas['eolline'])
221
237
# eol with no parents
222
238
expected_delta = (None, '264f39cab871e4cfd65b3a002f7255888bb5ed97', True,
223
[(0, 0, 1, [(u'noeolbase', 'line\n')])])
239
[(0, 0, 1, [('noeolbase', 'line\n')])])
224
240
self.assertEqual(['line'], f.get_lines('noeolbase'))
225
241
self.assertEqual(expected_delta, deltas['noeolbase'])
226
242
# eol with two parents, in inverse insertion order
227
243
expected_deltas = (('noeolbase', '264f39cab871e4cfd65b3a002f7255888bb5ed97', True,
228
[(0, 1, 1, [(u'eolbeforefirstparent', 'line\n')])]),
244
[(0, 1, 1, [('eolbeforefirstparent', 'line\n')])]),
229
245
('noeolbase', '264f39cab871e4cfd65b3a002f7255888bb5ed97', True,
230
[(0, 1, 1, [(u'eolbeforefirstparent', 'line\n')])]))
246
[(0, 1, 1, [('eolbeforefirstparent', 'line\n')])]))
231
247
self.assertEqual(['line'], f.get_lines('eolbeforefirstparent'))
232
248
#self.assertTrue(deltas['eolbeforefirstparent'] in expected_deltas)
586
605
if []!= progress.updates:
587
606
self.assertEqual(expected, progress.updates)
589
lines = iter_with_versions(['child', 'otherchild'],
590
[('Walking content.', 0, 2),
591
('Walking content.', 0, 2),
592
('Walking content.', 3, 2),
608
lines = iter_with_versions(['child', 'otherchild'],
609
[('Walking content.', 0, 2),
610
('Walking content.', 1, 2),
593
611
('Walking content.', 2, 2)])
594
612
# we must see child and otherchild
595
613
self.assertTrue(lines['child\n'] > 0)
597
615
# we dont care if we got more than that.
600
lines = iter_with_versions(None, [('Walking content.', 0, 5),
601
('Walking content.', 0, 5),
602
('Walking content.', 1, 5),
603
('Walking content.', 2, 5),
604
('Walking content.', 2, 5),
605
('Walking content.', 3, 5),
618
lines = iter_with_versions(None, [('Walking content.', 0, 5),
619
('Walking content.', 1, 5),
620
('Walking content.', 2, 5),
621
('Walking content.', 3, 5),
622
('Walking content.', 4, 5),
606
623
('Walking content.', 5, 5)])
607
624
# all lines must be seen at least once
608
625
self.assertTrue(lines['base\n'] > 0)
664
684
self.assertRaises(NotImplementedError, vf.get_parents_with_ghosts, 'foo')
665
685
self.assertRaises(NotImplementedError, vf.get_graph_with_ghosts)
687
vf = self.reopen_file()
667
688
# test key graph related apis: getncestry, _graph, get_parents
669
690
# - these are ghost unaware and must not be reflect ghosts
670
self.assertEqual([u'notbxbfse'], vf.get_ancestry(u'notbxbfse'))
671
self.assertEqual([], vf.get_parents(u'notbxbfse'))
672
self.assertEqual({u'notbxbfse':[]}, vf.get_graph())
673
self.assertFalse(vf.has_version(u'b\xbfse'))
691
self.assertEqual(['notbxbfse'], vf.get_ancestry('notbxbfse'))
692
self.assertEqual([], vf.get_parents('notbxbfse'))
693
self.assertEqual({'notbxbfse':[]}, vf.get_graph())
694
self.assertFalse(self.callDeprecated([osutils._revision_id_warning],
695
vf.has_version, parent_id_unicode))
696
self.assertFalse(vf.has_version(parent_id_utf8))
674
697
# we have _with_ghost apis to give us ghost information.
675
self.assertEqual([u'b\xbfse', u'notbxbfse'], vf.get_ancestry_with_ghosts([u'notbxbfse']))
676
self.assertEqual([u'b\xbfse'], vf.get_parents_with_ghosts(u'notbxbfse'))
677
self.assertEqual({u'notbxbfse':[u'b\xbfse']}, vf.get_graph_with_ghosts())
678
self.assertTrue(vf.has_ghost(u'b\xbfse'))
698
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry_with_ghosts(['notbxbfse']))
699
self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
700
self.assertEqual({'notbxbfse':[parent_id_utf8]}, vf.get_graph_with_ghosts())
701
self.assertTrue(self.callDeprecated([osutils._revision_id_warning],
702
vf.has_ghost, parent_id_unicode))
703
self.assertTrue(vf.has_ghost(parent_id_utf8))
679
704
# if we add something that is a ghost of another, it should correct the
680
705
# results of the prior apis
681
vf.add_lines(u'b\xbfse', [], [])
682
self.assertEqual([u'b\xbfse', u'notbxbfse'], vf.get_ancestry([u'notbxbfse']))
683
self.assertEqual([u'b\xbfse'], vf.get_parents(u'notbxbfse'))
684
self.assertEqual({u'b\xbfse':[],
685
u'notbxbfse':[u'b\xbfse'],
706
self.callDeprecated([osutils._revision_id_warning],
707
vf.add_lines, parent_id_unicode, [], [])
708
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry(['notbxbfse']))
709
self.assertEqual([parent_id_utf8], vf.get_parents('notbxbfse'))
710
self.assertEqual({parent_id_utf8:[],
711
'notbxbfse':[parent_id_utf8],
688
self.assertTrue(vf.has_version(u'b\xbfse'))
714
self.assertTrue(self.callDeprecated([osutils._revision_id_warning],
715
vf.has_version, parent_id_unicode))
716
self.assertTrue(vf.has_version(parent_id_utf8))
689
717
# we have _with_ghost apis to give us ghost information.
690
self.assertEqual([u'b\xbfse', u'notbxbfse'], vf.get_ancestry_with_ghosts([u'notbxbfse']))
691
self.assertEqual([u'b\xbfse'], vf.get_parents_with_ghosts(u'notbxbfse'))
692
self.assertEqual({u'b\xbfse':[],
693
u'notbxbfse':[u'b\xbfse'],
718
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry_with_ghosts(['notbxbfse']))
719
self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
720
self.assertEqual({parent_id_utf8:[],
721
'notbxbfse':[parent_id_utf8],
695
723
vf.get_graph_with_ghosts())
696
self.assertFalse(vf.has_ghost(u'b\xbfse'))
724
self.assertFalse(self.callDeprecated([osutils._revision_id_warning],
725
vf.has_ghost, parent_id_unicode))
726
self.assertFalse(vf.has_ghost(parent_id_utf8))
698
728
def test_add_lines_with_ghosts_after_normal_revs(self):
699
729
# some versioned file formats allow lines to be added with parent