]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-106368: Increase Argument Clinic test coverage (GH-106369) (#106370)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 3 Jul 2023 20:45:49 +0000 (13:45 -0700)
committerGitHub <noreply@github.com>
Mon, 3 Jul 2023 20:45:49 +0000 (20:45 +0000)
Add tests for 'self' and 'defining_class' converter requirements.
(cherry picked from commit 7f4c8121db62a9f72f00f2d9f73381e82f289581)

Co-authored-by: Erlend E. Aasland <erlend@python.org>
Lib/test/test_clinic.py

index 76a06df5fe2e5511dd690efeebbd65dcd5e8bb88..30e8dcc3e8ef12a19d262fc15a6028733f77bc7f 100644 (file)
@@ -829,6 +829,63 @@ Annotations must be either a name, a function call, or a string.
                 out = self.parse_function_should_fail(fn)
                 self.assertEqual(out, expected_error_msg)
 
+    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 test_unused_param(self):
         block = self.parse("""
             module foo