]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-118569: Add a test for dynamic PEP695 classes (#118570)
authorNikita Sobolev <mail@sobolevn.me>
Sat, 4 May 2024 15:08:38 +0000 (18:08 +0300)
committerGitHub <noreply@github.com>
Sat, 4 May 2024 15:08:38 +0000 (18:08 +0300)
Lib/test/test_type_params.py

index 4c5bf6bfd33c75ab3318446bb35c954c97137c14..82f1007f9ac97b426a12db48a6ee861b4d3e20fb 100644 (file)
@@ -776,6 +776,31 @@ class TypeParamsClassScopeTest(unittest.TestCase):
         self.assertIn(int, C.D.__bases__)
         self.assertIs(C.D.x, str)
 
+
+class DynamicClassTest(unittest.TestCase):
+    def _set_type_params(self, ns, params):
+        ns['__type_params__'] = params
+
+    def test_types_new_class_with_callback(self):
+        T = TypeVar('T', infer_variance=True)
+        Klass = types.new_class('Klass', (Generic[T],), {},
+                                lambda ns: self._set_type_params(ns, (T,)))
+
+        self.assertEqual(Klass.__bases__, (Generic,))
+        self.assertEqual(Klass.__orig_bases__, (Generic[T],))
+        self.assertEqual(Klass.__type_params__, (T,))
+        self.assertEqual(Klass.__parameters__, (T,))
+
+    def test_types_new_class_no_callback(self):
+        T = TypeVar('T', infer_variance=True)
+        Klass = types.new_class('Klass', (Generic[T],), {})
+
+        self.assertEqual(Klass.__bases__, (Generic,))
+        self.assertEqual(Klass.__orig_bases__, (Generic[T],))
+        self.assertEqual(Klass.__type_params__, ())  # must be explicitly set
+        self.assertEqual(Klass.__parameters__, (T,))
+
+
 class TypeParamsManglingTest(unittest.TestCase):
     def test_mangling(self):
         class Foo[__T]: