diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2022-02-06 19:52:39 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-06 19:52:39 (GMT) |
commit | 3da5526136034188185d6a3fdba71e2b56577ee2 (patch) | |
tree | 92514b8aeb052064b106f401851a84dada1969d1 /Lib/test/test_typing.py | |
parent | 1578de2fcd685c71f9c84e09bac32901dea192c1 (diff) | |
download | cpython-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.py | 27 |
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): |