Home | History | Annotate | Download | only in test
      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