summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-20 14:07:14 (GMT)
committerGitHub <noreply@github.com>2023-10-20 14:07:14 (GMT)
commitff4e53cb747063e95eaec181fd396f062f885ac2 (patch)
treee9a48d24d0f1535f13485eb45e1b03b164cda680 /Lib
parent11312eae6ec3acf51aacafce4cb6d1a5edfd5f2e (diff)
downloadcpython-ff4e53cb747063e95eaec181fd396f062f885ac2.zip
cpython-ff4e53cb747063e95eaec181fd396f062f885ac2.tar.gz
cpython-ff4e53cb747063e95eaec181fd396f062f885ac2.tar.bz2
Synchronize test_contextlib with test_contextlib_async (GH-111000)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_contextlib.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
index 5d94ec7..3dad256 100644
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -173,6 +173,15 @@ class ContextManagerTestCase(unittest.TestCase):
# The "gen" attribute is an implementation detail.
self.assertFalse(ctx.gen.gi_suspended)
+ def test_contextmanager_trap_no_yield(self):
+ @contextmanager
+ def whoo():
+ if False:
+ yield
+ ctx = whoo()
+ with self.assertRaises(RuntimeError):
+ ctx.__enter__()
+
def test_contextmanager_trap_second_yield(self):
@contextmanager
def whoo():
@@ -186,6 +195,19 @@ class ContextManagerTestCase(unittest.TestCase):
# The "gen" attribute is an implementation detail.
self.assertFalse(ctx.gen.gi_suspended)
+ def test_contextmanager_non_normalised(self):
+ @contextmanager
+ def whoo():
+ try:
+ yield
+ except RuntimeError:
+ raise SyntaxError
+
+ ctx = whoo()
+ ctx.__enter__()
+ with self.assertRaises(SyntaxError):
+ ctx.__exit__(RuntimeError, None, None)
+
def test_contextmanager_except(self):
state = []
@contextmanager
@@ -265,6 +287,25 @@ def woohoo():
self.assertEqual(ex.args[0], 'issue29692:Unchained')
self.assertIsNone(ex.__cause__)
+ def test_contextmanager_wrap_runtimeerror(self):
+ @contextmanager
+ def woohoo():
+ try:
+ yield
+ except Exception as exc:
+ raise RuntimeError(f'caught {exc}') from exc
+
+ with self.assertRaises(RuntimeError):
+ with woohoo():
+ 1 / 0
+
+ # If the context manager wrapped StopIteration in a RuntimeError,
+ # we also unwrap it, because we can't tell whether the wrapping was
+ # done by the generator machinery or by the generator itself.
+ with self.assertRaises(StopIteration):
+ with woohoo():
+ raise StopIteration
+
def _create_contextmanager_attribs(self):
def attribs(**kw):
def decorate(func):
@@ -276,6 +317,7 @@ def woohoo():
@attribs(foo='bar')
def baz(spam):
"""Whee!"""
+ yield
return baz
def test_contextmanager_attribs(self):
@@ -332,8 +374,11 @@ def woohoo():
def test_recursive(self):
depth = 0
+ ncols = 0
@contextmanager
def woohoo():
+ nonlocal ncols
+ ncols += 1
nonlocal depth
before = depth
depth += 1
@@ -347,6 +392,7 @@ def woohoo():
recursive()
recursive()
+ self.assertEqual(ncols, 10)
self.assertEqual(depth, 0)