diff --git a/tests/micropython/viper_cond.py b/tests/micropython/viper_cond.py
index 258a3781269d9b8c57e2964cb9374052576de5a3..a168afce959c86a585af04d747866fef1e72c21d 100644
--- a/tests/micropython/viper_cond.py
+++ b/tests/micropython/viper_cond.py
@@ -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
diff --git a/tests/micropython/viper_cond.py.exp b/tests/micropython/viper_cond.py.exp
index 244817f1f10b30e0e3ca9a213ad7a9059fc5fbd9..dff71039349c80414e674ba2742dc7afc9d5b8ed 100644
--- a/tests/micropython/viper_cond.py.exp
+++ b/tests/micropython/viper_cond.py.exp
@@ -1,2 +1,3 @@
+not x False
 x True
 y 1
diff --git a/tests/micropython/viper_error.py b/tests/micropython/viper_error.py
index 514acebd783ee989037f368a51bd60c0312fc7a3..0762f5079790a9864df70e013dec6897be30162f 100644
--- a/tests/micropython/viper_error.py
+++ b/tests/micropython/viper_error.py
@@ -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")
diff --git a/tests/micropython/viper_error.py.exp b/tests/micropython/viper_error.py.exp
index 5275689b413831a08912dbbb262f52a6a736531e..ad1ba34c60477cb1f67c3af95c60e29fa474464a 100644
--- a/tests/micropython/viper_error.py.exp
+++ b/tests/micropython/viper_error.py.exp
@@ -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',)
diff --git a/tests/micropython/viper_misc.py b/tests/micropython/viper_misc.py
index 25dd47355356de7a5f7e221df3dad515e8bec9f9..e8b96b9c1424e6f8f65a28088c9bfd5c0009ada0 100644
--- a/tests/micropython/viper_misc.py
+++ b/tests/micropython/viper_misc.py
@@ -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:
diff --git a/tests/micropython/viper_misc.py.exp b/tests/micropython/viper_misc.py.exp
index a65bd2c52ca4ddbc943b295932ec4dbda24e027c..7859d39e53dcd284f49d4f92969bada566dd5e9f 100644
--- a/tests/micropython/viper_misc.py.exp
+++ b/tests/micropython/viper_misc.py.exp
@@ -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]
diff --git a/tests/micropython/viper_ptr16_load.py b/tests/micropython/viper_ptr16_load.py
index 06ce7db159dbbc9c460a8f86810217d6cb8ecf77..81a413c4061c2218da62ab3b107666c05c5dbb0c 100644
--- a/tests/micropython/viper_ptr16_load.py
+++ b/tests/micropython/viper_ptr16_load.py
@@ -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))
diff --git a/tests/micropython/viper_ptr16_load.py.exp b/tests/micropython/viper_ptr16_load.py.exp
index 68fd9e80cafbf6423ea06c0215135a1853a9b9d6..caf4754893a3ba552d7265a74dc231cd0c189bbe 100644
--- a/tests/micropython/viper_ptr16_load.py.exp
+++ b/tests/micropython/viper_ptr16_load.py.exp
@@ -1,3 +1,3 @@
 bytearray(b'1234')
-12849
+12849 13363
 26212
diff --git a/tests/micropython/viper_ptr8_load.py b/tests/micropython/viper_ptr8_load.py
index 98c163f8e5256d7600332c0d7b835331ca04a2e2..0ccf8a1d76ff468be5a4bb3d8f14f9246740e9d4 100644
--- a/tests/micropython/viper_ptr8_load.py
+++ b/tests/micropython/viper_ptr8_load.py
@@ -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))
diff --git a/tests/micropython/viper_ptr8_load.py.exp b/tests/micropython/viper_ptr8_load.py.exp
index aeab88da1140104898d80635d9c9b0997c7477b0..d899bbee741bf288ec263384027a129209e22895 100644
--- a/tests/micropython/viper_ptr8_load.py.exp
+++ b/tests/micropython/viper_ptr8_load.py.exp
@@ -1,4 +1,4 @@
 bytearray(b'1234')
-49
+49 50
 202
 202
diff --git a/tests/micropython/viper_ptr8_store.py b/tests/micropython/viper_ptr8_store.py
index fc24290c99d96c1e79119302f6e0f4bf3e5675ba..5a8622eb103ad7649b2bdcfc8ca2704063eb0cb8 100644
--- a/tests/micropython/viper_ptr8_store.py
+++ b/tests/micropython/viper_ptr8_store.py
@@ -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))
diff --git a/tests/micropython/viper_ptr8_store.py.exp b/tests/micropython/viper_ptr8_store.py.exp
index 30ca5b10ea5124db0642c139ffe71e945b1e1449..b2fbe426ce401f4776e8dd6a2b78bb0e48b5389c 100644
--- a/tests/micropython/viper_ptr8_store.py.exp
+++ b/tests/micropython/viper_ptr8_store.py.exp
@@ -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',,,,')