From: Erlend E. Aasland Date: Mon, 3 Jul 2023 22:07:05 +0000 (+0200) Subject: [3.11] gh-106368: Increase Argument Clinic test coverage (#106369) (#106374) X-Git-Tag: v3.11.5~235 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=52d5049cfd9f688d40f81194e3ccf7abbe724209;p=thirdparty%2FPython%2Fcpython.git [3.11] gh-106368: Increase Argument Clinic test coverage (#106369) (#106374) Add tests for 'self' and 'defining_class' converter requirements. (cherry picked from commit 7f4c8121db62a9f72f00f2d9f73381e82f289581) --- diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 8d4f92fa310c..c2d2085ecd6d 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -812,6 +812,63 @@ Annotations must be either a name, a function call, or a string. ) self.assertEqual(s, expected_failure_message) + def test_self_param_placement(self): + expected_error_msg = ( + "Error on line 0:\n" + "A 'self' parameter, if specified, must be the very first thing " + "in the parameter block.\n" + ) + block = """ + module foo + foo.func + a: int + self: self(type="PyObject *") + """ + out = self.parse_function_should_fail(block) + self.assertEqual(out, expected_error_msg) + + def test_self_param_cannot_be_optional(self): + expected_error_msg = ( + "Error on line 0:\n" + "A 'self' parameter cannot be marked optional.\n" + ) + block = """ + module foo + foo.func + self: self(type="PyObject *") = None + """ + out = self.parse_function_should_fail(block) + self.assertEqual(out, expected_error_msg) + + def test_defining_class_param_placement(self): + expected_error_msg = ( + "Error on line 0:\n" + "A 'defining_class' parameter, if specified, must either be the " + "first thing in the parameter block, or come just after 'self'.\n" + ) + block = """ + module foo + foo.func + self: self(type="PyObject *") + a: int + cls: defining_class + """ + out = self.parse_function_should_fail(block) + self.assertEqual(out, expected_error_msg) + + def test_defining_class_param_cannot_be_optional(self): + expected_error_msg = ( + "Error on line 0:\n" + "A 'defining_class' parameter cannot be marked optional.\n" + ) + block = """ + module foo + foo.func + cls: defining_class(type="PyObject *") = None + """ + out = self.parse_function_should_fail(block) + self.assertEqual(out, expected_error_msg) + def parse(self, text): c = FakeClinic() parser = DSLParser(c)