summaryrefslogtreecommitdiff
path: root/Lib/test/test_class.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_class.py')
-rw-r--r--Lib/test/test_class.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index ecc01f2779..a916e878b7 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -595,5 +595,54 @@ class ClassTests(unittest.TestCase):
with self.assertRaises(TypeError):
type.__setattr__(A, b'x', None)
+ def testConstructorErrorMessages(self):
+ # bpo-31506: Improves the error message logic for object_new & object_init
+
+ # Class without any method overrides
+ class C:
+ pass
+
+ with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'):
+ C(42)
+
+ with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'):
+ C.__new__(C, 42)
+
+ with self.assertRaisesRegex(TypeError, r'C\(\).__init__\(\) takes no arguments'):
+ C().__init__(42)
+
+ with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'):
+ object.__new__(C, 42)
+
+ with self.assertRaisesRegex(TypeError, r'C\(\).__init__\(\) takes no arguments'):
+ object.__init__(C(), 42)
+
+ # Class with both `__init__` & `__new__` method overriden
+ class D:
+ def __new__(cls, *args, **kwargs):
+ super().__new__(cls, *args, **kwargs)
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'):
+ D(42)
+
+ with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'):
+ D.__new__(D, 42)
+
+ with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'):
+ object.__new__(D, 42)
+
+ # Class that only overrides __init__
+ class E:
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ with self.assertRaisesRegex(TypeError, r'object.__init__\(\) takes no argument'):
+ E().__init__(42)
+
+ with self.assertRaisesRegex(TypeError, r'object.__init__\(\) takes no argument'):
+ object.__init__(E(), 42)
+
if __name__ == '__main__':
unittest.main()