summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/async_await2.py28
-rw-r--r--tests/basics/async_for2.py30
-rw-r--r--tests/basics/async_with2.py32
-rw-r--r--tests/basics/struct1.py25
-rw-r--r--tests/basics/struct_micropython.py41
-rw-r--r--tests/basics/struct_micropython.py.exp2
-rw-r--r--tests/misc/non_compliant.py6
-rw-r--r--tests/misc/non_compliant.py.exp2
8 files changed, 70 insertions, 96 deletions
diff --git a/tests/basics/async_await2.py b/tests/basics/async_await2.py
index 7097ce85a..2c5015fb4 100644
--- a/tests/basics/async_await2.py
+++ b/tests/basics/async_await2.py
@@ -1,22 +1,22 @@
# test await expression
-import sys
-if sys.implementation.name in ('micropython', 'circuitpython'):
- # uPy allows normal generators to be awaitables
- coroutine = lambda f: f
-else:
- import types
- coroutine = types.coroutine
+# uPy allows normal generators to be awaitables.
+# CircuitPython does not.
+# In CircuitPython you need to have an __await__ method on an awaitable like in CPython;
+# and like in CPython, generators do not have __await__.
-@coroutine
-def wait(value):
- print('wait value:', value)
- msg = yield 'message from wait(%u)' % value
- print('wait got back:', msg)
- return 10
+class Awaitable:
+ def __init__(self, value):
+ self.value = value
+
+ def __await__(self):
+ print('wait value:', self.value)
+ msg = yield 'message from wait(%u)' % self.value
+ print('wait got back:', msg)
+ return 10
async def f():
- x = await wait(1)**2
+ x = await Awaitable(1)**2
print('x =', x)
coro = f()
diff --git a/tests/basics/async_for2.py b/tests/basics/async_for2.py
index add74dd38..d7b97cb38 100644
--- a/tests/basics/async_for2.py
+++ b/tests/basics/async_for2.py
@@ -1,19 +1,19 @@
# test waiting within "async for" __anext__ function
-import sys
-if sys.implementation.name in ('micropython', 'circuitpython'):
- # 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
+# uPy allows normal generators to be awaitables.
+# CircuitPython does not.
+# In CircuitPython you need to have an __await__ method on an awaitable like in CPython;
+# and like in CPython, generators do not have __await__.
+
+class Awaitable:
+ def __init__(self, x):
+ self.x = x
+
+ def __await__(self):
+ print('f start:', self.x)
+ yield self.x + 1
+ yield self.x + 2
+ return self.x + 3
class ARange:
def __init__(self, high):
@@ -27,7 +27,7 @@ class ARange:
async def __anext__(self):
print('anext')
- print('f returned:', await f(20))
+ print('f returned:', await Awaitable(20))
if self.cur < self.high:
val = self.cur
self.cur += 1
diff --git a/tests/basics/async_with2.py b/tests/basics/async_with2.py
index 5fb06ba60..2e9e9e5a7 100644
--- a/tests/basics/async_with2.py
+++ b/tests/basics/async_with2.py
@@ -1,32 +1,32 @@
# test waiting within async with enter/exit functions
-import sys
-if sys.implementation.name in ('micropython', 'circuitpython'):
- # uPy allows normal generators to be awaitables
- coroutine = lambda f: f
-else:
- import types
- coroutine = types.coroutine
+# uPy allows normal generators to be awaitables.
+# CircuitPython does not.
+# In CircuitPython you need to have an __await__ method on an awaitable like in CPython;
+# and like in CPython, generators do not have __await__.
-@coroutine
-def f(x):
- print('f start:', x)
- yield x + 1
- yield x + 2
- return x + 3
+class Awaitable:
+ def __init__(self, x):
+ self.x = x
+
+ def __await__(self):
+ print('f start:', self.x)
+ yield self.x + 1
+ yield self.x + 2
+ return self.x + 3
class AContext:
async def __aenter__(self):
print('enter')
- print('f returned:', await f(10))
+ print('f returned:', await Awaitable(10))
async def __aexit__(self, exc_type, exc, tb):
print('exit', exc_type, exc)
- print('f returned:', await f(20))
+ print('f returned:', await Awaitable(20))
async def coro():
async with AContext():
print('body start')
- print('body f returned:', await f(30))
+ print('body f returned:', await Awaitable(30))
print('body end')
o = coro()
diff --git a/tests/basics/struct1.py b/tests/basics/struct1.py
index db34342a1..107006cc3 100644
--- a/tests/basics/struct1.py
+++ b/tests/basics/struct1.py
@@ -39,6 +39,28 @@ print(v == (10, 100, 200, 300))
# network byte order
print(struct.pack('!i', 123))
+# too short / too long arguments
+buf = bytearray(b'>>>123<<<')
+try:
+ struct.pack_into('bb', buf, 0, 3)
+except:
+ print('struct.error')
+
+try:
+ struct.pack_into('bb', buf, 0, 3, 1, 4)
+except:
+ print('struct.error')
+
+try:
+ struct.pack('bb', 3)
+except:
+ print('struct.error')
+
+try:
+ struct.pack('bb', 3, 1, 4)
+except:
+ print('struct.error')
+
# check that we get an error if the buffer is too small
try:
struct.unpack('I', b'\x00\x00\x00')
@@ -96,3 +118,6 @@ try:
print(struct.unpack_from('<b', buf, -11))
except:
print('struct.error')
+
+# check padding bytes
+print(struct.pack("xb", 3))
diff --git a/tests/basics/struct_micropython.py b/tests/basics/struct_micropython.py
deleted file mode 100644
index e72153071..000000000
--- a/tests/basics/struct_micropython.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# test MicroPython-specific features of struct
-
-try:
- import ustruct as struct
-except:
- try:
- import struct
- except ImportError:
- print("SKIP")
- raise SystemExit
-
-try:
- struct.pack('O', None)
-except ValueError:
- print("SKIP")
- raise SystemExit
-
-class A():
- pass
-
-# pack and unpack objects
-o = A()
-s = struct.pack("<O", o)
-o2 = struct.unpack("<O", s)
-print(o is o2[0])
-
-# pack can accept less arguments than required for the format spec
-print(struct.pack('<2I', 1))
-
-# pack and unpack pointer to a string
-# This requires uctypes to get the address of the string and instead of
-# putting this in a dedicated test that can be skipped we simply pass
-# if the import fails.
-try:
- import uctypes
- o = uctypes.addressof('abc')
- s = struct.pack("<S", o)
- o2 = struct.unpack("<S", s)
- assert o2[0] == 'abc'
-except ImportError:
- pass
diff --git a/tests/basics/struct_micropython.py.exp b/tests/basics/struct_micropython.py.exp
deleted file mode 100644
index 55b7b6623..000000000
--- a/tests/basics/struct_micropython.py.exp
+++ /dev/null
@@ -1,2 +0,0 @@
-True
-b'\x01\x00\x00\x00\x00\x00\x00\x00'
diff --git a/tests/misc/non_compliant.py b/tests/misc/non_compliant.py
index 99633416a..9a746a8b0 100644
--- a/tests/misc/non_compliant.py
+++ b/tests/misc/non_compliant.py
@@ -105,12 +105,6 @@ try:
except NotImplementedError:
print('NotImplementedError')
-# struct pack with too many args, not checked by uPy
-print(struct.pack('bb', 1, 2, 3))
-
-# struct pack with too few args, not checked by uPy
-print(struct.pack('bb', 1))
-
# array slice assignment with unsupported RHS
try:
bytearray(4)[0:1] = [1, 2]
diff --git a/tests/misc/non_compliant.py.exp b/tests/misc/non_compliant.py.exp
index 3f15a1440..8518828ec 100644
--- a/tests/misc/non_compliant.py.exp
+++ b/tests/misc/non_compliant.py.exp
@@ -14,8 +14,6 @@ NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
-b'\x01\x02'
-b'\x01\x00'
NotImplementedError
AttributeError
TypeError