Home | History | Annotate | Download | only in test
      1 """Unit tests for __instancecheck__ and __subclasscheck__."""
      2 
      3 import unittest
      4 
      5 
      6 class 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 
     19 class Integer(metaclass=ABC):
     20     __subclass__ = {int}
     21 
     22 
     23 class SubInt(Integer):
     24     pass
     25 
     26 
     27 class 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 
     70 if __name__ == "__main__":
     71     unittest.main()
     72