import byt2str
import unittest
from test import support
class ConvertTest(unittest.TestCase):
def test_min(self):
# Check that the "convert" min range is correct.
self.assertEqual(byt2str.convert(1), '1 Byte')
with self.assertRaises(AssertionError):
byt2str.convert(0)
def test_max(self):
# Test the max range for "convert" for errors.
prefix = ('geop', 'bronto', 'yotta', 'zetta', 'exa',
'peta', 'tera', 'giga', 'mega', 'kilo', '')
suffix = map(lambda s: '1023 ' + (s + 'bytes').capitalize(), prefix)
self.assertEqual(byt2str.convert((1 << 110) - 1), ', '.join(suffix))
with self.assertRaises(AssertionError):
byt2str.convert(1 << 110)
def test_ternary(self):
# Ensure that three separate components validate.
string = byt2str.convert((1 << 40) + (1 << 20) * 123 + 456)
self.assertEqual(string, '1 Terabyte, 123 Megabytes, 456 Bytes')
def test_binary(self):
# Observe if two non-contiguous numbers render well.
string = byt2str.convert(789 * (1 << 30) + (1 << 10))
self.assertEqual(string, '789 Gigabytes, 1 Kilobyte')
class PartitionTest(unittest.TestCase):
def setUp(self):
# Create test cases for child classes.
self.numbers = (1, 2, 4, 6, 8, 10, 16,
32, 36, 64, 100, 128,
216, 256, 512, 1000)
def test_base(self):
# Execute a series of tests for children.
for number, result in zip(self.numbers, self.results):
answer = list(byt2str.partition_number(number, self.pn_base))
self.assertListEqual(answer, result)
class BaseTwoTest(PartitionTest):
def setUp(self):
# Create variables to test against in base two.
super().setUp()
self.pn_base = 2
self.results = ([1],
[0, 1],
[0, 0, 1],
[0, 1, 1],
[0, 0, 0, 1],
[0, 1, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 1, 1, 1, 1, 1])
class BaseSixTest(PartitionTest):
def setUp(self):
# Setup parameters for the base six test.
super().setUp()
self.pn_base = 6
self.results = ([1],
[2],
[4],
[0, 1],
[2, 1],
[4, 1],
[4, 2],
[2, 5],
[0, 0, 1],
[4, 4, 1],
[4, 4, 2],
[2, 3, 3],
[0, 0, 0, 1],
[4, 0, 1, 1],
[2, 1, 2, 2],
[4, 4, 3, 4])
class BaseTenTest(PartitionTest):
def setUp(self):
# Create some data needed for testing base ten.
super().setUp()
self.pn_base = 10
self.results = ([1],
[2],
[4],
[6],
[8],
[0, 1],
[6, 1],
[2, 3],
[6, 3],
[4, 6],
[0, 0, 1],
[8, 2, 1],
[6, 1, 2],
[6, 5, 2],
[2, 1, 5],
[0, 0, 0, 1])
class BytesTest(unittest.TestCase):
def test_ascending(self):
# See if bytes are computed correctly while ascending.
example = ('0 Bytes',
'1 Kilobyte', '2 Megabytes', '3 Gigabytes',
'4 Terabytes', '5 Petabytes', '6 Exabytes',
'7 Zettabytes', '8 Yottabytes', '9 Brontobytes',
'10 Geopbytes')
results = tuple(byt2str.format_bytes(range(0, 11, 1)))
self.assertTupleEqual(results, example)
def test_descending(self):
# Check that strings for descending numbers are valid.
example = ('10 Bytes',
'9 Kilobytes', '8 Megabytes', '7 Gigabytes',
'6 Terabytes', '5 Petabytes', '4 Exabytes',
'3 Zettabytes', '2 Yottabytes', '1 Brontobyte',
'0 Geopbytes')
results = tuple(byt2str.format_bytes(range(10, -1, -1)))
self.assertTupleEqual(results, example)
class SuffixTest(unittest.TestCase):
def test_prefix(self):
# Ensure that each prefix is selected correctly.
example = ['Byte', 'Kilobyte', 'Megabyte', 'Gigabyte',
'Terabyte', 'Petabyte', 'Exabyte', 'Zettabyte',
'Yottabyte', 'Brontobyte', 'Geopbyte']
results = [byt2str.format_suffix(power, 1) for power in range(11)]
self.assertListEqual(results, example)
def test_plural(self):
# Test a range of numbers for the number of the word.
example = ['Bytes', 'Bytes', 'Byte', 'Bytes', 'Bytes']
results = [byt2str.format_suffix(0, number) for number in range(-1, 4)]
self.assertListEqual(results, example)
def test_main():
support.run_unittest(ConvertTest, BytesTest, SuffixTest,
BaseTwoTest, BaseSixTest, BaseTenTest)
if __name__ == '__main__':
test_main()