diff --git a/src/parse.py b/src/parse.py index e4b6d97..f9fb3a2 100644 --- a/src/parse.py +++ b/src/parse.py @@ -49,6 +49,29 @@ PARSE_FILE = enum.auto() # pragma: no mutate +# Message identifiers for ParseTasks +ParseTaskMessageIDs = { + ParseTask.TEST_TASK: "ParseTaskTestTask", + ParseTask.PARSE_NOTE: "ParseTaskNote", + ParseTask.CLEAR_NOTES: "ParseTaskClearNotes", + ParseTask.PARSE_TEXT: "ParseTaskText", + ParseTask.PARSE_BOOL: "ParseTaskBool", + ParseTask.PARSE_REFERENCE: "ParseTaskReference", + ParseTask.PARSE_VALUE: "ParseTaskValue", + ParseTask.PARSE_STATEMENT: "ParseTaskStatement", + ParseTask.PARSE_SUBJECT: "ParseTaskSubject", + ParseTask.PARSE_VERB: "ParseTaskVerb", + ParseTask.PARSE_ARGUMENT: "ParseTaskArgument", + ParseTask.PARSE_SET: "ParseTaskSet", + ParseTask.PARSE_CONDITIONAL: "ParseTaskConditional", + ParseTask.PARSE_TEST: "ParseTaskTest", + ParseTask.PARSE_SUCCESS: "ParseTaskSuccess", + ParseTask.PARSE_FAILURE: "ParseTaskFailure", + ParseTask.PARSE_DIRECTIVE: "ParseTaskDirective", + ParseTask.PARSE_FILE: "ParseTaskFile", +} + + # Context used for parse error exception class ParseContext: def __init__(self, task, token, parent): @@ -328,7 +351,7 @@ # Formats a ParseContext def format_context(context): - task = context.task + task = Message(ParseTaskMessageIDs[context.task], []) if context.token: file = context.token.location.file line = context.token.location.line diff --git a/tests/parse/test_error.py b/tests/parse/test_error.py index aad2f48..88ba89a 100644 --- a/tests/parse/test_error.py +++ b/tests/parse/test_error.py @@ -58,6 +58,28 @@ ParseError.FOUND_TERMINATOR: "ParseErrorFoundTerminator", } +# Mapping of task to message identifiers +task_message_ids = { + ParseTask.TEST_TASK: "ParseTaskTestTask", + ParseTask.PARSE_NOTE: "ParseTaskNote", + ParseTask.CLEAR_NOTES: "ParseTaskClearNotes", + ParseTask.PARSE_TEXT: "ParseTaskText", + ParseTask.PARSE_BOOL: "ParseTaskBool", + ParseTask.PARSE_REFERENCE: "ParseTaskReference", + ParseTask.PARSE_VALUE: "ParseTaskValue", + ParseTask.PARSE_STATEMENT: "ParseTaskStatement", + ParseTask.PARSE_SUBJECT: "ParseTaskSubject", + ParseTask.PARSE_VERB: "ParseTaskVerb", + ParseTask.PARSE_ARGUMENT: "ParseTaskArgument", + ParseTask.PARSE_SET: "ParseTaskSet", + ParseTask.PARSE_CONDITIONAL: "ParseTaskConditional", + ParseTask.PARSE_TEST: "ParseTaskTest", + ParseTask.PARSE_SUCCESS: "ParseTaskSuccess", + ParseTask.PARSE_FAILURE: "ParseTaskFailure", + ParseTask.PARSE_DIRECTIVE: "ParseTaskDirective", + ParseTask.PARSE_FILE: "ParseTaskFile", +} + # Draws a strategy, with 25% of draws being None @composite @@ -148,9 +170,13 @@ # Two combinations are possible: # - Message("ParseContext", [task]) # - Message("ParseContextAt", [task, file, line, offset]) -@given(draw_parse_context()) -def test_parse_error_format_context(context): - task = context.task +# task is a message representing the ParseTask, equivalent to: +# - Message(task_message_ids[context.task], []) +# file is a source file's name +# line is a source file's line number +# offset is a source file's line offset +def _test_parse_error_format_context(context): + task = Message(task_message_ids[context.task], []) has_location = context.token is not None if has_location: file = context.token.location.file @@ -162,6 +188,18 @@ value = format_context(context) assert expected == value +# Tests formatting with a random ParseContext +@given(draw_parse_context()) +def test_parse_error_format_context(context): + _test_parse_error_format_context(context) + + +# Tests formatting with each ParseTask +@given(draw_parse_task()) +def test_parse_error_format_parse_task(task): + context = ParseContext(task, None, None) + _test_parse_error_format_context(context) + # Tests formatting a ParseErrorException # We expect the following behaviour: