Esempio n. 1
0
def test_equality_leaf_not_equal_data():
    """
    Test node equality on leaves with unequal data
    """
    test: Node = Node(5, 'x')
    expected: Node = Node(5, 'b')
    assert test != expected
Esempio n. 2
0
def test_equality_leaf_not_equal_count():
    """
    Test node equality on leaves with unequal counts
    """
    test: Node = Node(5, 'x')
    expected: Node = Node(2, 'x')
    assert test != expected
Esempio n. 3
0
def test_equality_leaf_equal():
    """
    Test node equality on equal leaves.
    """
    test: Node = Node(5, 'x')
    expected: Node = Node(5, 'x')
    assert test == expected
Esempio n. 4
0
def test_to_bits_parent():
    """
    Test converting a parent node into a bit array
    """
    test: Node = Node(5, left=Node(2, 'x'), right=Node(3, 'b'))
    expected: BitArray = BitArray('0b1001111000001100010')
    assert test.to_bits() == expected
Esempio n. 5
0
def test_from_bits_leaf():
    """
    Test constructing a node from bits
    """
    given = BitArray('0b001111000100')
    expected = Node(data='x')

    result = Node()
    remaining = result.from_bits(given)

    assert result == expected
    assert remaining == BitArray('0b100')
Esempio n. 6
0
def huffman_encode(message, encoding="utf-8"):
    if not message:
        if encoding == "utf-8":
            return ""
        else:
            return b""
    h = []
    for ch, freq in Counter(message).items():
        h.append((freq, len(h), Leaf(ch)))

    heapq.heapify(h)

    count = len(h)
    while len(h) > 1:
        freq1, _count1, left = heapq.heappop(h)
        freq2, _count2, right = heapq.heappop(h)
        heapq.heappush(h, (freq1 + freq2, count, Node(left, right)))
        count += 1

    code = {}
    root = None
    if h:
        [(_freq, _count, root)] = h
        root.walk(code, BitArray())

    tree_bits = serialize_tree(root, encoding)

    message_bits = BitArray()
    for ch in message:
        message_bits.extend(code[ch])

    encoded = make_encoded_bytes(tree_bits, message_bits, encoding)
    return encoded
Esempio n. 7
0
def test_to_bits_leaf():
    """
    Tests converting a leaf node into a bitarray
    """
    test: Node = Node(5, 'x')
    expected: BitArray = BitArray('0b001111000')
    assert test.to_bits() == expected
Esempio n. 8
0
def test_equality_parent_not_equal_child():
    """
    Test node equality with two parents with nonequivalent children
    """
    test: Node = Node(5, left=Node(2, 'x'), right=Node(3, 'b'))
    expected: Node = Node(5, left=Node(2, 'a'), right=Node(3, 'b'))
    assert test != expected
Esempio n. 9
0
def test_equality_parent_equal():
    """
    Test node equality on two equal parents.
    """
    test: Node = Node(5, left=Node(2, 'x'), right=Node(3, 'b'))
    expected: Node = Node(5, left=Node(2, 'x'), right=Node(3, 'b'))
    assert test == expected
Esempio n. 10
0
def test_from_bits_parent():
    """
    Test constructing a node from bits
    """
    given = BitArray('0b1001111000001100010')
    expected = Node(left=Node(data='x'), right=Node(data='b'))

    result = Node()
    remaining = result.from_bits(given)

    assert result == expected
    assert remaining == BitArray()