def test_make_freq_dict(self, byte_list): """make_freq_dict returns dictionary whose values sum to the number of bytes consumed""" b, d = byte_list, make_freq_dict(byte_list) self.assertTrue(isinstance(d, dict)) self.assertEqual(sum(d.values()), len(b))
def test_round_trip(self, b): """test inverting generate_compressed and generate_uncompressed""" orig_text = b freq = make_freq_dict(orig_text) assume(len(freq) > 1) tree = huffman_tree(freq) codes = get_codes(tree) compressed = generate_compressed(orig_text, codes) uncompressed = generate_uncompressed(tree, compressed, len(orig_text)) assert orig_text == uncompressed
def test_num_nodes_to_bytes(self, b): """num_nodes_to_bytes returns a bytes object that has length 1 (since the number of internal nodes cannot exceed 256)""" # NB: also indirectly tests make_freq_dict and huffman_tree d = make_freq_dict(b) assume(len(d) > 1) t = huffman_tree(d) number_nodes(t) n = num_nodes_to_bytes(t) self.assertTrue(isinstance(n, bytes)) self.assertEqual(len(n), 1)
def test_generate_compressed(self, b): """generate_compressed should return a bytes object that is no longer than the input bytes, and the size of the compressed object should be invariant under permuting the input""" # NB: this also indirectly tests make_freq_dict, huffman_tree, # and get_codes d = make_freq_dict(b) t = huffman_tree(d) c = get_codes(t) compressed = generate_compressed(b, c) self.assertTrue(isinstance(compressed, bytes)) self.assertTrue(len(compressed) <= len(b)) l = list(b) shuffle(l) b = bytes(l) d = make_freq_dict(b) t = huffman_tree(d) c = get_codes(t) compressed2 = generate_compressed(b, c) self.assertEqual(len(compressed2), len(compressed))
def test_tree_to_bytes(self, b): """tree_to_bytes generates a bytes representation of a post-order traversal of a trees internal nodes""" # Since each internal node requires 4 bytes to represent, # and there are 1 fewer internal node than distinct symbols, # the length of the bytes produced should be 4 times the # length of the frequency dictionary, minus 4""" # NB: also indirectly tests make_freq_dict, huffman_tree, and # number_nodes d = make_freq_dict(b) assume(len(d) > 1) t = huffman_tree(d) number_nodes(t) output_bytes = tree_to_bytes(t) dictionary_length = len(d) leaf_count = dictionary_length self.assertEqual(4 * (leaf_count - 1), len(output_bytes))