aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_exceptions.py
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-07-08 19:01:47 +0100
committerGitHub <noreply@github.com>2022-07-08 19:01:47 +0100
commit4bed0db7c222f8df1b4e31107c0305214caf3f56 (patch)
treea36e45975d1c2d9fbfdba6fa5963b32839219a98 /Lib/test/test_exceptions.py
parent9dff9f48144cf5d8bc1e6605f258973200c6b8c8 (diff)
downloadcpython-4bed0db7c222f8df1b4e31107c0305214caf3f56.tar.gz
cpython-4bed0db7c222f8df1b4e31107c0305214caf3f56.zip
Increase test coverage of Objects/exceptions.c (GH-94674)
Diffstat (limited to 'Lib/test/test_exceptions.py')
-rw-r--r--Lib/test/test_exceptions.py52
1 files changed, 47 insertions, 5 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index d91308572b2..f8b05128e3f 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -546,6 +546,29 @@ class ExceptionTests(unittest.TestCase):
'pickled "%r", attribute "%s' %
(e, checkArgName))
+ def test_setstate(self):
+ e = Exception(42)
+ e.blah = 53
+ self.assertEqual(e.args, (42,))
+ self.assertEqual(e.blah, 53)
+ self.assertRaises(AttributeError, getattr, e, 'a')
+ self.assertRaises(AttributeError, getattr, e, 'b')
+ e.__setstate__({'a': 1 , 'b': 2})
+ self.assertEqual(e.args, (42,))
+ self.assertEqual(e.blah, 53)
+ self.assertEqual(e.a, 1)
+ self.assertEqual(e.b, 2)
+ e.__setstate__({'a': 11, 'args': (1,2,3), 'blah': 35})
+ self.assertEqual(e.args, (1,2,3))
+ self.assertEqual(e.blah, 35)
+ self.assertEqual(e.a, 11)
+ self.assertEqual(e.b, 2)
+
+ def test_invalid_setstate(self):
+ e = Exception(42)
+ with self.assertRaisesRegex(TypeError, "state is not a dictionary"):
+ e.__setstate__(42)
+
def test_notes(self):
for e in [BaseException(1), Exception(2), ValueError(3)]:
with self.subTest(e=e):
@@ -602,11 +625,30 @@ class ExceptionTests(unittest.TestCase):
else:
self.fail("No exception raised")
- def testInvalidAttrs(self):
- self.assertRaises(TypeError, setattr, Exception(), '__cause__', 1)
- self.assertRaises(TypeError, delattr, Exception(), '__cause__')
- self.assertRaises(TypeError, setattr, Exception(), '__context__', 1)
- self.assertRaises(TypeError, delattr, Exception(), '__context__')
+ def test_invalid_setattr(self):
+ TE = TypeError
+ exc = Exception()
+ msg = "'int' object is not iterable"
+ self.assertRaisesRegex(TE, msg, setattr, exc, 'args', 1)
+ msg = "__traceback__ must be a traceback or None"
+ self.assertRaisesRegex(TE, msg, setattr, exc, '__traceback__', 1)
+ msg = "exception cause must be None or derive from BaseException"
+ self.assertRaisesRegex(TE, msg, setattr, exc, '__cause__', 1)
+ msg = "exception context must be None or derive from BaseException"
+ self.assertRaisesRegex(TE, msg, setattr, exc, '__context__', 1)
+
+ def test_invalid_delattr(self):
+ TE = TypeError
+ try:
+ raise IndexError(4)
+ except Exception as e:
+ exc = e
+
+ msg = "may not be deleted"
+ self.assertRaisesRegex(TE, msg, delattr, exc, 'args')
+ self.assertRaisesRegex(TE, msg, delattr, exc, '__traceback__')
+ self.assertRaisesRegex(TE, msg, delattr, exc, '__cause__')
+ self.assertRaisesRegex(TE, msg, delattr, exc, '__context__')
def testNoneClearsTracebackAttr(self):
try: