Skip to content

Commit

Permalink
[3.11] gh-106368: Harden Argument Clinic parser tests (GH-106384) (#1…
Browse files Browse the repository at this point in the history
…06388)

(cherry picked from commit 648688c)

Co-authored-by: Erlend E. Aasland <erlend@python.org>
  • Loading branch information
miss-islington and erlend-aasland committed Jul 3, 2023
1 parent 3fdda97 commit 7688964
Showing 1 changed file with 68 additions and 42 deletions.
110 changes: 68 additions & 42 deletions Lib/test/test_clinic.py
Expand Up @@ -642,7 +642,7 @@ def test_disallowed_grouping__two_top_groups_on_left(self):
self.assertEqual(out, expected_msg)

def test_disallowed_grouping__two_top_groups_on_right(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.two_top_groups_on_right
param: int
Expand All @@ -653,9 +653,14 @@ def test_disallowed_grouping__two_top_groups_on_right(self):
group2 : int
]
""")
msg = (
"Function two_top_groups_on_right has an unsupported group "
"configuration. (Unexpected state 6.b)"
)
self.assertIn(msg, out)

def test_disallowed_grouping__parameter_after_group_on_right(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.parameter_after_group_on_right
param: int
Expand All @@ -666,9 +671,14 @@ def test_disallowed_grouping__parameter_after_group_on_right(self):
group2 : int
]
""")
msg = (
"Function parameter_after_group_on_right has an unsupported group "
"configuration. (Unexpected state 6.a)"
)
self.assertIn(msg, out)

def test_disallowed_grouping__group_after_parameter_on_left(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.group_after_parameter_on_left
[
Expand All @@ -679,9 +689,14 @@ def test_disallowed_grouping__group_after_parameter_on_left(self):
]
param: int
""")
msg = (
"Function group_after_parameter_on_left has an unsupported group "
"configuration. (Unexpected state 2.b)"
)
self.assertIn(msg, out)

def test_disallowed_grouping__empty_group_on_left(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.empty_group
[
Expand All @@ -691,9 +706,14 @@ def test_disallowed_grouping__empty_group_on_left(self):
]
param: int
""")
msg = (
"Function empty_group has an empty group.\n"
"All groups must contain at least one parameter."
)
self.assertIn(msg, out)

def test_disallowed_grouping__empty_group_on_right(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.empty_group
param: int
Expand All @@ -703,6 +723,11 @@ def test_disallowed_grouping__empty_group_on_right(self):
group2 : int
]
""")
msg = (
"Function empty_group has an empty group.\n"
"All groups must contain at least one parameter."
)
self.assertIn(msg, out)

def test_no_parameters(self):
function = self.parse_function("""
Expand Down Expand Up @@ -731,69 +756,60 @@ class foo.Bar "unused" "notneeded"
self.assertEqual(1, len(function.parameters))

def test_illegal_module_line(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar => int
/
""")
msg = "Illegal function name: foo.bar => int"
self.assertIn(msg, out)

def test_illegal_c_basename(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar as 935
/
""")
msg = "Illegal C basename: 935"
self.assertIn(msg, out)

def test_single_star(self):
self.parse_function_should_fail("""
module foo
foo.bar
*
*
""")

def test_parameters_required_after_star_without_initial_parameters_or_docstring(self):
self.parse_function_should_fail("""
module foo
foo.bar
*
""")

def test_parameters_required_after_star_without_initial_parameters_with_docstring(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar
*
Docstring here.
""")

def test_parameters_required_after_star_with_initial_parameters_without_docstring(self):
self.parse_function_should_fail("""
module foo
foo.bar
this: int
*
""")
self.assertIn("Function bar uses '*' more than once.", out)

def test_parameters_required_after_star_with_initial_parameters_and_docstring(self):
self.parse_function_should_fail("""
module foo
foo.bar
this: int
*
Docstring.
""")
def test_parameters_required_after_star(self):
dataset = (
"module foo\nfoo.bar\n *",
"module foo\nfoo.bar\n *\nDocstring here.",
"module foo\nfoo.bar\n this: int\n *",
"module foo\nfoo.bar\n this: int\n *\nDocstring.",
)
msg = "Function bar specifies '*' without any parameters afterwards."
for block in dataset:
with self.subTest(block=block):
out = self.parse_function_should_fail(block)
self.assertIn(msg, out)

def test_single_slash(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar
/
/
""")
msg = (
"Function bar has an unsupported group configuration. "
"(Unexpected state 0.d)"
)
self.assertIn(msg, out)

def test_mix_star_and_slash(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar
x: int
Expand All @@ -802,14 +818,24 @@ def test_mix_star_and_slash(self):
z: int
/
""")
msg = (
"Function bar mixes keyword-only and positional-only parameters, "
"which is unsupported."
)
self.assertIn(msg, out)

def test_parameters_not_permitted_after_slash_for_now(self):
self.parse_function_should_fail("""
out = self.parse_function_should_fail("""
module foo
foo.bar
/
x: int
""")
msg = (
"Function bar has an unsupported group configuration. "
"(Unexpected state 0.d)"
)
self.assertIn(msg, out)

def test_parameters_no_more_than_one_vararg(self):
expected_msg = (
Expand Down

0 comments on commit 7688964

Please sign in to comment.