1
# Copyright (C) 2006, 2007 Canonical Ltd
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.
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.
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
17
"""Tests for the test trees used by the tree_implementations tests."""
19
from bzrlib.tests.tree_implementations import TestCaseWithTree
22
class TestTreeShapes(TestCaseWithTree):
24
def test_empty_tree_no_parents(self):
25
tree = self.make_branch_and_tree('.')
26
tree = self.get_tree_no_parents_no_content(tree)
28
self.addCleanup(tree.unlock)
29
self.assertEqual([], tree.get_parent_ids())
30
self.assertEqual([], tree.conflicts())
31
self.assertEqual([], list(tree.unknowns()))
32
self.assertEqual(['empty-root-id'], list(iter(tree)))
34
[('', 'empty-root-id')],
35
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
37
def test_abc_tree_no_parents(self):
38
tree = self.make_branch_and_tree('.')
39
tree = self.get_tree_no_parents_abc_content(tree)
41
self.addCleanup(tree.unlock)
42
self.assertEqual([], tree.get_parent_ids())
43
self.assertEqual([], tree.conflicts())
44
self.assertEqual([], list(tree.unknowns()))
45
# __iter__ has no strongly defined order
47
set(['root-id', 'a-id', 'b-id', 'c-id']),
50
[('', 'root-id'), ('a', 'a-id'), ('b', 'b-id'), ('b/c', 'c-id')],
51
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
52
self.assertEqualDiff('contents of a\n', tree.get_file_text('a-id'))
53
self.assertFalse(tree.is_executable('c-id'))
55
def test_abc_tree_content_2_no_parents(self):
56
tree = self.make_branch_and_tree('.')
57
tree = self.get_tree_no_parents_abc_content_2(tree)
59
self.addCleanup(tree.unlock)
60
self.assertEqual([], tree.get_parent_ids())
61
self.assertEqual([], tree.conflicts())
62
self.assertEqual([], list(tree.unknowns()))
63
# __iter__ has no strongly defined order
65
set(['root-id', 'a-id', 'b-id', 'c-id']),
68
[('', 'root-id'), ('a', 'a-id'), ('b', 'b-id'), ('b/c', 'c-id')],
69
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
70
self.assertEqualDiff('foobar\n', tree.get_file_text('a-id'))
71
self.assertFalse(tree.is_executable('c-id'))
73
def test_abc_tree_content_3_no_parents(self):
74
tree = self.make_branch_and_tree('.')
75
tree = self.get_tree_no_parents_abc_content_3(tree)
77
self.addCleanup(tree.unlock)
78
self.assertEqual([], tree.get_parent_ids())
79
self.assertEqual([], tree.conflicts())
80
self.assertEqual([], list(tree.unknowns()))
81
# __iter__ has no strongly defined order
83
set(['root-id', 'a-id', 'b-id', 'c-id']),
86
[('', 'root-id'), ('a', 'a-id'), ('b', 'b-id'), ('b/c', 'c-id')],
87
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
88
self.assertEqualDiff('contents of a\n', tree.get_file_text('a-id'))
89
self.assertTrue(tree.is_executable('c-id'))
91
def test_abc_tree_content_4_no_parents(self):
92
tree = self.make_branch_and_tree('.')
93
tree = self.get_tree_no_parents_abc_content_4(tree)
95
self.addCleanup(tree.unlock)
96
self.assertEqual([], tree.get_parent_ids())
97
self.assertEqual([], tree.conflicts())
98
self.assertEqual([], list(tree.unknowns()))
99
# __iter__ has no strongly defined order
101
set(['root-id', 'a-id', 'b-id', 'c-id']),
104
[('', 'root-id'), ('b', 'b-id'), ('d', 'a-id'), ('b/c', 'c-id')],
105
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
106
self.assertEqualDiff('contents of a\n', tree.get_file_text('a-id'))
107
self.assertFalse(tree.is_executable('c-id'))
109
def test_abc_tree_content_5_no_parents(self):
110
tree = self.make_branch_and_tree('.')
111
tree = self.get_tree_no_parents_abc_content_5(tree)
113
self.addCleanup(tree.unlock)
114
self.assertEqual([], tree.get_parent_ids())
115
self.assertEqual([], tree.conflicts())
116
self.assertEqual([], list(tree.unknowns()))
117
# __iter__ has no strongly defined order
119
set(['root-id', 'a-id', 'b-id', 'c-id']),
122
[('', 'root-id'), ('b', 'b-id'), ('d', 'a-id'), ('b/c', 'c-id')],
123
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
124
self.assertEqualDiff('bar\n', tree.get_file_text('a-id'))
125
self.assertFalse(tree.is_executable('c-id'))
127
def test_abc_tree_content_6_no_parents(self):
128
tree = self.make_branch_and_tree('.')
129
tree = self.get_tree_no_parents_abc_content_6(tree)
131
self.addCleanup(tree.unlock)
132
self.assertEqual([], tree.get_parent_ids())
133
self.assertEqual([], tree.conflicts())
134
self.assertEqual([], list(tree.unknowns()))
135
# __iter__ has no strongly defined order
137
set(['root-id', 'a-id', 'b-id', 'c-id']),
140
[('', 'root-id'), ('a', 'a-id'), ('b', 'b-id'), ('e', 'c-id')],
141
[(path, node.file_id) for path, node in tree.iter_entries_by_dir()])
142
self.assertEqualDiff('contents of a\n', tree.get_file_text('a-id'))
143
self.assertTrue(tree.is_executable('c-id'))
145
def test_tree_with_subdirs_and_all_content_types(self):
146
# currently this test tree requires unicode. It might be good
147
# to have it simply stop having the single unicode file in it
148
# when dealing with a non-unicode filesystem.
149
tree = self.get_tree_with_subdirs_and_all_content_types()
151
self.addCleanup(tree.unlock)
152
self.assertEqual([], tree.get_parent_ids())
153
self.assertEqual([], tree.conflicts())
154
self.assertEqual([], list(tree.unknowns()))
155
# __iter__ has no strongly defined order
156
tree_root = tree.path2id('')
163
u'0utf\u1234file'.encode('utf8'),
167
# note that the order of the paths and fileids is deliberately
168
# mismatched to ensure that the result order is path based.
170
[('', tree_root, 'directory'),
171
('0file', '2file', 'file'),
172
('1top-dir', '1top-dir', 'directory'),
173
(u'2utf\u1234file', u'0utf\u1234file'.encode('utf8'), 'file'),
174
('symlink', 'symlink', 'symlink'),
175
('1top-dir/0file-in-1topdir', '1file-in-1topdir', 'file'),
176
('1top-dir/1dir-in-1topdir', '0dir-in-1topdir', 'directory')],
177
[(path, node.file_id, node.kind) for path, node in tree.iter_entries_by_dir()])
179
def test_tree_with_utf8(self):
180
tree = self.make_branch_and_tree('.')
181
tree = self.get_tree_with_utf8(tree)
183
revision_id = u'r\xe9v-1'.encode('utf8')
184
root_id = 'TREE_ROOT'
185
bar_id = u'b\xe5r-id'.encode('utf8')
186
foo_id = u'f\xf6-id'.encode('utf8')
187
baz_id = u'b\xe1z-id'.encode('utf8')
188
path_and_ids = [(u'', root_id, None),
189
(u'b\xe5r', bar_id, root_id),
190
(u'f\xf6', foo_id, root_id),
191
(u'b\xe5r/b\xe1z', baz_id, bar_id),
195
path_entries = list(tree.iter_entries_by_dir())
199
for expected, (path, ie) in zip(path_and_ids, path_entries):
200
self.assertEqual(expected[0], path) # Paths should match
201
self.assertIsInstance(path, unicode)
202
self.assertEqual(expected[1], ie.file_id)
203
self.assertIsInstance(ie.file_id, str)
204
self.assertEqual(expected[2], ie.parent_id)
205
if expected[2] is not None:
206
self.assertIsInstance(ie.parent_id, str)
207
# WorkingTree's return None for the last modified revision
208
if ie.revision is not None:
209
self.assertIsInstance(ie.revision, str)
210
if expected[0] != '':
211
# Some trees will preserve the revision id of the tree root,
213
self.assertEqual(revision_id, ie.revision)
214
self.assertEqual(len(path_and_ids), len(path_entries))
215
get_revision_id = getattr(tree, 'get_revision_id', None)
216
if get_revision_id is not None:
217
self.assertIsInstance(get_revision_id(), str)
218
last_revision = getattr(tree, 'last_revision', None)
219
if last_revision is not None:
220
self.assertIsInstance(last_revision(), str)
222
def test_tree_with_merged_utf8(self):
223
tree = self.make_branch_and_tree('.')
224
tree = self.get_tree_with_merged_utf8(tree)
226
revision_id_1 = u'r\xe9v-1'.encode('utf8')
227
revision_id_2 = u'r\xe9v-2'.encode('utf8')
228
root_id = 'TREE_ROOT'
229
bar_id = u'b\xe5r-id'.encode('utf8')
230
foo_id = u'f\xf6-id'.encode('utf8')
231
baz_id = u'b\xe1z-id'.encode('utf8')
232
zez_id = u'z\xf7z-id'.encode('utf8')
233
path_and_ids = [(u'', root_id, None, None),
234
(u'b\xe5r', bar_id, root_id, revision_id_1),
235
(u'f\xf6', foo_id, root_id, revision_id_1),
236
(u'b\xe5r/b\xe1z', baz_id, bar_id, revision_id_1),
237
(u'b\xe5r/z\xf7z', zez_id, bar_id, revision_id_2),
241
path_entries = list(tree.iter_entries_by_dir())
245
for expected, (path, ie) in zip(path_and_ids, path_entries):
246
self.assertEqual(expected[0], path) # Paths should match
247
self.assertIsInstance(path, unicode)
248
self.assertEqual(expected[1], ie.file_id)
249
self.assertIsInstance(ie.file_id, str)
250
self.assertEqual(expected[2], ie.parent_id)
251
if expected[2] is not None:
252
self.assertIsInstance(ie.parent_id, str)
253
# WorkingTree's return None for the last modified revision
254
if ie.revision is not None:
255
self.assertIsInstance(ie.revision, str)
256
if expected[0] == '':
257
# Some trees will preserve the revision id of the tree root,
260
self.assertEqual(expected[3], ie.revision)
261
self.assertEqual(len(path_and_ids), len(path_entries))
262
get_revision_id = getattr(tree, 'get_revision_id', None)
263
if get_revision_id is not None:
264
self.assertIsInstance(get_revision_id(), str)
265
last_revision = getattr(tree, 'last_revision', None)
266
if last_revision is not None:
267
self.assertIsInstance(last_revision(), str)