From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Wed, 4 Apr 2018 16:28:46 +0000 (-0700) Subject: bpo-29922: Add more tests for error messages in 'async with'. (GH-6370) X-Git-Tag: v3.7.0b4~78 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=785f36c876721c12f653371e9893527a25140624;p=python bpo-29922: Add more tests for error messages in 'async with'. (GH-6370) Different paths are executed for normal exit and for leaving the 'async with' block with 'break', 'continue' or 'return'. (cherry picked from commit 2eeac269dd1e04a2a179384576986c3e47895ee0) Co-authored-by: Serhiy Storchaka --- diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 429de489ad..ea54bca0df 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1269,6 +1269,7 @@ class CoroutineTest(unittest.TestCase): def __aexit__(self, *e): return 444 + # Exit with exception async def foo(): async with CM(): 1/0 @@ -1296,19 +1297,58 @@ class CoroutineTest(unittest.TestCase): def __aexit__(self, *e): return 456 + # Normal exit async def foo(): nonlocal CNT async with CM(): CNT += 1 + with self.assertRaisesRegex( + TypeError, + "'async with' received an object from __aexit__ " + "that does not implement __await__: int"): + run_async(foo()) + self.assertEqual(CNT, 1) + # Exit with 'break' + async def foo(): + nonlocal CNT + for i in range(2): + async with CM(): + CNT += 1 + break + with self.assertRaisesRegex( + TypeError, + "'async with' received an object from __aexit__ " + "that does not implement __await__: int"): + run_async(foo()) + self.assertEqual(CNT, 2) + # Exit with 'continue' + async def foo(): + nonlocal CNT + for i in range(2): + async with CM(): + CNT += 1 + continue with self.assertRaisesRegex( TypeError, "'async with' received an object from __aexit__ " "that does not implement __await__: int"): run_async(foo()) + self.assertEqual(CNT, 3) - self.assertEqual(CNT, 1) + # Exit with 'return' + async def foo(): + nonlocal CNT + async with CM(): + CNT += 1 + return + with self.assertRaisesRegex( + TypeError, + "'async with' received an object from __aexit__ " + "that does not implement __await__: int"): + run_async(foo()) + self.assertEqual(CNT, 4) def test_with_9(self):