Newer
Older
NewLang / tests / parse / test_error.py
# SPDX-License-Identifier: LGPL-2.1-only
# Copyright 2022 Jookia <contact@jookia.org>

from hypothesis.strategies import composite, integers, sampled_from, text

from src.parse import (
    ParseContext,
    ParseError,
    ParseErrorException,
    ParseTask,
)
from tests.templates import template_test_structure
from tests.test_token import draw_token_random, static_token

#
# Helper functions
#


# Draws a strategy, with 25% of draws being None
@composite
def draw_maybe(draw, strategy):
    chance = draw(integers(min_value=1, max_value=4))
    if chance == 1:
        return None
    else:
        return draw(strategy)


# Draws a random parse task
@composite
def draw_parse_task(draw):
    return draw(sampled_from(list(ParseTask)))


# Draws a random parse context without a parent
@composite
def draw_parse_context(draw):
    task = draw(draw_maybe(draw_parse_task()))
    token = draw(draw_maybe(draw_token_random()))
    context = draw(draw_maybe(draw_parse_context()))
    return ParseContext(task, token, context)


# Static parse context
def static_parse_context():
    task = ParseTask.TEST_TASK
    token = static_token()
    return ParseContext(task, token, None)


# Draws a random parse error
@composite
def draw_parse_error(draw):
    return draw(sampled_from(list(ParseError)))


# Draws a random parse error exception
@composite
def draw_parse_error_exception(draw):
    error = draw(draw_parse_error())
    token = draw(draw_maybe(draw_token_random()))
    expected = draw(draw_maybe(text()))
    context = draw(draw_parse_context())
    return ParseErrorException(error, token, expected, context)


#
# Test functions
#


# Test parse context structure
@template_test_structure(
    ParseContext,
    draw_parse_context(),
    task=draw_parse_task(),
    token=draw_maybe(draw_token_random()),
    parent=draw_maybe(draw_parse_context()),
)
def test_parse_context_structure():
    pass


# Test parse error exception structure
@template_test_structure(
    ParseErrorException,
    draw_parse_error_exception(),
    error=draw_parse_error(),
    token=draw_maybe(draw_token_random()),
    expected=draw_maybe(text()),
    context=draw_maybe(draw_parse_context()),
)
def test_parse_error_exception_structure():
    pass