Skip to content
Snippets Groups Projects
Commit 40d43ea8 authored by Damien George's avatar Damien George
Browse files

tests: Add more tests for viper, including tests for ViperTypeError's.

parent 5e981039
No related branches found
No related tags found
No related merge requests found
# using a bool as a conditional
# using False as a conditional
@micropython.viper
def f():
x = False
if x:
pass
else:
print("not x", x)
f()
# using True as a conditional
@micropython.viper
def f():
x = True
......
not x False
x True
y 1
# test syntax errors specific to viper code generation
# test syntax and type errors specific to viper code generation
def test_syntax(code):
def test(code):
try:
exec(code)
except SyntaxError:
print("SyntaxError")
except (SyntaxError, ViperTypeError) as e:
print(repr(e))
# viper: annotations must be identifiers
test_syntax("@micropython.viper\ndef f(a:1): pass")
test_syntax("@micropython.viper\ndef f() -> 1: pass")
test("@micropython.viper\ndef f(a:1): pass")
test("@micropython.viper\ndef f() -> 1: pass")
# local used before type known
test("""
@micropython.viper
def f():
print(x)
x = 1
""")
# type mismatch storing to local
test("""
@micropython.viper
def f():
x = 1
y = []
x = y
""")
# can't implicitly convert type to bool
test("""
@micropython.viper
def f():
x = ptr(0)
if x:
pass
""")
# incorrect return type
test("@micropython.viper\ndef f() -> int: return []")
# can't do binary op between incompatible types
test("@micropython.viper\ndef f(): 1 + []")
# can't load
test("@micropython.viper\ndef f(): 1[0]")
test("@micropython.viper\ndef f(): 1[x]")
# can't store
test("@micropython.viper\ndef f(): 1[0] = 1")
test("@micropython.viper\ndef f(): 1[x] = 1")
# must raise an object
test("@micropython.viper\ndef f(): raise 1")
SyntaxError
SyntaxError
SyntaxError('parameter annotation must be an identifier',)
SyntaxError('return annotation must be an identifier',)
ViperTypeError("local 'x' used before type known",)
ViperTypeError("local 'x' has type 'int' but source is 'object'",)
ViperTypeError("can't implicitly convert 'ptr' to 'bool'",)
ViperTypeError("return expected 'int' but got 'object'",)
ViperTypeError("can't do binary op between 'int' and 'object'",)
ViperTypeError("can't load from 'int'",)
ViperTypeError("can't load from 'int'",)
ViperTypeError("can't store to 'int'",)
ViperTypeError("can't store to 'int'",)
ViperTypeError('must raise an object',)
......@@ -12,6 +12,25 @@ def viper_object(x:object, y:object) -> object:
return x + y
print(viper_object(1, 2))
# return None as non-object (should return 0)
@micropython.viper
def viper_ret_none() -> int:
return None
print(viper_ret_none())
# 3 args
@micropython.viper
def viper_3args(a:int, b:int, c:int) -> int:
return a + b + c
print(viper_3args(1, 2, 3))
# 4 args
@micropython.viper
def viper_4args(a:int, b:int, c:int, d:int) -> int:
return a + b + c + d
# viper call with 4 args not yet supported
#print(viper_4args(1, 2, 3, 4))
# a local (should have automatic type int)
@micropython.viper
def viper_local(x:int) -> int:
......@@ -25,6 +44,13 @@ def viper_no_annotation(x, y):
return x * y
print(viper_no_annotation(4, 5))
# unsigned ints
@micropython.viper
def viper_uint() -> uint:
return uint(-1)
import sys
print(viper_uint() == (sys.maxsize << 1 | 1))
# a for loop
@micropython.viper
def viper_for(a:int, b:int) -> int:
......@@ -48,6 +74,12 @@ def viper_print(x, y:int):
print(x, y + 1)
viper_print(1, 2)
# convert constants to objects in tuple
@micropython.viper
def viper_tuple_consts(x):
return (x, 1, False, True)
print(viper_tuple_consts(0))
# making a tuple from an object and an int
@micropython.viper
def viper_tuple(x, y:int):
......@@ -75,11 +107,6 @@ try:
except OSError as e:
print(repr(e))
# this doesn't work at the moment
#@micropython.viper
#def g() -> uint:
# return -1
# calling GC after defining the function
@micropython.viper
def viper_gc() -> int:
......
6
3
0
6
7
20
True
49994955
1 1
1 3
(0, 1, False, True)
(1, 3)
[1, 3]
[1, 3]
......
......@@ -5,6 +5,10 @@
def get(src:ptr16) -> int:
return src[0]
@micropython.viper
def get1(src:ptr16) -> int:
return src[1]
@micropython.viper
def memadd(src:ptr16, n:int) -> int:
sum = 0
......@@ -14,5 +18,5 @@ def memadd(src:ptr16, n:int) -> int:
b = bytearray(b'1234')
print(b)
print(get(b))
print(get(b), get1(b))
print(memadd(b, 2))
bytearray(b'1234')
12849
12849 13363
26212
......@@ -4,6 +4,10 @@
def get(src:ptr8) -> int:
return src[0]
@micropython.viper
def get1(src:ptr8) -> int:
return src[1]
@micropython.viper
def memadd(src:ptr8, n:int) -> int:
sum = 0
......@@ -22,6 +26,6 @@ def memadd2(src_in) -> int:
b = bytearray(b'1234')
print(b)
print(get(b))
print(get(b), get1(b))
print(memadd(b, 4))
print(memadd2(b))
bytearray(b'1234')
49
49 50
202
202
......@@ -4,6 +4,10 @@
def set(dest:ptr8, val:int):
dest[0] = val
@micropython.viper
def set1(dest:ptr8, val:int):
dest[1] = val
@micropython.viper
def memset(dest:ptr8, val:int, n:int):
for i in range(n):
......@@ -19,7 +23,10 @@ def memset2(dest_in, val:int):
b = bytearray(4)
print(b)
set(b, 42)
set(b, 41)
print(b)
set1(b, 42)
print(b)
memset(b, 43, len(b))
......
bytearray(b'\x00\x00\x00\x00')
bytearray(b'*\x00\x00\x00')
bytearray(b')\x00\x00\x00')
bytearray(b')*\x00\x00')
bytearray(b'++++')
bytearray(b',,,,')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment