~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_versionedfile.py

  • Committer: Robert Collins
  • Date: 2007-07-04 08:08:13 UTC
  • mfrom: (2572 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2587.
  • Revision ID: robertc@robertcollins.net-20070704080813-wzebx0r88fvwj5rq
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
3
3
# Authors:
4
4
#   Johan Rydberg <jrydberg@gnu.org>
26
26
import bzrlib
27
27
from bzrlib import (
28
28
    errors,
 
29
    osutils,
29
30
    progress,
30
31
    )
31
32
from bzrlib.errors import (
140
141
        except NotImplementedError:
141
142
            pass
142
143
 
 
144
    def test_add_reserved(self):
 
145
        vf = self.get_file()
 
146
        self.assertRaises(errors.ReservedId,
 
147
            vf.add_lines, 'a:', [], ['a\n', 'b\n', 'c\n'])
 
148
 
 
149
        self.assertRaises(errors.ReservedId,
 
150
            vf.add_delta, 'a:', [], None, 'sha1', False, ((0, 0, 0, []),))
 
151
 
 
152
    def test_get_reserved(self):
 
153
        vf = self.get_file()
 
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:')
 
158
 
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)
233
249
 
368
384
        self.assertRaises(RevisionNotPresent,
369
385
            f.get_ancestry, ['rM', 'rX'])
370
386
 
 
387
        self.assertEqual(set(f.get_ancestry('rM')),
 
388
            set(f.get_ancestry('rM', topo_sorted=False)))
 
389
 
371
390
    def test_mutate_after_finish(self):
372
391
        f = self.get_file()
373
392
        f.transaction_finished()
586
605
            if []!= progress.updates: 
587
606
                self.assertEqual(expected, progress.updates)
588
607
            return lines
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.
598
616
        
599
617
        # test all lines
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)
655
672
        # add_lines_with_ghosts api.
656
673
        vf = self.get_file()
657
674
        # add a revision with ghost parents
 
675
        # The preferred form is utf8, but we should translate when needed
 
676
        parent_id_unicode = u'b\xbfse'
 
677
        parent_id_utf8 = parent_id_unicode.encode('utf8')
658
678
        try:
659
 
            vf.add_lines_with_ghosts(u'notbxbfse', [u'b\xbfse'], [])
 
679
            vf.add_lines_with_ghosts('notbxbfse', [parent_id_utf8], [])
660
680
        except NotImplementedError:
661
681
            # check the other ghost apis are also not implemented
662
682
            self.assertRaises(NotImplementedError, vf.has_ghost, 'foo')
664
684
            self.assertRaises(NotImplementedError, vf.get_parents_with_ghosts, 'foo')
665
685
            self.assertRaises(NotImplementedError, vf.get_graph_with_ghosts)
666
686
            return
 
687
        vf = self.reopen_file()
667
688
        # test key graph related apis: getncestry, _graph, get_parents
668
689
        # has_version
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],
686
712
                          },
687
713
                         vf.get_graph())
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],
694
722
                          },
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))
697
727
 
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