Skip to content

Commit

Permalink
debt: Align Python syntax error messages
Browse files Browse the repository at this point in the history
  • Loading branch information
kieran-ryan committed Jan 13, 2025
1 parent 7026d16 commit 638f6ab
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 15 deletions.
6 changes: 4 additions & 2 deletions python/cucumber_tag_expressions/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,10 @@ def parse(cls, text):

def ensure_expected_token_type(token_type, index):
if expected_token_type != token_type:
message = "Syntax error. Expected %s after %s" % \
(expected_token_type.name.lower(), last_part)
message = (
'Tag expression "%s" could not be parsed because of syntax '
'error: Expected %s.' % (text, expected_token_type.name.lower())
)
message = cls._make_error_description(message, parts, index)
raise TagExpressionError(message)

Expand Down
26 changes: 13 additions & 13 deletions python/tests/unit/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,34 +200,34 @@ def test_parse__fails_with_unbalanced_parens(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("a not ( and )", "Syntax error. Expected operator after a"),
("a not ( and )", "syntax error: Expected operator"),
])
def test_parse__fails_with_missing_operation_args(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("or or", "Syntax error. Expected operand after BEGIN"),
("or or", "syntax error: Expected operand"),
])
def test_parse__fails_with_only_operations(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("a b", "Syntax error. Expected operator after a"),
("a b", "syntax error: Expected operator"),
])
def test_parse__fails_for_args_without_operation(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("(())", "Syntax error. Expected operand after ("),
("(() ())", "Syntax error. Expected operand after ("),
("(())", "syntax error: Expected operand"),
("(() ())", "syntax error: Expected operand"),
])
def test_parse__fails_for_empty_parens_groups(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, expected", [
("a b or", "Syntax error. Expected operator after a"),
("a and (b not)", "Syntax error. Expected operator after b"),
("a and (b c) or", "Syntax error. Expected operator after b"),
("a b or", "syntax error: Expected operator"),
("a and (b not)", "syntax error: Expected operator"),
("a and (b c) or", "syntax error: Expected operator"),
])
def test_parse__fails_with_rpn_notation(self, text, expected):
# -- NOTE: RPN parsebility due to Shunting-yard algorithm (stack-based).
Expand All @@ -252,24 +252,24 @@ def test_parse__fails_with_rpn_notation(self, text, expected):
# -- BAD CASES: Too few operands
@pytest.mark.parametrize("text, error_message", [
("a and ", "and: Too few operands"),
(" and b", "Syntax error. Expected operand after BEGIN"),
(" and b", "syntax error: Expected operand"),
])
def test_parse__fails_and_operation_with_too_few_args(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("a or ", "or: Too few operands"),
(" or b", "Syntax error. Expected operand after BEGIN"),
(" or b", "syntax error: Expected operand"),
("a and b or ", "or: Too few operands"),
])
def test_parse__fails_or_operation_with_too_few_args(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)

@pytest.mark.parametrize("text, error_message", [
("not ", "not: Too few operands"),
("not ()", "Syntax error. Expected operand after ("),
("not () and b", "Syntax error. Expected operand after ("),
("not () or b", "Syntax error. Expected operand after ("),
("not ()", "syntax error: Expected operand"),
("not () and b", "syntax error: Expected operand"),
("not () or b", "syntax error: Expected operand"),
])
def test_parse__fails_not_operation_with_too_few_args(self, text, error_message):
self.assert_parse_with_error_contains_message(text, error_message)
Expand Down

0 comments on commit 638f6ab

Please sign in to comment.