diff --git a/src/parse.py b/src/parse.py index bd89747..2fb9a9b 100644 --- a/src/parse.py +++ b/src/parse.py @@ -10,6 +10,7 @@ TEST_TASK = enum.auto() # pragma: no mutate PARSE_NOTE = enum.auto() # pragma: no mutate CLEAR_NOTES = enum.auto() # pragma: no mutate + PARSE_BOOL = enum.auto() # pragma: no mutate # Context used for parse error exception @@ -149,14 +150,15 @@ return Syntax(value, location, type) # Parses a boolean syntax node - def parse_bool(self, stream): - s = read_token(stream, None, None) + def parse_bool(self, stream, parent_context): + context = ParseContext(ParseTask.PARSE_BOOL, stream.peek(), parent_context) + s = read_token(stream, None, context) if s.value == "True": return Syntax(True, s.location, SyntaxType.BOOL) elif s.value == "False": return Syntax(False, s.location, SyntaxType.BOOL) else: - raise ParseErrorException(ParseError.NOT_BOOL, s, None, None) + raise ParseErrorException(ParseError.NOT_BOOL, s, None, context) # Parses tokens diff --git a/tests/parse/test_bool.py b/tests/parse/test_bool.py index bb3bc98..84d8b41 100644 --- a/tests/parse/test_bool.py +++ b/tests/parse/test_bool.py @@ -4,8 +4,9 @@ from hypothesis import assume, given from hypothesis.strategies import booleans, composite -from src.parse import ParseError, ParseErrorException, Parser +from src.parse import ParseContext, ParseError, ParseErrorException, ParseTask, Parser from src.syntax import Syntax, SyntaxStream, SyntaxType +from tests.parse.test_parse import draw_parse_context from tests.test_syntax import draw_token_bool, draw_syntax_random @@ -30,7 +31,7 @@ def test_parse_bool_valid(canary, test_data): (token, result) = test_data stream = SyntaxStream([token] + [canary]) - parsed = Parser().parse_bool(stream) + parsed = Parser().parse_bool(stream, None) assert parsed is not None assert parsed == result assert stream.pop() == canary @@ -44,28 +45,31 @@ # - Error if the token is not True or False @composite def draw_syntax_bool_invalid(draw): + parent_context = draw(draw_parse_context()) if draw(booleans()): token = draw(draw_syntax_random()) assume( not (token.type == SyntaxType.TOKEN and token.value in ["True", "False"]) ) + context = ParseContext(ParseTask.PARSE_BOOL, token, parent_context) if token.type == SyntaxType.TOKEN: - error = ParseErrorException(ParseError.NOT_BOOL, token, None, None) + error = ParseErrorException(ParseError.NOT_BOOL, token, None, context) else: - error = ParseErrorException(ParseError.NOT_TOKEN, token, None, None) - return ([token], error) + error = ParseErrorException(ParseError.NOT_TOKEN, token, None, context) + return ([token], error, parent_context) else: - error = ParseErrorException(ParseError.NO_TOKEN, None, None, None) - return ([], error) + context = ParseContext(ParseTask.PARSE_BOOL, None, parent_context) + error = ParseErrorException(ParseError.NO_TOKEN, None, None, context) + return ([], error, parent_context) # Test that parse_bool errors in invalid cases @given(draw_syntax_bool_invalid()) def test_parse_bool_invalid(test_data): - (tokens, error) = test_data + (tokens, error, context) = test_data stream = SyntaxStream(tokens) try: - parsed = Parser().parse_bool(stream) + parsed = Parser().parse_bool(stream, context) raise AssertionError("Parsed invalid data: %s" % (parsed)) except ParseErrorException as e: assert e == error