Browse Source

tests/ports/unix: Update and extend the modffi integer tests.

Added the "long" modffi tests. The tests could not be added to the existing
ffi_types test because two .exp files were required for the 32-bit and
64-bit results. Code common to both the ffi_types and type "long" tests was
factored into ffi_int_base. ffi_types was renamed to ffi_int_types to group
the related tests under the "ffi_int" prefix.

Signed-off-by: Michael Sawyer <mjfsawyer@gmail.com>
pull/15225/head
Michael Sawyer 2 months ago
committed by Damien George
parent
commit
230e521515
  1. 49
      tests/ports/unix/ffi_int_base.py
  2. 16
      tests/ports/unix/ffi_int_long32.py
  3. 34
      tests/ports/unix/ffi_int_long32.py.exp
  4. 16
      tests/ports/unix/ffi_int_long64.py
  5. 34
      tests/ports/unix/ffi_int_long64.py.exp
  6. 16
      tests/ports/unix/ffi_int_types.py
  7. 0
      tests/ports/unix/ffi_int_types.py.exp
  8. 8
      tests/ports/unix/ffi_lib.c
  9. 51
      tests/ports/unix/ffi_types.py

49
tests/ports/unix/ffi_int_base.py

@ -0,0 +1,49 @@
# common tests for ffi_int_types/long32/long64
# requires ffi_lib.c to be compiled as: $(CC) -shared -o ffi_lib.so ffi_lib.c
import os, sys
try:
import ffi
except ImportError:
print("SKIP")
raise SystemExit
ffi_lib_filename = sys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so"
try:
os.stat(ffi_lib_filename)
except OSError:
print("SKIP")
raise SystemExit
ffi_lib = ffi.open(ffi_lib_filename)
def test(funcs):
for type, name in funcs:
func = ffi_lib.func(type, name, type)
for val in (
0,
0x7F,
0x80,
0xFF,
0x100,
0x7FFF,
0x8000,
0xFFFF,
0x10000,
0x7FFFFFFF,
0x80000000,
0xFFFFFFFF,
0x100000000,
0x7FFF_FFFF_FFFF_FFFF,
0x8000_0000_0000_0000,
0xFFFF_FFFF_FFFF_FFFF,
0x1_0000_0000_0000_0000,
):
print("{}({:x}) = {:x}".format(name, val, func(val)))
if __name__ == "__main__":
print("SKIP")
raise SystemExit

16
tests/ports/unix/ffi_int_long32.py

@ -0,0 +1,16 @@
# test 32-bit long arguments and return types for ffi functions
import struct
import ffi_int_base
if struct.calcsize("l") != 4:
print("SKIP")
raise SystemExit
ffi_int_base.test(
[
("l", "fli"),
("L", "flu"),
]
)

34
tests/ports/unix/ffi_int_long32.py.exp

@ -0,0 +1,34 @@
fli(0) = 1
fli(7f) = 7e
fli(80) = 81
fli(ff) = fe
fli(100) = 101
fli(7fff) = 7ffe
fli(8000) = 8001
fli(ffff) = fffe
fli(10000) = 10001
fli(7fffffff) = 7ffffffe
fli(80000000) = -7fffffff
fli(ffffffff) = -2
fli(100000000) = 1
fli(7fffffffffffffff) = -2
fli(8000000000000000) = 1
fli(ffffffffffffffff) = -2
fli(10000000000000000) = 1
flu(0) = 1
flu(7f) = 7e
flu(80) = 81
flu(ff) = fe
flu(100) = 101
flu(7fff) = 7ffe
flu(8000) = 8001
flu(ffff) = fffe
flu(10000) = 10001
flu(7fffffff) = 7ffffffe
flu(80000000) = 80000001
flu(ffffffff) = fffffffe
flu(100000000) = 1
flu(7fffffffffffffff) = fffffffe
flu(8000000000000000) = 1
flu(ffffffffffffffff) = fffffffe
flu(10000000000000000) = 1

16
tests/ports/unix/ffi_int_long64.py

@ -0,0 +1,16 @@
# test 64-bit long arguments and return types for ffi functions
import struct
import ffi_int_base
if struct.calcsize("l") != 8:
print("SKIP")
raise SystemExit
ffi_int_base.test(
[
("l", "fli"),
("L", "flu"),
]
)

34
tests/ports/unix/ffi_int_long64.py.exp

@ -0,0 +1,34 @@
fli(0) = 1
fli(7f) = 7e
fli(80) = 81
fli(ff) = fe
fli(100) = 101
fli(7fff) = 7ffe
fli(8000) = 8001
fli(ffff) = fffe
fli(10000) = 10001
fli(7fffffff) = 7ffffffe
fli(80000000) = 80000001
fli(ffffffff) = fffffffe
fli(100000000) = 100000001
fli(7fffffffffffffff) = 7ffffffffffffffe
fli(8000000000000000) = -7fffffffffffffff
fli(ffffffffffffffff) = -2
fli(10000000000000000) = 1
flu(0) = 1
flu(7f) = 7e
flu(80) = 81
flu(ff) = fe
flu(100) = 101
flu(7fff) = 7ffe
flu(8000) = 8001
flu(ffff) = fffe
flu(10000) = 10001
flu(7fffffff) = 7ffffffe
flu(80000000) = 80000001
flu(ffffffff) = fffffffe
flu(100000000) = 100000001
flu(7fffffffffffffff) = 7ffffffffffffffe
flu(8000000000000000) = 8000000000000001
flu(ffffffffffffffff) = fffffffffffffffe
flu(10000000000000000) = 1

16
tests/ports/unix/ffi_int_types.py

@ -0,0 +1,16 @@
# test 8/16/32/64 bit signed/unsigned integer arguments and return types for ffi functions
import ffi_int_base
ffi_int_base.test(
[
("b", "f8i"),
("B", "f8u"),
("h", "f16i"),
("H", "f16u"),
("i", "f32i"),
("I", "f32u"),
("q", "f64i"),
("Q", "f64u"),
]
)

0
tests/ports/unix/ffi_types.py.exp → tests/ports/unix/ffi_int_types.py.exp

8
tests/ports/unix/ffi_lib.c

@ -31,3 +31,11 @@ int64_t f64i(int64_t x) {
uint64_t f64u(uint64_t x) { uint64_t f64u(uint64_t x) {
return x ^ 1; return x ^ 1;
} }
long fli(long x) {
return x ^ 1;
}
unsigned long flu(unsigned long x) {
return x ^ 1;
}

51
tests/ports/unix/ffi_types.py

@ -1,51 +0,0 @@
# test 8/16/32/64 bit signed/unsigned integer arguments and return types for ffi functions
# requires ffi_lib.c to be compiled as: $(CC) -shared -o ffi_lib.so ffi_lib.c
import os, sys
try:
import ffi
except ImportError:
print("SKIP")
raise SystemExit
ffi_lib_filename = "./" + sys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so"
try:
os.stat(ffi_lib_filename)
except OSError:
print("SKIP")
raise SystemExit
ffi_lib = ffi.open(ffi_lib_filename)
f8i = ffi_lib.func("b", "f8i", "b")
f8u = ffi_lib.func("B", "f8u", "B")
f16i = ffi_lib.func("h", "f16i", "h")
f16u = ffi_lib.func("H", "f16u", "H")
f32i = ffi_lib.func("i", "f32i", "i")
f32u = ffi_lib.func("I", "f32u", "I")
f64i = ffi_lib.func("q", "f64i", "q")
f64u = ffi_lib.func("Q", "f64u", "Q")
for func_name in ("f8i", "f8u", "f16i", "f16u", "f32i", "f32u", "f64i", "f64u"):
func = globals()[func_name]
for val in (
0,
0x7F,
0x80,
0xFF,
0x100,
0x7FFF,
0x8000,
0xFFFF,
0x10000,
0x7FFFFFFF,
0x80000000,
0xFFFFFFFF,
0x100000000,
0x7FFF_FFFF_FFFF_FFFF,
0x8000_0000_0000_0000,
0xFFFF_FFFF_FFFF_FFFF,
0x1_0000_0000_0000_0000,
):
print("{}({:x}) = {:x}".format(func_name, val, func(val)))
Loading…
Cancel
Save