mirror of https://github.com/python/cpython
bpo-46611: add coverage to instance and class checks in `typing.py` (GH-31078)
This commit is contained in:
parent
b556f53785
commit
067c03bf40
|
@ -703,22 +703,62 @@ class UnionTests(unittest.TestCase):
|
|||
self.assertEqual(hash(int | str), hash(str | int))
|
||||
self.assertEqual(hash(int | str), hash(typing.Union[int, str]))
|
||||
|
||||
def test_instancecheck(self):
|
||||
x = int | str
|
||||
self.assertIsInstance(1, x)
|
||||
self.assertIsInstance(True, x)
|
||||
self.assertIsInstance('a', x)
|
||||
self.assertNotIsInstance(None, x)
|
||||
self.assertTrue(issubclass(int, x))
|
||||
self.assertTrue(issubclass(bool, x))
|
||||
self.assertTrue(issubclass(str, x))
|
||||
self.assertFalse(issubclass(type(None), x))
|
||||
x = int | None
|
||||
self.assertIsInstance(None, x)
|
||||
self.assertTrue(issubclass(type(None), x))
|
||||
x = int | collections.abc.Mapping
|
||||
self.assertIsInstance({}, x)
|
||||
self.assertTrue(issubclass(dict, x))
|
||||
def test_instancecheck_and_subclasscheck(self):
|
||||
for x in (int | str, typing.Union[int, str]):
|
||||
with self.subTest(x=x):
|
||||
self.assertIsInstance(1, x)
|
||||
self.assertIsInstance(True, x)
|
||||
self.assertIsInstance('a', x)
|
||||
self.assertNotIsInstance(None, x)
|
||||
self.assertTrue(issubclass(int, x))
|
||||
self.assertTrue(issubclass(bool, x))
|
||||
self.assertTrue(issubclass(str, x))
|
||||
self.assertFalse(issubclass(type(None), x))
|
||||
|
||||
for x in (int | None, typing.Union[int, None]):
|
||||
with self.subTest(x=x):
|
||||
self.assertIsInstance(None, x)
|
||||
self.assertTrue(issubclass(type(None), x))
|
||||
|
||||
for x in (
|
||||
int | collections.abc.Mapping,
|
||||
typing.Union[int, collections.abc.Mapping],
|
||||
):
|
||||
with self.subTest(x=x):
|
||||
self.assertIsInstance({}, x)
|
||||
self.assertNotIsInstance((), x)
|
||||
self.assertTrue(issubclass(dict, x))
|
||||
self.assertFalse(issubclass(list, x))
|
||||
|
||||
def test_instancecheck_and_subclasscheck_order(self):
|
||||
T = typing.TypeVar('T')
|
||||
|
||||
will_resolve = (
|
||||
int | T,
|
||||
typing.Union[int, T],
|
||||
)
|
||||
for x in will_resolve:
|
||||
with self.subTest(x=x):
|
||||
self.assertIsInstance(1, x)
|
||||
self.assertTrue(issubclass(int, x))
|
||||
|
||||
wont_resolve = (
|
||||
T | int,
|
||||
typing.Union[T, int],
|
||||
)
|
||||
for x in wont_resolve:
|
||||
with self.subTest(x=x):
|
||||
with self.assertRaises(TypeError):
|
||||
issubclass(int, x)
|
||||
with self.assertRaises(TypeError):
|
||||
isinstance(1, x)
|
||||
|
||||
for x in (*will_resolve, *wont_resolve):
|
||||
with self.subTest(x=x):
|
||||
with self.assertRaises(TypeError):
|
||||
issubclass(object, x)
|
||||
with self.assertRaises(TypeError):
|
||||
isinstance(object(), x)
|
||||
|
||||
def test_bad_instancecheck(self):
|
||||
class BadMeta(type):
|
||||
|
|
|
@ -439,6 +439,8 @@ class TupleTests(BaseTestCase):
|
|||
class MyTuple(tuple):
|
||||
pass
|
||||
self.assertIsSubclass(MyTuple, Tuple)
|
||||
self.assertIsSubclass(Tuple, Tuple)
|
||||
self.assertIsSubclass(tuple, Tuple)
|
||||
|
||||
def test_tuple_instance_type_error(self):
|
||||
with self.assertRaises(TypeError):
|
||||
|
@ -466,6 +468,7 @@ class BaseCallableTests:
|
|||
with self.assertRaises(TypeError):
|
||||
issubclass(types.FunctionType, Callable[[int], int])
|
||||
self.assertIsSubclass(types.FunctionType, Callable)
|
||||
self.assertIsSubclass(Callable, Callable)
|
||||
|
||||
def test_eq_hash(self):
|
||||
Callable = self.Callable
|
||||
|
|
Loading…
Reference in New Issue