Blame tests/libbytesize_unittest.py

Packit Service 0a675f
#!/usr/bin/python3
Packit b040ce
# -*- coding: utf-8 -*-
Packit b040ce
Packit b040ce
import locale
Packit b040ce
import unittest
Packit b040ce
import sys
Packit b040ce
import ctypes
Packit b040ce
Packit b040ce
from locale_utils import get_avail_locales, requires_locales
Packit b040ce
Packit Service 0a675f
from bytesize import KiB, GiB, ROUND_UP, ROUND_DOWN, ROUND_HALF_UP, OverflowError
Packit Service 0a675f
Packit Service 0a675f
# SizeStruct is part of the 'private' API and needs to be imported differently
Packit Service 0a675f
# when running from locally build tree and when using installed library
Packit Service 0a675f
try:
Packit Service 0a675f
    from bytesize import SizeStruct
Packit Service 0a675f
except ImportError:
Packit Service 0a675f
    from bytesize.bytesize import SizeStruct
Packit b040ce
Packit b040ce
DEFAULT_LOCALE = "en_US.utf8"
Packit b040ce
Packit b040ce
class SizeTestCase(unittest.TestCase):
Packit b040ce
Packit b040ce
    @classmethod
Packit b040ce
    def setUpClass(cls):
Packit b040ce
        unittest.TestCase.setUpClass()
Packit b040ce
        cls.avail_locales = get_avail_locales()
Packit b040ce
Packit b040ce
    @requires_locales({DEFAULT_LOCALE})
Packit b040ce
    def setUp(self):
Packit b040ce
        locale.setlocale(locale.LC_ALL, DEFAULT_LOCALE)
Packit b040ce
        self.addCleanup(self._clean_up)
Packit b040ce
Packit b040ce
    def _clean_up(self):
Packit b040ce
        locale.setlocale(locale.LC_ALL, DEFAULT_LOCALE)
Packit b040ce
Packit b040ce
    def testNew(self):
Packit b040ce
        actual = SizeStruct.new().get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
    @requires_locales({'cs_CZ.UTF-8', 'ps_AF.UTF-8', 'en_US.UTF-8'})
Packit b040ce
    def testNewFromStr(self):
Packit b040ce
        actual = SizeStruct.new_from_str('0 B').get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1 KiB').get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1KB').get_bytes()
Packit b040ce
        expected = (1000, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1 MiB').get_bytes()
Packit b040ce
        expected = (1048576, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('   1 MiB').get_bytes()
Packit b040ce
        expected = (1048576, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1 MiB    ').get_bytes()
Packit b040ce
        expected = (1048576, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('    1 MiB   ').get_bytes()
Packit b040ce
        expected = (1048576, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1.5 GiB').get_bytes()
Packit b040ce
        expected = (1610612736, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('+1.5 GiB').get_bytes()
Packit b040ce
        expected = (1610612736, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        locale.setlocale(locale.LC_ALL,'cs_CZ.UTF-8')
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1,5 KiB').get_bytes()
Packit b040ce
        expected = (1536, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1,5 KiB').get_bytes()
Packit b040ce
        expected = (1536, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1.5 KiB').get_bytes()
Packit b040ce
        expected = (1536, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1.5 KiB').get_bytes()
Packit b040ce
        expected = (1536, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1e-1 KB').get_bytes()
Packit b040ce
        expected = (100, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1e-1 KB').get_bytes()
Packit b040ce
        expected = (100, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # this persian locale uses a two-byte unicode character for the radix
Packit b040ce
        locale.setlocale(locale.LC_ALL, 'ps_AF.UTF-8')
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1٫5 KiB').get_bytes()
Packit b040ce
        expected = (1536, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1٫5 KiB').get_bytes()
Packit b040ce
        expected = (1536, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('1.5 KiB').get_bytes()
Packit b040ce
        expected = (1536, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_str('-1.5 KiB').get_bytes()
Packit b040ce
        expected = (1536, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        locale.setlocale(locale.LC_ALL, DEFAULT_LOCALE)
Packit b040ce
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testNewFromBytes(self):
Packit b040ce
        actual = SizeStruct.new_from_bytes(0, 0).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_bytes(10, 1).get_bytes()
Packit b040ce
        expected = (10, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        actual = SizeStruct.new_from_bytes(1024, -1).get_bytes()
Packit b040ce
        expected = (1024, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # now let's try something bigger than MAXUINT32
Packit b040ce
        actual = SizeStruct.new_from_bytes(5718360*1024, 1).get_bytes()
Packit b040ce
        expected = (5718360*1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testNewFromSizeStruct(self):
Packit b040ce
        tempSizeStruct = SizeStruct.new_from_bytes(17, 1)
Packit b040ce
        actual = SizeStruct.new_from_size(tempSizeStruct).get_bytes()
Packit b040ce
        expected = (17, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testAdd(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        actual = x.add(y).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        actual = x.add(y).get_bytes()
Packit b040ce
        expected = (8, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, -1)
Packit b040ce
        actual = x.add(y).get_bytes()
Packit b040ce
        expected = (24, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, -1)
Packit b040ce
        actual = x.add(y).get_bytes()
Packit b040ce
        expected = (16, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        y = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        actual = x.add(y).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
Packit b040ce
    def testAddBytes(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        actual = x.add_bytes(16).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        actual = x.add_bytes(8).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        actual = x.add_bytes(0).get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # try some big value (bigger than ULONG_MAX on 32bit arches)
Packit b040ce
        x = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        actual = x.add_bytes(2**36).get_bytes()
Packit b040ce
        expected = (2**36, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testSub(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        actual = x.sub(y).get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        actual = x.sub(y).get_bytes()
Packit b040ce
        expected = (24, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, -1)
Packit b040ce
        actual = x.sub(y).get_bytes()
Packit b040ce
        expected = (8, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, -1)
Packit b040ce
        actual = x.sub(y).get_bytes()
Packit b040ce
        expected = (16, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        y = SizeStruct.new_from_bytes(0, 0)
Packit b040ce
        actual = x.sub(y).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testSubBytes(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        actual = x.sub_bytes(16).get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        actual = x.sub_bytes(8).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, -1)
Packit b040ce
        actual = x.sub_bytes(0).get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # try some big value (bigger than ULONG_MAX on 32bit arches)
Packit b040ce
        x = SizeStruct.new_from_bytes(2**36 + 10, 1)
Packit b040ce
        actual = x.sub_bytes(2**36).get_bytes()
Packit b040ce
        expected = (10, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testCmp(self):
Packit b040ce
        x = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        y = SizeStruct.new_from_str("-1 KiB")
Packit b040ce
Packit b040ce
        # params: SizeStruct x, SizeStruct y, bool abs
Packit b040ce
        # result > 0
Packit b040ce
        cmpResult = SizeStruct.cmp(x, y, False)
Packit b040ce
        self.assertGreater(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result < 0
Packit b040ce
        cmpResult = SizeStruct.cmp(y, x, False)
Packit b040ce
        self.assertLess(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result == 0
Packit b040ce
        cmpResult = SizeStruct.cmp(y, x, True)
Packit b040ce
        self.assertEqual(cmpResult, 0)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testCmpBytes(self):
Packit b040ce
        x = SizeStruct.new_from_str("1 KiB")
Packit b040ce
Packit b040ce
        # result > 0
Packit b040ce
        y = 1023
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, False)
Packit b040ce
        self.assertGreater(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result < 0
Packit b040ce
        y = 1025
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, False)
Packit b040ce
        self.assertLess(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result == 0
Packit b040ce
        y = 1024
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, False)
Packit b040ce
        self.assertEqual(cmpResult, 0)
Packit b040ce
Packit b040ce
        # test with abs == True
Packit b040ce
        x = SizeStruct.new_from_str("-1 KiB")
Packit b040ce
Packit b040ce
        # result > 0
Packit b040ce
        y = 1023
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, True)
Packit b040ce
        self.assertGreater(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result < 0
Packit b040ce
        y = 1025
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, True)
Packit b040ce
        self.assertLess(cmpResult, 0)
Packit b040ce
Packit b040ce
        # result == 0
Packit b040ce
        y = 1024
Packit b040ce
        cmpResult = SizeStruct.cmp_bytes(x, y, True)
Packit b040ce
        self.assertEqual(cmpResult, 0)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testConvertTo(self):
Packit b040ce
        x = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        x.convert_to(KiB)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testDiv(self):
Packit b040ce
        x = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        y = SizeStruct.new_from_str("-0.1 KiB")
Packit b040ce
        divResult = x.div(y)
Packit b040ce
        self.assertEqual(divResult, (10, -1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1 MiB")
Packit b040ce
        y = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        divResult = x.div(y)
Packit b040ce
        self.assertEqual(divResult, (1024, 1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1 GB")
Packit b040ce
        y = SizeStruct.new_from_str("0.7 GB")
Packit b040ce
        divResult = x.div(y)
Packit b040ce
        self.assertEqual(divResult, (1, 1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-1 KiB")
Packit b040ce
        y = SizeStruct.new_from_str("0.1 KiB")
Packit b040ce
        divResult = x.div(y)
Packit b040ce
        self.assertEqual(divResult, (10, -1))
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testDivInt(self):
Packit b040ce
        x = SizeStruct.new_from_str("1 MiB")
Packit b040ce
        y = 1024
Packit b040ce
        divResult = x.div_int(y).get_bytes()
Packit b040ce
        self.assertEqual(divResult, (1024, 1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-1 MiB")
Packit b040ce
        y = 1077
Packit b040ce
        divResult = x.div_int(y).get_bytes()
Packit b040ce
        self.assertEqual(divResult, (973, -1))
Packit b040ce
Packit b040ce
        try:
Packit b040ce
            x = SizeStruct.new_from_bytes(2 * 2**36, 1)
Packit b040ce
            y = 2**36
Packit b040ce
            res = x.div_int(y).get_bytes()
Packit b040ce
            self.assertEqual(res, (2, 1))
Packit b040ce
        except OverflowError:
Packit b040ce
            # ULONG_MAX is the real limit for division, if it's smaller than
Packit b040ce
            # UINT64_MAX, an error is expected, otherwise it is a bug
Packit b040ce
            if ctypes.sizeof(ctypes.c_ulong) == 4:
Packit b040ce
                pass
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testGetBytesStr(self):
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("-1 KiB").get_bytes_str()
Packit b040ce
        self.assertEqual(strSizeStruct, "-1024")
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    @requires_locales({'cs_CZ.UTF-8'})
Packit b040ce
    def testHumanReadable(self):
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("12 KiB").human_readable(KiB, 2, False)
Packit b040ce
        self.assertEqual(strSizeStruct, "12 KiB")
Packit b040ce
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("1 KB").human_readable(KiB, 2, False)
Packit b040ce
        self.assertEqual(strSizeStruct, "0.98 KiB")
Packit b040ce
Packit b040ce
        locale.setlocale(locale.LC_ALL, 'cs_CZ.UTF-8')
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("1 KB").human_readable(KiB, 2, True)
Packit b040ce
        self.assertEqual(strSizeStruct, "0,98 KiB")
Packit b040ce
        locale.setlocale(locale.LC_ALL, DEFAULT_LOCALE);
Packit b040ce
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("100 GiB").human_readable(KiB, 2, False)
Packit b040ce
        self.assertEqual(strSizeStruct, "100 GiB")
Packit b040ce
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("100.00 GiB").human_readable(KiB, 2, False)
Packit b040ce
        self.assertEqual(strSizeStruct, "100 GiB")
Packit b040ce
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("100 GiB").human_readable(KiB, 0, False)
Packit b040ce
        self.assertEqual(strSizeStruct, "100 GiB")
Packit b040ce
Packit b040ce
        # test that the result of human_readable() can be parsed back
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("100 GiB").human_readable(GiB, 0, False)
Packit b040ce
        self.assertEqual(SizeStruct.new_from_str(strSizeStruct).get_bytes(), (100 * 1024**3, 1))
Packit b040ce
Packit b040ce
        # even if translated
Packit b040ce
        strSizeStruct = SizeStruct.new_from_str("100 GiB").human_readable(GiB, 0, True)
Packit b040ce
        self.assertEqual(SizeStruct.new_from_str(strSizeStruct).get_bytes(), (100 * 1024**3, 1))
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testSgn(self):
Packit b040ce
        sgn = SizeStruct.new_from_str("12 KiB").sgn()
Packit b040ce
        self.assertEqual(sgn, 1)
Packit b040ce
Packit b040ce
        sgn = SizeStruct.new_from_str("0 MB").sgn()
Packit b040ce
        self.assertEqual(sgn, 0)
Packit b040ce
Packit b040ce
        sgn = SizeStruct.new_from_str("-12 GiB").sgn()
Packit b040ce
        self.assertEqual(sgn, -1)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testTrueDiv(self):
Packit b040ce
        x = SizeStruct.new_from_str("1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("-102.4 B") # rounds to whole bytes
Packit b040ce
        divResult = float(x.true_div(y)[:15].replace(locale.nl_langinfo(locale.RADIXCHAR), ".")) # just some number to cover accurancy and not cross max float range
Packit b040ce
        self.assertAlmostEqual(divResult, 1024.0/-102.0)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1 MiB")
Packit b040ce
        y = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        divResult = float(x.true_div(y)[:15].replace(locale.nl_langinfo(locale.RADIXCHAR), ".")) # just some number to cover accurancy and not cross max float range
Packit b040ce
        self.assertAlmostEqual(divResult, 1024.0)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testMod(self):
Packit b040ce
        x = SizeStruct.new_from_str("1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("1000 B")
Packit b040ce
        actual = x.mod(y).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # when modding the signs are ignored
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("-1000 B")
Packit b040ce
        actual = x.mod(y).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("1000 B")
Packit b040ce
        actual = x.mod(y).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("-1000 B")
Packit b040ce
        actual = x.mod(y).get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1024 B")
Packit b040ce
        y = SizeStruct.new_from_str("1024 B")
Packit b040ce
        actual = x.mod(y).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testMulFloatStr(self):
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        actual = x.mul_float_str("1.51").get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, 1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-8 B")
Packit b040ce
        actual = x.mul_float_str("1.51").get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, -1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        actual = x.mul_float_str("-1.51").get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, -1))
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testMulInt(self):
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        y = 2
Packit b040ce
        actual = x.mul_int(y).get_bytes()
Packit b040ce
        expected = (16, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("0 B")
Packit b040ce
        y = 1
Packit b040ce
        actual = x.mul_int(y).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("10 B")
Packit b040ce
        y = 0
Packit b040ce
        actual = x.mul_int(y).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(4, 1)
Packit b040ce
        y = 2**36
Packit b040ce
        actual = x.mul_int(y).get_bytes()
Packit b040ce
        expected = (4 * 2**36, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testRoundToNearest(self):
Packit b040ce
        x = SizeStruct.new_from_str("1500 B")
Packit b040ce
        roundTo = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (2048, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1500 B")
Packit b040ce
        roundTo = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1500 B")
Packit b040ce
        roundTo = SizeStruct.new_from_str("10 KiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1024 B")
Packit b040ce
        roundTo = SizeStruct.new_from_str("1 KiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1023 B")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1025 B")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (2048, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1535 B")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (2048, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("1536 B")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_DOWN).get_bytes()
Packit b040ce
        expected = (1024, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_UP).get_bytes()
Packit b040ce
        expected = (2048, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes()
Packit b040ce
        expected = (2048, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        # now check something bigger
Packit b040ce
        x = SizeStruct.new_from_str("575 GiB")
Packit b040ce
        roundTo = SizeStruct.new_from_str("128 GiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes_str()
Packit b040ce
        expected = SizeStruct.new_from_str("512 GiB").get_bytes_str()
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("576 GiB")
Packit b040ce
        roundTo = SizeStruct.new_from_str("128 GiB")
Packit b040ce
        actual = x.round_to_nearest(roundTo, ROUND_HALF_UP).get_bytes_str()
Packit b040ce
        expected = SizeStruct.new_from_str("640 GiB").get_bytes_str()
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testGrow(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        y = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        x.grow(y)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testGrowBytes(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        x.grow_bytes(8)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (24, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        x.grow_bytes(2**36)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (16 + 2**36, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testGrowMulFloatStr(self):
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        x.grow_mul_float_str("1.51")
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, 1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-8 B")
Packit b040ce
        x.grow_mul_float_str("1.51")
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, -1))
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        x.grow_mul_float_str("-1.51")
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        self.assertEqual(actual, (12, -1))
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testGrowMulInt(self):
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        x.grow_mul_int(2)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (16, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("0 B")
Packit b040ce
        x.grow_mul_int(1)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("10 B")
Packit b040ce
        x.grow_mul_int(0)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (0, 0)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(4, 1)
Packit b040ce
        x.grow_mul_int(2**36)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (4 * 2**36, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testShrink(self):
Packit b040ce
        x = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        y = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        x.shrink(y)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (8, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(8, 1)
Packit b040ce
        y = SizeStruct.new_from_bytes(16, 1)
Packit b040ce
        x.shrink(y)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testShrinkBytes(self):
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        x.shrink_bytes(2)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (6, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("8 B")
Packit b040ce
        x.shrink_bytes(16)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (8, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-8 B")
Packit b040ce
        x.shrink_bytes(8)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (16, -1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(2 * 2**36, 1)
Packit b040ce
        x.shrink_bytes(2**36)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (2**36, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testShrinkDivInt(self):
Packit b040ce
        x = SizeStruct.new_from_str("100 B")
Packit b040ce
        y = 11
Packit b040ce
        x.shrink_div_int(y)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (9, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("98 B")
Packit b040ce
        y = 11
Packit b040ce
        x.shrink_div_int(y)
Packit b040ce
        actual = x.get_bytes()
Packit b040ce
        expected = (8, 1)
Packit b040ce
        self.assertEqual(actual, expected)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(2 * 2**36, 1)
Packit b040ce
        y = 2**36
Packit b040ce
        try:
Packit b040ce
            res = x.shrink_div_int(y).get_bytes()
Packit b040ce
            self.assertEqual(res, (2, 1))
Packit b040ce
        except OverflowError:
Packit b040ce
            # ULONG_MAX is the real limit for division, if it's smaller than
Packit b040ce
            # UINT64_MAX, an error is expected, otherwise it is a bug
Packit b040ce
            if ctypes.sizeof(ctypes.c_ulong) == 4:
Packit b040ce
                pass
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
    def testTrueDivInt(self):
Packit b040ce
        x = SizeStruct.new_from_str("1000 B")
Packit b040ce
        y = 100
Packit b040ce
        divResult = float(x.true_div_int(y)[:15]) # just some number to cover accuracy and not cross max float range
Packit b040ce
        self.assertAlmostEqual(divResult, 1000.0/100.0)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("-1 MiB")
Packit b040ce
        y = 1024
Packit b040ce
        divResult = float(x.true_div_int(y)[:15]) # just some number to cover accuracy and not cross max float range
Packit b040ce
        self.assertAlmostEqual(divResult, -1024.0)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_str("0 MiB")
Packit b040ce
        y = 1024
Packit b040ce
        divResult = float(x.true_div_int(y)[:15]) # just some number to cover accuracy and not cross max float range
Packit b040ce
        self.assertAlmostEqual(divResult, 0.0)
Packit b040ce
Packit b040ce
        x = SizeStruct.new_from_bytes(10 * 2**36, 1)
Packit b040ce
        y = 2**36
Packit b040ce
        try:
Packit b040ce
            res = float(x.true_div_int(y)[:15])
Packit b040ce
            self.assertAlmostEqual(res, 10.0)
Packit b040ce
        except OverflowError:
Packit b040ce
            # ULONG_MAX is the real limit for division, if it's smaller than
Packit b040ce
            # UINT64_MAX, an error is expected, otherwise it is a bug
Packit b040ce
            if ctypes.sizeof(ctypes.c_ulong) == 4:
Packit b040ce
                pass
Packit b040ce
    #enddef
Packit b040ce
Packit b040ce
#endclass
Packit b040ce
Packit b040ce
Packit b040ce
# script entry point
Packit b040ce
if __name__=='__main__':
Packit b040ce
    if len(sys.argv) > 1:
Packit b040ce
        DEFAULT_LOCALE = sys.argv[1]
Packit b040ce
        # the unittest module would try to intepret the argument too, let's
Packit b040ce
        # remove it
Packit b040ce
        sys.argv = [sys.argv[0]]
Packit b040ce
    unittest.main()
Packit b040ce
#endif