1 """Unit tests for __instancecheck__ and __subclasscheck__.""" 2 3 import unittest 4 from test import test_support 5 6 7 class ABC(type): 8 9 def __instancecheck__(cls, inst): 10 """Implement isinstance(inst, cls).""" 11 return any(cls.__subclasscheck__(c) 12 for c in set([type(inst), inst.__class__])) 13 14 def __subclasscheck__(cls, sub): 15 """Implement issubclass(sub, cls).""" 16 candidates = cls.__dict__.get("__subclass__", set()) | set([cls]) 17 return any(c in candidates for c in sub.mro()) 18 19 20 class Integer: 21 22 __metaclass__ = ABC 23 24 __subclass__ = set([int]) 25 26 27 class SubInt(Integer): 28 29 pass 30 31 32 class TypeChecksTest(unittest.TestCase): 33 34 def testIsSubclassInternal(self): 35 self.assertEqual(Integer.__subclasscheck__(int), True) 36 self.assertEqual(Integer.__subclasscheck__(float), False) 37 38 def testIsSubclassBuiltin(self): 39 self.assertEqual(issubclass(int, Integer), True) 40 self.assertEqual(issubclass(int, (Integer,)), True) 41 self.assertEqual(issubclass(float, Integer), False) 42 self.assertEqual(issubclass(float, (Integer,)), False) 43 44 def testIsInstanceBuiltin(self): 45 self.assertEqual(isinstance(42, Integer), True) 46 self.assertEqual(isinstance(42, (Integer,)), True) 47 self.assertEqual(isinstance(3.14, Integer), False) 48 self.assertEqual(isinstance(3.14, (Integer,)), False) 49 50 def testIsInstanceActual(self): 51 self.assertEqual(isinstance(Integer(), Integer), True) 52 self.assertEqual(isinstance(Integer(), (Integer,)), True) 53 54 def testIsSubclassActual(self): 55 self.assertEqual(issubclass(Integer, Integer), True) 56 self.assertEqual(issubclass(Integer, (Integer,)), True) 57 58 def testSubclassBehavior(self): 59 self.assertEqual(issubclass(SubInt, Integer), True) 60 self.assertEqual(issubclass(SubInt, (Integer,)), True) 61 self.assertEqual(issubclass(SubInt, SubInt), True) 62 self.assertEqual(issubclass(SubInt, (SubInt,)), True) 63 self.assertEqual(issubclass(Integer, SubInt), False) 64 self.assertEqual(issubclass(Integer, (SubInt,)), False) 65 self.assertEqual(issubclass(int, SubInt), False) 66 self.assertEqual(issubclass(int, (SubInt,)), False) 67 self.assertEqual(isinstance(SubInt(), Integer), True) 68 self.assertEqual(isinstance(SubInt(), (Integer,)), True) 69 self.assertEqual(isinstance(SubInt(), SubInt), True) 70 self.assertEqual(isinstance(SubInt(), (SubInt,)), True) 71 self.assertEqual(isinstance(42, SubInt), False) 72 self.assertEqual(isinstance(42, (SubInt,)), False) 73 74 def test_oldstyle(self): 75 # These should just be ignored. 76 class X: 77 def __instancecheck__(self, inst): 78 return True 79 def __subclasscheck__(self, cls): 80 return True 81 class Sub(X): pass 82 self.assertNotIsInstance(3, X) 83 self.assertIsInstance(X(), X) 84 self.assertFalse(issubclass(int, X)) 85 self.assertTrue(issubclass(Sub, X)) 86 87 88 def test_main(): 89 test_support.run_unittest(TypeChecksTest) 90 91 92 if __name__ == "__main__": 93 unittest.main() 94