1"""Unit tests for __instancecheck__ and __subclasscheck__.""" 2 3import unittest 4 5 6class ABC(type): 7 8 def __instancecheck__(cls, inst): 9 """Implement isinstance(inst, cls).""" 10 return any(cls.__subclasscheck__(c) 11 for c in {type(inst), inst.__class__}) 12 13 def __subclasscheck__(cls, sub): 14 """Implement issubclass(sub, cls).""" 15 candidates = cls.__dict__.get("__subclass__", set()) | {cls} 16 return any(c in candidates for c in sub.mro()) 17 18 19class Integer(metaclass=ABC): 20 __subclass__ = {int} 21 22 23class SubInt(Integer): 24 pass 25 26 27class TypeChecksTest(unittest.TestCase): 28 29 def testIsSubclassInternal(self): 30 self.assertEqual(Integer.__subclasscheck__(int), True) 31 self.assertEqual(Integer.__subclasscheck__(float), False) 32 33 def testIsSubclassBuiltin(self): 34 self.assertEqual(issubclass(int, Integer), True) 35 self.assertEqual(issubclass(int, (Integer,)), True) 36 self.assertEqual(issubclass(float, Integer), False) 37 self.assertEqual(issubclass(float, (Integer,)), False) 38 39 def testIsInstanceBuiltin(self): 40 self.assertEqual(isinstance(42, Integer), True) 41 self.assertEqual(isinstance(42, (Integer,)), True) 42 self.assertEqual(isinstance(3.14, Integer), False) 43 self.assertEqual(isinstance(3.14, (Integer,)), False) 44 45 def testIsInstanceActual(self): 46 self.assertEqual(isinstance(Integer(), Integer), True) 47 self.assertEqual(isinstance(Integer(), (Integer,)), True) 48 49 def testIsSubclassActual(self): 50 self.assertEqual(issubclass(Integer, Integer), True) 51 self.assertEqual(issubclass(Integer, (Integer,)), True) 52 53 def testSubclassBehavior(self): 54 self.assertEqual(issubclass(SubInt, Integer), True) 55 self.assertEqual(issubclass(SubInt, (Integer,)), True) 56 self.assertEqual(issubclass(SubInt, SubInt), True) 57 self.assertEqual(issubclass(SubInt, (SubInt,)), True) 58 self.assertEqual(issubclass(Integer, SubInt), False) 59 self.assertEqual(issubclass(Integer, (SubInt,)), False) 60 self.assertEqual(issubclass(int, SubInt), False) 61 self.assertEqual(issubclass(int, (SubInt,)), False) 62 self.assertEqual(isinstance(SubInt(), Integer), True) 63 self.assertEqual(isinstance(SubInt(), (Integer,)), True) 64 self.assertEqual(isinstance(SubInt(), SubInt), True) 65 self.assertEqual(isinstance(SubInt(), (SubInt,)), True) 66 self.assertEqual(isinstance(42, SubInt), False) 67 self.assertEqual(isinstance(42, (SubInt,)), False) 68 69 70if __name__ == "__main__": 71 unittest.main() 72