~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_versionedfile.py

  • Committer: Robert Collins
  • Date: 2006-03-02 01:26:22 UTC
  • mto: (1594.2.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1596.
  • Revision ID: robertc@robertcollins.net-20060302012622-6d1d0b92fe94d9be
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
                           )
31
31
from bzrlib.knit import KnitVersionedFile, \
32
32
     KnitAnnotateFactory
33
 
from bzrlib.tests import TestCaseInTempDir
 
33
from bzrlib.tests import TestCaseWithTransport
34
34
from bzrlib.trace import mutter
35
35
from bzrlib.transport.local import LocalTransport
 
36
import bzrlib.versionedfile as versionedfile
36
37
from bzrlib.weave import WeaveFile
37
38
from bzrlib.weavefile import read_weave
38
39
 
126
127
        self.assertRaises(RevisionNotPresent,
127
128
            f.annotate, 'foo')
128
129
 
129
 
    def test_join(self):
130
 
        f1 = self.get_file('1')
131
 
        f1.add_lines('r0', [], ['a\n', 'b\n'])
132
 
        f1.add_lines('r1', ['r0'], ['c\n', 'b\n'])
133
 
        f2 = self.get_file('2')
134
 
        f2.join(f1, None)
135
 
        def verify_file(f):
136
 
            self.assertTrue(f.has_version('r0'))
137
 
            self.assertTrue(f.has_version('r1'))
138
 
        verify_file(f2)
139
 
        verify_file(self.reopen_file('2'))
140
 
 
141
 
        self.assertRaises(RevisionNotPresent,
142
 
            f2.join, f1, version_ids=['r3'])
143
 
 
144
 
        #f3 = self.get_file('1')
145
 
        #f3.add_lines('r0', ['a\n', 'b\n'], [])
146
 
        #f3.add_lines('r1', ['c\n', 'b\n'], ['r0'])
147
 
        #f4 = self.get_file('2')
148
 
        #f4.join(f3, ['r0'])
149
 
        #self.assertTrue(f4.has_version('r0'))
150
 
        #self.assertFalse(f4.has_version('r1'))
151
 
 
152
130
    def test_walk(self):
153
131
        f = self.get_file('1')
154
132
        f.add_lines('r0', [], ['a\n', 'b\n'])
312
290
        self.assertEqual(['a'], w1.get_parents('b'))
313
291
        self.assertEqual(['b'], w1.get_parents('c'))
314
292
 
315
 
class TestWeave(TestCaseInTempDir, VersionedFileTestMixIn):
 
293
class TestWeave(TestCaseWithTransport, VersionedFileTestMixIn):
316
294
 
317
295
    def get_file(self, name='foo'):
318
296
        return WeaveFile(name, LocalTransport('.'))
355
333
        return WeaveFile(name, LocalTransport('.'))
356
334
 
357
335
 
358
 
class TestKnit(TestCaseInTempDir, VersionedFileTestMixIn):
 
336
class TestKnit(TestCaseWithTransport, VersionedFileTestMixIn):
359
337
 
360
338
    def get_file(self, name='foo'):
361
339
        return KnitVersionedFile(LocalTransport('.'),
373
351
 
374
352
    def test_detection(self):
375
353
        print "TODO for merging: create a corrupted knit."
 
354
 
 
355
 
 
356
class InterString(versionedfile.InterVersionedFile):
 
357
    """An inter-versionedfile optimised code path for strings.
 
358
 
 
359
    This is for use during testing where we use strings as versionedfiles
 
360
    so that none of the default regsitered interversionedfile classes will
 
361
    match - which lets us test the match logic.
 
362
    """
 
363
 
 
364
    @staticmethod
 
365
    def is_compatible(source, target):
 
366
        """InterString is compatible with strings-as-versionedfiles."""
 
367
        return isinstance(source, str) and isinstance(target, str)
 
368
 
 
369
 
 
370
# TODO this and the InterRepository core logic should be consolidatable
 
371
# if we make the registry a separate class though we still need to 
 
372
# test the behaviour in the active registry to catch failure-to-handle-
 
373
# stange-objects
 
374
class TestInterVersionedFile(TestCaseWithTransport):
 
375
 
 
376
    def test_get_default_inter_versionedfile(self):
 
377
        # test that the InterVersionedFile.get(a, b) probes
 
378
        # for a class where is_compatible(a, b) returns
 
379
        # true and returns a default interversionedfile otherwise.
 
380
        # This also tests that the default registered optimised interversionedfile
 
381
        # classes do not barf inappropriately when a surprising versionedfile type
 
382
        # is handed to them.
 
383
        dummy_a = "VersionedFile 1."
 
384
        dummy_b = "VersionedFile 2."
 
385
        self.assertGetsDefaultInterVersionedFile(dummy_a, dummy_b)
 
386
 
 
387
    def assertGetsDefaultInterVersionedFile(self, a, b):
 
388
        """Asserts that InterVersionedFile.get(a, b) -> the default."""
 
389
        inter = versionedfile.InterVersionedFile.get(a, b)
 
390
        self.assertEqual(versionedfile.InterVersionedFile,
 
391
                         inter.__class__)
 
392
        self.assertEqual(a, inter.source)
 
393
        self.assertEqual(b, inter.target)
 
394
 
 
395
    def test_register_inter_versionedfile_class(self):
 
396
        # test that a optimised code path provider - a
 
397
        # InterVersionedFile subclass can be registered and unregistered
 
398
        # and that it is correctly selected when given a versionedfile
 
399
        # pair that it returns true on for the is_compatible static method
 
400
        # check
 
401
        dummy_a = "VersionedFile 1."
 
402
        dummy_b = "VersionedFile 2."
 
403
        versionedfile.InterVersionedFile.register_optimiser(InterString)
 
404
        try:
 
405
            # we should get the default for something InterString returns False
 
406
            # to
 
407
            self.assertFalse(InterString.is_compatible(dummy_a, None))
 
408
            self.assertGetsDefaultInterVersionedFile(dummy_a, None)
 
409
            # and we should get an InterString for a pair it 'likes'
 
410
            self.assertTrue(InterString.is_compatible(dummy_a, dummy_b))
 
411
            inter = versionedfile.InterVersionedFile.get(dummy_a, dummy_b)
 
412
            self.assertEqual(InterString, inter.__class__)
 
413
            self.assertEqual(dummy_a, inter.source)
 
414
            self.assertEqual(dummy_b, inter.target)
 
415
        finally:
 
416
            versionedfile.InterVersionedFile.unregister_optimiser(InterString)
 
417
        # now we should get the default InterVersionedFile object again.
 
418
        self.assertGetsDefaultInterVersionedFile(dummy_a, dummy_b)
 
419
 
 
420