# 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)