diff options
Diffstat (limited to 'tests/basics')
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: |