import unittest
import os
import filecmp
import shutil
import subprocess
import hashlib

TEST_FILES = [
        'tests/resources/testfile1.bin',
        'tests/resources/testfile2.bin',
        'tests/resources/testfile3.bin',
        'tests/resources/testfile4.bin',
    ]

EXPECTED_MD5 = [
    'd1b520eac79e5b2acc7ad49023da4bf3',
    'e2277a6ac23fd320275448add3e257ad',
    '0b7fd4fd1edef574e2a6db15412eebb3',
    '1d6260598f95c6bd880cca06c1c54c70'
]

EXEC_FILE = './huffman'

def hash_file(path):
    hasher = hashlib.md5()
    with open(path, 'rb') as file:
        hasher.update(file.read())
    return hasher.hexdigest()

class TestHuffman(unittest.TestCase):
    def test_huffman(self):
        """
        Create .deflate files for each example binary
        and compare their checksum with known values
        """

        for filename, md5 in zip(TEST_FILES, EXPECTED_MD5):
            subprocess.run([EXEC_FILE, filename])
            output_filename = filename + '.deflate'
            self.assertTrue(os.path.exists(output_filename))
            self.assertEqual(hash_file(output_filename), md5)
            os.remove(output_filename)


if __name__ == '__main__':
    unittest.main()