From 785f36c876721c12f653371e9893527a25140624 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 4 Apr 2018 09:28:46 -0700 Subject: [PATCH] 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 --- Lib/test/test_coroutines.py | 46 ++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 429de489ad1..ea54bca0df0 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,20 +1297,59 @@ 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) + + # 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): CNT = 0