blob: a547fe274c878073f537c4bf9c145d64b527d657 [file] [log] [blame]
Guido van Rossum6aafbd42016-04-17 17:52:05 -07001import contextlib
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002import collections
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08003import pickle
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07004import re
5import sys
Ɓukasz Langaf350a262017-09-14 14:33:00 -04006from unittest import TestCase, main, skipUnless, SkipTest, expectedFailure
Guido van Rossumb7dedc82016-10-29 12:44:29 -07007from copy import copy, deepcopy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07008
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02009from typing import Any, NoReturn
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070010from typing import TypeVar, AnyStr
11from typing import T, KT, VT # Not in __all__.
12from typing import Union, Optional
Guido van Rossum4cefe742016-09-27 15:20:12 -070013from typing import Tuple, List, MutableMapping
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070014from typing import Callable
Ivan Levkivskyid911e402018-01-20 11:23:59 +000015from typing import Generic, ClassVar
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070016from typing import cast
17from typing import get_type_hints
18from typing import no_type_check, no_type_check_decorator
Guido van Rossumeb9aca32016-05-24 16:38:22 -070019from typing import Type
Guido van Rossum91185fe2016-06-08 11:19:11 -070020from typing import NewType
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070021from typing import NamedTuple
22from typing import IO, TextIO, BinaryIO
23from typing import Pattern, Match
Guido van Rossume2592672016-10-08 20:27:22 -070024import abc
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070025import typing
Guido van Rossum83ec3022017-01-17 20:43:28 -080026import weakref
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070027
Ivan Levkivskyid911e402018-01-20 11:23:59 +000028from test import mod_generics_cache
Ivan Levkivskyi29bc1932017-12-05 03:43:58 +010029
30
Zachary Ware75b1bdc2016-04-19 11:49:37 -050031class BaseTestCase(TestCase):
32
33 def assertIsSubclass(self, cls, class_or_tuple, msg=None):
34 if not issubclass(cls, class_or_tuple):
35 message = '%r is not a subclass of %r' % (cls, class_or_tuple)
36 if msg is not None:
37 message += ' : %s' % msg
38 raise self.failureException(message)
39
40 def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
41 if issubclass(cls, class_or_tuple):
42 message = '%r is a subclass of %r' % (cls, class_or_tuple)
43 if msg is not None:
44 message += ' : %s' % msg
45 raise self.failureException(message)
46
Guido van Rossumca4b2522016-11-19 10:32:41 -080047 def clear_caches(self):
48 for f in typing._cleanups:
49 f()
50
Zachary Ware75b1bdc2016-04-19 11:49:37 -050051
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070052class Employee:
53 pass
54
55
56class Manager(Employee):
57 pass
58
59
60class Founder(Employee):
61 pass
62
63
64class ManagingFounder(Manager, Founder):
65 pass
66
67
Zachary Ware75b1bdc2016-04-19 11:49:37 -050068class AnyTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070069
Guido van Rossumd70fe632015-08-05 12:11:06 +020070 def test_any_instance_type_error(self):
71 with self.assertRaises(TypeError):
72 isinstance(42, Any)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070073
Guido van Rossum4cefe742016-09-27 15:20:12 -070074 def test_any_subclass_type_error(self):
75 with self.assertRaises(TypeError):
76 issubclass(Employee, Any)
77 with self.assertRaises(TypeError):
78 issubclass(Any, Employee)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070079
80 def test_repr(self):
81 self.assertEqual(repr(Any), 'typing.Any')
82
83 def test_errors(self):
84 with self.assertRaises(TypeError):
85 issubclass(42, Any)
86 with self.assertRaises(TypeError):
87 Any[int] # Any is not a generic type.
88
89 def test_cannot_subclass(self):
90 with self.assertRaises(TypeError):
91 class A(Any):
92 pass
Guido van Rossum4cefe742016-09-27 15:20:12 -070093 with self.assertRaises(TypeError):
94 class A(type(Any)):
95 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070096
97 def test_cannot_instantiate(self):
98 with self.assertRaises(TypeError):
99 Any()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700100 with self.assertRaises(TypeError):
101 type(Any)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700102
Guido van Rossum4cefe742016-09-27 15:20:12 -0700103 def test_any_works_with_alias(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700104 # These expressions must simply not fail.
105 typing.Match[Any]
106 typing.Pattern[Any]
107 typing.IO[Any]
108
109
Ivan Levkivskyif06e0212017-05-02 19:14:07 +0200110class NoReturnTests(BaseTestCase):
111
112 def test_noreturn_instance_type_error(self):
113 with self.assertRaises(TypeError):
114 isinstance(42, NoReturn)
115
116 def test_noreturn_subclass_type_error(self):
117 with self.assertRaises(TypeError):
118 issubclass(Employee, NoReturn)
119 with self.assertRaises(TypeError):
120 issubclass(NoReturn, Employee)
121
122 def test_repr(self):
123 self.assertEqual(repr(NoReturn), 'typing.NoReturn')
124
125 def test_not_generic(self):
126 with self.assertRaises(TypeError):
127 NoReturn[int]
128
129 def test_cannot_subclass(self):
130 with self.assertRaises(TypeError):
131 class A(NoReturn):
132 pass
133 with self.assertRaises(TypeError):
134 class A(type(NoReturn)):
135 pass
136
137 def test_cannot_instantiate(self):
138 with self.assertRaises(TypeError):
139 NoReturn()
140 with self.assertRaises(TypeError):
141 type(NoReturn)()
142
143
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500144class TypeVarTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700145
146 def test_basic_plain(self):
147 T = TypeVar('T')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700148 # T equals itself.
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500149 self.assertEqual(T, T)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200150 # T is an instance of TypeVar
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500151 self.assertIsInstance(T, TypeVar)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200152
153 def test_typevar_instance_type_error(self):
154 T = TypeVar('T')
155 with self.assertRaises(TypeError):
156 isinstance(42, T)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700157
Guido van Rossum4cefe742016-09-27 15:20:12 -0700158 def test_typevar_subclass_type_error(self):
159 T = TypeVar('T')
160 with self.assertRaises(TypeError):
161 issubclass(int, T)
162 with self.assertRaises(TypeError):
163 issubclass(T, int)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700164
165 def test_constrained_error(self):
166 with self.assertRaises(TypeError):
167 X = TypeVar('X', int)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700168 X
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700169
170 def test_union_unique(self):
171 X = TypeVar('X')
172 Y = TypeVar('Y')
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500173 self.assertNotEqual(X, Y)
174 self.assertEqual(Union[X], X)
175 self.assertNotEqual(Union[X], Union[X, Y])
176 self.assertEqual(Union[X, X], X)
177 self.assertNotEqual(Union[X, int], Union[X])
178 self.assertNotEqual(Union[X, int], Union[int])
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700179 self.assertEqual(Union[X, int].__args__, (X, int))
180 self.assertEqual(Union[X, int].__parameters__, (X,))
181 self.assertIs(Union[X, int].__origin__, Union)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700182
183 def test_union_constrained(self):
184 A = TypeVar('A', str, bytes)
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500185 self.assertNotEqual(Union[A, str], Union[A])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700186
187 def test_repr(self):
188 self.assertEqual(repr(T), '~T')
189 self.assertEqual(repr(KT), '~KT')
190 self.assertEqual(repr(VT), '~VT')
191 self.assertEqual(repr(AnyStr), '~AnyStr')
192 T_co = TypeVar('T_co', covariant=True)
193 self.assertEqual(repr(T_co), '+T_co')
194 T_contra = TypeVar('T_contra', contravariant=True)
195 self.assertEqual(repr(T_contra), '-T_contra')
196
197 def test_no_redefinition(self):
198 self.assertNotEqual(TypeVar('T'), TypeVar('T'))
199 self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
200
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700201 def test_cannot_subclass_vars(self):
202 with self.assertRaises(TypeError):
203 class V(TypeVar('T')):
204 pass
205
206 def test_cannot_subclass_var_itself(self):
207 with self.assertRaises(TypeError):
208 class V(TypeVar):
209 pass
210
211 def test_cannot_instantiate_vars(self):
212 with self.assertRaises(TypeError):
213 TypeVar('A')()
214
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700215 def test_bound_errors(self):
216 with self.assertRaises(TypeError):
217 TypeVar('X', bound=42)
218 with self.assertRaises(TypeError):
219 TypeVar('X', str, float, bound=Employee)
220
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100221 def test_no_bivariant(self):
222 with self.assertRaises(ValueError):
223 TypeVar('T', covariant=True, contravariant=True)
224
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700225
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500226class UnionTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700227
228 def test_basics(self):
229 u = Union[int, float]
230 self.assertNotEqual(u, Union)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700231
232 def test_subclass_error(self):
233 with self.assertRaises(TypeError):
234 issubclass(int, Union)
235 with self.assertRaises(TypeError):
236 issubclass(Union, int)
237 with self.assertRaises(TypeError):
238 issubclass(int, Union[int, str])
239 with self.assertRaises(TypeError):
240 issubclass(Union[int, str], int)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700241
242 def test_union_any(self):
243 u = Union[Any]
244 self.assertEqual(u, Any)
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700245 u1 = Union[int, Any]
246 u2 = Union[Any, int]
247 u3 = Union[Any, object]
248 self.assertEqual(u1, u2)
249 self.assertNotEqual(u1, Any)
250 self.assertNotEqual(u2, Any)
251 self.assertNotEqual(u3, Any)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700252
253 def test_union_object(self):
254 u = Union[object]
255 self.assertEqual(u, object)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700256 u1 = Union[int, object]
257 u2 = Union[object, int]
258 self.assertEqual(u1, u2)
259 self.assertNotEqual(u1, object)
260 self.assertNotEqual(u2, object)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700261
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700262 def test_unordered(self):
263 u1 = Union[int, float]
264 u2 = Union[float, int]
265 self.assertEqual(u1, u2)
266
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700267 def test_single_class_disappears(self):
268 t = Union[Employee]
269 self.assertIs(t, Employee)
270
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700271 def test_base_class_kept(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700272 u = Union[Employee, Manager]
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700273 self.assertNotEqual(u, Employee)
274 self.assertIn(Employee, u.__args__)
275 self.assertIn(Manager, u.__args__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700276
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700277 def test_union_union(self):
278 u = Union[int, float]
279 v = Union[u, Employee]
280 self.assertEqual(v, Union[int, float, Employee])
281
282 def test_repr(self):
283 self.assertEqual(repr(Union), 'typing.Union')
284 u = Union[Employee, int]
285 self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
286 u = Union[int, Employee]
287 self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100288 T = TypeVar('T')
289 u = Union[T, int][int]
290 self.assertEqual(repr(u), repr(int))
291 u = Union[List[int], int]
292 self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700293
294 def test_cannot_subclass(self):
295 with self.assertRaises(TypeError):
296 class C(Union):
297 pass
298 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700299 class C(type(Union)):
300 pass
301 with self.assertRaises(TypeError):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700302 class C(Union[int, str]):
303 pass
304
305 def test_cannot_instantiate(self):
306 with self.assertRaises(TypeError):
307 Union()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700308 with self.assertRaises(TypeError):
309 type(Union)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700310 u = Union[int, float]
311 with self.assertRaises(TypeError):
312 u()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700313 with self.assertRaises(TypeError):
314 type(u)()
315
316 def test_union_generalization(self):
317 self.assertFalse(Union[str, typing.Iterable[int]] == str)
318 self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700319 self.assertIn(str, Union[str, typing.Iterable[int]].__args__)
320 self.assertIn(typing.Iterable[int], Union[str, typing.Iterable[int]].__args__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700321
Guido van Rossum83ec3022017-01-17 20:43:28 -0800322 def test_union_compare_other(self):
323 self.assertNotEqual(Union, object)
324 self.assertNotEqual(Union, Any)
325 self.assertNotEqual(ClassVar, Union)
326 self.assertNotEqual(Optional, Union)
327 self.assertNotEqual([None], Optional)
328 self.assertNotEqual(Optional, typing.Mapping)
329 self.assertNotEqual(Optional[typing.MutableMapping], Union)
330
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700331 def test_optional(self):
332 o = Optional[int]
333 u = Union[int, None]
334 self.assertEqual(o, u)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700335
336 def test_empty(self):
337 with self.assertRaises(TypeError):
338 Union[()]
339
Guido van Rossumd70fe632015-08-05 12:11:06 +0200340 def test_union_instance_type_error(self):
341 with self.assertRaises(TypeError):
342 isinstance(42, Union[int, str])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700343
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100344 def test_no_eval_union(self):
345 u = Union[int, str]
346 def f(x: u): ...
347 self.assertIs(get_type_hints(f)['x'], u)
348
349 def test_function_repr_union(self):
350 def fun() -> int: ...
351 self.assertEqual(repr(Union[fun, int]), 'typing.Union[fun, int]')
352
Guido van Rossumca636ea2015-10-19 14:55:47 -0700353 def test_union_str_pattern(self):
354 # Shouldn't crash; see http://bugs.python.org/issue25390
355 A = Union[str, Pattern]
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700356 A
Guido van Rossumca636ea2015-10-19 14:55:47 -0700357
Guido van Rossum91185fe2016-06-08 11:19:11 -0700358 def test_etree(self):
359 # See https://github.com/python/typing/issues/229
360 # (Only relevant for Python 2.)
361 try:
362 from xml.etree.cElementTree import Element
363 except ImportError:
364 raise SkipTest("cElementTree not found")
365 Union[Element, str] # Shouldn't crash
366
367 def Elem(*args):
368 return Element(*args)
369
370 Union[Elem, str] # Nor should this
371
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700372
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500373class TupleTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700374
375 def test_basics(self):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700376 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700377 issubclass(Tuple, Tuple[int, str])
378 with self.assertRaises(TypeError):
379 issubclass(tuple, Tuple[int, str])
380
381 class TP(tuple): ...
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700382 self.assertTrue(issubclass(tuple, Tuple))
Guido van Rossum4cefe742016-09-27 15:20:12 -0700383 self.assertTrue(issubclass(TP, Tuple))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700384
Guido van Rossum5abcbb32016-04-18 07:37:41 -0700385 def test_equality(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500386 self.assertEqual(Tuple[int], Tuple[int])
387 self.assertEqual(Tuple[int, ...], Tuple[int, ...])
388 self.assertNotEqual(Tuple[int], Tuple[int, int])
389 self.assertNotEqual(Tuple[int], Tuple[int, ...])
Guido van Rossum5abcbb32016-04-18 07:37:41 -0700390
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700391 def test_tuple_subclass(self):
392 class MyTuple(tuple):
393 pass
394 self.assertTrue(issubclass(MyTuple, Tuple))
395
Guido van Rossumd70fe632015-08-05 12:11:06 +0200396 def test_tuple_instance_type_error(self):
397 with self.assertRaises(TypeError):
398 isinstance((0, 0), Tuple[int, int])
Guido van Rossum4cefe742016-09-27 15:20:12 -0700399 self.assertIsInstance((0, 0), Tuple)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700400
401 def test_repr(self):
402 self.assertEqual(repr(Tuple), 'typing.Tuple')
Guido van Rossum91185fe2016-06-08 11:19:11 -0700403 self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700404 self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
405 self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
406
407 def test_errors(self):
408 with self.assertRaises(TypeError):
409 issubclass(42, Tuple)
410 with self.assertRaises(TypeError):
411 issubclass(42, Tuple[int])
412
413
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500414class CallableTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700415
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700416 def test_self_subclass(self):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700417 with self.assertRaises(TypeError):
418 self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
419 self.assertTrue(issubclass(type(lambda x: x), Callable))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700420
421 def test_eq_hash(self):
422 self.assertEqual(Callable[[int], int], Callable[[int], int])
423 self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
424 self.assertNotEqual(Callable[[int], int], Callable[[int], str])
425 self.assertNotEqual(Callable[[int], int], Callable[[str], int])
426 self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
427 self.assertNotEqual(Callable[[int], int], Callable[[], int])
428 self.assertNotEqual(Callable[[int], int], Callable)
429
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700430 def test_cannot_instantiate(self):
431 with self.assertRaises(TypeError):
432 Callable()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700433 with self.assertRaises(TypeError):
434 type(Callable)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700435 c = Callable[[int], str]
436 with self.assertRaises(TypeError):
437 c()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700438 with self.assertRaises(TypeError):
439 type(c)()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700440
Guido van Rossum991d14f2016-11-09 13:12:51 -0800441 def test_callable_wrong_forms(self):
442 with self.assertRaises(TypeError):
443 Callable[[...], int]
444 with self.assertRaises(TypeError):
445 Callable[(), int]
446 with self.assertRaises(TypeError):
447 Callable[[()], int]
448 with self.assertRaises(TypeError):
449 Callable[[int, 1], 2]
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100450 with self.assertRaises(TypeError):
451 Callable[int]
Guido van Rossum991d14f2016-11-09 13:12:51 -0800452
Guido van Rossumd70fe632015-08-05 12:11:06 +0200453 def test_callable_instance_works(self):
Guido van Rossum1b669102015-09-04 12:15:54 -0700454 def f():
455 pass
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500456 self.assertIsInstance(f, Callable)
457 self.assertNotIsInstance(None, Callable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700458
Guido van Rossumd70fe632015-08-05 12:11:06 +0200459 def test_callable_instance_type_error(self):
Guido van Rossum1b669102015-09-04 12:15:54 -0700460 def f():
461 pass
Guido van Rossumd70fe632015-08-05 12:11:06 +0200462 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500463 self.assertIsInstance(f, Callable[[], None])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200464 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500465 self.assertIsInstance(f, Callable[[], Any])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200466 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500467 self.assertNotIsInstance(None, Callable[[], None])
Guido van Rossumd70fe632015-08-05 12:11:06 +0200468 with self.assertRaises(TypeError):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500469 self.assertNotIsInstance(None, Callable[[], Any])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700470
471 def test_repr(self):
472 ct0 = Callable[[], bool]
473 self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
474 ct2 = Callable[[str, float], int]
475 self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
476 ctv = Callable[..., str]
477 self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
478
Guido van Rossumd70fe632015-08-05 12:11:06 +0200479 def test_callable_with_ellipsis(self):
480
481 def foo(a: Callable[..., T]):
482 pass
483
484 self.assertEqual(get_type_hints(foo, globals(), locals()),
485 {'a': Callable[..., T]})
486
Guido van Rossumefa798d2016-08-23 11:01:50 -0700487 def test_ellipsis_in_generic(self):
488 # Shouldn't crash; see https://github.com/python/typing/issues/259
489 typing.List[Callable[..., str]]
490
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700491
492XK = TypeVar('XK', str, bytes)
493XV = TypeVar('XV')
494
495
496class SimpleMapping(Generic[XK, XV]):
497
498 def __getitem__(self, key: XK) -> XV:
499 ...
500
501 def __setitem__(self, key: XK, value: XV):
502 ...
503
504 def get(self, key: XK, default: XV = None) -> XV:
505 ...
506
507
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700508class MySimpleMapping(SimpleMapping[XK, XV]):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700509
510 def __init__(self):
511 self.store = {}
512
513 def __getitem__(self, key: str):
514 return self.store[key]
515
516 def __setitem__(self, key: str, value):
517 self.store[key] = value
518
519 def get(self, key: str, default=None):
520 try:
521 return self.store[key]
522 except KeyError:
523 return default
524
525
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500526class ProtocolTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700527
528 def test_supports_int(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500529 self.assertIsSubclass(int, typing.SupportsInt)
530 self.assertNotIsSubclass(str, typing.SupportsInt)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700531
532 def test_supports_float(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500533 self.assertIsSubclass(float, typing.SupportsFloat)
534 self.assertNotIsSubclass(str, typing.SupportsFloat)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700535
536 def test_supports_complex(self):
537
538 # Note: complex itself doesn't have __complex__.
539 class C:
540 def __complex__(self):
541 return 0j
542
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500543 self.assertIsSubclass(C, typing.SupportsComplex)
544 self.assertNotIsSubclass(str, typing.SupportsComplex)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700545
546 def test_supports_bytes(self):
547
548 # Note: bytes itself doesn't have __bytes__.
549 class B:
550 def __bytes__(self):
551 return b''
552
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500553 self.assertIsSubclass(B, typing.SupportsBytes)
554 self.assertNotIsSubclass(str, typing.SupportsBytes)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700555
556 def test_supports_abs(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500557 self.assertIsSubclass(float, typing.SupportsAbs)
558 self.assertIsSubclass(int, typing.SupportsAbs)
559 self.assertNotIsSubclass(str, typing.SupportsAbs)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700560
561 def test_supports_round(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700562 issubclass(float, typing.SupportsRound)
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500563 self.assertIsSubclass(float, typing.SupportsRound)
564 self.assertIsSubclass(int, typing.SupportsRound)
565 self.assertNotIsSubclass(str, typing.SupportsRound)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700566
567 def test_reversible(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500568 self.assertIsSubclass(list, typing.Reversible)
569 self.assertNotIsSubclass(int, typing.Reversible)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700570
Guido van Rossumd70fe632015-08-05 12:11:06 +0200571 def test_protocol_instance_type_error(self):
572 with self.assertRaises(TypeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700573 isinstance(0, typing.SupportsAbs)
Guido van Rossumca4b2522016-11-19 10:32:41 -0800574 class C1(typing.SupportsInt):
575 def __int__(self) -> int:
576 return 42
577 class C2(C1):
578 pass
579 c = C2()
580 self.assertIsInstance(c, C1)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200581
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700582
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500583class GenericTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700584
585 def test_basics(self):
586 X = SimpleMapping[str, Any]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500587 self.assertEqual(X.__parameters__, ())
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700588 with self.assertRaises(TypeError):
589 X[str]
590 with self.assertRaises(TypeError):
591 X[str, str]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700592 Y = SimpleMapping[XK, str]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500593 self.assertEqual(Y.__parameters__, (XK,))
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700594 Y[str]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700595 with self.assertRaises(TypeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700596 Y[str, str]
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000597 SM1 = SimpleMapping[str, int]
598 with self.assertRaises(TypeError):
599 issubclass(SM1, SimpleMapping)
600 self.assertIsInstance(SM1(), SimpleMapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700601
Guido van Rossum4cefe742016-09-27 15:20:12 -0700602 def test_generic_errors(self):
Guido van Rossum62fe1bb2016-10-29 16:05:26 -0700603 T = TypeVar('T')
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100604 S = TypeVar('S')
Guido van Rossum62fe1bb2016-10-29 16:05:26 -0700605 with self.assertRaises(TypeError):
606 Generic[T]()
Guido van Rossum4cefe742016-09-27 15:20:12 -0700607 with self.assertRaises(TypeError):
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100608 Generic[T][T]
609 with self.assertRaises(TypeError):
610 Generic[T][S]
611 with self.assertRaises(TypeError):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000612 class C(Generic[T], Generic[T]): ...
613 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700614 isinstance([], List[int])
615 with self.assertRaises(TypeError):
616 issubclass(list, List[int])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100617 with self.assertRaises(TypeError):
618 class NewGeneric(Generic): ...
619 with self.assertRaises(TypeError):
620 class MyGeneric(Generic[T], Generic[S]): ...
621 with self.assertRaises(TypeError):
622 class MyGeneric(List[T], Generic[S]): ...
Guido van Rossum4cefe742016-09-27 15:20:12 -0700623
Guido van Rossumd70fe632015-08-05 12:11:06 +0200624 def test_init(self):
625 T = TypeVar('T')
626 S = TypeVar('S')
627 with self.assertRaises(TypeError):
628 Generic[T, T]
629 with self.assertRaises(TypeError):
630 Generic[T, S, T]
631
Ivan Levkivskyi29bc1932017-12-05 03:43:58 +0100632 def test_init_subclass(self):
633 class X(typing.Generic[T]):
634 def __init_subclass__(cls, **kwargs):
635 super().__init_subclass__(**kwargs)
636 cls.attr = 42
637 class Y(X):
638 pass
639 self.assertEqual(Y.attr, 42)
640 with self.assertRaises(AttributeError):
641 X.attr
642 X.attr = 1
643 Y.attr = 2
644 class Z(Y):
645 pass
646 class W(X[int]):
647 pass
648 self.assertEqual(Y.attr, 2)
649 self.assertEqual(Z.attr, 42)
650 self.assertEqual(W.attr, 42)
651
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700652 def test_repr(self):
653 self.assertEqual(repr(SimpleMapping),
Serhiy Storchaka96136092018-07-21 22:46:26 +0300654 f"<class '{__name__}.SimpleMapping'>")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700655 self.assertEqual(repr(MySimpleMapping),
Serhiy Storchaka96136092018-07-21 22:46:26 +0300656 f"<class '{__name__}.MySimpleMapping'>")
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700657
658 def test_chain_repr(self):
659 T = TypeVar('T')
660 S = TypeVar('S')
661
662 class C(Generic[T]):
663 pass
664
665 X = C[Tuple[S, T]]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500666 self.assertEqual(X, C[Tuple[S, T]])
667 self.assertNotEqual(X, C[Tuple[T, S]])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700668
669 Y = X[T, int]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500670 self.assertEqual(Y, X[T, int])
671 self.assertNotEqual(Y, X[S, int])
672 self.assertNotEqual(Y, X[T, str])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700673
674 Z = Y[str]
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500675 self.assertEqual(Z, Y[str])
676 self.assertNotEqual(Z, Y[int])
677 self.assertNotEqual(Z, Y[T])
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700678
Zachary Ware75b1bdc2016-04-19 11:49:37 -0500679 self.assertTrue(str(Z).endswith(
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700680 '.C[typing.Tuple[str, int]]'))
681
682 def test_new_repr(self):
683 T = TypeVar('T')
684 U = TypeVar('U', covariant=True)
685 S = TypeVar('S')
686
687 self.assertEqual(repr(List), 'typing.List')
688 self.assertEqual(repr(List[T]), 'typing.List[~T]')
689 self.assertEqual(repr(List[U]), 'typing.List[+U]')
690 self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
691 self.assertEqual(repr(List[int]), 'typing.List[int]')
692
693 def test_new_repr_complex(self):
694 T = TypeVar('T')
695 TS = TypeVar('TS')
696
697 self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
698 self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
699 'typing.List[typing.Tuple[int, ~T]]')
Guido van Rossum95919c02017-01-22 17:47:20 -0800700 self.assertEqual(
701 repr(List[Tuple[T, T]][List[int]]),
702 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]'
703 )
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700704
705 def test_new_repr_bare(self):
706 T = TypeVar('T')
707 self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000708 self.assertEqual(repr(typing._Protocol[T]), 'typing._Protocol[~T]')
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700709 class C(typing.Dict[Any, Any]): ...
710 # this line should just work
711 repr(C.__mro__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700712
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800713 def test_dict(self):
714 T = TypeVar('T')
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700715
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800716 class B(Generic[T]):
717 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700718
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800719 b = B()
720 b.foo = 42
721 self.assertEqual(b.__dict__, {'foo': 42})
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700722
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800723 class C(B[int]):
724 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700725
Guido van Rossumbb7c57c2015-11-18 21:12:58 -0800726 c = C()
727 c.bar = 'abc'
728 self.assertEqual(c.__dict__, {'bar': 'abc'})
729
Ivan Levkivskyiabb3b8a2017-02-24 04:03:28 +0100730 def test_subscripted_generics_as_proxies(self):
731 T = TypeVar('T')
732 class C(Generic[T]):
733 x = 'def'
734 self.assertEqual(C[int].x, 'def')
735 self.assertEqual(C[C[int]].x, 'def')
736 C[C[int]].x = 'changed'
737 self.assertEqual(C.x, 'changed')
738 self.assertEqual(C[str].x, 'changed')
739 C[List[str]].z = 'new'
740 self.assertEqual(C.z, 'new')
741 self.assertEqual(C[Tuple[int]].z, 'new')
742
743 self.assertEqual(C().x, 'changed')
744 self.assertEqual(C[Tuple[str]]().z, 'new')
745
746 class D(C[T]):
747 pass
748 self.assertEqual(D[int].x, 'changed')
749 self.assertEqual(D.z, 'new')
750 D.z = 'from derived z'
751 D[int].x = 'from derived x'
752 self.assertEqual(C.x, 'changed')
753 self.assertEqual(C[int].z, 'new')
754 self.assertEqual(D.x, 'from derived x')
755 self.assertEqual(D[str].z, 'from derived z')
756
Ivan Levkivskyi365cb5b2017-02-24 18:28:26 +0100757 def test_abc_registry_kept(self):
758 T = TypeVar('T')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000759 class C(collections.abc.Mapping, Generic[T]): ...
Ivan Levkivskyi365cb5b2017-02-24 18:28:26 +0100760 C.register(int)
761 self.assertIsInstance(1, C)
762 C[int]
763 self.assertIsInstance(1, C)
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000764 C._abc_registry_clear()
765 C._abc_caches_clear() # To keep refleak hunting mode clean
Ivan Levkivskyi365cb5b2017-02-24 18:28:26 +0100766
Guido van Rossum4cefe742016-09-27 15:20:12 -0700767 def test_false_subclasses(self):
768 class MyMapping(MutableMapping[str, str]): pass
769 self.assertNotIsInstance({}, MyMapping)
770 self.assertNotIsSubclass(dict, MyMapping)
771
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700772 def test_abc_bases(self):
773 class MM(MutableMapping[str, str]):
774 def __getitem__(self, k):
775 return None
776 def __setitem__(self, k, v):
777 pass
778 def __delitem__(self, k):
779 pass
780 def __iter__(self):
781 return iter(())
782 def __len__(self):
783 return 0
784 # this should just work
785 MM().update()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000786 self.assertIsInstance(MM(), collections.abc.MutableMapping)
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700787 self.assertIsInstance(MM(), MutableMapping)
788 self.assertNotIsInstance(MM(), List)
789 self.assertNotIsInstance({}, MM)
790
791 def test_multiple_bases(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000792 class MM1(MutableMapping[str, str], collections.abc.MutableMapping):
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700793 pass
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000794 class MM2(collections.abc.MutableMapping, MutableMapping[str, str]):
795 pass
796 self.assertEqual(MM2.__bases__, (collections.abc.MutableMapping, Generic))
Guido van Rossum4cefe742016-09-27 15:20:12 -0700797
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700798 def test_orig_bases(self):
799 T = TypeVar('T')
800 class C(typing.Dict[str, T]): ...
801 self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
802
803 def test_naive_runtime_checks(self):
804 def naive_dict_check(obj, tp):
805 # Check if a dictionary conforms to Dict type
806 if len(tp.__parameters__) > 0:
807 raise NotImplementedError
808 if tp.__args__:
809 KT, VT = tp.__args__
Guido van Rossum95919c02017-01-22 17:47:20 -0800810 return all(
811 isinstance(k, KT) and isinstance(v, VT)
812 for k, v in obj.items()
813 )
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700814 self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[str, int]))
815 self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[str, int]))
816 with self.assertRaises(NotImplementedError):
817 naive_dict_check({1: 'x'}, typing.Dict[str, T])
818
819 def naive_generic_check(obj, tp):
820 # Check if an instance conforms to the generic class
821 if not hasattr(obj, '__orig_class__'):
822 raise NotImplementedError
823 return obj.__orig_class__ == tp
824 class Node(Generic[T]): ...
825 self.assertTrue(naive_generic_check(Node[int](), Node[int]))
826 self.assertFalse(naive_generic_check(Node[str](), Node[int]))
827 self.assertFalse(naive_generic_check(Node[str](), List))
828 with self.assertRaises(NotImplementedError):
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800829 naive_generic_check([1, 2, 3], Node[int])
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700830
831 def naive_list_base_check(obj, tp):
832 # Check if list conforms to a List subclass
833 return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
834 for x in obj)
835 class C(List[int]): ...
836 self.assertTrue(naive_list_base_check([1, 2, 3], C))
837 self.assertFalse(naive_list_base_check(['a', 'b'], C))
838
839 def test_multi_subscr_base(self):
840 T = TypeVar('T')
841 U = TypeVar('U')
842 V = TypeVar('V')
843 class C(List[T][U][V]): ...
844 class D(C, List[T][U][V]): ...
845 self.assertEqual(C.__parameters__, (V,))
846 self.assertEqual(D.__parameters__, (V,))
847 self.assertEqual(C[int].__parameters__, ())
848 self.assertEqual(D[int].__parameters__, ())
849 self.assertEqual(C[int].__args__, (int,))
850 self.assertEqual(D[int].__args__, (int,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000851 self.assertEqual(C.__bases__, (list, Generic))
852 self.assertEqual(D.__bases__, (C, list, Generic))
Guido van Rossum7ef22d62016-10-21 14:27:58 -0700853 self.assertEqual(C.__orig_bases__, (List[T][U][V],))
854 self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
855
Guido van Rossum83ec3022017-01-17 20:43:28 -0800856 def test_subscript_meta(self):
857 T = TypeVar('T')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000858 class Meta(type): ...
859 self.assertEqual(Type[Meta], Type[Meta])
860 self.assertEqual(Union[T, int][Meta], Union[Meta, int])
861 self.assertEqual(Callable[..., Meta].__args__, (Ellipsis, Meta))
Guido van Rossum83ec3022017-01-17 20:43:28 -0800862
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100863 def test_generic_hashes(self):
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100864 class A(Generic[T]):
865 ...
866
867 class B(Generic[T]):
868 class A(Generic[T]):
869 ...
870
871 self.assertEqual(A, A)
872 self.assertEqual(mod_generics_cache.A[str], mod_generics_cache.A[str])
873 self.assertEqual(B.A, B.A)
874 self.assertEqual(mod_generics_cache.B.A[B.A[str]],
875 mod_generics_cache.B.A[B.A[str]])
876
877 self.assertNotEqual(A, B.A)
878 self.assertNotEqual(A, mod_generics_cache.A)
879 self.assertNotEqual(A, mod_generics_cache.B.A)
880 self.assertNotEqual(B.A, mod_generics_cache.A)
881 self.assertNotEqual(B.A, mod_generics_cache.B.A)
882
883 self.assertNotEqual(A[str], B.A[str])
884 self.assertNotEqual(A[List[Any]], B.A[List[Any]])
885 self.assertNotEqual(A[str], mod_generics_cache.A[str])
886 self.assertNotEqual(A[str], mod_generics_cache.B.A[str])
887 self.assertNotEqual(B.A[int], mod_generics_cache.A[int])
888 self.assertNotEqual(B.A[List[Any]], mod_generics_cache.B.A[List[Any]])
889
890 self.assertNotEqual(Tuple[A[str]], Tuple[B.A[str]])
891 self.assertNotEqual(Tuple[A[List[Any]]], Tuple[B.A[List[Any]]])
892 self.assertNotEqual(Union[str, A[str]], Union[str, mod_generics_cache.A[str]])
893 self.assertNotEqual(Union[A[str], A[str]],
894 Union[A[str], mod_generics_cache.A[str]])
895 self.assertNotEqual(typing.FrozenSet[A[str]],
896 typing.FrozenSet[mod_generics_cache.B.A[str]])
897
898 if sys.version_info[:2] > (3, 2):
899 self.assertTrue(repr(Tuple[A[str]]).endswith('<locals>.A[str]]'))
900 self.assertTrue(repr(Tuple[B.A[str]]).endswith('<locals>.B.A[str]]'))
901 self.assertTrue(repr(Tuple[mod_generics_cache.A[str]])
902 .endswith('mod_generics_cache.A[str]]'))
903 self.assertTrue(repr(Tuple[mod_generics_cache.B.A[str]])
904 .endswith('mod_generics_cache.B.A[str]]'))
905
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700906 def test_extended_generic_rules_eq(self):
907 T = TypeVar('T')
908 U = TypeVar('U')
909 self.assertEqual(Tuple[T, T][int], Tuple[int, int])
910 self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
911 with self.assertRaises(TypeError):
912 Tuple[T, int][()]
913 with self.assertRaises(TypeError):
914 Tuple[T, U][T, ...]
915
916 self.assertEqual(Union[T, int][int], int)
917 self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
918 class Base: ...
919 class Derived(Base): ...
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700920 self.assertEqual(Union[T, Base][Union[Base, Derived]], Union[Base, Derived])
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700921 with self.assertRaises(TypeError):
922 Union[T, int][1]
923
924 self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
925 self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
926 with self.assertRaises(TypeError):
927 Callable[[T], U][..., int]
928 with self.assertRaises(TypeError):
929 Callable[[T], U][[], int]
930
931 def test_extended_generic_rules_repr(self):
932 T = TypeVar('T')
933 self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
934 'Union[Tuple, Callable]')
935 self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000936 'Union[Tuple, Tuple[int]]')
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700937 self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
938 'Callable[..., Union[int, NoneType]]')
939 self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
940 'Callable[[], List[int]]')
941
Guido van Rossumf9099de2016-11-09 13:18:59 -0800942 def test_generic_forward_ref(self):
943 def foobar(x: List[List['CC']]): ...
944 class CC: ...
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800945 self.assertEqual(
946 get_type_hints(foobar, globals(), locals()),
947 {'x': List[List[CC]]}
948 )
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700949 T = TypeVar('T')
Guido van Rossumca4b2522016-11-19 10:32:41 -0800950 AT = Tuple[T, ...]
951 def barfoo(x: AT): ...
952 self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT)
953 CT = Callable[..., List[T]]
954 def barfoo2(x: CT): ...
955 self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700956
957 def test_extended_generic_rules_subclassing(self):
958 class T1(Tuple[T, KT]): ...
959 class T2(Tuple[T, ...]): ...
960 class C1(Callable[[T], T]): ...
961 class C2(Callable[..., int]):
962 def __call__(self):
963 return None
964
965 self.assertEqual(T1.__parameters__, (T, KT))
966 self.assertEqual(T1[int, str].__args__, (int, str))
967 self.assertEqual(T1[int, T].__origin__, T1)
968
969 self.assertEqual(T2.__parameters__, (T,))
970 with self.assertRaises(TypeError):
971 T1[int]
972 with self.assertRaises(TypeError):
973 T2[int, str]
974
975 self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
976 self.assertEqual(C2.__parameters__, ())
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000977 self.assertIsInstance(C2(), collections.abc.Callable)
978 self.assertIsSubclass(C2, collections.abc.Callable)
979 self.assertIsSubclass(C1, collections.abc.Callable)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700980 self.assertIsInstance(T1(), tuple)
981 self.assertIsSubclass(T2, tuple)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000982 with self.assertRaises(TypeError):
983 issubclass(Tuple[int, ...], typing.Sequence)
984 with self.assertRaises(TypeError):
985 issubclass(Tuple[int, ...], typing.Iterable)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700986
987 def test_fail_with_bare_union(self):
988 with self.assertRaises(TypeError):
989 List[Union]
990 with self.assertRaises(TypeError):
991 Tuple[Optional]
992 with self.assertRaises(TypeError):
993 ClassVar[ClassVar]
994 with self.assertRaises(TypeError):
995 List[ClassVar[int]]
996
997 def test_fail_with_bare_generic(self):
998 T = TypeVar('T')
999 with self.assertRaises(TypeError):
1000 List[Generic]
1001 with self.assertRaises(TypeError):
1002 Tuple[Generic[T]]
1003 with self.assertRaises(TypeError):
1004 List[typing._Protocol]
1005
1006 def test_type_erasure_special(self):
1007 T = TypeVar('T')
Guido van Rossumca4b2522016-11-19 10:32:41 -08001008 # this is the only test that checks type caching
1009 self.clear_caches()
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001010 class MyTup(Tuple[T, T]): ...
1011 self.assertIs(MyTup[int]().__class__, MyTup)
1012 self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
1013 class MyCall(Callable[..., T]):
1014 def __call__(self): return None
1015 self.assertIs(MyCall[T]().__class__, MyCall)
1016 self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
1017 class MyDict(typing.Dict[T, T]): ...
1018 self.assertIs(MyDict[int]().__class__, MyDict)
1019 self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
1020 class MyDef(typing.DefaultDict[str, T]): ...
1021 self.assertIs(MyDef[int]().__class__, MyDef)
1022 self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001023 # ChainMap was added in 3.3
1024 if sys.version_info >= (3, 3):
1025 class MyChain(typing.ChainMap[str, T]): ...
1026 self.assertIs(MyChain[int]().__class__, MyChain)
1027 self.assertIs(MyChain[int]().__orig_class__, MyChain[int])
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001028
1029 def test_all_repr_eq_any(self):
1030 objs = (getattr(typing, el) for el in typing.__all__)
1031 for obj in objs:
1032 self.assertNotEqual(repr(obj), '')
1033 self.assertEqual(obj, obj)
1034 if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
1035 self.assertEqual(obj[Any].__args__, (Any,))
1036 if isinstance(obj, type):
1037 for base in obj.__mro__:
1038 self.assertNotEqual(repr(base), '')
1039 self.assertEqual(base, base)
1040
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001041 def test_pickle(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001042 global C # pickle wants to reference the class by name
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001043 T = TypeVar('T')
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001044
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001045 class B(Generic[T]):
1046 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001047
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001048 class C(B[int]):
1049 pass
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001050
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001051 c = C()
1052 c.foo = 42
1053 c.bar = 'abc'
Serhiy Storchaka6d9e9232015-11-20 18:33:02 +02001054 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1055 z = pickle.dumps(c, proto)
1056 x = pickle.loads(z)
1057 self.assertEqual(x.foo, 42)
1058 self.assertEqual(x.bar, 'abc')
1059 self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001060 samples = [Any, Union, Tuple, Callable, ClassVar,
Ivan Levkivskyi2a363d22018-04-05 01:25:15 +01001061 Union[int, str], ClassVar[List], Tuple[int, ...], Callable[[str], bytes],
1062 typing.DefaultDict, typing.FrozenSet[int]]
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001063 for s in samples:
Guido van Rossumb7dedc82016-10-29 12:44:29 -07001064 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1065 z = pickle.dumps(s, proto)
1066 x = pickle.loads(z)
1067 self.assertEqual(s, x)
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001068 more_samples = [List, typing.Iterable, typing.Type, List[int],
Ivan Levkivskyi2a363d22018-04-05 01:25:15 +01001069 typing.Type[typing.Mapping], typing.AbstractSet[Tuple[int, str]]]
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001070 for s in more_samples:
1071 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1072 z = pickle.dumps(s, proto)
1073 x = pickle.loads(z)
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001074 self.assertEqual(s, x)
Guido van Rossumb7dedc82016-10-29 12:44:29 -07001075
1076 def test_copy_and_deepcopy(self):
1077 T = TypeVar('T')
1078 class Node(Generic[T]): ...
1079 things = [Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
1080 Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
1081 typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
1082 typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
1083 Union['T', int], List['T'], typing.Mapping['T', int]]
1084 for t in things + [Any]:
1085 self.assertEqual(t, copy(t))
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001086 self.assertEqual(t, deepcopy(t))
1087
1088 def test_immutability_by_copy_and_pickle(self):
1089 # Special forms like Union, Any, etc., generic aliases to containers like List,
1090 # Mapping, etc., and type variabcles are considered immutable by copy and pickle.
1091 global TP, TPB, TPV # for pickle
1092 TP = TypeVar('TP')
1093 TPB = TypeVar('TPB', bound=int)
1094 TPV = TypeVar('TPV', bytes, str)
1095 for X in [TP, TPB, TPV, List, typing.Mapping, ClassVar, typing.Iterable,
1096 Union, Any, Tuple, Callable]:
1097 self.assertIs(copy(X), X)
1098 self.assertIs(deepcopy(X), X)
1099 self.assertIs(pickle.loads(pickle.dumps(X)), X)
1100 # Check that local type variables are copyable.
1101 TL = TypeVar('TL')
1102 TLB = TypeVar('TLB', bound=int)
1103 TLV = TypeVar('TLV', bytes, str)
1104 for X in [TL, TLB, TLV]:
1105 self.assertIs(copy(X), X)
1106 self.assertIs(deepcopy(X), X)
Guido van Rossumbb7c57c2015-11-18 21:12:58 -08001107
Ivan Levkivskyi29bc1932017-12-05 03:43:58 +01001108 def test_copy_generic_instances(self):
1109 T = TypeVar('T')
1110 class C(Generic[T]):
1111 def __init__(self, attr: T) -> None:
1112 self.attr = attr
1113
1114 c = C(42)
1115 self.assertEqual(copy(c).attr, 42)
1116 self.assertEqual(deepcopy(c).attr, 42)
1117 self.assertIsNot(copy(c), c)
1118 self.assertIsNot(deepcopy(c), c)
1119 c.attr = 1
1120 self.assertEqual(copy(c).attr, 1)
1121 self.assertEqual(deepcopy(c).attr, 1)
1122 ci = C[int](42)
1123 self.assertEqual(copy(ci).attr, 42)
1124 self.assertEqual(deepcopy(ci).attr, 42)
1125 self.assertIsNot(copy(ci), ci)
1126 self.assertIsNot(deepcopy(ci), ci)
1127 ci.attr = 1
1128 self.assertEqual(copy(ci).attr, 1)
1129 self.assertEqual(deepcopy(ci).attr, 1)
1130 self.assertEqual(ci.__orig_class__, C[int])
1131
Guido van Rossum83ec3022017-01-17 20:43:28 -08001132 def test_weakref_all(self):
1133 T = TypeVar('T')
1134 things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any],
1135 Optional[List[int]], typing.Mapping[int, str],
1136 typing.re.Match[bytes], typing.Iterable['whatever']]
1137 for t in things:
1138 self.assertEqual(weakref.ref(t)(), t)
1139
Guido van Rossum61f0a022016-11-29 09:46:21 -08001140 def test_parameterized_slots(self):
1141 T = TypeVar('T')
1142 class C(Generic[T]):
1143 __slots__ = ('potato',)
1144
1145 c = C()
1146 c_int = C[int]()
Guido van Rossum61f0a022016-11-29 09:46:21 -08001147
1148 c.potato = 0
1149 c_int.potato = 0
1150 with self.assertRaises(AttributeError):
1151 c.tomato = 0
1152 with self.assertRaises(AttributeError):
1153 c_int.tomato = 0
1154
1155 def foo(x: C['C']): ...
1156 self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C])
Guido van Rossum61f0a022016-11-29 09:46:21 -08001157 self.assertEqual(copy(C[int]), deepcopy(C[int]))
1158
1159 def test_parameterized_slots_dict(self):
1160 T = TypeVar('T')
1161 class D(Generic[T]):
1162 __slots__ = {'banana': 42}
1163
1164 d = D()
1165 d_int = D[int]()
Guido van Rossum61f0a022016-11-29 09:46:21 -08001166
1167 d.banana = 'yes'
1168 d_int.banana = 'yes'
1169 with self.assertRaises(AttributeError):
1170 d.foobar = 'no'
1171 with self.assertRaises(AttributeError):
1172 d_int.foobar = 'no'
1173
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001174 def test_errors(self):
1175 with self.assertRaises(TypeError):
1176 B = SimpleMapping[XK, Any]
1177
1178 class C(Generic[B]):
1179 pass
1180
1181 def test_repr_2(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001182 class C(Generic[T]):
1183 pass
1184
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001185 self.assertEqual(C.__module__, __name__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001186 self.assertEqual(C.__qualname__,
1187 'GenericTests.test_repr_2.<locals>.C')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001188 X = C[int]
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001189 self.assertEqual(X.__module__, __name__)
Guido van Rossum7ef22d62016-10-21 14:27:58 -07001190 self.assertEqual(repr(X).split('.')[-1], 'C[int]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001191
1192 class Y(C[int]):
1193 pass
1194
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001195 self.assertEqual(Y.__module__, __name__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001196 self.assertEqual(Y.__qualname__,
1197 'GenericTests.test_repr_2.<locals>.Y')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001198
1199 def test_eq_1(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001200 self.assertEqual(Generic, Generic)
1201 self.assertEqual(Generic[T], Generic[T])
1202 self.assertNotEqual(Generic[KT], Generic[VT])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001203
1204 def test_eq_2(self):
1205
1206 class A(Generic[T]):
1207 pass
1208
1209 class B(Generic[T]):
1210 pass
1211
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001212 self.assertEqual(A, A)
1213 self.assertNotEqual(A, B)
1214 self.assertEqual(A[T], A[T])
1215 self.assertNotEqual(A[T], B[T])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001216
1217 def test_multiple_inheritance(self):
1218
1219 class A(Generic[T, VT]):
1220 pass
1221
1222 class B(Generic[KT, T]):
1223 pass
1224
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001225 class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001226 pass
1227
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001228 self.assertEqual(C.__parameters__, (VT, T, KT))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001229
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001230 def test_multiple_inheritance_special(self):
1231 S = TypeVar('S')
1232 class B(Generic[S]): ...
1233 class C(List[int], B): ...
1234 self.assertEqual(C.__mro__, (C, list, B, Generic, object))
1235
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001236 def test_init_subclass_super_called(self):
1237 class FinalException(Exception):
1238 pass
1239
1240 class Final:
1241 def __init_subclass__(cls, **kwargs) -> None:
1242 for base in cls.__bases__:
1243 if base is not Final and issubclass(base, Final):
1244 raise FinalException(base)
1245 super().__init_subclass__(**kwargs)
1246 class Test(Generic[T], Final):
1247 pass
1248 with self.assertRaises(FinalException):
1249 class Subclass(Test):
1250 pass
1251 with self.assertRaises(FinalException):
1252 class Subclass(Test[int]):
1253 pass
1254
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001255 def test_nested(self):
1256
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001257 G = Generic
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001258
1259 class Visitor(G[T]):
1260
1261 a = None
1262
1263 def set(self, a: T):
1264 self.a = a
1265
1266 def get(self):
1267 return self.a
1268
1269 def visit(self) -> T:
1270 return self.a
1271
1272 V = Visitor[typing.List[int]]
1273
1274 class IntListVisitor(V):
1275
1276 def append(self, x: int):
1277 self.a.append(x)
1278
1279 a = IntListVisitor()
1280 a.set([])
1281 a.append(1)
1282 a.append(42)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001283 self.assertEqual(a.get(), [1, 42])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001284
1285 def test_type_erasure(self):
1286 T = TypeVar('T')
1287
1288 class Node(Generic[T]):
Guido van Rossum1b669102015-09-04 12:15:54 -07001289 def __init__(self, label: T,
1290 left: 'Node[T]' = None,
1291 right: 'Node[T]' = None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001292 self.label = label # type: T
1293 self.left = left # type: Optional[Node[T]]
1294 self.right = right # type: Optional[Node[T]]
1295
1296 def foo(x: T):
1297 a = Node(x)
1298 b = Node[T](x)
1299 c = Node[Any](x)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001300 self.assertIs(type(a), Node)
1301 self.assertIs(type(b), Node)
1302 self.assertIs(type(c), Node)
1303 self.assertEqual(a.label, x)
1304 self.assertEqual(b.label, x)
1305 self.assertEqual(c.label, x)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001306
1307 foo(42)
1308
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001309 def test_implicit_any(self):
1310 T = TypeVar('T')
1311
1312 class C(Generic[T]):
1313 pass
1314
1315 class D(C):
1316 pass
1317
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001318 self.assertEqual(D.__parameters__, ())
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001319
1320 with self.assertRaises(Exception):
1321 D[int]
1322 with self.assertRaises(Exception):
1323 D[Any]
1324 with self.assertRaises(Exception):
1325 D[T]
1326
Ivan Levkivskyi43d12a62018-05-09 02:23:46 +01001327 def test_new_with_args(self):
1328
1329 class A(Generic[T]):
1330 pass
1331
1332 class B:
1333 def __new__(cls, arg):
1334 # call object
1335 obj = super().__new__(cls)
1336 obj.arg = arg
1337 return obj
1338
1339 # mro: C, A, Generic, B, object
1340 class C(A, B):
1341 pass
1342
1343 c = C('foo')
1344 self.assertEqual(c.arg, 'foo')
1345
1346 def test_new_with_args2(self):
1347
1348 class A:
1349 def __init__(self, arg):
1350 self.from_a = arg
1351 # call object
1352 super().__init__()
1353
1354 # mro: C, Generic, A, object
1355 class C(Generic[T], A):
1356 def __init__(self, arg):
1357 self.from_c = arg
1358 # call Generic
1359 super().__init__(arg)
1360
1361 c = C('foo')
1362 self.assertEqual(c.from_a, 'foo')
1363 self.assertEqual(c.from_c, 'foo')
1364
1365 def test_new_no_args(self):
1366
1367 class A(Generic[T]):
1368 pass
1369
Ivan Levkivskyib551e9f2018-05-10 23:10:10 -04001370 with self.assertRaises(TypeError):
1371 A('foo')
1372
Ivan Levkivskyi43d12a62018-05-09 02:23:46 +01001373 class B:
1374 def __new__(cls):
1375 # call object
1376 obj = super().__new__(cls)
1377 obj.from_b = 'b'
1378 return obj
1379
1380 # mro: C, A, Generic, B, object
1381 class C(A, B):
1382 def __init__(self, arg):
1383 self.arg = arg
1384
1385 def __new__(cls, arg):
1386 # call A
1387 obj = super().__new__(cls)
1388 obj.from_c = 'c'
1389 return obj
1390
1391 c = C('foo')
1392 self.assertEqual(c.arg, 'foo')
1393 self.assertEqual(c.from_b, 'b')
1394 self.assertEqual(c.from_c, 'c')
1395
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001396
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001397class ClassVarTests(BaseTestCase):
1398
1399 def test_basics(self):
1400 with self.assertRaises(TypeError):
1401 ClassVar[1]
1402 with self.assertRaises(TypeError):
1403 ClassVar[int, str]
1404 with self.assertRaises(TypeError):
1405 ClassVar[int][str]
1406
1407 def test_repr(self):
1408 self.assertEqual(repr(ClassVar), 'typing.ClassVar')
1409 cv = ClassVar[int]
1410 self.assertEqual(repr(cv), 'typing.ClassVar[int]')
1411 cv = ClassVar[Employee]
1412 self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
1413
1414 def test_cannot_subclass(self):
1415 with self.assertRaises(TypeError):
1416 class C(type(ClassVar)):
1417 pass
1418 with self.assertRaises(TypeError):
1419 class C(type(ClassVar[int])):
1420 pass
1421
1422 def test_cannot_init(self):
1423 with self.assertRaises(TypeError):
Guido van Rossum4cefe742016-09-27 15:20:12 -07001424 ClassVar()
1425 with self.assertRaises(TypeError):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001426 type(ClassVar)()
1427 with self.assertRaises(TypeError):
1428 type(ClassVar[Optional[int]])()
1429
1430 def test_no_isinstance(self):
1431 with self.assertRaises(TypeError):
1432 isinstance(1, ClassVar[int])
1433 with self.assertRaises(TypeError):
1434 issubclass(int, ClassVar)
1435
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001436
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001437class CastTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001438
1439 def test_basics(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001440 self.assertEqual(cast(int, 42), 42)
1441 self.assertEqual(cast(float, 42), 42)
1442 self.assertIs(type(cast(float, 42)), int)
1443 self.assertEqual(cast(Any, 42), 42)
1444 self.assertEqual(cast(list, 42), 42)
1445 self.assertEqual(cast(Union[str, float], 42), 42)
1446 self.assertEqual(cast(AnyStr, 42), 42)
1447 self.assertEqual(cast(None, 42), 42)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001448
1449 def test_errors(self):
1450 # Bogus calls are not expected to fail.
1451 cast(42, 42)
1452 cast('hello', 42)
1453
1454
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001455class ForwardRefTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001456
1457 def test_basics(self):
1458
1459 class Node(Generic[T]):
1460
1461 def __init__(self, label: T):
1462 self.label = label
1463 self.left = self.right = None
1464
1465 def add_both(self,
1466 left: 'Optional[Node[T]]',
1467 right: 'Node[T]' = None,
1468 stuff: int = None,
1469 blah=None):
1470 self.left = left
1471 self.right = right
1472
1473 def add_left(self, node: Optional['Node[T]']):
1474 self.add_both(node, None)
1475
1476 def add_right(self, node: 'Node[T]' = None):
1477 self.add_both(None, node)
1478
1479 t = Node[int]
1480 both_hints = get_type_hints(t.add_both, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001481 self.assertEqual(both_hints['left'], Optional[Node[T]])
1482 self.assertEqual(both_hints['right'], Optional[Node[T]])
1483 self.assertEqual(both_hints['left'], both_hints['right'])
1484 self.assertEqual(both_hints['stuff'], Optional[int])
1485 self.assertNotIn('blah', both_hints)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001486
1487 left_hints = get_type_hints(t.add_left, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001488 self.assertEqual(left_hints['node'], Optional[Node[T]])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001489
1490 right_hints = get_type_hints(t.add_right, globals(), locals())
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001491 self.assertEqual(right_hints['node'], Optional[Node[T]])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001492
Guido van Rossumd70fe632015-08-05 12:11:06 +02001493 def test_forwardref_instance_type_error(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001494 fr = typing.ForwardRef('int')
Guido van Rossumd70fe632015-08-05 12:11:06 +02001495 with self.assertRaises(TypeError):
1496 isinstance(42, fr)
1497
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001498 def test_forwardref_subclass_type_error(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001499 fr = typing.ForwardRef('int')
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001500 with self.assertRaises(TypeError):
1501 issubclass(int, fr)
1502
1503 def test_forward_equality(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001504 fr = typing.ForwardRef('int')
1505 self.assertEqual(fr, typing.ForwardRef('int'))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001506 self.assertNotEqual(List['int'], List[int])
1507
1508 def test_forward_repr(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001509 self.assertEqual(repr(List['int']), "typing.List[ForwardRef('int')]")
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001510
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001511 def test_union_forward(self):
1512
1513 def foo(a: Union['T']):
1514 pass
1515
1516 self.assertEqual(get_type_hints(foo, globals(), locals()),
1517 {'a': Union[T]})
1518
1519 def test_tuple_forward(self):
1520
1521 def foo(a: Tuple['T']):
1522 pass
1523
1524 self.assertEqual(get_type_hints(foo, globals(), locals()),
1525 {'a': Tuple[T]})
1526
1527 def test_callable_forward(self):
1528
1529 def foo(a: Callable[['T'], 'T']):
1530 pass
1531
1532 self.assertEqual(get_type_hints(foo, globals(), locals()),
1533 {'a': Callable[[T], T]})
1534
Guido van Rossumd70fe632015-08-05 12:11:06 +02001535 def test_callable_with_ellipsis_forward(self):
1536
1537 def foo(a: 'Callable[..., T]'):
1538 pass
1539
1540 self.assertEqual(get_type_hints(foo, globals(), locals()),
1541 {'a': Callable[..., T]})
1542
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001543 def test_syntax_error(self):
1544
1545 with self.assertRaises(SyntaxError):
1546 Generic['/T']
1547
1548 def test_delayed_syntax_error(self):
1549
1550 def foo(a: 'Node[T'):
1551 pass
1552
1553 with self.assertRaises(SyntaxError):
1554 get_type_hints(foo)
1555
1556 def test_type_error(self):
1557
1558 def foo(a: Tuple['42']):
1559 pass
1560
1561 with self.assertRaises(TypeError):
1562 get_type_hints(foo)
1563
1564 def test_name_error(self):
1565
1566 def foo(a: 'Noode[T]'):
1567 pass
1568
1569 with self.assertRaises(NameError):
1570 get_type_hints(foo, locals())
1571
1572 def test_no_type_check(self):
1573
1574 @no_type_check
1575 def foo(a: 'whatevers') -> {}:
1576 pass
1577
1578 th = get_type_hints(foo)
1579 self.assertEqual(th, {})
1580
1581 def test_no_type_check_class(self):
1582
1583 @no_type_check
1584 class C:
1585 def foo(a: 'whatevers') -> {}:
1586 pass
1587
1588 cth = get_type_hints(C.foo)
1589 self.assertEqual(cth, {})
1590 ith = get_type_hints(C().foo)
1591 self.assertEqual(ith, {})
1592
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001593 def test_no_type_check_no_bases(self):
1594 class C:
1595 def meth(self, x: int): ...
1596 @no_type_check
1597 class D(C):
1598 c = C
1599 # verify that @no_type_check never affects bases
1600 self.assertEqual(get_type_hints(C.meth), {'x': int})
1601
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -04001602 def test_no_type_check_forward_ref_as_string(self):
1603 class C:
1604 foo: typing.ClassVar[int] = 7
1605 class D:
1606 foo: ClassVar[int] = 7
1607 class E:
1608 foo: 'typing.ClassVar[int]' = 7
1609 class F:
1610 foo: 'ClassVar[int]' = 7
1611
1612 expected_result = {'foo': typing.ClassVar[int]}
1613 for clazz in [C, D, E, F]:
1614 self.assertEqual(get_type_hints(clazz), expected_result)
1615
1616 def test_nested_classvar_fails_forward_ref_check(self):
1617 class E:
1618 foo: 'typing.ClassVar[typing.ClassVar[int]]' = 7
1619 class F:
1620 foo: ClassVar['ClassVar[int]'] = 7
1621
1622 for clazz in [E, F]:
1623 with self.assertRaises(TypeError):
1624 get_type_hints(clazz)
1625
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001626 def test_meta_no_type_check(self):
1627
1628 @no_type_check_decorator
Éric Araujo03b95372017-10-12 12:28:55 -04001629 def magic_decorator(func):
1630 return func
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001631
1632 self.assertEqual(magic_decorator.__name__, 'magic_decorator')
1633
1634 @magic_decorator
1635 def foo(a: 'whatevers') -> {}:
1636 pass
1637
1638 @magic_decorator
1639 class C:
1640 def foo(a: 'whatevers') -> {}:
1641 pass
1642
1643 self.assertEqual(foo.__name__, 'foo')
1644 th = get_type_hints(foo)
1645 self.assertEqual(th, {})
1646 cth = get_type_hints(C.foo)
1647 self.assertEqual(cth, {})
1648 ith = get_type_hints(C().foo)
1649 self.assertEqual(ith, {})
1650
1651 def test_default_globals(self):
1652 code = ("class C:\n"
1653 " def foo(self, a: 'C') -> 'D': pass\n"
1654 "class D:\n"
1655 " def bar(self, b: 'D') -> C: pass\n"
1656 )
1657 ns = {}
1658 exec(code, ns)
1659 hints = get_type_hints(ns['C'].foo)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001660 self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']})
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001661
1662
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001663class OverloadTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001664
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001665 def test_overload_fails(self):
1666 from typing import overload
1667
1668 with self.assertRaises(RuntimeError):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001669
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001670 @overload
1671 def blah():
1672 pass
1673
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001674 blah()
1675
1676 def test_overload_succeeds(self):
1677 from typing import overload
1678
1679 @overload
1680 def blah():
1681 pass
1682
1683 def blah():
1684 pass
1685
1686 blah()
1687
1688
Guido van Rossumac353df2016-10-21 16:12:17 -07001689ASYNCIO_TESTS = """
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001690import asyncio
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001691
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001692T_a = TypeVar('T_a')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001693
Guido van Rossumf17c2002015-12-03 17:31:24 -08001694class AwaitableWrapper(typing.Awaitable[T_a]):
1695
1696 def __init__(self, value):
1697 self.value = value
1698
1699 def __await__(self) -> typing.Iterator[T_a]:
1700 yield
1701 return self.value
1702
Guido van Rossumf17c2002015-12-03 17:31:24 -08001703class AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
1704
1705 def __init__(self, value: typing.Iterable[T_a]):
1706 self.value = value
1707
1708 def __aiter__(self) -> typing.AsyncIterator[T_a]:
1709 return self
1710
Andrew Svetlov68b34a72019-05-16 17:52:10 +03001711 async def __anext__(self) -> T_a:
1712 data = await self.value
Guido van Rossumf17c2002015-12-03 17:31:24 -08001713 if data:
1714 return data
1715 else:
1716 raise StopAsyncIteration
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001717
1718class ACM:
1719 async def __aenter__(self) -> int:
1720 return 42
1721 async def __aexit__(self, etype, eval, tb):
1722 return None
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001723"""
1724
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001725try:
1726 exec(ASYNCIO_TESTS)
1727except ImportError:
1728 ASYNCIO = False # multithreading is not enabled
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001729else:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001730 ASYNCIO = True
Guido van Rossumf17c2002015-12-03 17:31:24 -08001731
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001732# Definitions needed for features introduced in Python 3.6
1733
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001734from test import ann_module, ann_module2, ann_module3
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001735from typing import AsyncContextManager
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001736
Guido van Rossum991d14f2016-11-09 13:12:51 -08001737class A:
1738 y: float
1739class B(A):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001740 x: ClassVar[Optional['B']] = None
1741 y: int
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001742 b: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001743class CSub(B):
1744 z: ClassVar['CSub'] = B()
1745class G(Generic[T]):
1746 lst: ClassVar[List[T]] = []
1747
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001748class NoneAndForward:
1749 parent: 'NoneAndForward'
1750 meaning: None
1751
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001752class CoolEmployee(NamedTuple):
1753 name: str
1754 cool: int
Guido van Rossum3c268be2017-01-18 08:03:50 -08001755
1756class CoolEmployeeWithDefault(NamedTuple):
1757 name: str
1758 cool: int = 0
Guido van Rossum95919c02017-01-22 17:47:20 -08001759
1760class XMeth(NamedTuple):
1761 x: int
1762 def double(self):
1763 return 2 * self.x
1764
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001765class XRepr(NamedTuple):
Guido van Rossum95919c02017-01-22 17:47:20 -08001766 x: int
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001767 y: int = 1
1768 def __str__(self):
1769 return f'{self.x} -> {self.y}'
1770 def __add__(self, other):
1771 return 0
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001772
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001773class HasForeignBaseClass(mod_generics_cache.A):
1774 some_xrepr: 'XRepr'
1775 other_a: 'mod_generics_cache.A'
1776
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02001777async def g_with(am: AsyncContextManager[int]):
1778 x: int
1779 async with am as x:
1780 return x
1781
1782try:
1783 g_with(ACM()).send(None)
1784except StopIteration as e:
1785 assert e.args[0] == 42
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001786
1787gth = get_type_hints
1788
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001789
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001790class GetTypeHintTests(BaseTestCase):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001791 def test_get_type_hints_from_various_objects(self):
1792 # For invalid objects should fail with TypeError (not AttributeError etc).
1793 with self.assertRaises(TypeError):
1794 gth(123)
1795 with self.assertRaises(TypeError):
1796 gth('abc')
1797 with self.assertRaises(TypeError):
1798 gth(None)
1799
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001800 def test_get_type_hints_modules(self):
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001801 ann_module_type_hints = {1: 2, 'f': Tuple[int, int], 'x': int, 'y': str}
1802 self.assertEqual(gth(ann_module), ann_module_type_hints)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001803 self.assertEqual(gth(ann_module2), {})
1804 self.assertEqual(gth(ann_module3), {})
1805
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001806 @expectedFailure
1807 def test_get_type_hints_modules_forwardref(self):
1808 # FIXME: This currently exposes a bug in typing. Cached forward references
1809 # don't account for the case where there are multiple types of the same
1810 # name coming from different modules in the same program.
1811 mgc_hints = {'default_a': Optional[mod_generics_cache.A],
1812 'default_b': Optional[mod_generics_cache.B]}
1813 self.assertEqual(gth(mod_generics_cache), mgc_hints)
1814
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001815 def test_get_type_hints_classes(self):
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001816 self.assertEqual(gth(ann_module.C), # gth will find the right globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001817 {'y': Optional[ann_module.C]})
1818 self.assertIsInstance(gth(ann_module.j_class), dict)
1819 self.assertEqual(gth(ann_module.M), {'123': 123, 'o': type})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001820 self.assertEqual(gth(ann_module.D),
Guido van Rossum991d14f2016-11-09 13:12:51 -08001821 {'j': str, 'k': str, 'y': Optional[ann_module.C]})
1822 self.assertEqual(gth(ann_module.Y), {'z': int})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001823 self.assertEqual(gth(ann_module.h_class),
Guido van Rossum991d14f2016-11-09 13:12:51 -08001824 {'y': Optional[ann_module.C]})
1825 self.assertEqual(gth(ann_module.S), {'x': str, 'y': str})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001826 self.assertEqual(gth(ann_module.foo), {'x': int})
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001827 self.assertEqual(gth(NoneAndForward),
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001828 {'parent': NoneAndForward, 'meaning': type(None)})
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001829 self.assertEqual(gth(HasForeignBaseClass),
1830 {'some_xrepr': XRepr, 'other_a': mod_generics_cache.A,
1831 'some_b': mod_generics_cache.B})
Ivan Levkivskyi43d12a62018-05-09 02:23:46 +01001832 self.assertEqual(gth(XRepr.__new__),
1833 {'x': int, 'y': int})
Ɓukasz Langaf350a262017-09-14 14:33:00 -04001834 self.assertEqual(gth(mod_generics_cache.B),
1835 {'my_inner_a1': mod_generics_cache.B.A,
1836 'my_inner_a2': mod_generics_cache.B.A,
1837 'my_outer_a': mod_generics_cache.A})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001838
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001839 def test_respect_no_type_check(self):
1840 @no_type_check
1841 class NoTpCheck:
1842 class Inn:
1843 def __init__(self, x: 'not a type'): ...
1844 self.assertTrue(NoTpCheck.__no_type_check__)
1845 self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
1846 self.assertEqual(gth(ann_module2.NTC.meth), {})
1847 class ABase(Generic[T]):
1848 def meth(x: int): ...
1849 @no_type_check
1850 class Der(ABase): ...
1851 self.assertEqual(gth(ABase.meth), {'x': int})
1852
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001853 def test_get_type_hints_for_builtins(self):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001854 # Should not fail for built-in classes and functions.
1855 self.assertEqual(gth(int), {})
1856 self.assertEqual(gth(type), {})
1857 self.assertEqual(gth(dir), {})
1858 self.assertEqual(gth(len), {})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001859 self.assertEqual(gth(object.__str__), {})
1860 self.assertEqual(gth(object().__str__), {})
1861 self.assertEqual(gth(str.join), {})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001862
1863 def test_previous_behavior(self):
1864 def testf(x, y): ...
1865 testf.__annotations__['x'] = 'int'
1866 self.assertEqual(gth(testf), {'x': int})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001867 def testg(x: None): ...
1868 self.assertEqual(gth(testg), {'x': type(None)})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001869
Guido van Rossum991d14f2016-11-09 13:12:51 -08001870 def test_get_type_hints_for_object_with_annotations(self):
1871 class A: ...
1872 class B: ...
1873 b = B()
1874 b.__annotations__ = {'x': 'A'}
1875 self.assertEqual(gth(b, locals()), {'x': A})
1876
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001877 def test_get_type_hints_ClassVar(self):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001878 self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__),
1879 {'var': typing.ClassVar[ann_module2.CV]})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001880 self.assertEqual(gth(B, globals()),
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001881 {'y': int, 'x': ClassVar[Optional[B]], 'b': int})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001882 self.assertEqual(gth(CSub, globals()),
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001883 {'z': ClassVar[CSub], 'y': int, 'b': int,
1884 'x': ClassVar[Optional[B]]})
Guido van Rossum991d14f2016-11-09 13:12:51 -08001885 self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001886
Guido van Rossumf17c2002015-12-03 17:31:24 -08001887
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001888class CollectionsAbcTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001889
1890 def test_hashable(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001891 self.assertIsInstance(42, typing.Hashable)
1892 self.assertNotIsInstance([], typing.Hashable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001893
1894 def test_iterable(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001895 self.assertIsInstance([], typing.Iterable)
Guido van Rossum1b669102015-09-04 12:15:54 -07001896 # Due to ABC caching, the second time takes a separate code
1897 # path and could fail. So call this a few times.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001898 self.assertIsInstance([], typing.Iterable)
1899 self.assertIsInstance([], typing.Iterable)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001900 self.assertNotIsInstance(42, typing.Iterable)
Guido van Rossum1b669102015-09-04 12:15:54 -07001901 # Just in case, also test issubclass() a few times.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001902 self.assertIsSubclass(list, typing.Iterable)
1903 self.assertIsSubclass(list, typing.Iterable)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001904
1905 def test_iterator(self):
1906 it = iter([])
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001907 self.assertIsInstance(it, typing.Iterator)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001908 self.assertNotIsInstance(42, typing.Iterator)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001909
Guido van Rossumac353df2016-10-21 16:12:17 -07001910 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001911 def test_awaitable(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001912 ns = {}
1913 exec(
1914 "async def foo() -> typing.Awaitable[int]:\n"
1915 " return await AwaitableWrapper(42)\n",
1916 globals(), ns)
1917 foo = ns['foo']
Guido van Rossumf17c2002015-12-03 17:31:24 -08001918 g = foo()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001919 self.assertIsInstance(g, typing.Awaitable)
1920 self.assertNotIsInstance(foo, typing.Awaitable)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001921 g.send(None) # Run foo() till completion, to avoid warning.
1922
Guido van Rossumac353df2016-10-21 16:12:17 -07001923 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001924 def test_coroutine(self):
1925 ns = {}
1926 exec(
1927 "async def foo():\n"
1928 " return\n",
1929 globals(), ns)
1930 foo = ns['foo']
1931 g = foo()
1932 self.assertIsInstance(g, typing.Coroutine)
1933 with self.assertRaises(TypeError):
1934 isinstance(g, typing.Coroutine[int])
1935 self.assertNotIsInstance(foo, typing.Coroutine)
1936 try:
1937 g.send(None)
1938 except StopIteration:
1939 pass
1940
1941 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001942 def test_async_iterable(self):
1943 base_it = range(10) # type: Iterator[int]
1944 it = AsyncIteratorWrapper(base_it)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001945 self.assertIsInstance(it, typing.AsyncIterable)
1946 self.assertIsInstance(it, typing.AsyncIterable)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001947 self.assertNotIsInstance(42, typing.AsyncIterable)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001948
Guido van Rossumac353df2016-10-21 16:12:17 -07001949 @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
Guido van Rossumf17c2002015-12-03 17:31:24 -08001950 def test_async_iterator(self):
1951 base_it = range(10) # type: Iterator[int]
1952 it = AsyncIteratorWrapper(base_it)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001953 self.assertIsInstance(it, typing.AsyncIterator)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001954 self.assertNotIsInstance(42, typing.AsyncIterator)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001955
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001956 def test_sized(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001957 self.assertIsInstance([], typing.Sized)
1958 self.assertNotIsInstance(42, typing.Sized)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001959
1960 def test_container(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001961 self.assertIsInstance([], typing.Container)
1962 self.assertNotIsInstance(42, typing.Container)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001963
Guido van Rossumefa798d2016-08-23 11:01:50 -07001964 def test_collection(self):
1965 if hasattr(typing, 'Collection'):
1966 self.assertIsInstance(tuple(), typing.Collection)
1967 self.assertIsInstance(frozenset(), typing.Collection)
1968 self.assertIsSubclass(dict, typing.Collection)
1969 self.assertNotIsInstance(42, typing.Collection)
1970
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001971 def test_abstractset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001972 self.assertIsInstance(set(), typing.AbstractSet)
1973 self.assertNotIsInstance(42, typing.AbstractSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001974
1975 def test_mutableset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001976 self.assertIsInstance(set(), typing.MutableSet)
1977 self.assertNotIsInstance(frozenset(), typing.MutableSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001978
1979 def test_mapping(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001980 self.assertIsInstance({}, typing.Mapping)
1981 self.assertNotIsInstance(42, typing.Mapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001982
1983 def test_mutablemapping(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001984 self.assertIsInstance({}, typing.MutableMapping)
1985 self.assertNotIsInstance(42, typing.MutableMapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001986
1987 def test_sequence(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001988 self.assertIsInstance([], typing.Sequence)
1989 self.assertNotIsInstance(42, typing.Sequence)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001990
1991 def test_mutablesequence(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001992 self.assertIsInstance([], typing.MutableSequence)
1993 self.assertNotIsInstance((), typing.MutableSequence)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001994
1995 def test_bytestring(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05001996 self.assertIsInstance(b'', typing.ByteString)
1997 self.assertIsInstance(bytearray(b''), typing.ByteString)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001998
1999 def test_list(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002000 self.assertIsSubclass(list, typing.List)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002001
Raymond Hettinger80490522017-01-16 22:42:37 -08002002 def test_deque(self):
2003 self.assertIsSubclass(collections.deque, typing.Deque)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002004 class MyDeque(typing.Deque[int]): ...
2005 self.assertIsInstance(MyDeque(), collections.deque)
2006
2007 def test_counter(self):
2008 self.assertIsSubclass(collections.Counter, typing.Counter)
Raymond Hettinger80490522017-01-16 22:42:37 -08002009
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002010 def test_set(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002011 self.assertIsSubclass(set, typing.Set)
2012 self.assertNotIsSubclass(frozenset, typing.Set)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002013
2014 def test_frozenset(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002015 self.assertIsSubclass(frozenset, typing.FrozenSet)
2016 self.assertNotIsSubclass(set, typing.FrozenSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002017
2018 def test_dict(self):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002019 self.assertIsSubclass(dict, typing.Dict)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002020
2021 def test_no_list_instantiation(self):
2022 with self.assertRaises(TypeError):
2023 typing.List()
2024 with self.assertRaises(TypeError):
2025 typing.List[T]()
2026 with self.assertRaises(TypeError):
2027 typing.List[int]()
2028
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002029 def test_list_subclass(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002030
2031 class MyList(typing.List[int]):
2032 pass
2033
2034 a = MyList()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002035 self.assertIsInstance(a, MyList)
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002036 self.assertIsInstance(a, typing.Sequence)
2037
2038 self.assertIsSubclass(MyList, list)
2039 self.assertNotIsSubclass(list, MyList)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002040
2041 def test_no_dict_instantiation(self):
2042 with self.assertRaises(TypeError):
2043 typing.Dict()
2044 with self.assertRaises(TypeError):
2045 typing.Dict[KT, VT]()
2046 with self.assertRaises(TypeError):
2047 typing.Dict[str, int]()
2048
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002049 def test_dict_subclass(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002050
2051 class MyDict(typing.Dict[str, int]):
2052 pass
2053
2054 d = MyDict()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002055 self.assertIsInstance(d, MyDict)
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002056 self.assertIsInstance(d, typing.MutableMapping)
2057
2058 self.assertIsSubclass(MyDict, dict)
2059 self.assertNotIsSubclass(dict, MyDict)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002060
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002061 def test_defaultdict_instantiation(self):
2062 self.assertIs(type(typing.DefaultDict()), collections.defaultdict)
2063 self.assertIs(type(typing.DefaultDict[KT, VT]()), collections.defaultdict)
2064 self.assertIs(type(typing.DefaultDict[str, int]()), collections.defaultdict)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002065
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002066 def test_defaultdict_subclass(self):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002067
2068 class MyDefDict(typing.DefaultDict[str, int]):
2069 pass
2070
2071 dd = MyDefDict()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002072 self.assertIsInstance(dd, MyDefDict)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002073
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002074 self.assertIsSubclass(MyDefDict, collections.defaultdict)
2075 self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
2076
Ismo Toijala68b56d02018-12-02 17:53:14 +02002077 def test_ordereddict_instantiation(self):
2078 self.assertIs(type(typing.OrderedDict()), collections.OrderedDict)
2079 self.assertIs(type(typing.OrderedDict[KT, VT]()), collections.OrderedDict)
2080 self.assertIs(type(typing.OrderedDict[str, int]()), collections.OrderedDict)
2081
2082 def test_ordereddict_subclass(self):
2083
2084 class MyOrdDict(typing.OrderedDict[str, int]):
2085 pass
2086
2087 od = MyOrdDict()
2088 self.assertIsInstance(od, MyOrdDict)
2089
2090 self.assertIsSubclass(MyOrdDict, collections.OrderedDict)
2091 self.assertNotIsSubclass(collections.OrderedDict, MyOrdDict)
2092
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002093 @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
2094 def test_chainmap_instantiation(self):
2095 self.assertIs(type(typing.ChainMap()), collections.ChainMap)
2096 self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap)
2097 self.assertIs(type(typing.ChainMap[str, int]()), collections.ChainMap)
2098 class CM(typing.ChainMap[KT, VT]): ...
2099 self.assertIs(type(CM[int, str]()), CM)
2100
2101 @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
2102 def test_chainmap_subclass(self):
2103
2104 class MyChainMap(typing.ChainMap[str, int]):
2105 pass
2106
2107 cm = MyChainMap()
2108 self.assertIsInstance(cm, MyChainMap)
2109
2110 self.assertIsSubclass(MyChainMap, collections.ChainMap)
2111 self.assertNotIsSubclass(collections.ChainMap, MyChainMap)
2112
2113 def test_deque_instantiation(self):
2114 self.assertIs(type(typing.Deque()), collections.deque)
2115 self.assertIs(type(typing.Deque[T]()), collections.deque)
2116 self.assertIs(type(typing.Deque[int]()), collections.deque)
2117 class D(typing.Deque[T]): ...
2118 self.assertIs(type(D[int]()), D)
2119
2120 def test_counter_instantiation(self):
2121 self.assertIs(type(typing.Counter()), collections.Counter)
2122 self.assertIs(type(typing.Counter[T]()), collections.Counter)
2123 self.assertIs(type(typing.Counter[int]()), collections.Counter)
2124 class C(typing.Counter[T]): ...
2125 self.assertIs(type(C[int]()), C)
2126
2127 def test_counter_subclass_instantiation(self):
2128
2129 class MyCounter(typing.Counter[int]):
2130 pass
2131
2132 d = MyCounter()
2133 self.assertIsInstance(d, MyCounter)
2134 self.assertIsInstance(d, typing.Counter)
2135 self.assertIsInstance(d, collections.Counter)
Raymond Hettinger80490522017-01-16 22:42:37 -08002136
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002137 def test_no_set_instantiation(self):
2138 with self.assertRaises(TypeError):
2139 typing.Set()
2140 with self.assertRaises(TypeError):
2141 typing.Set[T]()
2142 with self.assertRaises(TypeError):
2143 typing.Set[int]()
2144
2145 def test_set_subclass_instantiation(self):
2146
2147 class MySet(typing.Set[int]):
2148 pass
2149
2150 d = MySet()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002151 self.assertIsInstance(d, MySet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002152
2153 def test_no_frozenset_instantiation(self):
2154 with self.assertRaises(TypeError):
2155 typing.FrozenSet()
2156 with self.assertRaises(TypeError):
2157 typing.FrozenSet[T]()
2158 with self.assertRaises(TypeError):
2159 typing.FrozenSet[int]()
2160
2161 def test_frozenset_subclass_instantiation(self):
2162
2163 class MyFrozenSet(typing.FrozenSet[int]):
2164 pass
2165
2166 d = MyFrozenSet()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002167 self.assertIsInstance(d, MyFrozenSet)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002168
2169 def test_no_tuple_instantiation(self):
2170 with self.assertRaises(TypeError):
2171 Tuple()
2172 with self.assertRaises(TypeError):
2173 Tuple[T]()
2174 with self.assertRaises(TypeError):
2175 Tuple[int]()
2176
2177 def test_generator(self):
2178 def foo():
2179 yield 42
2180 g = foo()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002181 self.assertIsSubclass(type(g), typing.Generator)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002182
2183 def test_no_generator_instantiation(self):
2184 with self.assertRaises(TypeError):
2185 typing.Generator()
2186 with self.assertRaises(TypeError):
2187 typing.Generator[T, T, T]()
2188 with self.assertRaises(TypeError):
2189 typing.Generator[int, int, int]()
2190
Guido van Rossume9ed5602017-01-18 13:10:31 -08002191 def test_async_generator(self):
2192 ns = {}
2193 exec("async def f():\n"
Guido van Rossum95919c02017-01-22 17:47:20 -08002194 " yield 42\n", globals(), ns)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002195 g = ns['f']()
2196 self.assertIsSubclass(type(g), typing.AsyncGenerator)
2197
Guido van Rossume9ed5602017-01-18 13:10:31 -08002198 def test_no_async_generator_instantiation(self):
2199 with self.assertRaises(TypeError):
2200 typing.AsyncGenerator()
2201 with self.assertRaises(TypeError):
2202 typing.AsyncGenerator[T, T]()
2203 with self.assertRaises(TypeError):
2204 typing.AsyncGenerator[int, int]()
2205
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002206 def test_subclassing(self):
2207
2208 class MMA(typing.MutableMapping):
2209 pass
2210
2211 with self.assertRaises(TypeError): # It's abstract
2212 MMA()
2213
2214 class MMC(MMA):
Guido van Rossumb47c9d22016-10-03 08:40:50 -07002215 def __getitem__(self, k):
2216 return None
2217 def __setitem__(self, k, v):
2218 pass
2219 def __delitem__(self, k):
2220 pass
2221 def __iter__(self):
2222 return iter(())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002223 def __len__(self):
2224 return 0
2225
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002226 self.assertEqual(len(MMC()), 0)
Guido van Rossume2592672016-10-08 20:27:22 -07002227 assert callable(MMC.update)
2228 self.assertIsInstance(MMC(), typing.Mapping)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002229
2230 class MMB(typing.MutableMapping[KT, VT]):
Guido van Rossumb47c9d22016-10-03 08:40:50 -07002231 def __getitem__(self, k):
2232 return None
2233 def __setitem__(self, k, v):
2234 pass
2235 def __delitem__(self, k):
2236 pass
2237 def __iter__(self):
2238 return iter(())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002239 def __len__(self):
2240 return 0
2241
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002242 self.assertEqual(len(MMB()), 0)
2243 self.assertEqual(len(MMB[str, str]()), 0)
2244 self.assertEqual(len(MMB[KT, VT]()), 0)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002245
Guido van Rossum1cea70f2016-05-18 08:35:00 -07002246 self.assertNotIsSubclass(dict, MMA)
2247 self.assertNotIsSubclass(dict, MMB)
2248
2249 self.assertIsSubclass(MMA, typing.Mapping)
2250 self.assertIsSubclass(MMB, typing.Mapping)
2251 self.assertIsSubclass(MMC, typing.Mapping)
2252
Guido van Rossume2592672016-10-08 20:27:22 -07002253 self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002254 self.assertIsInstance(MMB[KT, VT](), collections.abc.Mapping)
Guido van Rossume2592672016-10-08 20:27:22 -07002255
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002256 self.assertIsSubclass(MMA, collections.abc.Mapping)
2257 self.assertIsSubclass(MMB, collections.abc.Mapping)
2258 self.assertIsSubclass(MMC, collections.abc.Mapping)
Guido van Rossume2592672016-10-08 20:27:22 -07002259
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002260 with self.assertRaises(TypeError):
2261 issubclass(MMB[str, str], typing.Mapping)
Guido van Rossume2592672016-10-08 20:27:22 -07002262 self.assertIsSubclass(MMC, MMA)
2263
2264 class I(typing.Iterable): ...
2265 self.assertNotIsSubclass(list, I)
2266
2267 class G(typing.Generator[int, int, int]): ...
2268 def g(): yield 0
2269 self.assertIsSubclass(G, typing.Generator)
2270 self.assertIsSubclass(G, typing.Iterable)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002271 self.assertIsSubclass(G, collections.abc.Generator)
2272 self.assertIsSubclass(G, collections.abc.Iterable)
Guido van Rossume2592672016-10-08 20:27:22 -07002273 self.assertNotIsSubclass(type(g), G)
2274
Guido van Rossume9ed5602017-01-18 13:10:31 -08002275 def test_subclassing_async_generator(self):
2276 class G(typing.AsyncGenerator[int, int]):
2277 def asend(self, value):
2278 pass
2279 def athrow(self, typ, val=None, tb=None):
2280 pass
2281
2282 ns = {}
2283 exec('async def g(): yield 0', globals(), ns)
2284 g = ns['g']
2285 self.assertIsSubclass(G, typing.AsyncGenerator)
2286 self.assertIsSubclass(G, typing.AsyncIterable)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002287 self.assertIsSubclass(G, collections.abc.AsyncGenerator)
2288 self.assertIsSubclass(G, collections.abc.AsyncIterable)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002289 self.assertNotIsSubclass(type(g), G)
2290
2291 instance = G()
2292 self.assertIsInstance(instance, typing.AsyncGenerator)
2293 self.assertIsInstance(instance, typing.AsyncIterable)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002294 self.assertIsInstance(instance, collections.abc.AsyncGenerator)
2295 self.assertIsInstance(instance, collections.abc.AsyncIterable)
Guido van Rossume9ed5602017-01-18 13:10:31 -08002296 self.assertNotIsInstance(type(g), G)
2297 self.assertNotIsInstance(g, G)
2298
Guido van Rossume2592672016-10-08 20:27:22 -07002299 def test_subclassing_subclasshook(self):
2300
2301 class Base(typing.Iterable):
2302 @classmethod
2303 def __subclasshook__(cls, other):
2304 if other.__name__ == 'Foo':
2305 return True
2306 else:
2307 return False
2308
2309 class C(Base): ...
2310 class Foo: ...
2311 class Bar: ...
2312 self.assertIsSubclass(Foo, Base)
2313 self.assertIsSubclass(Foo, C)
2314 self.assertNotIsSubclass(Bar, C)
2315
2316 def test_subclassing_register(self):
2317
2318 class A(typing.Container): ...
2319 class B(A): ...
2320
2321 class C: ...
2322 A.register(C)
2323 self.assertIsSubclass(C, A)
2324 self.assertNotIsSubclass(C, B)
2325
2326 class D: ...
2327 B.register(D)
2328 self.assertIsSubclass(D, A)
2329 self.assertIsSubclass(D, B)
2330
2331 class M(): ...
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002332 collections.abc.MutableMapping.register(M)
Guido van Rossume2592672016-10-08 20:27:22 -07002333 self.assertIsSubclass(M, typing.Mapping)
2334
2335 def test_collections_as_base(self):
2336
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002337 class M(collections.abc.Mapping): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002338 self.assertIsSubclass(M, typing.Mapping)
2339 self.assertIsSubclass(M, typing.Iterable)
2340
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002341 class S(collections.abc.MutableSequence): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002342 self.assertIsSubclass(S, typing.MutableSequence)
2343 self.assertIsSubclass(S, typing.Iterable)
2344
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002345 class I(collections.abc.Iterable): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002346 self.assertIsSubclass(I, typing.Iterable)
2347
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002348 class A(collections.abc.Mapping, metaclass=abc.ABCMeta): ...
Guido van Rossume2592672016-10-08 20:27:22 -07002349 class B: ...
2350 A.register(B)
2351 self.assertIsSubclass(B, typing.Mapping)
2352
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002353
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002354class OtherABCTests(BaseTestCase):
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002355
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002356 def test_contextmanager(self):
2357 @contextlib.contextmanager
2358 def manager():
2359 yield 42
2360
2361 cm = manager()
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002362 self.assertIsInstance(cm, typing.ContextManager)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002363 self.assertNotIsInstance(42, typing.ContextManager)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002364
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +02002365 @skipUnless(ASYNCIO, 'Python 3.5 required')
2366 def test_async_contextmanager(self):
2367 class NotACM:
2368 pass
2369 self.assertIsInstance(ACM(), typing.AsyncContextManager)
2370 self.assertNotIsInstance(NotACM(), typing.AsyncContextManager)
2371 @contextlib.contextmanager
2372 def manager():
2373 yield 42
2374
2375 cm = manager()
2376 self.assertNotIsInstance(cm, typing.AsyncContextManager)
2377 self.assertEqual(typing.AsyncContextManager[int].__args__, (int,))
2378 with self.assertRaises(TypeError):
2379 isinstance(42, typing.AsyncContextManager[int])
2380 with self.assertRaises(TypeError):
2381 typing.AsyncContextManager[int, str]
2382
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002383
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002384class TypeTests(BaseTestCase):
2385
2386 def test_type_basic(self):
2387
2388 class User: pass
2389 class BasicUser(User): pass
2390 class ProUser(User): pass
2391
2392 def new_user(user_class: Type[User]) -> User:
2393 return user_class()
2394
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002395 new_user(BasicUser)
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002396
2397 def test_type_typevar(self):
2398
2399 class User: pass
2400 class BasicUser(User): pass
2401 class ProUser(User): pass
2402
2403 U = TypeVar('U', bound=User)
2404
2405 def new_user(user_class: Type[U]) -> U:
2406 return user_class()
2407
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002408 new_user(BasicUser)
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002409
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002410 def test_type_optional(self):
2411 A = Optional[Type[BaseException]]
2412
2413 def foo(a: A) -> Optional[BaseException]:
2414 if a is None:
2415 return None
2416 else:
2417 return a()
2418
2419 assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
2420 assert foo(None) is None
2421
Guido van Rossumeb9aca32016-05-24 16:38:22 -07002422
Guido van Rossum91185fe2016-06-08 11:19:11 -07002423class NewTypeTests(BaseTestCase):
2424
2425 def test_basic(self):
2426 UserId = NewType('UserId', int)
2427 UserName = NewType('UserName', str)
2428 self.assertIsInstance(UserId(5), int)
2429 self.assertIsInstance(UserName('Joe'), str)
2430 self.assertEqual(UserId(5) + 1, 6)
2431
2432 def test_errors(self):
2433 UserId = NewType('UserId', int)
2434 UserName = NewType('UserName', str)
2435 with self.assertRaises(TypeError):
2436 issubclass(UserId, int)
2437 with self.assertRaises(TypeError):
2438 class D(UserName):
2439 pass
2440
2441
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002442class NamedTupleTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002443
2444 def test_basics(self):
2445 Emp = NamedTuple('Emp', [('name', str), ('id', int)])
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002446 self.assertIsSubclass(Emp, tuple)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002447 joe = Emp('Joe', 42)
2448 jim = Emp(name='Jim', id=1)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002449 self.assertIsInstance(joe, Emp)
2450 self.assertIsInstance(joe, tuple)
2451 self.assertEqual(joe.name, 'Joe')
2452 self.assertEqual(joe.id, 42)
2453 self.assertEqual(jim.name, 'Jim')
2454 self.assertEqual(jim.id, 1)
2455 self.assertEqual(Emp.__name__, 'Emp')
2456 self.assertEqual(Emp._fields, ('name', 'id'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002457 self.assertEqual(Emp.__annotations__,
2458 collections.OrderedDict([('name', str), ('id', int)]))
2459 self.assertIs(Emp._field_types, Emp.__annotations__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002460
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002461 def test_namedtuple_pyversion(self):
2462 if sys.version_info[:2] < (3, 6):
2463 with self.assertRaises(TypeError):
2464 NamedTuple('Name', one=int, other=str)
2465 with self.assertRaises(TypeError):
2466 class NotYet(NamedTuple):
2467 whatever = 0
2468
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002469 def test_annotation_usage(self):
2470 tim = CoolEmployee('Tim', 9000)
2471 self.assertIsInstance(tim, CoolEmployee)
2472 self.assertIsInstance(tim, tuple)
2473 self.assertEqual(tim.name, 'Tim')
2474 self.assertEqual(tim.cool, 9000)
2475 self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
2476 self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002477 self.assertEqual(CoolEmployee.__annotations__,
2478 collections.OrderedDict(name=str, cool=int))
2479 self.assertIs(CoolEmployee._field_types, CoolEmployee.__annotations__)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002480
Guido van Rossum3c268be2017-01-18 08:03:50 -08002481 def test_annotation_usage_with_default(self):
2482 jelle = CoolEmployeeWithDefault('Jelle')
2483 self.assertIsInstance(jelle, CoolEmployeeWithDefault)
2484 self.assertIsInstance(jelle, tuple)
2485 self.assertEqual(jelle.name, 'Jelle')
2486 self.assertEqual(jelle.cool, 0)
2487 cooler_employee = CoolEmployeeWithDefault('Sjoerd', 1)
2488 self.assertEqual(cooler_employee.cool, 1)
2489
2490 self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault')
2491 self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool'))
2492 self.assertEqual(CoolEmployeeWithDefault._field_types, dict(name=str, cool=int))
2493 self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0))
2494
2495 with self.assertRaises(TypeError):
2496 exec("""
2497class NonDefaultAfterDefault(NamedTuple):
2498 x: int = 3
2499 y: int
2500""")
2501
Guido van Rossum95919c02017-01-22 17:47:20 -08002502 def test_annotation_usage_with_methods(self):
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002503 self.assertEqual(XMeth(1).double(), 2)
2504 self.assertEqual(XMeth(42).x, XMeth(42)[0])
2505 self.assertEqual(str(XRepr(42)), '42 -> 1')
2506 self.assertEqual(XRepr(1, 2) + XRepr(3), 0)
2507
2508 with self.assertRaises(AttributeError):
2509 exec("""
2510class XMethBad(NamedTuple):
2511 x: int
2512 def _fields(self):
2513 return 'no chance for this'
2514""")
Guido van Rossum95919c02017-01-22 17:47:20 -08002515
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02002516 with self.assertRaises(AttributeError):
2517 exec("""
2518class XMethBad2(NamedTuple):
2519 x: int
2520 def _source(self):
2521 return 'no chance for this as well'
2522""")
2523
Guido van Rossum2f841442016-11-15 09:48:06 -08002524 def test_namedtuple_keyword_usage(self):
2525 LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int)
2526 nick = LocalEmployee('Nick', 25)
2527 self.assertIsInstance(nick, tuple)
2528 self.assertEqual(nick.name, 'Nick')
2529 self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
2530 self.assertEqual(LocalEmployee._fields, ('name', 'age'))
Guido van Rossum83ec3022017-01-17 20:43:28 -08002531 self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int))
2532 self.assertIs(LocalEmployee._field_types, LocalEmployee.__annotations__)
Guido van Rossum2f841442016-11-15 09:48:06 -08002533 with self.assertRaises(TypeError):
2534 NamedTuple('Name', [('x', int)], y=str)
2535 with self.assertRaises(TypeError):
2536 NamedTuple('Name', x=1, y='a')
2537
Guido van Rossum557d1eb2015-11-19 08:16:31 -08002538 def test_pickle(self):
2539 global Emp # pickle wants to reference the class by name
2540 Emp = NamedTuple('Emp', [('name', str), ('id', int)])
2541 jane = Emp('jane', 37)
Serhiy Storchaka6d9e9232015-11-20 18:33:02 +02002542 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
2543 z = pickle.dumps(jane, proto)
2544 jane2 = pickle.loads(z)
2545 self.assertEqual(jane2, jane)
Guido van Rossum557d1eb2015-11-19 08:16:31 -08002546
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002547
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002548class IOTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002549
2550 def test_io(self):
2551
2552 def stuff(a: IO) -> AnyStr:
2553 return a.readline()
2554
2555 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002556 self.assertEqual(a.__parameters__, (AnyStr,))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002557
2558 def test_textio(self):
2559
2560 def stuff(a: TextIO) -> str:
2561 return a.readline()
2562
2563 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002564 self.assertEqual(a.__parameters__, ())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002565
2566 def test_binaryio(self):
2567
2568 def stuff(a: BinaryIO) -> bytes:
2569 return a.readline()
2570
2571 a = stuff.__annotations__['a']
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002572 self.assertEqual(a.__parameters__, ())
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002573
2574 def test_io_submodule(self):
2575 from typing.io import IO, TextIO, BinaryIO, __all__, __name__
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002576 self.assertIs(IO, typing.IO)
2577 self.assertIs(TextIO, typing.TextIO)
2578 self.assertIs(BinaryIO, typing.BinaryIO)
2579 self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
2580 self.assertEqual(__name__, 'typing.io')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002581
2582
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002583class RETests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002584 # Much of this is really testing _TypeAlias.
2585
2586 def test_basics(self):
2587 pat = re.compile('[a-z]+', re.I)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002588 self.assertIsSubclass(pat.__class__, Pattern)
2589 self.assertIsSubclass(type(pat), Pattern)
Guido van Rossum4cefe742016-09-27 15:20:12 -07002590 self.assertIsInstance(pat, Pattern)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002591
2592 mat = pat.search('12345abcde.....')
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002593 self.assertIsSubclass(mat.__class__, Match)
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002594 self.assertIsSubclass(type(mat), Match)
Guido van Rossum4cefe742016-09-27 15:20:12 -07002595 self.assertIsInstance(mat, Match)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002596
Guido van Rossum4cefe742016-09-27 15:20:12 -07002597 # these should just work
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002598 Pattern[Union[str, bytes]]
2599 Match[Union[bytes, str]]
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002600
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002601 def test_alias_equality(self):
2602 self.assertEqual(Pattern[str], Pattern[str])
2603 self.assertNotEqual(Pattern[str], Pattern[bytes])
2604 self.assertNotEqual(Pattern[str], Match[str])
2605 self.assertNotEqual(Pattern[str], str)
2606
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002607 def test_errors(self):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002608 m = Match[Union[str, bytes]]
2609 with self.assertRaises(TypeError):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002610 m[str]
Guido van Rossumd70fe632015-08-05 12:11:06 +02002611 with self.assertRaises(TypeError):
2612 # We don't support isinstance().
Guido van Rossumd70fe632015-08-05 12:11:06 +02002613 isinstance(42, Pattern[str])
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002614 with self.assertRaises(TypeError):
2615 # We don't support issubclass().
2616 issubclass(Pattern[bytes], Pattern[str])
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002617
2618 def test_repr(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002619 self.assertEqual(repr(Pattern), 'typing.Pattern')
2620 self.assertEqual(repr(Pattern[str]), 'typing.Pattern[str]')
2621 self.assertEqual(repr(Pattern[bytes]), 'typing.Pattern[bytes]')
2622 self.assertEqual(repr(Match), 'typing.Match')
2623 self.assertEqual(repr(Match[str]), 'typing.Match[str]')
2624 self.assertEqual(repr(Match[bytes]), 'typing.Match[bytes]')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002625
2626 def test_re_submodule(self):
2627 from typing.re import Match, Pattern, __all__, __name__
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002628 self.assertIs(Match, typing.Match)
2629 self.assertIs(Pattern, typing.Pattern)
2630 self.assertEqual(set(__all__), set(['Match', 'Pattern']))
2631 self.assertEqual(__name__, 'typing.re')
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002632
2633 def test_cannot_subclass(self):
2634 with self.assertRaises(TypeError) as ex:
2635
2636 class A(typing.Match):
2637 pass
2638
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002639 self.assertEqual(str(ex.exception),
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002640 "type 're.Match' is not an acceptable base type")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002641
2642
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002643class AllTests(BaseTestCase):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002644 """Tests for __all__."""
2645
2646 def test_all(self):
2647 from typing import __all__ as a
2648 # Just spot-check the first and last of every category.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002649 self.assertIn('AbstractSet', a)
2650 self.assertIn('ValuesView', a)
2651 self.assertIn('cast', a)
2652 self.assertIn('overload', a)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002653 if hasattr(contextlib, 'AbstractContextManager'):
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002654 self.assertIn('ContextManager', a)
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002655 # Check that io and re are not exported.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002656 self.assertNotIn('io', a)
2657 self.assertNotIn('re', a)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002658 # Spot-check that stdlib modules aren't exported.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002659 self.assertNotIn('os', a)
2660 self.assertNotIn('sys', a)
Guido van Rossum6aafbd42016-04-17 17:52:05 -07002661 # Check that Text is defined.
Zachary Ware75b1bdc2016-04-19 11:49:37 -05002662 self.assertIn('Text', a)
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02002663 # Check previously missing classes.
2664 self.assertIn('SupportsBytes', a)
2665 self.assertIn('SupportsComplex', a)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002666
2667
2668if __name__ == '__main__':
2669 main()