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

pull/1197/head
Damien George 2015-04-22 23:18:28 +01:00
rodzic 5e9810396f
commit 40d43ea88d
12 zmienionych plików z 131 dodań i 20 usunięć

Wyświetl plik

@ -1,4 +1,14 @@
# 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

Wyświetl plik

@ -1,2 +1,3 @@
not x False
x True
y 1

Wyświetl plik

@ -1,11 +1,54 @@
# 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")

Wyświetl plik

@ -1,2 +1,12 @@
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',)

Wyświetl plik

@ -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:

Wyświetl plik

@ -1,10 +1,14 @@
6
3
0
6
7
20
True
49994955
1 1
1 3
(0, 1, False, True)
(1, 3)
[1, 3]
[1, 3]

Wyświetl plik

@ -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))

Wyświetl plik

@ -1,3 +1,3 @@
bytearray(b'1234')
12849
12849 13363
26212

Wyświetl plik

@ -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))

Wyświetl plik

@ -1,4 +1,4 @@
bytearray(b'1234')
49
49 50
202
202

Wyświetl plik

@ -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))

Wyświetl plik

@ -1,4 +1,5 @@
bytearray(b'\x00\x00\x00\x00')
bytearray(b'*\x00\x00\x00')
bytearray(b')\x00\x00\x00')
bytearray(b')*\x00\x00')
bytearray(b'++++')
bytearray(b',,,,')