from cpp_boggle import Trie

from boggle.trie import bogglify_word


def asc(char: str):
    assert len(char) == 1
    return ord(char) - ord("a")


def test_trie():
    t = Trie()
    t.AddWord("agriculture")
    t.AddWord("culture")
    t.AddWord("boggle")
    t.AddWord("tea")
    t.AddWord("sea")
    t.AddWord("teapot")
    assert not t.IsWord()

    assert t.Size() == 6
    assert t.FindWord("agriculture") is not None
    assert t.FindWord("culture") is not None
    assert t.FindWord("boggle") is not None
    assert t.FindWord("tea") is not None
    assert t.FindWord("sea") is not None
    assert t.FindWord("teapot") is not None

    assert t.FindWord("teap") is None
    assert t.FindWord("random") is None
    assert t.FindWord("cultur") is None

    wd = t.Descend(asc("t"))
    assert wd is not None
    wd = wd.Descend(asc("e"))
    assert wd is not None
    wd = wd.Descend(asc("a"))
    assert wd is not None
    assert wd.Mark() == 0
    wd.SetMark(12345)
    assert wd.Mark() == 12345

    child = t.FindWord("agriculture")
    assert child is not None
    assert Trie.ReverseLookup(t, child) == "agriculture"


def test_bogglify_word():
    assert bogglify_word("quart") == "qart"
    assert bogglify_word("qi") is None
    assert bogglify_word("is") is None
    assert bogglify_word("boggle") == "boggle"
    assert bogglify_word("quinquennia") == "qinqennia"


def test_load_file():
    t = Trie.CreateFromFile("testdata/boggle-words-4.txt")
    assert not t.IsWord()

    assert t.FindWord("wood") is not None
    assert t.FindWord("woxd") is None
