diff options
Diffstat (limited to 'bzrlib/tests/per_workingtree/test_views.py')
-rw-r--r-- | bzrlib/tests/per_workingtree/test_views.py | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/bzrlib/tests/per_workingtree/test_views.py b/bzrlib/tests/per_workingtree/test_views.py new file mode 100644 index 0000000..67e3439 --- /dev/null +++ b/bzrlib/tests/per_workingtree/test_views.py @@ -0,0 +1,188 @@ +# Copyright (C) 2008 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +"""Views stored within a working tree. + +The views are actually in the WorkingTree.views namespace, but these are +1:1 with WorkingTree implementations so can be tested from here. +""" + + +from bzrlib import views, errors +from bzrlib.tests import TestSkipped +from bzrlib.workingtree import WorkingTree + +from bzrlib.tests.per_workingtree import TestCaseWithWorkingTree + + +class TestTreeViews(TestCaseWithWorkingTree): + + def setUp(self): + # formats that don't support views can skip the rest of these + # tests... + fmt = self.workingtree_format + f = getattr(fmt, 'supports_views') + if f is None: + raise TestSkipped("format %s doesn't declare whether it " + "supports views, assuming not" % fmt) + if not f(): + raise TestSkipped("format %s doesn't support views" % fmt) + TestCaseWithWorkingTree.setUp(self) + + def test_views_initially_empty(self): + wt = self.make_branch_and_tree('wt') + current, views = wt.views.get_view_info() + self.assertEqual(None, current) + self.assertEqual({}, views) + + def test_set_and_get_view_info(self): + wt = self.make_branch_and_tree('wt') + view_current = 'view-name' + view_dict = { + view_current: ['dir-1'], + 'other-name': ['dir-2']} + wt.views.set_view_info(view_current, view_dict) + current, views = wt.views.get_view_info() + self.assertEquals(view_current, current) + self.assertEquals(view_dict, views) + # then reopen the tree and see they're still there + wt = WorkingTree.open('wt') + current, views = wt.views.get_view_info() + self.assertEquals(view_current, current) + self.assertEquals(view_dict, views) + # test setting a current view which does not exist + self.assertRaises(errors.NoSuchView, + wt.views.set_view_info, 'yet-another', view_dict) + current, views = wt.views.get_view_info() + self.assertEquals(view_current, current) + self.assertEquals(view_dict, views) + # test clearing the current view + wt.views.set_view_info(None, view_dict) + current, views = wt.views.get_view_info() + self.assertEquals(None, current) + self.assertEquals(view_dict, views) + + def test_lookup_view(self): + wt = self.make_branch_and_tree('wt') + view_current = 'view-name' + view_dict = { + view_current: ['dir-1'], + 'other-name': ['dir-2']} + wt.views.set_view_info(view_current, view_dict) + # test lookup of the default view + result = wt.views.lookup_view() + self.assertEqual(result, ['dir-1']) + # test lookup of a named view + result = wt.views.lookup_view('other-name') + self.assertEqual(result, ['dir-2']) + + def test_set_view(self): + wt = self.make_branch_and_tree('wt') + # test that set_view sets the current view by default + wt.views.set_view('view-1', ['dir-1']) + current, views = wt.views.get_view_info() + self.assertEquals('view-1', current) + self.assertEquals({'view-1': ['dir-1']}, views) + # test adding a view and not making it the current one + wt.views.set_view('view-2', ['dir-2'], make_current=False) + current, views = wt.views.get_view_info() + self.assertEquals('view-1', current) + self.assertEquals({'view-1': ['dir-1'], 'view-2': ['dir-2']}, views) + + def test_unicode_view(self): + wt = self.make_branch_and_tree('wt') + view_name = u'\u3070' + view_files = ['foo', 'bar/'] + view_dict = {view_name: view_files} + wt.views.set_view_info(view_name, view_dict) + current, views = wt.views.get_view_info() + self.assertEquals(view_name, current) + self.assertEquals(view_dict, views) + + def test_no_such_view(self): + wt = self.make_branch_and_tree('wt') + try: + wt.views.lookup_view('opaque') + except errors.NoSuchView, e: + self.assertEquals(e.view_name, 'opaque') + self.assertEquals(str(e), 'No such view: opaque.') + else: + self.fail("didn't get expected exception") + + def test_delete_view(self): + wt = self.make_branch_and_tree('wt') + view_name = u'\N{GREEK SMALL LETTER ALPHA}' + view_files = ['alphas/'] + wt.views.set_view(view_name, view_files) + # now try to delete it + wt.views.delete_view(view_name) + # now you can't look it up + self.assertRaises(errors.NoSuchView, + wt.views.lookup_view, view_name) + # and it's not in the dictionary + self.assertEquals(wt.views.get_view_info()[1], {}) + # and you can't remove it a second time + self.assertRaises(errors.NoSuchView, + wt.views.delete_view, view_name) + # or remove a view that never existed + self.assertRaises(errors.NoSuchView, + wt.views.delete_view, view_name + '2') + + def test_check_path_in_view(self): + wt = self.make_branch_and_tree('wt') + view_current = 'view-name' + view_dict = { + view_current: ['dir-1'], + 'other-name': ['dir-2']} + wt.views.set_view_info(view_current, view_dict) + self.assertEqual(views.check_path_in_view(wt, 'dir-1'), None) + self.assertEqual(views.check_path_in_view(wt, 'dir-1/sub'), None) + self.assertRaises(errors.FileOutsideView, + views.check_path_in_view, wt, 'dir-2') + self.assertRaises(errors.FileOutsideView, + views.check_path_in_view, wt, 'dir-2/sub') + self.assertRaises(errors.FileOutsideView, + views.check_path_in_view, wt, 'other') + + +class TestUnsupportedViews(TestCaseWithWorkingTree): + """Formats that don't support views should give reasonable errors.""" + + def setUp(self): + fmt = self.workingtree_format + supported = getattr(fmt, 'supports_views') + if supported is None: + warn("Format %s doesn't declare whether it supports views or not" + % fmt) + raise TestSkipped('No view support at all') + if supported(): + raise TestSkipped("Format %s declares that views are supported" + % fmt) + # it's covered by TestTreeViews + TestCaseWithWorkingTree.setUp(self) + + def test_view_methods_raise(self): + wt = self.make_branch_and_tree('wt') + self.assertRaises(errors.ViewsNotSupported, + wt.views.set_view_info, 'bar', {'bar': ['bars/']}) + self.assertRaises(errors.ViewsNotSupported, + wt.views.get_view_info) + self.assertRaises(errors.ViewsNotSupported, + wt.views.lookup_view, 'foo') + self.assertRaises(errors.ViewsNotSupported, + wt.views.set_view, 'foo', 'bar') + self.assertRaises(errors.ViewsNotSupported, + wt.views.delete_view, 'foo') |