diff options
Diffstat (limited to 'trunk/dimbola/utils_tests.py')
-rw-r--r-- | trunk/dimbola/utils_tests.py | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/trunk/dimbola/utils_tests.py b/trunk/dimbola/utils_tests.py new file mode 100644 index 0000000..3fb1cc1 --- /dev/null +++ b/trunk/dimbola/utils_tests.py @@ -0,0 +1,363 @@ +# Copyright (C) 2009 Lars Wirzenius <liw@liw.fi> +# +# 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 3 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, see <http://www.gnu.org/licenses/>. + + +import os +import shutil +import tempfile +import unittest + +import gtk + +import dimbola + + +class AbswalkTests(unittest.TestCase): + + def setUp(self): + self.root = tempfile.mkdtemp() + self.dirname = tempfile.mkdtemp(dir=self.root) + fd, self.filename = tempfile.mkstemp(dir=self.root) + os.close(fd) + + def tearDown(self): + shutil.rmtree(self.root) + + def test_returns_full_paths(self): + results = list(dimbola.abswalk(self.root)) + self.assertEqual(results, + [(self.root, [self.dirname], [self.filename]), + (self.dirname, [], [])]) + + +class FilterAbswalkTests(unittest.TestCase): + + def setUp(self): + self.root = tempfile.mkdtemp() + self.dirname = tempfile.mkdtemp(dir=self.root) + fd, self.filename = tempfile.mkstemp(dir=self.root) + os.close(fd) + + def tearDown(self): + shutil.rmtree(self.root) + + def test_returns_everything_if_is_ok_always_returns_true(self): + results = list(dimbola.filterabswalk(lambda x: True, self.root)) + self.assertEqual(results, + [(self.root, [self.dirname], [self.filename]), + (self.dirname, [], [])]) + + def test_returns_nothing_if_is_ok_always_returns_false(self): + results = list(dimbola.filterabswalk(lambda x: False, self.root)) + self.assertEqual(results, + [(self.root, [self.dirname], []), + (self.dirname, [], [])]) + + +class SafeCopyTests(unittest.TestCase): + + def setUp(self): + self.root = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.root) + + def make_file(self, contents): + fd, name = tempfile.mkstemp(dir=self.root) + os.write(fd, contents) + os.close(fd) + return name + + def cat(self, filename): + return file(filename).read() + + def callback(self, *args): + self.callback_args = args + + def test_copies_file_correctly(self): + old = self.make_file('foobar') + new = self.make_file('') + os.remove(new) + dimbola.safe_copy(old, new, self.callback) + self.assertEqual(self.cat(new), 'foobar') + self.assertEqual(self.callback_args, (old, new, len('foobar'))) + + def test_fails_if_output_file_already_exists(self): + name = self.make_file('foobar') + self.assertRaises(Exception, dimbola.safe_copy, name, name, None) + + +class FilterCmdTests(unittest.TestCase): + + def test_raises_exception_for_nonexistent_command(self): + self.assertRaises(Exception, dimbola.filter_cmd, + ['this-command-does-not-exist'], '') + + def test_raises_exception_for_failing_command(self): + self.assertRaises(Exception, dimbola.filter_cmd, ['false'], '') + + def test_filters_cleanly_through_cat(self): + self.assertEqual(dimbola.filter_cmd(['cat'], 'foo'), 'foo') + + def test_filters_a_lot_of_data_cleanly_through_cat(self): + data = 'x' * (1024**2) + self.assertEqual(dimbola.filter_cmd(['cat'], data), data) + + +class ImageDataToPixbufTests(unittest.TestCase): + + def test_makes_pixbuf_out_of_jpeg(self): + jpeg = file('test-plugins/test.jpg').read() + pixbuf = dimbola.image_data_to_pixbuf(jpeg) + self.assert_(isinstance(pixbuf, gtk.gdk.Pixbuf)) + + +class ScalePixbufTests(unittest.TestCase): + + def setUp(self): + jpeg = file('test-plugins/test.jpg').read() + self.pixbuf = dimbola.image_data_to_pixbuf(jpeg) + self.small = dimbola.scale_pixbuf(self.pixbuf, 100, 100) + + def test_width_is_correct(self): + self.assertEqual(self.small.get_width(), 100) + + def test_height_is_correct(self): + w = self.pixbuf.get_width() + h = self.pixbuf.get_height() + sh = int(100 * float(h)/w) + self.assertEqual(self.small.get_height(), sh) + + +class RotatePixbufTests(unittest.TestCase): + + def setUp(self): + jpeg = file('test-plugins/test.jpg').read() + self.pixbuf = dimbola.image_data_to_pixbuf(jpeg) + + def test_rotates_left_and_back_to_original(self): + temp = dimbola.rotate_pixbuf(self.pixbuf, 180) + temp2 = dimbola.rotate_pixbuf(temp, 180) + self.assertEqual(self.pixbuf.get_pixels(), temp2.get_pixels()) + + +class DndTagidsTests(unittest.TestCase): + + def setUp(self): + self.tagids = [1, 2, 3] + + def test_round_trip_works(self): + encoded = dimbola.encode_dnd_tagids(self.tagids) + decoded = dimbola.decode_dnd_tagids(encoded) + self.assertEqual(self.tagids, decoded) + + +class TreeBuilderTests(unittest.TestCase): + + def setUp(self): + self.tb = dimbola.TreeBuilder() + + def test_returns_empty_tree_by_default(self): + self.tb.done() + self.assertEqual(self.tb.tree, []) + + def test_returns_single_node_when_only_one_item(self): + self.tb.add('node', 'data', 'sortkey', None) + self.tb.done() + self.assertEqual(self.tb.tree, [('node', 'data', [])]) + + def test_returns_two_root_nodes_when_no_children(self): + self.tb.add('node1', 'data1', None, None) + self.tb.add('node2', 'data2', None, None) + self.tb.done() + self.assertEqual(self.tb.tree, + [('node1', 'data1', []), + ('node2', 'data2', [])]) + + def test_returns_children_nodes_when_there_is_one(self): + self.tb.add('child', 'data3', None, 'node1') + self.tb.add('node1', 'data1', None, None) + self.tb.add('node2', 'data2', None, None) + self.tb.done() + self.assertEqual(self.tb.tree, + [('node1', 'data1', [('child', 'data3', [])]), + ('node2', 'data2', [])]) + + def test_sorts_children_with_same_parent(self): + self.tb.add('parent', 'data', None, None) + self.tb.add('foo', 'data1', 'key2', 'parent') + self.tb.add('bar', 'data2', 'key1', 'parent') + self.tb.done() + self.assertEqual(self.tb.tree, + [('parent', 'data', + [('bar', 'data2', []), + ('foo', 'data1', [])])]) + + def test_sorts_roots(self): + self.tb.add('foo', 'data1', 'key2', None) + self.tb.add('bar', 'data2', 'key1', None) + self.tb.done() + self.assertEqual(self.tb.tree, + [('bar', 'data2', []), + ('foo', 'data1', [])]) + + +class DcrawTypeCacheTests(unittest.TestCase): + + def setUp(self): + self.dtc = dimbola.DcrawTypeCache() + self.dtc.get_mime_type = self.fake_get_mime_type + self.dtc.get_dcraw = self.fake_get_dcraw + self.fake_get_mime_type_called = False + self.fake_get_dcraw_called = False + + def fake_get_mime_type(self, filename): + self.fake_get_mime_type_called = True + return 'mime/type' + + def fake_get_dcraw(self, filename): + self.fake_get_dcraw_called = True + return 'desc' + + def fake_get_dcraw_fail(self, filename): + self.fake_get_dcraw_called = True + return None + + def test_lists_nothing_by_default(self): + self.assertEqual(self.dtc.formats, []) + + def test_adding_format_lists_it(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.assertEqual(self.dtc.formats, + [{ 'name': 'name', + 'mime_types': ['mime/type'], + 'extensions': ['ext', 'EXT'], + }]) + + def test_adding_format_with_same_name_does_not_add_it(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.dtc.add_format('name', 'mime/type', 'ext') + self.assertEqual(len(self.dtc.formats), 1) + + def test_adding_with_same_name_new_mime_type_modifies_existing(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.dtc.add_format('name', 'mime/type2', 'ext2') + self.assertEqual(self.dtc.formats, + [{ 'name': 'name', + 'mime_types': ['mime/type', 'mime/type2'], + 'extensions': ['ext', 'EXT', 'ext2', 'EXT2'], + }]) + + def test_adding_with_diff_name_same_mime_type_modifies_existing(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.dtc.add_format('name2', 'mime/type', 'ext2') + self.assertEqual(self.dtc.formats, + [{ 'name': 'name', + 'mime_types': ['mime/type'], + 'extensions': ['ext', 'EXT', 'ext2', 'EXT2'], + }]) + + def test_adding_with_same_extension_modifies_existing(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.dtc.add_format('name2', 'mime/type2', 'ext') + self.assertEqual(self.dtc.formats, + [{ 'name': 'name', + 'mime_types': ['mime/type', 'mime/type2'], + 'extensions': ['ext', 'EXT'], + }]) + + def test_known_extension_is_known(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.assert_(self.dtc.extension_is_known('ext')) + + def test_unknown_extension_is_unknown(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.assertFalse(self.dtc.extension_is_known('ext2')) + + def test_known_mime_type_is_known(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.assert_(self.dtc.mime_type_is_known('mime/type')) + + def test_unknown_mime_type_is_unknown(self): + self.dtc.add_format('name', 'mime/type', 'ext') + self.assertFalse(self.dtc.extension_is_known('mime/type2')) + + def test_recognizes_jpeg_mime_type(self): + dtc = dimbola.DcrawTypeCache() + self.assertEqual(dtc.get_mime_type('test-plugins/test.jpg'), + 'image/jpeg') + + def test_recognizes_raw_file_type(self): + dtc = dimbola.DcrawTypeCache() + self.assertEqual(dtc.get_dcraw('test-plugins/test.cr2'), + 'Canon EOS 5D') + + def test_dcraw_returns_None_for_unknown_filetype(self): + dtc = dimbola.DcrawTypeCache() + self.assertEqual(dtc.get_dcraw('README'), None) + + def test_recognizes_existing_format_based_on_mime_type(self): + self.dtc.add_from_file('filename.ext') + self.fake_get_mime_type_called = False + self.fake_get_dcraw_called = False + self.dtc.add_from_file('filename.ext2') + self.assertFalse(self.fake_get_dcraw_called) + self.assert_(self.fake_get_mime_type_called) + + def test_recognizes_existing_format_based_on_extension(self): + self.dtc.add_from_file('filename.ext') + self.fake_get_mime_type_called = False + self.fake_get_dcraw_called = False + self.dtc.add_from_file('filename.ext') + self.assertFalse(self.fake_get_mime_type_called) + self.assertFalse(self.fake_get_dcraw_called) + + def test_does_not_add_unrecognized_format(self): + self.dtc.get_dcraw = self.fake_get_dcraw_fail + self.dtc.add_from_file('filename.ext') + self.assertEqual(self.dtc.formats, []) + + def test_adds_format_from_file_with_dcraw(self): + self.dtc.add_from_file('filename.ext') + self.assertEqual(self.dtc.formats, + [{ 'name': 'ext', + 'mime_types': ['mime/type'], + 'extensions': ['ext', 'EXT'], + }]) + + def test_does_not_test_twice_for_unknown_type_with_same_ext(self): + self.dtc.get_dcraw = self.fake_get_dcraw_fail + self.dtc.add_from_file('filename.ext') + self.fake_get_mime_type_called = False + self.fake_get_dcraw_called = False + self.dtc.add_from_file('filename.ext') + self.assertFalse(self.fake_get_mime_type_called) + self.assertFalse(self.fake_get_dcraw_called) + + def test_does_not_test_twice_for_unknown_type_with_same_mime(self): + self.dtc.get_dcraw = self.fake_get_dcraw_fail + self.dtc.add_from_file('filename.ext') + self.fake_get_mime_type_called = False + self.fake_get_dcraw_called = False + self.dtc.add_from_file('filename.ext2') + self.assertFalse(self.fake_get_dcraw_called) + + def test_supported_returns_false_for_unsupported_file(self): + self.dtc.get_dcraw = self.fake_get_dcraw_fail + self.assertFalse(self.dtc.supported('filename.ext')) + + def test_supported_returns_true_for_unsupported_file(self): + self.assert_(self.dtc.supported('filename.ext')) + |