summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_typing.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-02-06 19:52:39 (GMT)
committerGitHub <noreply@github.com>2022-02-06 19:52:39 (GMT)
commit3da5526136034188185d6a3fdba71e2b56577ee2 (patch)
tree92514b8aeb052064b106f401851a84dada1969d1 /Lib/test/test_typing.py
parent1578de2fcd685c71f9c84e09bac32901dea192c1 (diff)
downloadcpython-3da5526136034188185d6a3fdba71e2b56577ee2.zip
cpython-3da5526136034188185d6a3fdba71e2b56577ee2.tar.gz
cpython-3da5526136034188185d6a3fdba71e2b56577ee2.tar.bz2
Add more tests for variable substitution in generics (GH-31170)
Diffstat (limited to 'Lib/test/test_typing.py')
-rw-r--r--Lib/test/test_typing.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 85f7406..14f49b0 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -255,6 +255,15 @@ class TypeVarTests(BaseTestCase):
with self.assertRaises(ValueError):
TypeVar('T', covariant=True, contravariant=True)
+ def test_bad_var_substitution(self):
+ T = TypeVar('T')
+ for arg in (), (int, str):
+ with self.subTest(arg=arg):
+ with self.assertRaises(TypeError):
+ List[T][arg]
+ with self.assertRaises(TypeError):
+ list[T][arg]
+
class UnionTests(BaseTestCase):
@@ -568,8 +577,11 @@ class BaseCallableTests:
C2 = Callable[[KT, T], VT]
C3 = Callable[..., T]
self.assertEqual(C1[str], Callable[[int, str], str])
+ if Callable is typing.Callable:
+ self.assertEqual(C1[None], Callable[[int, type(None)], type(None)])
self.assertEqual(C2[int, float, str], Callable[[int, float], str])
self.assertEqual(C3[int], Callable[..., int])
+ self.assertEqual(C3[NoReturn], Callable[..., NoReturn])
# multi chaining
C4 = C2[int, VT, str]
@@ -4981,6 +4993,17 @@ class ParamSpecTests(BaseTestCase):
self.assertEqual(G1.__args__, ((int, str), (bytes,)))
self.assertEqual(G2.__args__, ((int,), (str, bytes)))
+ def test_bad_var_substitution(self):
+ T = TypeVar('T')
+ P = ParamSpec('P')
+ bad_args = (42, int, None, T, int|str, Union[int, str])
+ for arg in bad_args:
+ with self.subTest(arg=arg):
+ with self.assertRaises(TypeError):
+ typing.Callable[P, T][arg, str]
+ with self.assertRaises(TypeError):
+ collections.abc.Callable[P, T][arg, str]
+
def test_no_paramspec_in__parameters__(self):
# ParamSpec should not be found in __parameters__
# of generics. Usages outside Callable, Concatenate
@@ -5010,6 +5033,10 @@ class ParamSpecTests(BaseTestCase):
self.assertEqual(G1.__parameters__, (P, T))
self.assertEqual(G2.__parameters__, (P, T))
self.assertEqual(G3.__parameters__, (P, T))
+ C = Callable[[int, str], float]
+ self.assertEqual(G1[[int, str], float], List[C])
+ self.assertEqual(G2[[int, str], float], list[C])
+ self.assertEqual(G3[[int, str], float], list[C] | int)
class ConcatenateTests(BaseTestCase):