+++ /dev/null
-"""Unit tests for __instancecheck__ and __subclasscheck__."""\r
-\r
-import unittest\r
-from test import test_support\r
-\r
-\r
-class ABC(type):\r
-\r
- def __instancecheck__(cls, inst):\r
- """Implement isinstance(inst, cls)."""\r
- return any(cls.__subclasscheck__(c)\r
- for c in set([type(inst), inst.__class__]))\r
-\r
- def __subclasscheck__(cls, sub):\r
- """Implement issubclass(sub, cls)."""\r
- candidates = cls.__dict__.get("__subclass__", set()) | set([cls])\r
- return any(c in candidates for c in sub.mro())\r
-\r
-\r
-class Integer:\r
-\r
- __metaclass__ = ABC\r
-\r
- __subclass__ = set([int])\r
-\r
-\r
-class SubInt(Integer):\r
-\r
- pass\r
-\r
-\r
-class TypeChecksTest(unittest.TestCase):\r
-\r
- def testIsSubclassInternal(self):\r
- self.assertEqual(Integer.__subclasscheck__(int), True)\r
- self.assertEqual(Integer.__subclasscheck__(float), False)\r
-\r
- def testIsSubclassBuiltin(self):\r
- self.assertEqual(issubclass(int, Integer), True)\r
- self.assertEqual(issubclass(int, (Integer,)), True)\r
- self.assertEqual(issubclass(float, Integer), False)\r
- self.assertEqual(issubclass(float, (Integer,)), False)\r
-\r
- def testIsInstanceBuiltin(self):\r
- self.assertEqual(isinstance(42, Integer), True)\r
- self.assertEqual(isinstance(42, (Integer,)), True)\r
- self.assertEqual(isinstance(3.14, Integer), False)\r
- self.assertEqual(isinstance(3.14, (Integer,)), False)\r
-\r
- def testIsInstanceActual(self):\r
- self.assertEqual(isinstance(Integer(), Integer), True)\r
- self.assertEqual(isinstance(Integer(), (Integer,)), True)\r
-\r
- def testIsSubclassActual(self):\r
- self.assertEqual(issubclass(Integer, Integer), True)\r
- self.assertEqual(issubclass(Integer, (Integer,)), True)\r
-\r
- def testSubclassBehavior(self):\r
- self.assertEqual(issubclass(SubInt, Integer), True)\r
- self.assertEqual(issubclass(SubInt, (Integer,)), True)\r
- self.assertEqual(issubclass(SubInt, SubInt), True)\r
- self.assertEqual(issubclass(SubInt, (SubInt,)), True)\r
- self.assertEqual(issubclass(Integer, SubInt), False)\r
- self.assertEqual(issubclass(Integer, (SubInt,)), False)\r
- self.assertEqual(issubclass(int, SubInt), False)\r
- self.assertEqual(issubclass(int, (SubInt,)), False)\r
- self.assertEqual(isinstance(SubInt(), Integer), True)\r
- self.assertEqual(isinstance(SubInt(), (Integer,)), True)\r
- self.assertEqual(isinstance(SubInt(), SubInt), True)\r
- self.assertEqual(isinstance(SubInt(), (SubInt,)), True)\r
- self.assertEqual(isinstance(42, SubInt), False)\r
- self.assertEqual(isinstance(42, (SubInt,)), False)\r
-\r
- def test_oldstyle(self):\r
- # These should just be ignored.\r
- class X:\r
- def __instancecheck__(self, inst):\r
- return True\r
- def __subclasscheck__(self, cls):\r
- return True\r
- class Sub(X): pass\r
- self.assertNotIsInstance(3, X)\r
- self.assertIsInstance(X(), X)\r
- self.assertFalse(issubclass(int, X))\r
- self.assertTrue(issubclass(Sub, X))\r
-\r
-\r
-def test_main():\r
- test_support.run_unittest(TypeChecksTest)\r
-\r
-\r
-if __name__ == "__main__":\r
- unittest.main()\r