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

from hypothesis import given
from hypothesis.strategies import composite, just, lists, one_of

from src.parse import (
    NoteSkipper,
    ParseContext,
    ParseError,
    ParseErrorException,
    ParseTask,
)
from src.token import TokenStream
from tests.parse.templates import template_test_invalid
from tests.parse.test_error import static_parse_context
from tests.parse.test_note import draw_note_value_token, static_note_tokens
from tests.test_token import static_token_by_value


# Draws a tokens of notes and non-notes and output without notes
@composite
def draw_notes_to_clear(draw):
    token_sets = draw(
        lists(one_of([lists(draw_note_value_token()), just(static_note_tokens())]))
    )
    output = []
    tokens = []
    for set in token_sets:
        tokens += set
        if set != static_note_tokens():
            output += set
    return (tokens, output)


# Tests clear_notes filters out notes
@given(draw_notes_to_clear())
def test_parse_clear_notes_valid(test_data):
    (tokens, result) = test_data
    stream = TokenStream(tokens)
    cleared = NoteSkipper().clear_notes(stream, None)
    assert cleared == result


# Tests clear_notes errors when finding an EndNote
@given(lists(draw_note_value_token()))
def test_parse_clear_notes_invalid_endnote(tokens):
    token = static_token_by_value("EndNote")
    new_tokens = tokens + [token]
    parser = NoteSkipper().clear_notes
    parent_context = static_parse_context()
    context = ParseContext(ParseTask.CLEAR_NOTES, new_tokens[0], parent_context)
    error = ParseErrorException(ParseError.FOUND_ENDNOTE, token, None, context)
    template_test_invalid(parser, parent_context, new_tokens, error)