14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Tests some corner cases with isinstance() and issubclass().  While these
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# tests use new style classes and properties, they actually do whitebox
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# testing of error conditions uncovered when using extension types.
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestIsInstanceExceptions(unittest.TestCase):
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Test to make sure that an AttributeError when accessing the instance's
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # class's bases is masked.  This was actually a bug in Python 2.2 and
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # 2.2.1 where the exception wasn't caught but it also wasn't being cleared
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # (leading to an "undetected error" in the debug build).  Set up is,
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # isinstance(inst, cls) where:
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # - inst isn't an InstanceType
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # - cls isn't a ClassType, a TypeType, or a TupleType
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # - cls has a __bases__ attribute
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # - inst has a __class__ attribute
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # - inst.__class__ as no __bases__ attribute
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Sounds complicated, I know, but this mimics a situation where an
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # extension type raises an AttributeError when its __bases__ attribute is
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # gotten.  In that case, isinstance() should return False.
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_class_has_no_bases(self):
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class I(object):
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getclass(self):
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # This must return an object that has no __bases__ attribute
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return None
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __class__ = property(getclass)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ()
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(I(), C()))
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Like above except that inst.__class__.__bases__ raises an exception
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # other than AttributeError
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_bases_raises_other_than_attribute_error(self):
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class E(object):
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise RuntimeError
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class I(object):
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getclass(self):
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return E()
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __class__ = property(getclass)
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ()
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, isinstance, I(), C())
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Here's a situation where getattr(cls, '__bases__') raises an exception.
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # If that exception is not AttributeError, it should not get masked
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dont_mask_non_attribute_error(self):
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class I: pass
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise RuntimeError
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, isinstance, I(), C())
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Like above, except that getattr(cls, '__bases__') raises an
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # AttributeError, which /should/ get masked as a TypeError
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_mask_attribute_error(self):
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class I: pass
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise AttributeError
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, isinstance, I(), C())
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# These tests are similar to above, but tickle certain code paths in
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# issubclass() instead of isinstance() -- really PyObject_IsSubclass()
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# vs. PyObject_IsInstance().
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestIsSubclassExceptions(unittest.TestCase):
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dont_mask_non_attribute_error(self):
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise RuntimeError
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class S(C): pass
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, issubclass, C(), S())
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_mask_attribute_error(self):
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise AttributeError
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class S(C): pass
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, issubclass, C(), S())
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Like above, but test the second branch, where the __bases__ of the
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # second arg (the cls arg) is tested.  This means the first arg must
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return a valid __bases__, and it's okay for it to be a normal --
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # unrelated by inheritance -- class.
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dont_mask_non_attribute_error_in_cls_arg(self):
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class B: pass
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise RuntimeError
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, issubclass, B, C())
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_mask_attribute_error_in_cls_arg(self):
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class B: pass
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def getbases(self):
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise AttributeError
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __bases__ = property(getbases)
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, issubclass, B, C())
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# meta classes for creating abstract classes and instances
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass AbstractClass(object):
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, bases):
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.bases = bases
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def getbases(self):
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.bases
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __bases__ = property(getbases)
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __call__(self):
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return AbstractInstance(self)
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass AbstractInstance(object):
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, klass):
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.klass = klass
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def getclass(self):
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.klass
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __class__ = property(getclass)
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# abstract classes
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAbstractSuper = AbstractClass(bases=())
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAbstractChild = AbstractClass(bases=(AbstractSuper,))
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# normal classes
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Super:
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Child(Super):
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# new-style classes
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass NewSuper(object):
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass NewChild(NewSuper):
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestIsInstanceIsSubclass(unittest.TestCase):
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tests to ensure that isinstance and issubclass work on abstract
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # classes and instances.  Before the 2.2 release, TypeErrors were
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # raised when boolean values should have been returned.  The bug was
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # triggered by mixing 'normal' classes and instances were with
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # 'abstract' classes and instances.  This case tries to test all
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # combinations.
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_isinstance_normal(self):
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # normal instances
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, isinstance(Super(), Super))
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(Super(), Child))
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(Super(), AbstractSuper))
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(Super(), AbstractChild))
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, isinstance(Child(), Super))
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(Child(), AbstractSuper))
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_isinstance_abstract(self):
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # abstract instances
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, isinstance(AbstractSuper(), AbstractSuper))
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(AbstractSuper(), AbstractChild))
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(AbstractSuper(), Super))
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(AbstractSuper(), Child))
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, isinstance(AbstractChild(), AbstractChild))
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, isinstance(AbstractChild(), AbstractSuper))
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(AbstractChild(), Super))
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, isinstance(AbstractChild(), Child))
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subclass_normal(self):
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # normal classes
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Super, Super))
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(Super, AbstractSuper))
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(Super, Child))
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Child, Child))
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Child, Super))
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(Child, AbstractSuper))
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subclass_abstract(self):
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # abstract classes
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(AbstractSuper, AbstractSuper))
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(AbstractSuper, AbstractChild))
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(AbstractSuper, Child))
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(AbstractChild, AbstractChild))
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(AbstractChild, AbstractSuper))
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(AbstractChild, Super))
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(AbstractChild, Child))
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subclass_tuple(self):
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # test with a tuple as the second argument classes
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Child, (Child,)))
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Child, (Super,)))
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(Super, (Child,)))
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Super, (Child, Super)))
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(Child, ()))
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(Super, (Child, (Super,))))
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(NewChild, (NewChild,)))
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(NewChild, (NewSuper,)))
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(NewSuper, (NewChild,)))
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(NewSuper, (NewChild, NewSuper)))
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(False, issubclass(NewChild, ()))
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(NewSuper, (NewChild, (NewSuper,))))
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(True, issubclass(int, (long, (float, int))))
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if test_support.have_unicode:
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(True, issubclass(str, (unicode, (Child, NewChild, basestring))))
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_subclass_recursion_limit(self):
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # make sure that issubclass raises RuntimeError before the C stack is
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # blown
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, blowstack, issubclass, str, str)
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_isinstance_recursion_limit(self):
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # make sure that issubclass raises RuntimeError before the C stack is
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # blown
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, blowstack, isinstance, '', str)
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef blowstack(fxn, arg, compare_to):
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Make sure that calling isinstance with a deeply nested tuple for its
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # argument will raise RuntimeError eventually.
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tuple_arg = (compare_to,)
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for cnt in xrange(sys.getrecursionlimit()+5):
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tuple_arg = (tuple_arg,)
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fxn(arg, tuple_arg)
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.run_unittest(
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TestIsInstanceExceptions,
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TestIsSubclassExceptions,
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TestIsInstanceIsSubclass
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    )
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
278