Skip to content

Commit a6e4461

Browse files
committed
gh-92810: Address review fixes
1 parent 968766d commit a6e4461

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

Lib/test/test_abc.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
def test_factory(abc_ABCMeta, abc_get_cache_token):
1616
class TestLegacyAPI(unittest.TestCase):
17+
1718
def test_abstractproperty_basics(self):
1819
@abc.abstractproperty
1920
def foo(self): pass
@@ -558,8 +559,32 @@ class S(metaclass=abc_ABCMeta):
558559
with self.assertRaisesRegex(CustomError, exc_msg):
559560
issubclass(int, S)
560561

561-
def test_subclasshook(self):
562+
def test_issubclass_bad_class(self):
562563
class A(metaclass=abc.ABCMeta):
564+
pass
565+
566+
A._abc_impl = 1
567+
error_msg = "_abc_impl is set to a wrong type"
568+
with self.assertRaisesRegex(TypeError, error_msg):
569+
issubclass(A, A)
570+
571+
class B(metaclass=_py_abc.ABCMeta):
572+
pass
573+
574+
B._abc_cache = 1
575+
error_msg = "argument of type 'int' is not a container or iterable"
576+
with self.assertRaisesRegex(TypeError, error_msg):
577+
issubclass(B, B)
578+
579+
class C(metaclass=_py_abc.ABCMeta):
580+
pass
581+
582+
C._abc_negative_cache = 1
583+
with self.assertRaisesRegex(TypeError, error_msg):
584+
issubclass(C, C)
585+
586+
def test_subclasshook(self):
587+
class A(metaclass=abc_ABCMeta):
563588
@classmethod
564589
def __subclasshook__(cls, C):
565590
if cls is A:
@@ -576,6 +601,26 @@ class C:
576601
self.assertNotIsSubclass(C, A)
577602
self.assertNotIsSubclass(C, (A,))
578603

604+
def test_subclasshook_exception(self):
605+
# Check that issubclass() propagates exceptions raised by
606+
# __subclasshook__.
607+
class CustomError(Exception): ...
608+
exc_msg = "exception from __subclasshook__"
609+
class A(metaclass=abc_ABCMeta):
610+
@classmethod
611+
def __subclasshook__(cls, C):
612+
raise CustomError(exc_msg)
613+
with self.assertRaisesRegex(CustomError, exc_msg):
614+
issubclass(A, A)
615+
class B(A):
616+
pass
617+
with self.assertRaisesRegex(CustomError, exc_msg):
618+
issubclass(B, A)
619+
class C:
620+
pass
621+
with self.assertRaisesRegex(CustomError, exc_msg):
622+
issubclass(C, A)
623+
579624
def test_all_new_methods_are_called(self):
580625
class A(metaclass=abc_ABCMeta):
581626
pass

0 commit comments

Comments
 (0)