[Python-checkins] bpo-29922: Add more tests for error messages in 'async with'. (GH-6370)

Serhiy Storchaka webhook-mailer at python.org
Wed Apr 4 11:45:20 EDT 2018


https://github.com/python/cpython/commit/2eeac269dd1e04a2a179384576986c3e47895ee0
commit: 2eeac269dd1e04a2a179384576986c3e47895ee0
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018-04-04T18:45:10+03:00
summary:

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'.

files:
M Lib/test/test_coroutines.py

diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py
index 9ad7ff9564bc..10f7cca50473 100644
--- a/Lib/test/test_coroutines.py
+++ b/Lib/test/test_coroutines.py
@@ -1269,6 +1269,7 @@ class CM:
             def __aexit__(self, *e):
                 return 444
 
+        # Exit with exception
         async def foo():
             async with CM():
                 1/0
@@ -1296,19 +1297,58 @@ class CM:
             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):



More information about the Python-checkins mailing list