Degenerated Trie Test
All checks were successful
continuous-integration/drone/push Build is passing

Tests for a ByteTrie that degenerates to a doubly linked list
This commit is contained in:
Armin Friedl 2020-10-18 18:46:36 +02:00
parent 543c71b562
commit 9f47254090
5 changed files with 73 additions and 3 deletions

View file

@ -3,7 +3,9 @@
# Bytetrie # Bytetrie
A fast, dependency-free, self-compressing trie with radix 256 in pure python. A fast, dependency-free, self-compressing trie with radix 256 in pure python.
![](trie.png) | ![Artistic ByteTrie Render](trie.png) |
|--------------------------------------------------------------------------------------------------------------------------:|
| *Rendering of a ByteTrie containing [~200,000 cities with a population > 500](http://download.geonames.org/export/dump/)* |
Bytetrie allows fast prefix search in a large corpus of keys. Each key can be Bytetrie allows fast prefix search in a large corpus of keys. Each key can be
associated with arbitrary data. It features fast lookup times at the cost of associated with arbitrary data. It features fast lookup times at the cost of

View file

@ -1,5 +1,6 @@
import pytest import pytest
pytest_plugins = [ pytest_plugins = [
"tries.simple_trie" "tries.simple_trie",
"tries.degenerated_trie"
] ]

View file

@ -2,11 +2,12 @@ import pytest
import sys import sys
import os import os
sys.path.append("tests/tries/")
from bytetrie import ByteTrie from bytetrie import ByteTrie
sys.path.append("tests/tries/")
import simple_trie import simple_trie
import degenerated_trie
def test_find_all(simple_trie): def test_find_all(simple_trie):
r = simple_trie.find(b"A") r = simple_trie.find(b"A")
@ -47,3 +48,18 @@ def test_partial_prefix_find_terminal(simple_trie):
assert len(r) == 1 assert len(r) == 1
assert r[0].key() == b"ABCDE" assert r[0].key() == b"ABCDE"
assert r[0].value() == "ABCDE" assert r[0].value() == "ABCDE"
def test_degenerated_find_first_finds_all(degenerated_trie):
r = degenerated_trie.find(b"A")
assert len(r) == 26
assert r[0].key() == b"A"
assert r[0].value() == "A"
assert r[25].key() == b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
assert r[25].value() == "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def test_degenerated_find_last_finds_one(degenerated_trie):
r = degenerated_trie.find(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ")
assert len(r) == 1
assert r[0].key() == b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
assert r[0].value() == "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -0,0 +1,51 @@
"""
A degenerated ByteTrie fixture. ByteTrie resolves to a doubly-linked list. The
worst case scenario.
See degenerated_trie.png
"""
import pytest
from bytetrie import ByteTrie
def insert(trie):
""" Shall only be used to insert strings """
t = trie
def _insert(*vals):
for val in vals:
t.insert(val.encode('utf-8'), val)
return _insert
@pytest.fixture
def degenerated_trie():
t = ByteTrie()
ins = insert(t)
ins("A")
ins("AB")
ins("ABC")
ins("ABCD")
ins("ABCDE")
ins("ABCDEF")
ins("ABCDEFG")
ins("ABCDEFGH")
ins("ABCDEFGHI")
ins("ABCDEFGHIJ")
ins("ABCDEFGHIJK")
ins("ABCDEFGHIJKL")
ins("ABCDEFGHIJKLM")
ins("ABCDEFGHIJKLMN")
ins("ABCDEFGHIJKLMNO")
ins("ABCDEFGHIJKLMNOP")
ins("ABCDEFGHIJKLMNOPQ")
ins("ABCDEFGHIJKLMNOPQR")
ins("ABCDEFGHIJKLMNOPQRS")
ins("ABCDEFGHIJKLMNOPQRST")
ins("ABCDEFGHIJKLMNOPQRSTU")
ins("ABCDEFGHIJKLMNOPQRSTUV")
ins("ABCDEFGHIJKLMNOPQRSTUVW")
ins("ABCDEFGHIJKLMNOPQRSTUVWX")
ins("ABCDEFGHIJKLMNOPQRSTUVWXY")
ins("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
return t