Skip to content

Commit

Permalink
[3.11] Synchronize test_contextlib with test_contextlib_async (python…
Browse files Browse the repository at this point in the history
…GH-111000) (pythonGH-111115)

(cherry picked from commit ff4e53c)

Co-authored-by: Serhiy Storchaka <[email protected]>
  • Loading branch information
miss-islington and serhiy-storchaka authored Oct 20, 2023
1 parent 69bcaf7 commit 7213fc2
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions Lib/test/test_contextlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,15 @@ def whoo():
# 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():
Expand All @@ -175,6 +184,19 @@ def whoo():
# 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
Expand Down Expand Up @@ -254,6 +276,25 @@ def test_issue29692():
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):
Expand All @@ -265,6 +306,7 @@ def decorate(func):
@attribs(foo='bar')
def baz(spam):
"""Whee!"""
yield
return baz

def test_contextmanager_attribs(self):
Expand Down Expand Up @@ -321,8 +363,11 @@ def woohoo(a, *, b):

def test_recursive(self):
depth = 0
ncols = 0
@contextmanager
def woohoo():
nonlocal ncols
ncols += 1
nonlocal depth
before = depth
depth += 1
Expand All @@ -336,6 +381,7 @@ def recursive():
recursive()

recursive()
self.assertEqual(ncols, 10)
self.assertEqual(depth, 0)


Expand Down

0 comments on commit 7213fc2

Please sign in to comment.