summaryrefslogtreecommitdiffstatshomepage
path: root/tests/basics
diff options
context:
space:
mode:
Diffstat (limited to 'tests/basics')
-rw-r--r--tests/basics/array1.py7
-rw-r--r--tests/basics/array_add.py7
-rw-r--r--tests/basics/array_construct.py7
-rw-r--r--tests/basics/array_construct2.py7
-rw-r--r--tests/basics/array_construct_endian.py7
-rw-r--r--tests/basics/array_micropython.py12
-rw-r--r--tests/basics/array_micropython.py.exp2
-rw-r--r--tests/basics/array_q.py7
-rw-r--r--tests/basics/builtin_dir.py3
-rw-r--r--tests/basics/builtin_locals.py4
-rw-r--r--tests/basics/class_item.py9
-rw-r--r--tests/basics/class_misc.py9
-rw-r--r--tests/basics/dict_fromkeys.py3
-rw-r--r--tests/basics/gen_yield_from_close.py36
-rw-r--r--tests/basics/gen_yield_from_throw.py11
-rw-r--r--tests/basics/gen_yield_from_throw2.py15
-rw-r--r--tests/basics/gen_yield_from_throw2.py.exp3
-rw-r--r--tests/basics/generator1.py3
-rw-r--r--tests/basics/ifexpr.py9
-rw-r--r--tests/basics/int1.py1
-rw-r--r--tests/basics/int_big_add.py11
-rw-r--r--tests/basics/int_big_rshift.py1
-rw-r--r--tests/basics/int_big_xor.py1
-rw-r--r--tests/basics/int_bytes_notimpl.py9
-rw-r--r--tests/basics/int_bytes_notimpl.py.exp2
-rw-r--r--tests/basics/int_mpz.py9
-rw-r--r--tests/basics/iter1.py9
-rw-r--r--tests/basics/lexer.py4
-rw-r--r--tests/basics/list_slice.py16
-rw-r--r--tests/basics/logic_constfolding.py26
-rw-r--r--tests/basics/memoryview1.py7
-rw-r--r--tests/basics/set_basic.py (renamed from tests/basics/set1.py)0
-rw-r--r--tests/basics/set_pop.py9
-rw-r--r--tests/basics/set_type.py16
-rw-r--r--tests/basics/struct1.py12
-rw-r--r--tests/basics/struct2.py7
-rw-r--r--tests/basics/struct_micropython.py20
-rw-r--r--tests/basics/struct_micropython.py.exp1
-rw-r--r--tests/basics/try2.py9
-rw-r--r--tests/basics/types1.py4
40 files changed, 319 insertions, 16 deletions
diff --git a/tests/basics/array1.py b/tests/basics/array1.py
index c45b883c94..43f775b797 100644
--- a/tests/basics/array1.py
+++ b/tests/basics/array1.py
@@ -1,4 +1,9 @@
-import array
+try:
+ import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
a = array.array('B', [1, 2, 3])
print(a, len(a))
diff --git a/tests/basics/array_add.py b/tests/basics/array_add.py
index 1dba8a3bc5..41cd77b428 100644
--- a/tests/basics/array_add.py
+++ b/tests/basics/array_add.py
@@ -1,5 +1,10 @@
# test array + array
-import array
+try:
+ import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
a1 = array.array('I', [1])
a2 = array.array('I', [2])
diff --git a/tests/basics/array_construct.py b/tests/basics/array_construct.py
index 0625111c9e..cafa57784c 100644
--- a/tests/basics/array_construct.py
+++ b/tests/basics/array_construct.py
@@ -1,6 +1,11 @@
# test construction of array.array from different objects
-from array import array
+try:
+ from array import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
# tuple, list
print(array('b', (1, 2)))
diff --git a/tests/basics/array_construct2.py b/tests/basics/array_construct2.py
index 0013a0aa74..d1c1a6c70b 100644
--- a/tests/basics/array_construct2.py
+++ b/tests/basics/array_construct2.py
@@ -1,4 +1,9 @@
-from array import array
+try:
+ from array import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
# construct from something with unknown length (requires generators)
print(array('i', (i for i in range(10))))
diff --git a/tests/basics/array_construct_endian.py b/tests/basics/array_construct_endian.py
index 1ea8230532..bf34b05d15 100644
--- a/tests/basics/array_construct_endian.py
+++ b/tests/basics/array_construct_endian.py
@@ -1,6 +1,11 @@
# test construction of array.array from different objects
-from array import array
+try:
+ from array import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
# raw copy from bytes, bytearray
print(array('h', b'12'))
diff --git a/tests/basics/array_micropython.py b/tests/basics/array_micropython.py
new file mode 100644
index 0000000000..8e904bdfea
--- /dev/null
+++ b/tests/basics/array_micropython.py
@@ -0,0 +1,12 @@
+# test MicroPython-specific features of array.array
+import array
+
+# arrays of objects
+a = array.array('O')
+a.append(1)
+print(a[0])
+
+# arrays of pointers
+a = array.array('P')
+a.append(1)
+print(a[0])
diff --git a/tests/basics/array_micropython.py.exp b/tests/basics/array_micropython.py.exp
new file mode 100644
index 0000000000..6ed281c757
--- /dev/null
+++ b/tests/basics/array_micropython.py.exp
@@ -0,0 +1,2 @@
+1
+1
diff --git a/tests/basics/array_q.py b/tests/basics/array_q.py
index a52c9895c7..2975cd3851 100644
--- a/tests/basics/array_q.py
+++ b/tests/basics/array_q.py
@@ -1,6 +1,11 @@
# test array('q') and array('Q')
-from array import array
+try:
+ from array import array
+except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
print(array('q'))
print(array('Q'))
diff --git a/tests/basics/builtin_dir.py b/tests/basics/builtin_dir.py
index 70ab249603..843467e783 100644
--- a/tests/basics/builtin_dir.py
+++ b/tests/basics/builtin_dir.py
@@ -7,6 +7,9 @@ print('__name__' in dir())
import sys
print('platform' in dir(sys))
+# dir of type
+print('append' in dir(list))
+
class Foo:
def __init__(self):
self.x = 1
diff --git a/tests/basics/builtin_locals.py b/tests/basics/builtin_locals.py
new file mode 100644
index 0000000000..3689216ef6
--- /dev/null
+++ b/tests/basics/builtin_locals.py
@@ -0,0 +1,4 @@
+# test builtin locals()
+
+x = 123
+print(locals()['x'])
diff --git a/tests/basics/class_item.py b/tests/basics/class_item.py
index a96817462f..1d9488bde1 100644
--- a/tests/basics/class_item.py
+++ b/tests/basics/class_item.py
@@ -15,3 +15,12 @@ c = C()
print(c[1])
c[1] = 2
del c[3]
+
+# index not supported
+class A:
+ pass
+a = A()
+try:
+ a[1]
+except TypeError:
+ print('TypeError')
diff --git a/tests/basics/class_misc.py b/tests/basics/class_misc.py
new file mode 100644
index 0000000000..82b9b3479e
--- /dev/null
+++ b/tests/basics/class_misc.py
@@ -0,0 +1,9 @@
+# converting user instance to buffer
+class C:
+ pass
+
+c = C()
+try:
+ d = bytearray(c)
+except TypeError:
+ print('TypeError')
diff --git a/tests/basics/dict_fromkeys.py b/tests/basics/dict_fromkeys.py
index d03f6ae9d2..bfad347c89 100644
--- a/tests/basics/dict_fromkeys.py
+++ b/tests/basics/dict_fromkeys.py
@@ -8,3 +8,6 @@ l = list(d.values())
l.sort()
print(l)
+# argument to fromkeys has no __len__
+d = dict.fromkeys(reversed(range(1)))
+print(d)
diff --git a/tests/basics/gen_yield_from_close.py b/tests/basics/gen_yield_from_close.py
index 7982d5c990..d66691ff9c 100644
--- a/tests/basics/gen_yield_from_close.py
+++ b/tests/basics/gen_yield_from_close.py
@@ -85,3 +85,39 @@ try:
print(next(g))
except StopIteration:
print("StopIteration")
+
+# case where generator ignores the close request and yields instead
+def gen7():
+ try:
+ yield 123
+ except GeneratorExit:
+ yield 456
+
+g = gen7()
+print(next(g))
+try:
+ g.close()
+except RuntimeError:
+ print('RuntimeError')
+
+# case where close is propagated up to a built-in iterator
+def gen8():
+ g = reversed([2, 1])
+ yield from g
+g = gen8()
+print(next(g))
+g.close()
+
+# case with a user-defined close method
+class Iter:
+ def __iter__(self):
+ return self
+ def __next__(self):
+ return 1
+ def close(self):
+ print('close')
+def gen9():
+ yield from Iter()
+g = gen9()
+print(next(g))
+g.close()
diff --git a/tests/basics/gen_yield_from_throw.py b/tests/basics/gen_yield_from_throw.py
index 30960fb9c1..829bf0f3b4 100644
--- a/tests/basics/gen_yield_from_throw.py
+++ b/tests/basics/gen_yield_from_throw.py
@@ -17,3 +17,14 @@ try:
except TypeError:
print("got TypeError from downstream!")
+# case where generator doesn't intercept the thrown/injected exception
+def gen3():
+ yield 123
+ yield 456
+
+g3 = gen3()
+print(next(g3))
+try:
+ g3.throw(StopIteration)
+except StopIteration:
+ print('got StopIteration from downstream!')
diff --git a/tests/basics/gen_yield_from_throw2.py b/tests/basics/gen_yield_from_throw2.py
new file mode 100644
index 0000000000..2cff9e08ba
--- /dev/null
+++ b/tests/basics/gen_yield_from_throw2.py
@@ -0,0 +1,15 @@
+# uPy differs from CPython for this test
+# generator ignored GeneratorExit
+def gen():
+ try:
+ yield 123
+ except GeneratorExit:
+ print('GeneratorExit')
+ yield 456
+
+g = gen()
+print(next(g))
+try:
+ g.throw(GeneratorExit)
+except RuntimeError:
+ print('RuntimeError')
diff --git a/tests/basics/gen_yield_from_throw2.py.exp b/tests/basics/gen_yield_from_throw2.py.exp
new file mode 100644
index 0000000000..d5805b4947
--- /dev/null
+++ b/tests/basics/gen_yield_from_throw2.py.exp
@@ -0,0 +1,3 @@
+123
+GeneratorExit
+RuntimeError
diff --git a/tests/basics/generator1.py b/tests/basics/generator1.py
index d4028b0ce3..ea1d3b38bc 100644
--- a/tests/basics/generator1.py
+++ b/tests/basics/generator1.py
@@ -20,3 +20,6 @@ for val in f(3):
#print(gen.__next__())
#print(gen.__next__())
#print(gen.__next__())
+
+# test printing, but only the first chars that match CPython
+print(repr(f(0))[0:17])
diff --git a/tests/basics/ifexpr.py b/tests/basics/ifexpr.py
new file mode 100644
index 0000000000..66f94f95c1
--- /dev/null
+++ b/tests/basics/ifexpr.py
@@ -0,0 +1,9 @@
+# test if-expressions
+
+print(1 if 0 else 2)
+print(3 if 1 else 4)
+
+def f(x):
+ print('a' if x else 'b')
+f([])
+f([1])
diff --git a/tests/basics/int1.py b/tests/basics/int1.py
index aea72b7dd1..2d92105c73 100644
--- a/tests/basics/int1.py
+++ b/tests/basics/int1.py
@@ -36,6 +36,7 @@ print(int('11', 16))
print(int('11', 8))
print(int('11', 2))
print(int('11', 36))
+print(int('xyz', 36))
print(int('0o123', 0))
print(int('8388607'))
print(int('0x123', 16))
diff --git a/tests/basics/int_big_add.py b/tests/basics/int_big_add.py
new file mode 100644
index 0000000000..f0c3336d05
--- /dev/null
+++ b/tests/basics/int_big_add.py
@@ -0,0 +1,11 @@
+# tests transition from small to large int representation by addition
+
+# 31-bit overflow
+i = 0x3fffffff
+print(i + i)
+print(-i + -i)
+
+# 63-bit overflow
+i = 0x3fffffffffffffff
+print(i + i)
+print(-i + -i)
diff --git a/tests/basics/int_big_rshift.py b/tests/basics/int_big_rshift.py
index 6055e95b97..b2fecb36c9 100644
--- a/tests/basics/int_big_rshift.py
+++ b/tests/basics/int_big_rshift.py
@@ -4,3 +4,4 @@ print(i >> 1000)
# result needs rounding up
print(-(1<<70) >> 80)
+print(-0xffffffffffffffff >> 32)
diff --git a/tests/basics/int_big_xor.py b/tests/basics/int_big_xor.py
index 943d1ac15d..318db45e60 100644
--- a/tests/basics/int_big_xor.py
+++ b/tests/basics/int_big_xor.py
@@ -19,6 +19,7 @@ print((-a) ^ (1 << 100))
print((-a) ^ (1 << 200))
print((-a) ^ a == 0)
print(bool((-a) ^ a))
+print(-1 ^ 0xffffffffffffffff) # carry overflows to higher digit
# test + -
diff --git a/tests/basics/int_bytes_notimpl.py b/tests/basics/int_bytes_notimpl.py
new file mode 100644
index 0000000000..b47d6ab584
--- /dev/null
+++ b/tests/basics/int_bytes_notimpl.py
@@ -0,0 +1,9 @@
+try:
+ print((10).to_bytes(1, "big"))
+except Exception as e:
+ print(type(e))
+
+try:
+ print(int.from_bytes(b"\0", "big"))
+except Exception as e:
+ print(type(e))
diff --git a/tests/basics/int_bytes_notimpl.py.exp b/tests/basics/int_bytes_notimpl.py.exp
new file mode 100644
index 0000000000..d1bf338eb6
--- /dev/null
+++ b/tests/basics/int_bytes_notimpl.py.exp
@@ -0,0 +1,2 @@
+<class 'NotImplementedError'>
+<class 'NotImplementedError'>
diff --git a/tests/basics/int_mpz.py b/tests/basics/int_mpz.py
index 05aec95cea..425bc21b67 100644
--- a/tests/basics/int_mpz.py
+++ b/tests/basics/int_mpz.py
@@ -7,6 +7,8 @@ y = 2000000000000000000000000000000
# printing
print(x)
print(y)
+print('%#X' % (x - x)) # print prefix
+print('{:#,}'.format(x)) # print with commas
# addition
print(x + 1)
@@ -66,6 +68,13 @@ print(int("123456789012345678901234567890"))
print(int("-123456789012345678901234567890"))
print(int("123456789012345678901234567890abcdef", 16))
print(int("123456789012345678901234567890ABCDEF", 16))
+print(int("1234567890abcdefghijklmnopqrstuvwxyz", 36))
+
+# invalid characters in string
+try:
+ print(int("123456789012345678901234567890abcdef"))
+except ValueError:
+ print('ValueError');
# test constant integer with more than 255 chars
x = 0x84ce72aa8699df436059f052ac51b6398d2511e49631bcb7e71f89c499b9ee425dfbc13a5f6d408471b054f2655617cbbaf7937b7c80cd8865cf02c8487d30d2b0fbd8b2c4e102e16d828374bbc47b93852f212d5043c3ea720f086178ff798cc4f63f787b9c2e419efa033e7644ea7936f54462dc21a6c4580725f7f0e7d1aaaaaaa
diff --git a/tests/basics/iter1.py b/tests/basics/iter1.py
index 5bd7f5090b..9117dfd2b7 100644
--- a/tests/basics/iter1.py
+++ b/tests/basics/iter1.py
@@ -9,6 +9,15 @@ try:
except TypeError:
print('TypeError')
+# this class has no __next__ implementation
+class NotIterable:
+ def __iter__(self):
+ return self
+try:
+ print(all(NotIterable()))
+except TypeError:
+ print('TypeError')
+
class MyStopIteration(StopIteration):
pass
diff --git a/tests/basics/lexer.py b/tests/basics/lexer.py
index 70a9cce993..5f12afa70f 100644
--- a/tests/basics/lexer.py
+++ b/tests/basics/lexer.py
@@ -19,6 +19,10 @@ print(eval("1\r"))
print(eval("12\r"))
print(eval("123\r"))
+# backslash used to escape a line-break in a string
+print('a\
+b')
+
# lots of indentation
def a(x):
if x:
diff --git a/tests/basics/list_slice.py b/tests/basics/list_slice.py
index 3a9a1e05e6..fc08e580a1 100644
--- a/tests/basics/list_slice.py
+++ b/tests/basics/list_slice.py
@@ -1,22 +1,28 @@
-# test slices; only 2 argument version supported by Micro Python at the moment
+# test list slices, getting values
+
x = list(range(10))
a = 2
b = 4
c = 3
print(x[:])
print(x[::])
-#print(x[::c])
+print(x[::c])
print(x[:b])
print(x[:b:])
-#print(x[:b:c])
+print(x[:b:c])
print(x[a])
print(x[a:])
print(x[a::])
-#print(x[a::c])
+print(x[a::c])
print(x[a:b])
print(x[a:b:])
-#print(x[a:b:c])
+print(x[a:b:c])
# these should not raise IndexError
print([][1:])
print([][-1:])
+
+try:
+ [][::0]
+except ValueError:
+ print('ValueError')
diff --git a/tests/basics/logic_constfolding.py b/tests/basics/logic_constfolding.py
new file mode 100644
index 0000000000..14afe6111a
--- /dev/null
+++ b/tests/basics/logic_constfolding.py
@@ -0,0 +1,26 @@
+# tests logical constant folding in parser
+
+def f_true():
+ print('f_true')
+ return True
+
+def f_false():
+ print('f_false')
+ return False
+
+print(0 or False)
+print(1 or foo)
+print(f_false() or 1 or foo)
+print(f_false() or 1 or f_true())
+
+print(0 and foo)
+print(1 and True)
+print(f_true() and 0 and foo)
+print(f_true() and 1 and f_false())
+
+print(not 0)
+print(not False)
+print(not 1)
+print(not True)
+print(not not 0)
+print(not not 1)
diff --git a/tests/basics/memoryview1.py b/tests/basics/memoryview1.py
index 862a573e84..1cd411195d 100644
--- a/tests/basics/memoryview1.py
+++ b/tests/basics/memoryview1.py
@@ -28,6 +28,7 @@ print(list(m[1:-1]))
# this tests get_buffer of memoryview
m = memoryview(bytearray(2))
print(bytearray(m))
+print(list(memoryview(memoryview(b'1234')))) # read-only memoryview
import array
a = array.array('i', [1, 2, 3, 4])
@@ -78,3 +79,9 @@ 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/set1.py b/tests/basics/set_basic.py
index 6ea69e4f05..6ea69e4f05 100644
--- a/tests/basics/set1.py
+++ b/tests/basics/set_basic.py
diff --git a/tests/basics/set_pop.py b/tests/basics/set_pop.py
index 0cd478ce25..5e1196c9f0 100644
--- a/tests/basics/set_pop.py
+++ b/tests/basics/set_pop.py
@@ -7,3 +7,12 @@ except KeyError:
else:
print("Failed to raise KeyError")
+# this tests an optimisation in mp_set_remove_first
+# N must not be equal to one of the values in hash_allocation_sizes
+N = 11
+s = set(range(N))
+while s:
+ print(s.pop()) # last pop() should trigger the optimisation
+for i in range(N):
+ s.add(i) # check that we can add the numbers back to the set
+print(list(s))
diff --git a/tests/basics/set_type.py b/tests/basics/set_type.py
new file mode 100644
index 0000000000..d790fa062e
--- /dev/null
+++ b/tests/basics/set_type.py
@@ -0,0 +1,16 @@
+# set type
+
+# This doesn't really work as expected, because {None}
+# leads SyntaxError during parsing.
+try:
+ set
+except NameError:
+ import sys
+ print("SKIP")
+ sys.exit()
+
+print(set)
+
+print(type(set()) == set)
+
+print(type({None}) == set)
diff --git a/tests/basics/struct1.py b/tests/basics/struct1.py
index b53a9c8bc0..d89519a2fa 100644
--- a/tests/basics/struct1.py
+++ b/tests/basics/struct1.py
@@ -1,7 +1,13 @@
try:
import ustruct as struct
except:
- import struct
+ try:
+ import struct
+ except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
+
print(struct.calcsize("<bI"))
print(struct.unpack("<bI", b"\x80\0\0\x01\0"))
print(struct.calcsize(">bI"))
@@ -55,6 +61,10 @@ print(struct.unpack(">q", b"\xf2\x34\x56\x78\x90\x12\x34\x56"))
print(struct.unpack("<I", b"\xff\xff\xff\xff"))
print(struct.unpack("<Q", b"\xff\xff\xff\xff\xff\xff\xff\xff"))
+# check small int overflow
+print(struct.unpack("<i", b'\xff\xff\xff\x7f'))
+print(struct.unpack("<q", b'\xff\xff\xff\xff\xff\xff\xff\x7f'))
+
# network byte order
print(struct.pack('!i', 123))
diff --git a/tests/basics/struct2.py b/tests/basics/struct2.py
index f438bb55d2..6dd963260b 100644
--- a/tests/basics/struct2.py
+++ b/tests/basics/struct2.py
@@ -3,7 +3,12 @@
try:
import ustruct as struct
except:
- import struct
+ try:
+ import struct
+ except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
print(struct.calcsize('0s'))
print(struct.unpack('0s', b''))
diff --git a/tests/basics/struct_micropython.py b/tests/basics/struct_micropython.py
new file mode 100644
index 0000000000..e3b0ea5086
--- /dev/null
+++ b/tests/basics/struct_micropython.py
@@ -0,0 +1,20 @@
+# test MicroPython-specific features of struct
+
+try:
+ import ustruct as struct
+except:
+ try:
+ import struct
+ except ImportError:
+ import sys
+ print("SKIP")
+ sys.exit()
+
+class A():
+ pass
+
+# pack and unpack objects
+o = A()
+s = struct.pack("<O", o)
+o2 = struct.unpack("<O", s)
+print(o is o2[0])
diff --git a/tests/basics/struct_micropython.py.exp b/tests/basics/struct_micropython.py.exp
new file mode 100644
index 0000000000..0ca95142bb
--- /dev/null
+++ b/tests/basics/struct_micropython.py.exp
@@ -0,0 +1 @@
+True
diff --git a/tests/basics/try2.py b/tests/basics/try2.py
index 5827699e90..11e60b3c22 100644
--- a/tests/basics/try2.py
+++ b/tests/basics/try2.py
@@ -22,6 +22,15 @@ try:
except NameError:
print("except 1")
+# raised exception not contained in except tuple
+try:
+ try:
+ raise Exception
+ except (RuntimeError, SyntaxError):
+ print('except 2')
+except Exception:
+ print('except 1')
+
# Check that exceptions across function boundaries work as expected
def func1():
try:
diff --git a/tests/basics/types1.py b/tests/basics/types1.py
index 38a20d6803..e098abe8bd 100644
--- a/tests/basics/types1.py
+++ b/tests/basics/types1.py
@@ -1,24 +1,22 @@
# basic types
+# similar test for set type is done in set_type.py
print(bool)
print(int)
print(tuple)
print(list)
-print(set)
print(dict)
print(type(bool()) == bool)
print(type(int()) == int)
print(type(tuple()) == tuple)
print(type(list()) == list)
-print(type(set()) == set)
print(type(dict()) == dict)
print(type(False) == bool)
print(type(0) == int)
print(type(()) == tuple)
print(type([]) == list)
-print(type({None}) == set)
print(type({}) == dict)
try: