1414
1515def 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