diff --git a/tests/test_media_split.py b/tests/test_media_split.py new file mode 100755 index 00000000..91de8a6b --- /dev/null +++ b/tests/test_media_split.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +try: + import unittest2 as unittest +except ImportError: + import unittest +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) + +from pungi import media_split + + +class ConvertMediaSizeTestCase(unittest.TestCase): + + def test_size_parser_correct_number_as_int(self): + self.assertEqual(media_split.convert_media_size(123), 123) + + def test_size_parser_correct_number_as_str(self): + self.assertEqual(media_split.convert_media_size('123'), 123) + + def test_size_parser_with_unit_b(self): + self.assertEqual(media_split.convert_media_size('123b'), 123) + + def test_size_parser_with_unit_k(self): + self.assertEqual(media_split.convert_media_size('123k'), 123 * 1024) + + def test_size_parser_with_unit_M(self): + self.assertEqual(media_split.convert_media_size('123M'), + 123 * 1024 * 1024) + + def test_size_parser_with_unit_G(self): + self.assertEqual(media_split.convert_media_size('123G'), + 123 * 1024 * 1024 * 1024) + + def test_size_parser_with_negative_number(self): + with self.assertRaises(ValueError): + media_split.convert_media_size(-15) + + def test_size_parser_with_unknown_unit(self): + with self.assertRaises(ValueError): + media_split.convert_media_size('123X') + + +class ConvertFileSizeTestCase(unittest.TestCase): + + def test_round_up(self): + self.assertEqual(media_split.convert_file_size(123, 2048), 2048) + + def test_exactly_block_size(self): + self.assertEqual(media_split.convert_file_size(100, 100), 100) + + +def bl(s): + return s * 2048 + + +class MediaSplitterTestCase(unittest.TestCase): + + def test_sum_size(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('first', bl(20)) + ms.add_file('second', bl(30)) + ms.add_file('third', 10) + + self.assertEqual(ms.total_size, bl(50) + 10) + self.assertEqual(ms.total_size_in_blocks, bl(51)) + + def test_add_same_file_twice(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('first', bl(20)) + ms.add_file('first', bl(20)) + + self.assertEqual(ms.total_size, bl(20)) + + def test_add_same_file_twice_with_different_size(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('first', bl(20)) + with self.assertRaises(ValueError): + ms.add_file('first', bl(30)) + + def test_add_too_big_file(self): + ms = media_split.MediaSplitter(bl(100)) + with self.assertRaises(ValueError): + ms.add_file('too-big', bl(300)) + + def test_fit_on_one(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('first', bl(20)) + ms.add_file('second', bl(30)) + + self.assertEqual(ms.split(), + [{'files': ['first', 'second'], 'size': bl(50)}]) + + def test_split_on_two_discs(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('first', bl(25)) + ms.add_file('second', bl(40)) + ms.add_file('third', bl(80)) + + self.assertEqual(ms.split(), + [{'files': ['first', 'second'], 'size': bl(65)}, + {'files': ['third'], 'size': bl(80)}]) + + def test_split_with_sticky_file(self): + ms = media_split.MediaSplitter(bl(100)) + ms.add_file('sticky', bl(15), sticky=True) + ms.add_file('first', bl(25)) + ms.add_file('second', bl(40)) + ms.add_file('third', bl(80)) + + self.assertEqual(ms.split(), + [{'files': ['sticky', 'first', 'second'], 'size': bl(80)}, + {'files': ['sticky', 'third'], 'size': bl(95)}]) + +if __name__ == "__main__": + unittest.main()