mirror of
https://github.com/python/cpython
synced 2024-09-16 05:29:56 +00:00
bpo-46348: modernize test_typing
(GH-30547)
This commit is contained in:
parent
43839ba438
commit
e2a9c8ef09
|
@ -1,53 +1,21 @@
|
||||||
"""Module for testing the behavior of generics across different modules."""
|
"""Module for testing the behavior of generics across different modules."""
|
||||||
|
|
||||||
import sys
|
|
||||||
from textwrap import dedent
|
|
||||||
from typing import TypeVar, Generic, Optional
|
from typing import TypeVar, Generic, Optional
|
||||||
|
|
||||||
|
default_a: Optional['A'] = None
|
||||||
|
default_b: Optional['B'] = None
|
||||||
|
|
||||||
if sys.version_info[:2] >= (3, 6):
|
T = TypeVar('T')
|
||||||
exec(dedent("""
|
|
||||||
default_a: Optional['A'] = None
|
|
||||||
default_b: Optional['B'] = None
|
|
||||||
|
|
||||||
T = TypeVar('T')
|
|
||||||
|
|
||||||
|
|
||||||
|
class A(Generic[T]):
|
||||||
|
some_b: 'B'
|
||||||
|
|
||||||
|
|
||||||
|
class B(Generic[T]):
|
||||||
class A(Generic[T]):
|
class A(Generic[T]):
|
||||||
some_b: 'B'
|
pass
|
||||||
|
|
||||||
|
my_inner_a1: 'B.A'
|
||||||
class B(Generic[T]):
|
my_inner_a2: A
|
||||||
class A(Generic[T]):
|
my_outer_a: 'A' # unless somebody calls get_type_hints with localns=B.__dict__
|
||||||
pass
|
|
||||||
|
|
||||||
my_inner_a1: 'B.A'
|
|
||||||
my_inner_a2: A
|
|
||||||
my_outer_a: 'A' # unless somebody calls get_type_hints with localns=B.__dict__
|
|
||||||
"""))
|
|
||||||
else: # This should stay in sync with the syntax above.
|
|
||||||
__annotations__ = dict(
|
|
||||||
default_a=Optional['A'],
|
|
||||||
default_b=Optional['B'],
|
|
||||||
)
|
|
||||||
default_a = None
|
|
||||||
default_b = None
|
|
||||||
|
|
||||||
T = TypeVar('T')
|
|
||||||
|
|
||||||
|
|
||||||
class A(Generic[T]):
|
|
||||||
__annotations__ = dict(
|
|
||||||
some_b='B'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class B(Generic[T]):
|
|
||||||
class A(Generic[T]):
|
|
||||||
pass
|
|
||||||
|
|
||||||
__annotations__ = dict(
|
|
||||||
my_inner_a1='B.A',
|
|
||||||
my_inner_a2=A,
|
|
||||||
my_outer_a='A' # unless somebody calls get_type_hints with localns=B.__dict__
|
|
||||||
)
|
|
||||||
|
|
|
@ -2938,7 +2938,9 @@ def blah():
|
||||||
blah()
|
blah()
|
||||||
|
|
||||||
|
|
||||||
ASYNCIO_TESTS = """
|
# Definitions needed for features introduced in Python 3.6
|
||||||
|
|
||||||
|
from test import ann_module, ann_module2, ann_module3, ann_module5, ann_module6
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
T_a = TypeVar('T_a')
|
T_a = TypeVar('T_a')
|
||||||
|
@ -2972,19 +2974,6 @@ async def __aenter__(self) -> int:
|
||||||
return 42
|
return 42
|
||||||
async def __aexit__(self, etype, eval, tb):
|
async def __aexit__(self, etype, eval, tb):
|
||||||
return None
|
return None
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
|
||||||
exec(ASYNCIO_TESTS)
|
|
||||||
except ImportError:
|
|
||||||
ASYNCIO = False # multithreading is not enabled
|
|
||||||
else:
|
|
||||||
ASYNCIO = True
|
|
||||||
|
|
||||||
# Definitions needed for features introduced in Python 3.6
|
|
||||||
|
|
||||||
from test import ann_module, ann_module2, ann_module3, ann_module5, ann_module6
|
|
||||||
from typing import AsyncContextManager
|
|
||||||
|
|
||||||
class A:
|
class A:
|
||||||
y: float
|
y: float
|
||||||
|
@ -3044,7 +3033,7 @@ class HasForeignBaseClass(mod_generics_cache.A):
|
||||||
some_xrepr: 'XRepr'
|
some_xrepr: 'XRepr'
|
||||||
other_a: 'mod_generics_cache.A'
|
other_a: 'mod_generics_cache.A'
|
||||||
|
|
||||||
async def g_with(am: AsyncContextManager[int]):
|
async def g_with(am: typing.AsyncContextManager[int]):
|
||||||
x: int
|
x: int
|
||||||
async with am as x:
|
async with am as x:
|
||||||
return x
|
return x
|
||||||
|
@ -3386,7 +3375,6 @@ def test_iterator(self):
|
||||||
self.assertIsInstance(it, typing.Iterator)
|
self.assertIsInstance(it, typing.Iterator)
|
||||||
self.assertNotIsInstance(42, typing.Iterator)
|
self.assertNotIsInstance(42, typing.Iterator)
|
||||||
|
|
||||||
@skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
|
|
||||||
def test_awaitable(self):
|
def test_awaitable(self):
|
||||||
ns = {}
|
ns = {}
|
||||||
exec(
|
exec(
|
||||||
|
@ -3399,7 +3387,6 @@ def test_awaitable(self):
|
||||||
self.assertNotIsInstance(foo, typing.Awaitable)
|
self.assertNotIsInstance(foo, typing.Awaitable)
|
||||||
g.send(None) # Run foo() till completion, to avoid warning.
|
g.send(None) # Run foo() till completion, to avoid warning.
|
||||||
|
|
||||||
@skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
|
|
||||||
def test_coroutine(self):
|
def test_coroutine(self):
|
||||||
ns = {}
|
ns = {}
|
||||||
exec(
|
exec(
|
||||||
|
@ -3417,7 +3404,6 @@ def test_coroutine(self):
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
|
|
||||||
def test_async_iterable(self):
|
def test_async_iterable(self):
|
||||||
base_it = range(10) # type: Iterator[int]
|
base_it = range(10) # type: Iterator[int]
|
||||||
it = AsyncIteratorWrapper(base_it)
|
it = AsyncIteratorWrapper(base_it)
|
||||||
|
@ -3425,7 +3411,6 @@ def test_async_iterable(self):
|
||||||
self.assertIsInstance(it, typing.AsyncIterable)
|
self.assertIsInstance(it, typing.AsyncIterable)
|
||||||
self.assertNotIsInstance(42, typing.AsyncIterable)
|
self.assertNotIsInstance(42, typing.AsyncIterable)
|
||||||
|
|
||||||
@skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
|
|
||||||
def test_async_iterator(self):
|
def test_async_iterator(self):
|
||||||
base_it = range(10) # type: Iterator[int]
|
base_it = range(10) # type: Iterator[int]
|
||||||
it = AsyncIteratorWrapper(base_it)
|
it = AsyncIteratorWrapper(base_it)
|
||||||
|
@ -3580,7 +3565,6 @@ class MyOrdDict(typing.OrderedDict[str, int]):
|
||||||
self.assertIsSubclass(MyOrdDict, collections.OrderedDict)
|
self.assertIsSubclass(MyOrdDict, collections.OrderedDict)
|
||||||
self.assertNotIsSubclass(collections.OrderedDict, MyOrdDict)
|
self.assertNotIsSubclass(collections.OrderedDict, MyOrdDict)
|
||||||
|
|
||||||
@skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
|
|
||||||
def test_chainmap_instantiation(self):
|
def test_chainmap_instantiation(self):
|
||||||
self.assertIs(type(typing.ChainMap()), collections.ChainMap)
|
self.assertIs(type(typing.ChainMap()), collections.ChainMap)
|
||||||
self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap)
|
self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap)
|
||||||
|
@ -3588,7 +3572,6 @@ def test_chainmap_instantiation(self):
|
||||||
class CM(typing.ChainMap[KT, VT]): ...
|
class CM(typing.ChainMap[KT, VT]): ...
|
||||||
self.assertIs(type(CM[int, str]()), CM)
|
self.assertIs(type(CM[int, str]()), CM)
|
||||||
|
|
||||||
@skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3')
|
|
||||||
def test_chainmap_subclass(self):
|
def test_chainmap_subclass(self):
|
||||||
|
|
||||||
class MyChainMap(typing.ChainMap[str, int]):
|
class MyChainMap(typing.ChainMap[str, int]):
|
||||||
|
@ -3852,7 +3835,6 @@ def manager():
|
||||||
self.assertIsInstance(cm, typing.ContextManager)
|
self.assertIsInstance(cm, typing.ContextManager)
|
||||||
self.assertNotIsInstance(42, typing.ContextManager)
|
self.assertNotIsInstance(42, typing.ContextManager)
|
||||||
|
|
||||||
@skipUnless(ASYNCIO, 'Python 3.5 required')
|
|
||||||
def test_async_contextmanager(self):
|
def test_async_contextmanager(self):
|
||||||
class NotACM:
|
class NotACM:
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in a new issue