summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/array_intbig.py2
-rw-r--r--tests/basics/builtin_reversed.py8
-rw-r--r--tests/basics/bytearray_intbig.py11
-rw-r--r--tests/basics/class_store_class.py3
-rw-r--r--tests/basics/dict_fromkeys2.py7
-rw-r--r--tests/basics/dict_fromkeys_reversed.py7
-rw-r--r--tests/basics/int_big_zeroone.py11
-rw-r--r--tests/basics/int_bytes.py3
-rw-r--r--tests/basics/int_bytes_intbig.py3
-rw-r--r--tests/basics/int_longint_bytes.py15
-rw-r--r--tests/basics/memoryview1.py48
-rw-r--r--tests/basics/memoryview1_slice_assign.py58
-rw-r--r--tests/basics/namedtuple1.py5
-rw-r--r--tests/basics/namedtuple1_cpython_compat.py20
-rw-r--r--tests/basics/print.py1
-rw-r--r--tests/basics/self_type_check.py2
-rw-r--r--tests/circuitpython/blinky.py2
-rwxr-xr-xtests/run-tests32
-rw-r--r--tests/skip_if.py80
19 files changed, 242 insertions, 76 deletions
diff --git a/tests/basics/array_intbig.py b/tests/basics/array_intbig.py
index 5702a8ae6..ef3b56793 100644
--- a/tests/basics/array_intbig.py
+++ b/tests/basics/array_intbig.py
@@ -1,4 +1,6 @@
# test array types QqLl that require big-ints
+import skip_if
+skip_if.no_bigint()
try:
from array import array
diff --git a/tests/basics/builtin_reversed.py b/tests/basics/builtin_reversed.py
index f43505a8b..6f07beaad 100644
--- a/tests/basics/builtin_reversed.py
+++ b/tests/basics/builtin_reversed.py
@@ -1,9 +1,5 @@
-# test the builtin reverse() function
-try:
- reversed
-except:
- print("SKIP")
- raise SystemExit
+import skip_if
+skip_if.no_reversed()
# list
print(list(reversed([])))
diff --git a/tests/basics/bytearray_intbig.py b/tests/basics/bytearray_intbig.py
index 334eabe12..77bcf2225 100644
--- a/tests/basics/bytearray_intbig.py
+++ b/tests/basics/bytearray_intbig.py
@@ -1 +1,12 @@
+# Skip if long ints are not supported.
+try:
+ # We have to use variables because 1 << 40 causes an exception on parse and
+ # cannot be caught.
+ x = 40
+ x = 1 << x
+except OverflowError:
+ print("SKIP")
+ import sys
+ sys.exit(1)
+
print(bytearray(2**65 - (2**65 - 1)))
diff --git a/tests/basics/class_store_class.py b/tests/basics/class_store_class.py
index 797f88f85..8f3e542d1 100644
--- a/tests/basics/class_store_class.py
+++ b/tests/basics/class_store_class.py
@@ -11,6 +11,9 @@ except ImportError:
print("SKIP")
raise SystemExit
+import skip_if
+skip_if.no_cpython_compat()
+
_DefragResultBase = namedtuple('DefragResult', [ 'foo', 'bar' ])
class _ResultMixinStr(object):
diff --git a/tests/basics/dict_fromkeys2.py b/tests/basics/dict_fromkeys2.py
index dce1e8ef5..a5371bc53 100644
--- a/tests/basics/dict_fromkeys2.py
+++ b/tests/basics/dict_fromkeys2.py
@@ -1,8 +1,5 @@
-try:
- reversed
-except:
- print("SKIP")
- raise SystemExit
+import skip_if
+skip_if.no_reversed()
# argument to fromkeys has no __len__
d = dict.fromkeys(reversed(range(1)))
diff --git a/tests/basics/dict_fromkeys_reversed.py b/tests/basics/dict_fromkeys_reversed.py
new file mode 100644
index 000000000..34b0ed129
--- /dev/null
+++ b/tests/basics/dict_fromkeys_reversed.py
@@ -0,0 +1,7 @@
+# Skip this test if reversed() isn't built in.
+import skip_if
+skip_if.no_reversed()
+
+# argument to fromkeys has no __len__
+d = dict.fromkeys(reversed(range(1)))
+print(d)
diff --git a/tests/basics/int_big_zeroone.py b/tests/basics/int_big_zeroone.py
index 7e0b7a720..131d96c76 100644
--- a/tests/basics/int_big_zeroone.py
+++ b/tests/basics/int_big_zeroone.py
@@ -1,5 +1,16 @@
# test [0,-0,1,-1] edge cases of bignum
+# Skip if long ints are not supported.
+try:
+ # We have to use variables because 1 << 40 causes an exception on parse and
+ # cannot be caught.
+ x = 40
+ x = 1 << x
+except OverflowError:
+ print("SKIP")
+ import sys
+ sys.exit(1)
+
long_zero = (2**64) >> 65
long_neg_zero = -long_zero
long_one = long_zero + 1
diff --git a/tests/basics/int_bytes.py b/tests/basics/int_bytes.py
index 93c00bba1..a96a4e65f 100644
--- a/tests/basics/int_bytes.py
+++ b/tests/basics/int_bytes.py
@@ -1,9 +1,6 @@
print((10).to_bytes(1, "little"))
print((111111).to_bytes(4, "little"))
print((100).to_bytes(10, "little"))
-print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
-print(int.from_bytes(b"\x01\0\0\0\0\0\0\0", "little"))
-print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
# check that extra zero bytes don't change the internal int value
print(int.from_bytes(bytes(20), "little") == 0)
diff --git a/tests/basics/int_bytes_intbig.py b/tests/basics/int_bytes_intbig.py
index 0e0ad1cbb..7c8a7f4af 100644
--- a/tests/basics/int_bytes_intbig.py
+++ b/tests/basics/int_bytes_intbig.py
@@ -1,3 +1,6 @@
+import skip_if
+skip_if.no_bigint()
+
print((2**64).to_bytes(9, "little"))
b = bytes(range(20))
diff --git a/tests/basics/int_longint_bytes.py b/tests/basics/int_longint_bytes.py
new file mode 100644
index 000000000..31510d75a
--- /dev/null
+++ b/tests/basics/int_longint_bytes.py
@@ -0,0 +1,15 @@
+# Skip if long ints are not supported.
+try:
+ # We have to use variables because 1 << 40 causes an exception on parse and
+ # cannot be caught.
+ x = 40
+ x = 1 << x
+except OverflowError:
+ print("SKIP")
+ import sys
+ sys.exit(1)
+
+print((2**64).to_bytes(9, "little"))
+print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
+print(int.from_bytes(b"\x01\0\0\0\0\0\0\0", "little"))
+print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
diff --git a/tests/basics/memoryview1.py b/tests/basics/memoryview1.py
index c4cc6ffab..3e5c86768 100644
--- a/tests/basics/memoryview1.py
+++ b/tests/basics/memoryview1.py
@@ -46,51 +46,3 @@ print(list(m))
print(list(m[1:-1]))
m[2] = 6
print(a)
-
-# test slice assignment between memoryviews
-b1 = bytearray(b'1234')
-b2 = bytearray(b'5678')
-b3 = bytearray(b'5678')
-m1 = memoryview(b1)
-m2 = memoryview(b2)
-m3 = memoryview(b3)
-m2[1:3] = m1[0:2]
-print(b2)
-b3[1:3] = m1[0:2]
-print(b3)
-m1[2:4] = b3[1:3]
-print(b1)
-
-try:
- m2[1:3] = b1[0:4]
-except ValueError:
- print("ValueError")
-
-try:
- m2[1:3] = m1[0:4]
-except ValueError:
- print("ValueError")
-
-try:
- m2[0:4] = m1[1:3]
-except ValueError:
- print("ValueError")
-
-# test memoryview of arrays with items sized larger than 1
-a1 = array.array('i', [0]*5)
-m4 = memoryview(a1)
-a2 = array.array('i', [3]*5)
-m5 = memoryview(a2)
-m4[1:3] = m5[1:3]
-print(a1)
-
-try:
- m4[1:3] = m2[1:3]
-except ValueError:
- print("ValueError")
-
-# invalid assignment on RHS
-try:
- memoryview(array.array('i'))[0:2] = b'1234'
-except ValueError:
- print('ValueError')
diff --git a/tests/basics/memoryview1_slice_assign.py b/tests/basics/memoryview1_slice_assign.py
new file mode 100644
index 000000000..f272fd392
--- /dev/null
+++ b/tests/basics/memoryview1_slice_assign.py
@@ -0,0 +1,58 @@
+import skip_if
+
+try:
+ memoryview
+except:
+ skip_if.skip()
+
+skip_if.no_slice_assign()
+
+# test slice assignment between memoryviews
+b1 = bytearray(b'1234')
+b2 = bytearray(b'5678')
+b3 = bytearray(b'5678')
+m1 = memoryview(b1)
+m2 = memoryview(b2)
+m3 = memoryview(b3)
+m2[1:3] = m1[0:2]
+print(b2)
+b3[1:3] = m1[0:2]
+print(b3)
+m1[2:4] = b3[1:3]
+print(b1)
+
+try:
+ m2[1:3] = b1[0:4]
+except ValueError:
+ print("ValueError")
+
+try:
+ m2[1:3] = m1[0:4]
+except ValueError:
+ print("ValueError")
+
+try:
+ m2[0:4] = m1[1:3]
+except ValueError:
+ print("ValueError")
+
+import array
+
+# test memoryview of arrays with items sized larger than 1
+a1 = array.array('i', [0]*5)
+m4 = memoryview(a1)
+a2 = array.array('i', [3]*5)
+m5 = memoryview(a2)
+m4[1:3] = m5[1:3]
+print(a1)
+
+try:
+ m4[1:3] = m2[1:3]
+except ValueError:
+ print("ValueError")
+
+# invalid assignment on RHS
+try:
+ memoryview(array.array('i'))[0:2] = b'1234'
+except ValueError:
+ print('ValueError')
diff --git a/tests/basics/namedtuple1.py b/tests/basics/namedtuple1.py
index b9a007240..56c29ddda 100644
--- a/tests/basics/namedtuple1.py
+++ b/tests/basics/namedtuple1.py
@@ -65,11 +65,6 @@ try:
except TypeError:
print("TypeError")
-# Try single string
-T3 = namedtuple("TupComma", "foo bar")
-t = T3(1, 2)
-print(t.foo, t.bar)
-
# Try tuple
T4 = namedtuple("TupTuple", ("foo", "bar"))
t = T4(1, 2)
diff --git a/tests/basics/namedtuple1_cpython_compat.py b/tests/basics/namedtuple1_cpython_compat.py
new file mode 100644
index 000000000..a1b852d90
--- /dev/null
+++ b/tests/basics/namedtuple1_cpython_compat.py
@@ -0,0 +1,20 @@
+import skip_if
+skip_if.no_cpython_compat()
+
+try:
+ try:
+ from collections import namedtuple
+ except ImportError:
+ from ucollections import namedtuple
+except ImportError:
+ skip_if.skip()
+
+# Try single string
+T3 = namedtuple("TupComma", "foo bar")
+t = T3(1, 2)
+print(t.foo, t.bar)
+
+# Try single string with comma field separator
+# Not implemented so far
+#T2 = namedtuple("TupComma", "foo,bar")
+#t = T2(1, 2)
diff --git a/tests/basics/print.py b/tests/basics/print.py
index 880aaf44f..8b53e32c9 100644
--- a/tests/basics/print.py
+++ b/tests/basics/print.py
@@ -1,5 +1,6 @@
# test builtin print function
+print("break the test")
print()
print(None)
print('')
diff --git a/tests/basics/self_type_check.py b/tests/basics/self_type_check.py
index 947e362cd..206678e25 100644
--- a/tests/basics/self_type_check.py
+++ b/tests/basics/self_type_check.py
@@ -1,4 +1,6 @@
# make sure type of first arg (self) to a builtin method is checked
+import skip_if
+skip_if.board_in("gemma_m0", "trinket_m0")
list.append
diff --git a/tests/circuitpython/blinky.py b/tests/circuitpython/blinky.py
new file mode 100644
index 000000000..a9412b07c
--- /dev/null
+++ b/tests/circuitpython/blinky.py
@@ -0,0 +1,2 @@
+import digitalio
+import board
diff --git a/tests/run-tests b/tests/run-tests
index f24fc0961..a45477dea 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -123,9 +123,13 @@ def run_micropython(pyb, args, test_file, is_special=False):
cmdlist.append(test_file)
# run the actual test
- try:
- output_mupy = subprocess.check_output(cmdlist)
- except subprocess.CalledProcessError:
+ e = {"MICROPYPATH": os.getcwd() + ":", "LANG": "en_US.UTF-8"}
+ p = subprocess.Popen(cmdlist, env=e, stdout=subprocess.PIPE)
+ output_mupy = b''
+ while p.poll() is None:
+ output_mupy += p.stdout.read()
+ output_mupy += p.stdout.read()
+ if p.returncode != 0:
output_mupy = b'CRASH'
# clean up if we had an intermediate .mpy file
@@ -368,13 +372,19 @@ def run_tests(pyb, tests, args, base_path="."):
output_expected = f.read()
else:
# run CPython to work out expected output
- try:
- output_expected = subprocess.check_output([CPYTHON3, '-B', test_file])
- if args.write_exp:
- with open(test_file_expected, 'wb') as f:
- f.write(output_expected)
- except subprocess.CalledProcessError:
+ e = {"PYTHONPATH": os.getcwd(),
+ "PATH": os.environ["PATH"],
+ "LANG": "en_US.UTF-8"}
+ p = subprocess.Popen([CPYTHON3, '-B', test_file], env=e, stdout=subprocess.PIPE)
+ output_expected = b''
+ while p.poll() is None:
+ output_expected += p.stdout.read()
+ output_expected += p.stdout.read()
+ if p.returncode != 0:
output_expected = b'CPYTHON3 CRASH'
+ elif args.write_exp:
+ with open(test_file_expected, 'wb') as f:
+ f.write(output_expected)
# canonical form for all host platforms is to use \n for end-of-line
output_expected = output_expected.replace(b'\r\n', b'\n')
@@ -405,6 +415,10 @@ def run_tests(pyb, tests, args, base_path="."):
f.write(output_expected)
with open(filename_mupy, "wb") as f:
f.write(output_mupy)
+ print("### Expected")
+ print(output_expected)
+ print("### Actual")
+ print(output_mupy)
print("FAIL ", test_file)
failed_tests.append(test_name)
diff --git a/tests/skip_if.py b/tests/skip_if.py
new file mode 100644
index 000000000..f6d22b4c1
--- /dev/null
+++ b/tests/skip_if.py
@@ -0,0 +1,80 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# This must be on one line so its skipped when built into tests.
+"""This file provides helpers to detect particular running conditions and skip the test when appropriate."""
+
+def skip():
+ print("SKIP")
+ raise SystemExit
+
+def no_reversed():
+ import builtins
+ if "reversed" not in dir(builtins):
+ skip()
+
+def no_bigint():
+ try:
+ # We have to use variables because 1 << 40 causes an exception on parse and
+ # cannot be caught.
+ x = 40
+ x = 1 << x
+ except OverflowError:
+ skip()
+
+def board_in(*board):
+ try:
+ import test_env
+ except ImportError:
+ class Env:
+ def __init__(self, board):
+ self.board = board
+ test_env = Env("unknown")
+ if test_env.board in board:
+ skip()
+
+def no_cpython_compat():
+ try:
+ try:
+ from collections import namedtuple
+ except ImportError:
+ from ucollections import namedtuple
+ except ImportError:
+ skip()
+ try:
+ T3 = namedtuple("TupComma", "foo bar")
+ except TypeError:
+ skip()
+
+def no_slice_assign():
+ try:
+ memoryview
+ except:
+ skip()
+ b1 = bytearray(b'1234')
+ b2 = bytearray(b'5678')
+ m1 = memoryview(b1)
+ m2 = memoryview(b2)
+ try:
+ m2[1:3] = m1[0:2]
+ except TypeError:
+ skip()