bpo-46611: add coverage to instance and class checks in `typing.py` (GH-31078)

This commit is contained in:
Nikita Sobolev 2022-02-07 04:35:48 +03:00 committed by GitHub
parent b556f53785
commit 067c03bf40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 16 deletions

View File

@ -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):

View File

@ -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