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