summaryrefslogtreecommitdiffstatshomepage
path: root/tests/basics
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-04-13 15:27:06 +0100
committerDamien George <damien.p.george@gmail.com>2016-04-13 15:27:06 +0100
commitc33df193bfbc09dc5c3b62db6507ad1a79e92ea6 (patch)
tree8085372975f5fe96a850a75aeec2340f31256dc1 /tests/basics
parenteacbd7aeba3bdd634b56af544e40da87779f4a95 (diff)
downloadmicropython-c33df193bfbc09dc5c3b62db6507ad1a79e92ea6.tar.gz
micropython-c33df193bfbc09dc5c3b62db6507ad1a79e92ea6.zip
tests: Add 6 tests for async await/for/with.
Diffstat (limited to 'tests/basics')
-rw-r--r--tests/basics/async_await.py17
-rw-r--r--tests/basics/async_await2.py27
-rw-r--r--tests/basics/async_for.py29
-rw-r--r--tests/basics/async_for2.py48
-rw-r--r--tests/basics/async_with.py17
-rw-r--r--tests/basics/async_with2.py37
6 files changed, 175 insertions, 0 deletions
diff --git a/tests/basics/async_await.py b/tests/basics/async_await.py
new file mode 100644
index 0000000000..23b3ba9378
--- /dev/null
+++ b/tests/basics/async_await.py
@@ -0,0 +1,17 @@
+# test basic await expression
+# adapted from PEP0492
+
+async def abinary(n):
+ print(n)
+ if n <= 0:
+ return 1
+ l = await abinary(n - 1)
+ r = await abinary(n - 1)
+ return l + 1 + r
+
+o = abinary(4)
+try:
+ while True:
+ o.send(None)
+except StopIteration:
+ print('finished')
diff --git a/tests/basics/async_await2.py b/tests/basics/async_await2.py
new file mode 100644
index 0000000000..129d3751a5
--- /dev/null
+++ b/tests/basics/async_await2.py
@@ -0,0 +1,27 @@
+# test await expression
+
+import sys
+if sys.implementation.name == 'micropython':
+ # uPy allows normal generators to be awaitables
+ coroutine = lambda f: f
+else:
+ import types
+ coroutine = types.coroutine
+
+@coroutine
+def wait(value):
+ print('wait value:', value)
+ msg = yield 'message from wait(%u)' % value
+ print('wait got back:', msg)
+ return 10
+
+async def f():
+ x = await wait(1)**2
+ print('x =', x)
+
+coro = f()
+print('return from send:', coro.send(None))
+try:
+ coro.send('message from main')
+except StopIteration:
+ print('got StopIteration')
diff --git a/tests/basics/async_for.py b/tests/basics/async_for.py
new file mode 100644
index 0000000000..6b4e136d59
--- /dev/null
+++ b/tests/basics/async_for.py
@@ -0,0 +1,29 @@
+# test basic async for execution
+# example taken from PEP0492
+
+class AsyncIteratorWrapper:
+ def __init__(self, obj):
+ print('init')
+ self._it = iter(obj)
+
+ async def __aiter__(self):
+ print('aiter')
+ return self
+
+ async def __anext__(self):
+ print('anext')
+ try:
+ value = next(self._it)
+ except StopIteration:
+ raise StopAsyncIteration
+ return value
+
+async def coro():
+ async for letter in AsyncIteratorWrapper('abc'):
+ print(letter)
+
+o = coro()
+try:
+ o.send(None)
+except StopIteration:
+ print('finished')
diff --git a/tests/basics/async_for2.py b/tests/basics/async_for2.py
new file mode 100644
index 0000000000..89584fcb10
--- /dev/null
+++ b/tests/basics/async_for2.py
@@ -0,0 +1,48 @@
+# test waiting within "async for" aiter/anext functions
+
+import sys
+if sys.implementation.name == 'micropython':
+ # uPy allows normal generators to be awaitables
+ coroutine = lambda f: f
+else:
+ import types
+ coroutine = types.coroutine
+
+@coroutine
+def f(x):
+ print('f start:', x)
+ yield x + 1
+ yield x + 2
+ return x + 3
+
+class ARange:
+ def __init__(self, high):
+ print('init')
+ self.cur = 0
+ self.high = high
+
+ async def __aiter__(self):
+ print('aiter')
+ print('f returned:', await f(10))
+ return self
+
+ async def __anext__(self):
+ print('anext')
+ print('f returned:', await f(20))
+ if self.cur < self.high:
+ val = self.cur
+ self.cur += 1
+ return val
+ else:
+ raise StopAsyncIteration
+
+async def coro():
+ async for x in ARange(4):
+ print('x', x)
+
+o = coro()
+try:
+ while True:
+ print('coro yielded:', o.send(None))
+except StopIteration:
+ print('finished')
diff --git a/tests/basics/async_with.py b/tests/basics/async_with.py
new file mode 100644
index 0000000000..742f9ba993
--- /dev/null
+++ b/tests/basics/async_with.py
@@ -0,0 +1,17 @@
+# test simple async with execution
+
+class AContext:
+ async def __aenter__(self):
+ print('enter')
+ async def __aexit__(self, exc_type, exc, tb):
+ print('exit')
+
+async def f():
+ async with AContext():
+ print('body')
+
+o = f()
+try:
+ o.send(None)
+except StopIteration:
+ print('finished')
diff --git a/tests/basics/async_with2.py b/tests/basics/async_with2.py
new file mode 100644
index 0000000000..0ebec489fe
--- /dev/null
+++ b/tests/basics/async_with2.py
@@ -0,0 +1,37 @@
+# test waiting within async with enter/exit functions
+
+import sys
+if sys.implementation.name == 'micropython':
+ # uPy allows normal generators to be awaitables
+ coroutine = lambda f: f
+else:
+ import types
+ coroutine = types.coroutine
+
+@coroutine
+def f(x):
+ print('f start:', x)
+ yield x + 1
+ yield x + 2
+ return x + 3
+
+class AContext:
+ async def __aenter__(self):
+ print('enter')
+ print('f returned:', await f(10))
+ async def __aexit__(self, exc_type, exc, tb):
+ print('exit')
+ print('f returned:', await f(20))
+
+async def coro():
+ async with AContext():
+ print('body start')
+ print('body f returned:', await f(30))
+ print('body end')
+
+o = coro()
+try:
+ while True:
+ print('coro yielded:', o.send(None))
+except StopIteration:
+ print('finished')