summaryrefslogtreecommitdiff
path: root/tests/unix
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-06-05 22:28:05 +1000
committerDamien George <damien@micropython.org>2021-06-06 22:52:25 +1000
commit20a8f4f7ec2f691e2381a150ac6e246df9c58077 (patch)
treef0c4da468b0ad8158c18df8837e079f05be20085 /tests/unix
parent784208543448e8022b185a82015e107f04960738 (diff)
tests/unix: Add ffi test for integer types.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'tests/unix')
-rw-r--r--tests/unix/ffi_lib.c33
-rw-r--r--tests/unix/ffi_types.py51
-rw-r--r--tests/unix/ffi_types.py.exp136
3 files changed, 220 insertions, 0 deletions
diff --git a/tests/unix/ffi_lib.c b/tests/unix/ffi_lib.c
new file mode 100644
index 000000000..35340536a
--- /dev/null
+++ b/tests/unix/ffi_lib.c
@@ -0,0 +1,33 @@
+#include <stdint.h>
+
+int8_t f8i(int8_t x) {
+ return x ^ 1;
+}
+
+uint8_t f8u(uint8_t x) {
+ return x ^ 1;
+}
+
+int16_t f16i(int16_t x) {
+ return x ^ 1;
+}
+
+uint16_t f16u(uint16_t x) {
+ return x ^ 1;
+}
+
+int32_t f32i(int32_t x) {
+ return x ^ 1;
+}
+
+uint32_t f32u(uint32_t x) {
+ return x ^ 1;
+}
+
+int64_t f64i(int64_t x) {
+ return x ^ 1;
+}
+
+uint64_t f64u(uint64_t x) {
+ return x ^ 1;
+}
diff --git a/tests/unix/ffi_types.py b/tests/unix/ffi_types.py
new file mode 100644
index 000000000..fd94c509d
--- /dev/null
+++ b/tests/unix/ffi_types.py
@@ -0,0 +1,51 @@
+# 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 uos, usys
+
+try:
+ import ffi
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+ffi_lib_filename = "./" + usys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so"
+try:
+ uos.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)))
diff --git a/tests/unix/ffi_types.py.exp b/tests/unix/ffi_types.py.exp
new file mode 100644
index 000000000..d6324477d
--- /dev/null
+++ b/tests/unix/ffi_types.py.exp
@@ -0,0 +1,136 @@
+f8i(0) = 1
+f8i(7f) = 7e
+f8i(80) = -7f
+f8i(ff) = -2
+f8i(100) = 1
+f8i(7fff) = -2
+f8i(8000) = 1
+f8i(ffff) = -2
+f8i(10000) = 1
+f8i(7fffffff) = -2
+f8i(80000000) = 1
+f8i(ffffffff) = -2
+f8i(100000000) = 1
+f8i(7fffffffffffffff) = -2
+f8i(8000000000000000) = 1
+f8i(ffffffffffffffff) = -2
+f8i(10000000000000000) = 1
+f8u(0) = 1
+f8u(7f) = 7e
+f8u(80) = 81
+f8u(ff) = fe
+f8u(100) = 1
+f8u(7fff) = fe
+f8u(8000) = 1
+f8u(ffff) = fe
+f8u(10000) = 1
+f8u(7fffffff) = fe
+f8u(80000000) = 1
+f8u(ffffffff) = fe
+f8u(100000000) = 1
+f8u(7fffffffffffffff) = fe
+f8u(8000000000000000) = 1
+f8u(ffffffffffffffff) = fe
+f8u(10000000000000000) = 1
+f16i(0) = 1
+f16i(7f) = 7e
+f16i(80) = 81
+f16i(ff) = fe
+f16i(100) = 101
+f16i(7fff) = 7ffe
+f16i(8000) = -7fff
+f16i(ffff) = -2
+f16i(10000) = 1
+f16i(7fffffff) = -2
+f16i(80000000) = 1
+f16i(ffffffff) = -2
+f16i(100000000) = 1
+f16i(7fffffffffffffff) = -2
+f16i(8000000000000000) = 1
+f16i(ffffffffffffffff) = -2
+f16i(10000000000000000) = 1
+f16u(0) = 1
+f16u(7f) = 7e
+f16u(80) = 81
+f16u(ff) = fe
+f16u(100) = 101
+f16u(7fff) = 7ffe
+f16u(8000) = 8001
+f16u(ffff) = fffe
+f16u(10000) = 1
+f16u(7fffffff) = fffe
+f16u(80000000) = 1
+f16u(ffffffff) = fffe
+f16u(100000000) = 1
+f16u(7fffffffffffffff) = fffe
+f16u(8000000000000000) = 1
+f16u(ffffffffffffffff) = fffe
+f16u(10000000000000000) = 1
+f32i(0) = 1
+f32i(7f) = 7e
+f32i(80) = 81
+f32i(ff) = fe
+f32i(100) = 101
+f32i(7fff) = 7ffe
+f32i(8000) = 8001
+f32i(ffff) = fffe
+f32i(10000) = 10001
+f32i(7fffffff) = 7ffffffe
+f32i(80000000) = -7fffffff
+f32i(ffffffff) = -2
+f32i(100000000) = 1
+f32i(7fffffffffffffff) = -2
+f32i(8000000000000000) = 1
+f32i(ffffffffffffffff) = -2
+f32i(10000000000000000) = 1
+f32u(0) = 1
+f32u(7f) = 7e
+f32u(80) = 81
+f32u(ff) = fe
+f32u(100) = 101
+f32u(7fff) = 7ffe
+f32u(8000) = 8001
+f32u(ffff) = fffe
+f32u(10000) = 10001
+f32u(7fffffff) = 7ffffffe
+f32u(80000000) = 80000001
+f32u(ffffffff) = fffffffe
+f32u(100000000) = 1
+f32u(7fffffffffffffff) = fffffffe
+f32u(8000000000000000) = 1
+f32u(ffffffffffffffff) = fffffffe
+f32u(10000000000000000) = 1
+f64i(0) = 1
+f64i(7f) = 7e
+f64i(80) = 81
+f64i(ff) = fe
+f64i(100) = 101
+f64i(7fff) = 7ffe
+f64i(8000) = 8001
+f64i(ffff) = fffe
+f64i(10000) = 10001
+f64i(7fffffff) = 7ffffffe
+f64i(80000000) = 80000001
+f64i(ffffffff) = fffffffe
+f64i(100000000) = 100000001
+f64i(7fffffffffffffff) = 7ffffffffffffffe
+f64i(8000000000000000) = -7fffffffffffffff
+f64i(ffffffffffffffff) = -2
+f64i(10000000000000000) = 1
+f64u(0) = 1
+f64u(7f) = 7e
+f64u(80) = 81
+f64u(ff) = fe
+f64u(100) = 101
+f64u(7fff) = 7ffe
+f64u(8000) = 8001
+f64u(ffff) = fffe
+f64u(10000) = 10001
+f64u(7fffffff) = 7ffffffe
+f64u(80000000) = 80000001
+f64u(ffffffff) = fffffffe
+f64u(100000000) = 100000001
+f64u(7fffffffffffffff) = 7ffffffffffffffe
+f64u(8000000000000000) = 8000000000000001
+f64u(ffffffffffffffff) = fffffffffffffffe
+f64u(10000000000000000) = 1