diff --git a/tests/basics/assign1.py b/tests/basics/assign1.py
new file mode 100644
index 0000000000000000000000000000000000000000..118747f74a0e5695a43005afbb4ffb792b1cdc9e
--- /dev/null
+++ b/tests/basics/assign1.py
@@ -0,0 +1,11 @@
+# test assignments
+
+a = 1
+print(a)
+
+a = b = 2
+print(a, b)
+
+a = b = c = 3
+print(a, b, c)
+
diff --git a/tests/basics/decorator.py b/tests/basics/decorator.py
new file mode 100644
index 0000000000000000000000000000000000000000..deb341d709d036909a88a9888f98b55529d109f9
--- /dev/null
+++ b/tests/basics/decorator.py
@@ -0,0 +1,24 @@
+# test decorators
+
+def dec(f):
+    print('dec')
+    return f
+
+def dec_arg(x):
+    print(x)
+    return lambda f:f
+
+# plain decorator
+@dec
+def f():
+    pass
+
+# decorator with arg
+@dec_arg('dec_arg')
+def g():
+    pass
+
+# decorator of class
+@dec
+class A:
+    pass
diff --git a/tests/basics/del_global.py b/tests/basics/del_global.py
index 24ecec8e84753394eb7981eb9909f128228ea65b..77d11cb3c4fad11dca7cdb0cf764864b1f796d94 100644
--- a/tests/basics/del_global.py
+++ b/tests/basics/del_global.py
@@ -16,3 +16,41 @@ try:
 except: # NameError:
     # FIXME uPy returns KeyError for this
     print("NameError")
+
+# delete globals using a list
+
+a = 1
+del (a,)
+try:
+    print(a)
+except NameError:
+    print("NameError")
+
+a = 2
+b = 3
+del (a, b)
+try:
+    print(a)
+except NameError:
+    print("NameError")
+try:
+    print(b)
+except NameError:
+    print("NameError")
+
+a = 1
+b = 2
+c = 3
+del (a, b, c)
+try:
+    print(a)
+except NameError:
+    print("NameError")
+try:
+    print(b)
+except NameError:
+    print("NameError")
+try:
+    print(c)
+except NameError:
+    print("NameError")
diff --git a/tests/basics/del_subscr.py b/tests/basics/del_subscr.py
index 67910c6234b29bcbdd2d88e9cdf401f913513f5e..0e66cf173a29d4c83e124c43cd79649a002fc5c5 100644
--- a/tests/basics/del_subscr.py
+++ b/tests/basics/del_subscr.py
@@ -11,3 +11,8 @@ del d[3]
 print(d)
 del d[5]
 print(d)
+
+# delete nested subscr
+d = {0:{0:0}}
+del d[0][0]
+print(d)
diff --git a/tests/basics/ifcond.py b/tests/basics/ifcond.py
index 911440efa2a3e9aed2b5365b0797a427e9318fe9..9264aa74dd5e4c8ef1271be1a6637b1c984101b0 100644
--- a/tests/basics/ifcond.py
+++ b/tests/basics/ifcond.py
@@ -33,6 +33,30 @@ elif 0:
 else:
     print(17)
 
+if not False:
+    print('a')
+
+if not True:
+    print('a')
+else:
+    print('b')
+
+if False:
+    print('a')
+else:
+    print('b')
+
+if True:
+    print('a')
+
+if (1,):
+    print('a')
+
+if not (1,):
+    print('a')
+else:
+    print('b')
+
 f2 = 0
 
 def f(t1, t2, f1):
diff --git a/tests/basics/int_small.py b/tests/basics/int_small.py
index 496e830d2623c5c916842a8cdf513c9dc45bd63c..4d4710437048917b55766e289caeb4da8f189cdd 100644
--- a/tests/basics/int_small.py
+++ b/tests/basics/int_small.py
@@ -24,6 +24,17 @@ print(-1073741823)
 
 # Operations tests
 
+# compile-time constexprs
+print(1 + 3)
+print(3 - 2)
+print(2 * 3)
+print(1 & 3)
+print(1 | 2)
+print(1 ^ 3)
+print(+3)
+print(-3)
+print(~3)
+
 a = 0x3fffff
 print(a)
 a *= 0x10
diff --git a/tests/basics/return1.py b/tests/basics/return1.py
new file mode 100644
index 0000000000000000000000000000000000000000..7209d87ce8f2dd0735ad1a515344b3e7da2a746f
--- /dev/null
+++ b/tests/basics/return1.py
@@ -0,0 +1,13 @@
+# test return statement
+
+def f():
+    return
+print(f())
+
+def g():
+    return 1
+print(g())
+
+def f(x):
+    return 1 if x else 2
+print(f(0), f(1))
diff --git a/tests/basics/seq_unpack.py b/tests/basics/seq_unpack.py
index af8b998d056e111e820a011d6f892b3149053c88..084ddb9f13c0ba78187538f2ef1ec660e5b5c58a 100644
--- a/tests/basics/seq_unpack.py
+++ b/tests/basics/seq_unpack.py
@@ -14,6 +14,13 @@ print(a, b)
 [a, b] = 100, 200
 print(a, b)
 
+# optimised 3-way swap
+a = 1
+b = 2
+c = 3
+a, b, c = b, c, a
+print(a, b, c)
+
 try:
     a, b, c = (1, 2)
 except ValueError:
diff --git a/tests/basics/string_join.py b/tests/basics/string_join.py
index 49bbfc5ca00cd995ad7b640b99410e98d7759ed2..b8694c01e05a7bf069128138886fa4e85f6fbb93 100644
--- a/tests/basics/string_join.py
+++ b/tests/basics/string_join.py
@@ -22,3 +22,6 @@ try:
     print(','.join([b'abc', b'123']))
 except TypeError:
     print("TypeError")
+
+# joined by the compiler
+print("a" "b")
diff --git a/tests/basics/unpack1.py b/tests/basics/unpack1.py
index b2b2ddb7e48de1d9efa849d45612c97d3be6bf2f..10e01dea06b429257e5a2d466d45214860b183ff 100644
--- a/tests/basics/unpack1.py
+++ b/tests/basics/unpack1.py
@@ -2,8 +2,23 @@
 
 a, = 1,     ; print(a)
 a, b = 2, 3 ; print(a, b)
+a, b, c = 1, 2, 3; print(a, b, c)
 
+a, = range(1); print(a)
 a, b = range(2); print(a, b)
+a, b, c = range(3); print(a, b, c)
+
+(a) = range(1); print(a)
+(a,) = range(1); print(a)
+(a, b) = range(2); print(a, b)
+(a, b, c) = range(3); print(a, b, c)
+
+# lists
+
+[] = []
+[a] = range(1); print(a)
+[a, b] = range(2); print(a, b)
+[a, b, c] = range(3); print(a, b, c)
 
 # with star
 
@@ -27,6 +42,9 @@ a = [28, 29]
 *b, = a
 print(a, b, a == b)
 
+[*a] = [1, 2, 3]
+print(a)
+
 try:
     a, *b, c = (30,)
 except ValueError:
diff --git a/tests/basics/while_cond.py b/tests/basics/while_cond.py
index 449c5b66ea5f4ac1bf31a4b14933194cca1eb4e9..eccc7a638bf8ae92bfd4e20a1a3a9222ca9ac872 100644
--- a/tests/basics/while_cond.py
+++ b/tests/basics/while_cond.py
@@ -16,3 +16,21 @@ while 2:
 while -1:
     print(4)
     break
+
+while False:
+    print('a')
+else:
+    print('b')
+
+while True:
+    print('a')
+    break
+
+while not False:
+    print('a')
+    break
+
+while not True:
+    print('a')
+else:
+    print('b')
diff --git a/tests/float/float1.py b/tests/float/float1.py
index 5971e6d0a7f384ed8aa50d623c2e7b1104d173be..7b5887ff0be70588714e563168a90448facb0386 100644
--- a/tests/float/float1.py
+++ b/tests/float/float1.py
@@ -2,6 +2,11 @@
 x = 1 / 2
 print(x)
 
+# /= operator
+a = 1
+a /= 2
+print(a)
+
 print(1.0 // 2)
 print(2.0 // 2)
 
diff --git a/tests/micropython/decorator.py b/tests/micropython/decorator.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf688968a0a23428b4846faec5b2032fec06af38
--- /dev/null
+++ b/tests/micropython/decorator.py
@@ -0,0 +1,7 @@
+# test micropython-specific decorators
+
+@micropython.bytecode
+def f():
+    return 'bytecode'
+
+print(f())
diff --git a/tests/micropython/decorator.py.exp b/tests/micropython/decorator.py.exp
new file mode 100644
index 0000000000000000000000000000000000000000..b37707e7c1d97b8754e291d9cfe59b0c4adbc721
--- /dev/null
+++ b/tests/micropython/decorator.py.exp
@@ -0,0 +1 @@
+bytecode