Update test_types.py from CPython 3.10
@@ -709,10 +709,9 @@ class UnionTests(unittest.TestCase):
self.assertEqual(hash(int | str), hash(str | int))
self.assertEqual(hash(int | str), hash(typing.Union[int, str]))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
- def test_instancecheck(self):
- x = int | str
+ 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)
@@ -721,15 +720,52 @@ class UnionTests(unittest.TestCase):
self.assertTrue(issubclass(bool, x))
self.assertTrue(issubclass(str, x))
self.assertFalse(issubclass(type(None), x))
- x = int | None
+
+ for x in (int | None, typing.Union[int, None]):
+ with self.subTest(x=x):
self.assertIsInstance(None, x)
self.assertTrue(issubclass(type(None), x))
- x = int | collections.abc.Mapping
+
+ 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)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_bad_instancecheck(self):
class BadMeta(type):
def __instancecheck__(cls, inst):
@@ -738,8 +774,6 @@ class UnionTests(unittest.TestCase):
self.assertTrue(isinstance(1, x))
self.assertRaises(ZeroDivisionError, isinstance, [], x)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
def test_bad_subclasscheck(self):
class BadMeta(type):
def __subclasscheck__(cls, sub):
