]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116417: Argument Clinic: test generated Limited C API code for float args (#116573)
authorErlend E. Aasland <erlend@python.org>
Mon, 11 Mar 2024 07:44:42 +0000 (08:44 +0100)
committerGitHub <noreply@github.com>
Mon, 11 Mar 2024 07:44:42 +0000 (08:44 +0100)
Lib/test/test_clinic.py

index 02a293e04b21822277c968fa3e5752a0a85c2771..cf3eeaadf0010c34840bb7311e9a028f0adf1b1e 100644 (file)
@@ -21,9 +21,9 @@ with test_tools.imports_under_tool('clinic'):
     from clinic import DSLParser
 
 
-def _make_clinic(*, filename='clinic_tests'):
+def _make_clinic(*, filename='clinic_tests', limited_capi=False):
     clang = clinic.CLanguage(filename)
-    c = clinic.Clinic(clang, filename=filename, limited_capi=False)
+    c = clinic.Clinic(clang, filename=filename, limited_capi=limited_capi)
     c.block_parser = clinic.BlockParser('', clang)
     return c
 
@@ -3614,6 +3614,46 @@ class ClinicFunctionalTest(unittest.TestCase):
         self.assertRaises(TypeError, fn, a="a", b="b", c="c", d="d", e="e", f="f", g="g")
 
 
+class LimitedCAPIOutputTests(unittest.TestCase):
+
+    def setUp(self):
+        self.clinic = _make_clinic(limited_capi=True)
+
+    @staticmethod
+    def wrap_clinic_input(block):
+        return dedent(f"""
+            /*[clinic input]
+            output everything buffer
+            {block}
+            [clinic start generated code]*/
+            /*[clinic input]
+            dump buffer
+            [clinic start generated code]*/
+        """)
+
+    def test_limited_capi_float(self):
+        block = self.wrap_clinic_input("""
+            func
+                f: float
+                /
+        """)
+        generated = self.clinic.parse(block)
+        self.assertNotIn("PyFloat_AS_DOUBLE", generated)
+        self.assertIn("float f;", generated)
+        self.assertIn("f = (float) PyFloat_AsDouble", generated)
+
+    def test_limited_capi_double(self):
+        block = self.wrap_clinic_input("""
+            func
+                f: double
+                /
+        """)
+        generated = self.clinic.parse(block)
+        self.assertNotIn("PyFloat_AS_DOUBLE", generated)
+        self.assertIn("double f;", generated)
+        self.assertIn("f = PyFloat_AsDouble", generated)
+
+
 try:
     import _testclinic_limited
 except ImportError:
@@ -3644,6 +3684,20 @@ class LimitedCAPIFunctionalTest(unittest.TestCase):
         with self.assertRaises(TypeError):
             _testclinic_limited.my_int_sum(1, "str")
 
+    def test_my_double_sum(self):
+        for func in (
+            _testclinic_limited.my_float_sum,
+            _testclinic_limited.my_double_sum,
+        ):
+            with self.subTest(func=func.__name__):
+                self.assertEqual(func(1.0, 2.5), 3.5)
+                with self.assertRaises(TypeError):
+                    func()
+                with self.assertRaises(TypeError):
+                    func(1)
+                with self.assertRaises(TypeError):
+                    func(1., "2")
+
 
 
 class PermutationTests(unittest.TestCase):