diff --git a/tests/basics/builtin_hash.py b/tests/basics/builtin_hash.py
index 76fb18304413d4e84ce1e2b61a2417f8d62f6e6b..c9731a3b598cd4e8f9f9315c8d08f0178d899f92 100644
--- a/tests/basics/builtin_hash.py
+++ b/tests/basics/builtin_hash.py
@@ -4,6 +4,7 @@ print(hash(False))
 print(hash(True))
 print({():1}) # hash tuple
 print({1 << 66:1}) # hash big int
+print({-(1 << 66):2}) # hash negative big int
 print(hash in {hash:1}) # hash function
 
 try:
diff --git a/tests/basics/int_big_error.py b/tests/basics/int_big_error.py
index 62ab936f9614c1405d513e67c856a9ae33a4553a..b7875ee87b8f6c60c0571d7a8559fe69a0a07e72 100644
--- a/tests/basics/int_big_error.py
+++ b/tests/basics/int_big_error.py
@@ -16,3 +16,16 @@ try:
     1 in i
 except TypeError:
     print("TypeError")
+
+# overflow because rhs of >> is being converted to machine int
+try:
+    1 >> i
+except OverflowError:
+    print('OverflowError')
+
+# to test conversion of negative mpz to machine int
+# (we know << will convert to machine int, even though it fails to do the shift)
+try:
+    i << (-(i >> 40))
+except ValueError:
+    print('ValueError')
diff --git a/tests/basics/int_big_lshift.py b/tests/basics/int_big_lshift.py
index af1d97504c9df432117dd644f7ac9bb8b03a8dad..14db90bff3f1b4b53e483fea472796436dea54ee 100644
--- a/tests/basics/int_big_lshift.py
+++ b/tests/basics/int_big_lshift.py
@@ -15,3 +15,6 @@ for i in range(8):
     print(-100000000000000000000000000002 >> i)
     print(-100000000000000000000000000003 >> i)
     print(-100000000000000000000000000004 >> i)
+
+# shl by zero
+print((1<<70) << 0)
diff --git a/tests/basics/int_big_pow.py b/tests/basics/int_big_pow.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f75e3150bed8b20835c6c0a0c6046908c530b6e
--- /dev/null
+++ b/tests/basics/int_big_pow.py
@@ -0,0 +1,8 @@
+# test bignum power
+
+i = 1 << 65
+
+print(0 ** i)
+print(i ** 0)
+print(i ** 1)
+print(i ** 2)
diff --git a/tests/basics/int_big_rshift.py b/tests/basics/int_big_rshift.py
index d11f8f63eb3e54faa2447fbc3936eee6cf0442ba..6055e95b97ec8a15e54610e0502e9ef2529008e9 100644
--- a/tests/basics/int_big_rshift.py
+++ b/tests/basics/int_big_rshift.py
@@ -1,3 +1,6 @@
 i = 123456789012345678901234567890
 print(i >> 1)
 print(i >> 1000)
+
+# result needs rounding up
+print(-(1<<70) >> 80)
diff --git a/tests/basics/struct1.py b/tests/basics/struct1.py
index 686251c446785190f4503eb537d309b9c243c3a5..1a32c482c404b4448fbd922eada6984f21502a89 100644
--- a/tests/basics/struct1.py
+++ b/tests/basics/struct1.py
@@ -35,8 +35,11 @@ print(struct.pack("<I", 0xffffffff))
 
 # long long ints
 print(struct.pack("<Q", 2**64 - 1))
+print(struct.pack(">Q", 2**64 - 1))
 print(struct.pack("<Q", 0xffffffffffffffff))
+print(struct.pack(">Q", 0xffffffffffffffff))
 print(struct.pack("<q", -1))
+print(struct.pack(">q", -1))
 print(struct.pack("<Q", 1234567890123456789))
 print(struct.pack("<q", -1234567890123456789))
 print(struct.pack(">Q", 1234567890123456789))
diff --git a/tests/float/int_big_float.py b/tests/float/int_big_float.py
index 5b8aaa8782dc795002722a7f679aad8663fa3867..2c404189cbbccad328a1ecf2f69b812d0ddd4706 100644
--- a/tests/float/int_big_float.py
+++ b/tests/float/int_big_float.py
@@ -5,6 +5,9 @@ i = 1 << 65
 # convert bignum to float on rhs
 print("%.5g" % (2.0 * i))
 
+# negative bignum as float
+print("%.5g" % float(-i))
+
 # this should convert to float
 print("%.5g" % (i / 5))
 
diff --git a/tests/unix/extra_coverage.py.exp b/tests/unix/extra_coverage.py.exp
index 00ddf0daf265f4c2e15c0a8d5220bc4cdb304d30..38aa22112da4170c8ffdcf72117325384414cb3b 100644
--- a/tests/unix/extra_coverage.py.exp
+++ b/tests/unix/extra_coverage.py.exp
@@ -27,3 +27,8 @@ ementation
 (start=1, stop=2, step=3)
 # str
 1
+# mpz
+1
+12345678
+0
+0
diff --git a/unix/coverage.c b/unix/coverage.c
index 1f52d9cf82758901b59e19f14cffeca453b6b02f..d6514b9cfff380b829178a6cbeabe729c25c0910 100644
--- a/unix/coverage.c
+++ b/unix/coverage.c
@@ -3,6 +3,7 @@
 #include "py/obj.h"
 #include "py/runtime.h"
 #include "py/repl.h"
+#include "py/mpz.h"
 
 #if defined(MICROPY_UNIX_COVERAGE)
 
@@ -83,6 +84,29 @@ STATIC mp_obj_t extra_coverage(void) {
         printf("%d\n", MP_OBJ_IS_QSTR(mp_obj_str_intern(mp_obj_new_str("intern me", 9, false))));
     }
 
+    // mpz
+    {
+        printf("# mpz\n");
+
+        mp_uint_t value;
+        mpz_t mpz;
+        mpz_init_zero(&mpz);
+
+        // mpz_as_uint_checked, with success
+        mpz_set_from_int(&mpz, 12345678);
+        printf("%d\n", mpz_as_uint_checked(&mpz, &value));
+        printf("%d\n", (int)value);
+
+        // mpz_as_uint_checked, with negative arg
+        mpz_set_from_int(&mpz, -1);
+        printf("%d\n", mpz_as_uint_checked(&mpz, &value));
+
+        // mpz_as_uint_checked, with overflowing arg
+        mpz_set_from_int(&mpz, 1);
+        mpz_shl_inpl(&mpz, &mpz, 70);
+        printf("%d\n", mpz_as_uint_checked(&mpz, &value));
+    }
+
     return mp_const_none;
 }
 MP_DEFINE_CONST_FUN_OBJ_0(extra_coverage_obj, extra_coverage);