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