import unittest

from byteb4rb1e.utils.string import RollingHash

class test_compute_initial_hash(unittest.TestCase):
    """RollingHash.compute_initial_hash()

    i calculated the hashes by hand, as a basis for this test case. Hopefully
    there's no logical flaw...
    """

    def test_default(self):
        """computation of hash"""
        result = RollingHash.compute_initial_hash(
            b'abcdefg',
            base = 31,
            mod = 10**9 + 7
        )

        self.assertEqual(result, 988021244)

class test___init__(unittest.TestCase):
    """RollingHash.__init__()

    Make sure the class instance is initialized correctly

    I calculated the hashes by hand, as a basis for this test case. Hopefully
    there's no logical flaw...
    """

    def test_default(self):
        """computation of initial hash and highest base factor"""
        instance = RollingHash(b'abcdefg')

        self.assertEqual(instance._hash, 988021244)
        self.assertEqual(instance._hbase_factor, 887503681)

    def test_defaults_override(self):
        """override of defaults"""
        instance = RollingHash(
            b'abcdefg',
            base = 9,
            mod = 4
        )

        self.assertEqual(instance._mod, 4)
        self.assertEqual(instance._base, 9)


class test_roll(unittest.TestCase):
    """RollingHash.roll()"""
    def test_rolling_hash(self):
        base=31
        mod=10**9 + 7

        rh = RollingHash(b"foobar", base=base, mod=mod)
        rolled_hash = rh.roll(ord("f"), ord("n"))

        control_hash = RollingHash.compute_initial_hash(b"oobarn", base, mod)

        self.assertEqual(rolled_hash, control_hash)
