/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/selftest/whitebox.py

  • Committer: Martin Pool
  • Date: 2005-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
import os
 
4
import unittest
 
5
 
 
6
from bzrlib.selftest import InTempDir, TestCase
 
7
from bzrlib.branch import ScratchBranch, Branch
 
8
from bzrlib.errors import NotBranchError, NotVersionedError
 
9
 
 
10
 
 
11
class TestBranch(InTempDir):
 
12
 
 
13
    def test_unknowns(self):
 
14
        b = Branch('.', init=True)
 
15
 
 
16
        self.build_tree(['hello.txt',
 
17
                         'hello.txt~'])
 
18
 
 
19
        self.assertEquals(list(b.unknowns()),
 
20
                          ['hello.txt'])
 
21
 
 
22
    def test_no_changes(self):
 
23
        from bzrlib.errors import PointlessCommit
 
24
        
 
25
        b = Branch('.', init=True)
 
26
 
 
27
        self.build_tree(['hello.txt'])
 
28
 
 
29
        self.assertRaises(PointlessCommit,
 
30
                          b.commit,
 
31
                          'commit without adding',
 
32
                          allow_pointless=False)
 
33
 
 
34
        b.commit('commit pointless tree',
 
35
                 allow_pointless=True)
 
36
 
 
37
        b.add('hello.txt')
 
38
        
 
39
        b.commit('commit first added file',
 
40
                 allow_pointless=False)
 
41
        
 
42
        self.assertRaises(PointlessCommit,
 
43
                          b.commit,
 
44
                          'commit after adding file',
 
45
                          allow_pointless=False)
 
46
        
 
47
        b.commit('commit pointless revision with one file',
 
48
                 allow_pointless=True)
 
49
 
 
50
        b.add_pending_merge('mbp@892739123-2005-123123')
 
51
        b.commit('commit new merge with no text changes',
 
52
                 allow_pointless=False)
 
53
        
 
54
 
 
55
 
 
56
class TestRevisionId(TestCase):
 
57
    
 
58
    def test_validate_revision_id(self):
 
59
        from bzrlib.revision import validate_revision_id
 
60
        validate_revision_id('mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
 
61
        self.assertRaises(ValueError,
 
62
                          validate_revision_id,
 
63
                          ' asdkjas')
 
64
        self.assertRaises(ValueError,
 
65
                          validate_revision_id,
 
66
                          'mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe\n')
 
67
        self.assertRaises(ValueError,
 
68
                          validate_revision_id,
 
69
                          ' mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
 
70
        self.assertRaises(ValueError,
 
71
                          validate_revision_id,
 
72
                          'Martin Pool <mbp@sourcefrog.net>-20050311061123-96a255005c7c9dbe')
 
73
 
 
74
 
 
75
class PendingMerges(InTempDir):
 
76
    def test_pending_merges(self):
 
77
        """Tracking pending-merged revisions."""
 
78
        b = Branch('.', init=True)
 
79
 
 
80
        self.assertEquals(b.pending_merges(), [])
 
81
        
 
82
        b.add_pending_merge('foo@azkhazan-123123-abcabc')
 
83
        
 
84
        self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
 
85
    
 
86
        b.add_pending_merge('foo@azkhazan-123123-abcabc')
 
87
        
 
88
        self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
 
89
 
 
90
        b.add_pending_merge('wibble@fofof--20050401--1928390812')
 
91
        self.assertEquals(b.pending_merges(),
 
92
                          ['foo@azkhazan-123123-abcabc',
 
93
                           'wibble@fofof--20050401--1928390812'])
 
94
 
 
95
        b.commit("commit from base with two merges")
 
96
 
 
97
        rev = b.get_revision(b.revision_history()[0])
 
98
        self.assertEquals(len(rev.parents), 2)
 
99
        self.assertEquals(rev.parents[0].revision_id,
 
100
                          'foo@azkhazan-123123-abcabc')
 
101
        self.assertEquals(rev.parents[1].revision_id,
 
102
                           'wibble@fofof--20050401--1928390812')
 
103
 
 
104
        # list should be cleared when we do a commit
 
105
        self.assertEquals(b.pending_merges(), [])
 
106
        
 
107
    def test_revert(self):
 
108
        """Test selected-file revert"""
 
109
        b = Branch('.', init=True)
 
110
 
 
111
        self.build_tree(['hello.txt'])
 
112
        file('hello.txt', 'w').write('initial hello')
 
113
 
 
114
        self.assertRaises(NotVersionedError,
 
115
                          b.revert, ['hello.txt'])
 
116
        
 
117
        b.add(['hello.txt'])
 
118
        b.commit('create initial hello.txt')
 
119
 
 
120
        self.check_file_contents('hello.txt', 'initial hello')
 
121
        file('hello.txt', 'w').write('new hello')
 
122
        self.check_file_contents('hello.txt', 'new hello')
 
123
 
 
124
        # revert file modified since last revision
 
125
        b.revert(['hello.txt'])
 
126
        self.check_file_contents('hello.txt', 'initial hello')
 
127
        self.check_file_contents('hello.txt~', 'new hello')
 
128
 
 
129
        # reverting again clobbers the backup
 
130
        b.revert(['hello.txt'])
 
131
        self.check_file_contents('hello.txt', 'initial hello')
 
132
        self.check_file_contents('hello.txt~', 'initial hello')
 
133
 
 
134
    def test_rename_dirs(self):
 
135
        """Test renaming directories and the files within them."""
 
136
        b = Branch('.', init=True)
 
137
        self.build_tree(['dir/', 'dir/sub/', 'dir/sub/file'])
 
138
        b.add(['dir', 'dir/sub', 'dir/sub/file'])
 
139
 
 
140
        b.commit('create initial state')
 
141
 
 
142
        # TODO: lift out to a test helper that checks the shape of
 
143
        # an inventory
 
144
        
 
145
        revid = b.revision_history()[0]
 
146
        self.log('first revision_id is {%s}' % revid)
 
147
        
 
148
        inv = b.get_revision_inventory(revid)
 
149
        self.log('contents of inventory: %r' % inv.entries())
 
150
 
 
151
        self.check_inventory_shape(inv,
 
152
                                   ['dir', 'dir/sub', 'dir/sub/file'])
 
153
 
 
154
        b.rename_one('dir', 'newdir')
 
155
 
 
156
        self.check_inventory_shape(b.inventory,
 
157
                                   ['newdir', 'newdir/sub', 'newdir/sub/file'])
 
158
 
 
159
        b.rename_one('newdir/sub', 'newdir/newsub')
 
160
        self.check_inventory_shape(b.inventory,
 
161
                                   ['newdir', 'newdir/newsub',
 
162
                                    'newdir/newsub/file'])
 
163
 
 
164
    def test_relpath(self):
 
165
        """test for branch path lookups
 
166
    
 
167
        Branch.relpath and bzrlib.branch._relpath do a simple but subtle
 
168
        job: given a path (either relative to cwd or absolute), work out
 
169
        if it is inside a branch and return the path relative to the base.
 
170
        """
 
171
        from bzrlib.branch import _relpath
 
172
        import tempfile, shutil
 
173
        
 
174
        savedir = os.getcwdu()
 
175
        dtmp = tempfile.mkdtemp()
 
176
        # On Mac OSX, /tmp actually expands to /private/tmp
 
177
        dtmp = os.path.realpath(dtmp)
 
178
 
 
179
        def rp(p):
 
180
            return _relpath(dtmp, p)
 
181
        
 
182
        try:
 
183
            # check paths inside dtmp while standing outside it
 
184
            self.assertEqual(rp(os.path.join(dtmp, 'foo')), 'foo')
 
185
 
 
186
            # root = nothing
 
187
            self.assertEqual(rp(dtmp), '')
 
188
 
 
189
            self.assertRaises(NotBranchError,
 
190
                              rp,
 
191
                              '/etc')
 
192
 
 
193
            # now some near-miss operations -- note that
 
194
            # os.path.commonprefix gets these wrong!
 
195
            self.assertRaises(NotBranchError,
 
196
                              rp,
 
197
                              dtmp.rstrip('\\/') + '2')
 
198
 
 
199
            self.assertRaises(NotBranchError,
 
200
                              rp,
 
201
                              dtmp.rstrip('\\/') + '2/foo')
 
202
 
 
203
            # now operations based on relpath of files in current
 
204
            # directory, or nearby
 
205
            os.chdir(dtmp)
 
206
 
 
207
            self.assertEqual(rp('foo/bar/quux'), 'foo/bar/quux')
 
208
 
 
209
            self.assertEqual(rp('foo'), 'foo')
 
210
 
 
211
            self.assertEqual(rp('./foo'), 'foo')
 
212
 
 
213
            self.assertEqual(rp(os.path.abspath('foo')), 'foo')
 
214
 
 
215
            self.assertRaises(NotBranchError,
 
216
                              rp, '../foo')
 
217
 
 
218
        finally:
 
219
            os.chdir(savedir)
 
220
            shutil.rmtree(dtmp)
 
221
 
 
222
 
 
223
TEST_CLASSES = [TestBranch,
 
224
                TestRevisionId,
 
225
                PendingMerges
 
226
                ]