diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_types.py | 72 | ||||
-rw-r--r-- | Lib/test/test_typing.py | 3 |
2 files changed, 59 insertions, 16 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index c54854e..b8b1ce9 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -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): diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2aee5c3..9eab461 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -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 |