Commit a81539db authored by Damien George's avatar Damien George
Browse files

tests: Add further tests for mpz code.

parent 2f4e8511
...@@ -4,6 +4,7 @@ print(hash(False)) ...@@ -4,6 +4,7 @@ print(hash(False))
print(hash(True)) print(hash(True))
print({():1}) # hash tuple print({():1}) # hash tuple
print({1 << 66:1}) # hash big int print({1 << 66:1}) # hash big int
print({-(1 << 66):2}) # hash negative big int
print(hash in {hash:1}) # hash function print(hash in {hash:1}) # hash function
try: try:
......
...@@ -16,3 +16,16 @@ try: ...@@ -16,3 +16,16 @@ try:
1 in i 1 in i
except TypeError: except TypeError:
print("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')
...@@ -15,3 +15,6 @@ for i in range(8): ...@@ -15,3 +15,6 @@ for i in range(8):
print(-100000000000000000000000000002 >> i) print(-100000000000000000000000000002 >> i)
print(-100000000000000000000000000003 >> i) print(-100000000000000000000000000003 >> i)
print(-100000000000000000000000000004 >> i) print(-100000000000000000000000000004 >> i)
# shl by zero
print((1<<70) << 0)
# test bignum power
i = 1 << 65
print(0 ** i)
print(i ** 0)
print(i ** 1)
print(i ** 2)
i = 123456789012345678901234567890 i = 123456789012345678901234567890
print(i >> 1) print(i >> 1)
print(i >> 1000) print(i >> 1000)
# result needs rounding up
print(-(1<<70) >> 80)
...@@ -35,8 +35,11 @@ print(struct.pack("<I", 0xffffffff)) ...@@ -35,8 +35,11 @@ print(struct.pack("<I", 0xffffffff))
# long long ints # long long ints
print(struct.pack("<Q", 2**64 - 1)) 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", 0xffffffffffffffff))
print(struct.pack("<q", -1)) 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)) print(struct.pack("<q", -1234567890123456789))
print(struct.pack(">Q", 1234567890123456789)) print(struct.pack(">Q", 1234567890123456789))
......
...@@ -5,6 +5,9 @@ i = 1 << 65 ...@@ -5,6 +5,9 @@ i = 1 << 65
# convert bignum to float on rhs # convert bignum to float on rhs
print("%.5g" % (2.0 * i)) print("%.5g" % (2.0 * i))
# negative bignum as float
print("%.5g" % float(-i))
# this should convert to float # this should convert to float
print("%.5g" % (i / 5)) print("%.5g" % (i / 5))
......
...@@ -27,3 +27,8 @@ ementation ...@@ -27,3 +27,8 @@ ementation
(start=1, stop=2, step=3) (start=1, stop=2, step=3)
# str # str
1 1
# mpz
1
12345678
0
0
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "py/obj.h" #include "py/obj.h"
#include "py/runtime.h" #include "py/runtime.h"
#include "py/repl.h" #include "py/repl.h"
#include "py/mpz.h"
#if defined(MICROPY_UNIX_COVERAGE) #if defined(MICROPY_UNIX_COVERAGE)
...@@ -83,6 +84,29 @@ STATIC mp_obj_t extra_coverage(void) { ...@@ -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)))); 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; return mp_const_none;
} }
MP_DEFINE_CONST_FUN_OBJ_0(extra_coverage_obj, extra_coverage); MP_DEFINE_CONST_FUN_OBJ_0(extra_coverage_obj, extra_coverage);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment