|
|
|
@ -37,6 +37,9 @@ except ImportError: |
|
|
|
from test import mod_generics_cache |
|
|
|
|
|
|
|
|
|
|
|
PY36 = sys.version_info[:2] >= (3, 6) |
|
|
|
|
|
|
|
|
|
|
|
class BaseTestCase(TestCase): |
|
|
|
|
|
|
|
def assertIsSubclass(self, cls, class_or_tuple, msg=None): |
|
|
|
@ -633,6 +636,27 @@ class GenericTests(BaseTestCase): |
|
|
|
with self.assertRaises(TypeError): |
|
|
|
Generic[T, S, T] |
|
|
|
|
|
|
|
@skipUnless(PY36, "__init_subclass__ support required") |
|
|
|
def test_init_subclass(self): |
|
|
|
class X(typing.Generic[T]): |
|
|
|
def __init_subclass__(cls, **kwargs): |
|
|
|
super().__init_subclass__(**kwargs) |
|
|
|
cls.attr = 42 |
|
|
|
class Y(X): |
|
|
|
pass |
|
|
|
self.assertEqual(Y.attr, 42) |
|
|
|
with self.assertRaises(AttributeError): |
|
|
|
X.attr |
|
|
|
X.attr = 1 |
|
|
|
Y.attr = 2 |
|
|
|
class Z(Y): |
|
|
|
pass |
|
|
|
class W(X[int]): |
|
|
|
pass |
|
|
|
self.assertEqual(Y.attr, 2) |
|
|
|
self.assertEqual(Z.attr, 42) |
|
|
|
self.assertEqual(W.attr, 42) |
|
|
|
|
|
|
|
def test_repr(self): |
|
|
|
self.assertEqual(repr(SimpleMapping), |
|
|
|
__name__ + '.' + 'SimpleMapping') |
|
|
|
@ -1080,6 +1104,30 @@ class GenericTests(BaseTestCase): |
|
|
|
self.assertTrue(t is copy(t)) |
|
|
|
self.assertTrue(t is deepcopy(t)) |
|
|
|
|
|
|
|
def test_copy_generic_instances(self): |
|
|
|
T = TypeVar('T') |
|
|
|
class C(Generic[T]): |
|
|
|
def __init__(self, attr: T) -> None: |
|
|
|
self.attr = attr |
|
|
|
|
|
|
|
c = C(42) |
|
|
|
self.assertEqual(copy(c).attr, 42) |
|
|
|
self.assertEqual(deepcopy(c).attr, 42) |
|
|
|
self.assertIsNot(copy(c), c) |
|
|
|
self.assertIsNot(deepcopy(c), c) |
|
|
|
c.attr = 1 |
|
|
|
self.assertEqual(copy(c).attr, 1) |
|
|
|
self.assertEqual(deepcopy(c).attr, 1) |
|
|
|
ci = C[int](42) |
|
|
|
self.assertEqual(copy(ci).attr, 42) |
|
|
|
self.assertEqual(deepcopy(ci).attr, 42) |
|
|
|
self.assertIsNot(copy(ci), ci) |
|
|
|
self.assertIsNot(deepcopy(ci), ci) |
|
|
|
ci.attr = 1 |
|
|
|
self.assertEqual(copy(ci).attr, 1) |
|
|
|
self.assertEqual(deepcopy(ci).attr, 1) |
|
|
|
self.assertEqual(ci.__orig_class__, C[int]) |
|
|
|
|
|
|
|
def test_weakref_all(self): |
|
|
|
T = TypeVar('T') |
|
|
|
things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any], |
|
|
|
@ -1580,8 +1628,6 @@ else: |
|
|
|
asyncio = None |
|
|
|
AwaitableWrapper = AsyncIteratorWrapper = ACM = object |
|
|
|
|
|
|
|
PY36 = sys.version_info[:2] >= (3, 6) |
|
|
|
|
|
|
|
PY36_TESTS = """ |
|
|
|
from test import ann_module, ann_module2, ann_module3 |
|
|
|
from typing import AsyncContextManager |
|
|
|
|