1 """Unit tests for __instancecheck__ and __subclasscheck__."""
2
3 import unittest
4
5
6 class ESC[4;38;5;81mABC(ESC[4;38;5;149mtype):
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 ESC[4;38;5;81mInteger(metaclass=ESC[4;38;5;149mABC):
20 __subclass__ = {int}
21
22
23 class ESC[4;38;5;81mSubInt(ESC[4;38;5;149mInteger):
24 pass
25
26
27 class ESC[4;38;5;81mTypeChecksTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
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()