/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
963 by Martin Pool
- add the start of a test for inventory file-id matching
1
# Copyright (C) 2005 by Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
17
from cStringIO import StringIO
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
18
import os
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
19
20
from bzrlib.branch import Branch
21
from bzrlib.diff import internal_diff
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
22
from bzrlib.inventory import Inventory, ROOT_ID
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
23
import bzrlib.inventory as inventory
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
24
from bzrlib.osutils import has_symlinks
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
25
from bzrlib.selftest import TestCase, TestCaseInTempDir
963 by Martin Pool
- add the start of a test for inventory file-id matching
26
969 by Martin Pool
- Add less-sucky is_within_any
27
1102 by Martin Pool
- merge test refactoring from robertc
28
class TestInventory(TestCase):
29
30
    def test_is_within(self):
968 by Martin Pool
- add some passing tests for is_inside_any
31
        from bzrlib.osutils import is_inside_any
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
32
33
        SRC_FOO_C = os.path.join('src', 'foo.c')
34
        for dirs, fn in [(['src', 'doc'], SRC_FOO_C),
35
                         (['src'], SRC_FOO_C),
968 by Martin Pool
- add some passing tests for is_inside_any
36
                         (['src'], 'src'),
37
                         ]:
38
            self.assert_(is_inside_any(dirs, fn))
39
            
969 by Martin Pool
- Add less-sucky is_within_any
40
        for dirs, fn in [(['src'], 'srccontrol'),
41
                         (['src'], 'srccontrol/foo')]:
42
            self.assertFalse(is_inside_any(dirs, fn))
43
            
1102 by Martin Pool
- merge test refactoring from robertc
44
    def test_ids(self):
963 by Martin Pool
- add the start of a test for inventory file-id matching
45
        """Test detection of files within selected directories."""
46
        inv = Inventory()
47
        
48
        for args in [('src', 'directory', 'src-id'), 
49
                     ('doc', 'directory', 'doc-id'), 
50
                     ('src/hello.c', 'file'),
51
                     ('src/bye.c', 'file', 'bye-id'),
52
                     ('Makefile', 'file')]:
53
            inv.add_path(*args)
54
            
55
        self.assertEqual(inv.path2id('src'), 'src-id')
56
        self.assertEqual(inv.path2id('src/bye.c'), 'bye-id')
57
        
58
        self.assert_('src-id' in inv)
1180 by Martin Pool
- start splitting code for xml (de)serialization away from objects
59
60
61
    def test_version(self):
62
        """Inventory remembers the text's version."""
63
        inv = Inventory()
64
        ie = inv.add_path('foo.txt', 'file')
65
        ## XXX
66
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
67
68
class TestInventoryEntry(TestCaseInTempDir):
69
70
    def test_file_kind_character(self):
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
71
        file = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
72
        self.assertEqual(file.kind_character(), '')
73
74
    def test_dir_kind_character(self):
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
75
        dir = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
76
        self.assertEqual(dir.kind_character(), '/')
77
78
    def test_link_kind_character(self):
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
79
        dir = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
80
        self.assertEqual(dir.kind_character(), '')
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
81
82
    def test_dir_detect_changes(self):
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
83
        left = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
84
        left.text_sha1 = 123
85
        left.executable = True
86
        left.symlink_target='foo'
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
87
        right = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
88
        right.text_sha1 = 321
89
        right.symlink_target='bar'
90
        self.assertEqual((False, False), left.detect_changes(right))
91
        self.assertEqual((False, False), right.detect_changes(left))
92
93
    def test_file_detect_changes(self):
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
94
        left = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
95
        left.text_sha1 = 123
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
96
        right = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
97
        right.text_sha1 = 123
98
        self.assertEqual((False, False), left.detect_changes(right))
99
        self.assertEqual((False, False), right.detect_changes(left))
100
        left.executable = True
101
        self.assertEqual((False, True), left.detect_changes(right))
102
        self.assertEqual((False, True), right.detect_changes(left))
103
        right.text_sha1 = 321
104
        self.assertEqual((True, True), left.detect_changes(right))
105
        self.assertEqual((True, True), right.detect_changes(left))
106
107
    def test_symlink_detect_changes(self):
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
108
        left = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
109
        left.text_sha1 = 123
110
        left.executable = True
111
        left.symlink_target='foo'
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
112
        right = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
113
        right.text_sha1 = 321
114
        right.symlink_target='foo'
115
        self.assertEqual((False, False), left.detect_changes(right))
116
        self.assertEqual((False, False), right.detect_changes(left))
117
        left.symlink_target = 'different'
118
        self.assertEqual((True, False), left.detect_changes(right))
119
        self.assertEqual((True, False), right.detect_changes(left))
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
120
1399.1.5 by Robert Collins
move checking whether an entry stores text into inventory.py from fetch,py
121
    def test_file_has_text(self):
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
122
        file = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
1399.1.5 by Robert Collins
move checking whether an entry stores text into inventory.py from fetch,py
123
        self.failUnless(file.has_text())
124
125
    def test_directory_has_text(self):
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
126
        dir = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
1399.1.5 by Robert Collins
move checking whether an entry stores text into inventory.py from fetch,py
127
        self.failIf(dir.has_text())
128
129
    def test_link_has_text(self):
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
130
        link = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
1399.1.5 by Robert Collins
move checking whether an entry stores text into inventory.py from fetch,py
131
        self.failIf(link.has_text())
132
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
133
134
class TestEntryDiffing(TestCaseInTempDir):
135
136
    def setUp(self):
137
        super(TestEntryDiffing, self).setUp()
138
        self.branch = Branch.initialize('.')
139
        print >> open('file', 'wb'), 'foo'
140
        self.branch.add(['file'], ['fileid'])
141
        if has_symlinks():
142
            os.symlink('target1', 'symlink')
143
            self.branch.add(['symlink'], ['linkid'])
144
        self.branch.commit('message_1', rev_id = '1')
145
        print >> open('file', 'wb'), 'bar'
146
        if has_symlinks():
147
            os.unlink('symlink')
148
            os.symlink('target2', 'symlink')
149
        self.tree_1 = self.branch.revision_tree('1')
150
        self.inv_1 = self.branch.get_inventory('1')
151
        self.file_1 = self.inv_1['fileid']
152
        self.tree_2 = self.branch.working_tree()
153
        self.inv_2 = self.branch.inventory
154
        self.file_2 = self.inv_2['fileid']
155
        if has_symlinks():
156
            self.link_1 = self.inv_1['linkid']
157
            self.link_2 = self.inv_2['linkid']
158
159
    def test_file_diff_deleted(self):
160
        output = StringIO()
161
        self.file_1.diff(internal_diff, 
162
                          "old_label", self.tree_1,
163
                          "/dev/null", None, None,
164
                          output)
165
        self.assertEqual(output.getvalue(), "--- old_label\n"
166
                                            "+++ /dev/null\n"
167
                                            "@@ -1,1 +0,0 @@\n"
168
                                            "-foo\n"
169
                                            "\n")
170
171
    def test_file_diff_added(self):
172
        output = StringIO()
173
        self.file_1.diff(internal_diff, 
174
                          "new_label", self.tree_1,
175
                          "/dev/null", None, None,
176
                          output, reverse=True)
177
        self.assertEqual(output.getvalue(), "--- /dev/null\n"
178
                                            "+++ new_label\n"
179
                                            "@@ -0,0 +1,1 @@\n"
180
                                            "+foo\n"
181
                                            "\n")
182
183
    def test_file_diff_changed(self):
184
        output = StringIO()
185
        self.file_1.diff(internal_diff, 
186
                          "/dev/null", self.tree_1, 
187
                          "new_label", self.file_2, self.tree_2,
188
                          output)
189
        self.assertEqual(output.getvalue(), "--- /dev/null\n"
190
                                            "+++ new_label\n"
191
                                            "@@ -1,1 +1,1 @@\n"
192
                                            "-foo\n"
193
                                            "+bar\n"
194
                                            "\n")
195
        
196
    def test_link_diff_deleted(self):
197
        output = StringIO()
198
        self.link_1.diff(internal_diff, 
199
                          "old_label", self.tree_1,
200
                          "/dev/null", None, None,
201
                          output)
202
        self.assertEqual(output.getvalue(),
203
                         "=== target was 'target1'\n")
204
205
    def test_link_diff_added(self):
206
        output = StringIO()
207
        self.link_1.diff(internal_diff, 
208
                          "new_label", self.tree_1,
209
                          "/dev/null", None, None,
210
                          output, reverse=True)
211
        self.assertEqual(output.getvalue(),
212
                         "=== target is 'target1'\n")
213
214
    def test_link_diff_changed(self):
215
        output = StringIO()
216
        self.link_1.diff(internal_diff, 
217
                          "/dev/null", self.tree_1, 
218
                          "new_label", self.link_2, self.tree_2,
219
                          output)
220
        self.assertEqual(output.getvalue(),
221
                         "=== target changed 'target1' => 'target2'\n")