aboutsummaryrefslogtreecommitdiff
path: root/integration/bunjs-only-snippets/ffi.test.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
commit729d445b6885f69dd2c6355f38707bd42851c791 (patch)
treef87a7c408929ea3f57bbb7ace380cf869da83c0e /integration/bunjs-only-snippets/ffi.test.js
parent25f820c6bf1d8ec6d444ef579cc036b8c0607b75 (diff)
downloadbun-jarred/rename.tar.gz
bun-jarred/rename.tar.zst
bun-jarred/rename.zip
change the directory structurejarred/rename
Diffstat (limited to 'integration/bunjs-only-snippets/ffi.test.js')
-rw-r--r--integration/bunjs-only-snippets/ffi.test.js537
1 files changed, 0 insertions, 537 deletions
diff --git a/integration/bunjs-only-snippets/ffi.test.js b/integration/bunjs-only-snippets/ffi.test.js
deleted file mode 100644
index b8d79887b..000000000
--- a/integration/bunjs-only-snippets/ffi.test.js
+++ /dev/null
@@ -1,537 +0,0 @@
-import { describe, it, expect } from "bun:test";
-import { unsafe } from "bun";
-//
-import {
- native,
- viewSource,
- dlopen,
- CString,
- ptr,
- toBuffer,
- toArrayBuffer,
- FFIType,
- callback,
- CFunction,
-} from "bun:ffi";
-
-it("ffi print", async () => {
- await Bun.write(
- import.meta.dir + "/ffi.test.fixture.callback.c",
- viewSource(
- {
- returns: "bool",
- args: ["ptr"],
- },
- true
- )
- );
- await Bun.write(
- import.meta.dir + "/ffi.test.fixture.receiver.c",
- viewSource(
- {
- not_a_callback: {
- returns: "float",
- args: ["float"],
- },
- },
- false
- )[0]
- );
- expect(
- viewSource(
- {
- returns: "int8_t",
- args: [],
- },
- true
- ).length > 0
- ).toBe(true);
- expect(
- viewSource(
- {
- a: {
- returns: "int8_t",
- args: [],
- },
- },
- false
- ).length > 0
- ).toBe(true);
-});
-
-function getTypes(fast) {
- const int64_t = fast ? "i64_fast" : "int64_t";
- const uint64_t = fast ? "u64_fast" : "uint64_t";
- return {
- returns_true: {
- returns: "bool",
- args: [],
- },
- returns_false: {
- returns: "bool",
- args: [],
- },
- returns_42_char: {
- returns: "char",
- args: [],
- },
- returns_42_float: {
- returns: "float",
- args: [],
- },
- returns_42_double: {
- returns: "double",
- args: [],
- },
- returns_42_uint8_t: {
- returns: "uint8_t",
- args: [],
- },
- returns_neg_42_int8_t: {
- returns: "int8_t",
- args: [],
- },
- returns_42_uint16_t: {
- returns: "uint16_t",
- args: [],
- },
- returns_42_uint32_t: {
- returns: "uint32_t",
- args: [],
- },
- returns_42_uint64_t: {
- returns: uint64_t,
- args: [],
- },
- returns_neg_42_int16_t: {
- returns: "int16_t",
- args: [],
- },
- returns_neg_42_int32_t: {
- returns: "int32_t",
- args: [],
- },
- returns_neg_42_int64_t: {
- returns: int64_t,
- args: [],
- },
-
- identity_char: {
- returns: "char",
- args: ["char"],
- },
- identity_float: {
- returns: "float",
- args: ["float"],
- },
- identity_bool: {
- returns: "bool",
- args: ["bool"],
- },
- identity_double: {
- returns: "double",
- args: ["double"],
- },
- identity_int8_t: {
- returns: "int8_t",
- args: ["int8_t"],
- },
- identity_int16_t: {
- returns: "int16_t",
- args: ["int16_t"],
- },
- identity_int32_t: {
- returns: "int32_t",
- args: ["int32_t"],
- },
- identity_int64_t: {
- returns: int64_t,
- args: [int64_t],
- },
- identity_uint8_t: {
- returns: "uint8_t",
- args: ["uint8_t"],
- },
- identity_uint16_t: {
- returns: "uint16_t",
- args: ["uint16_t"],
- },
- identity_uint32_t: {
- returns: "uint32_t",
- args: ["uint32_t"],
- },
- identity_uint64_t: {
- returns: uint64_t,
- args: [uint64_t],
- },
-
- add_char: {
- returns: "char",
- args: ["char", "char"],
- },
- add_float: {
- returns: "float",
- args: ["float", "float"],
- },
- add_double: {
- returns: "double",
- args: ["double", "double"],
- },
- add_int8_t: {
- returns: "int8_t",
- args: ["int8_t", "int8_t"],
- },
- add_int16_t: {
- returns: "int16_t",
- args: ["int16_t", "int16_t"],
- },
- add_int32_t: {
- returns: "int32_t",
- args: ["int32_t", "int32_t"],
- },
- add_int64_t: {
- returns: int64_t,
- args: [int64_t, int64_t],
- },
- add_uint8_t: {
- returns: "uint8_t",
- args: ["uint8_t", "uint8_t"],
- },
- add_uint16_t: {
- returns: "uint16_t",
- args: ["uint16_t", "uint16_t"],
- },
- add_uint32_t: {
- returns: "uint32_t",
- args: ["uint32_t", "uint32_t"],
- },
-
- does_pointer_equal_42_as_int32_t: {
- returns: "bool",
- args: ["ptr"],
- },
-
- ptr_should_point_to_42_as_int32_t: {
- returns: "ptr",
- args: [],
- },
- identity_ptr: {
- returns: "ptr",
- args: ["ptr"],
- },
- add_uint64_t: {
- returns: uint64_t,
- args: [uint64_t, uint64_t],
- },
-
- cb_identity_true: {
- returns: "bool",
- args: ["ptr"],
- },
- cb_identity_false: {
- returns: "bool",
- args: ["ptr"],
- },
- cb_identity_42_char: {
- returns: "char",
- args: ["ptr"],
- },
- cb_identity_42_float: {
- returns: "float",
- args: ["ptr"],
- },
- cb_identity_42_double: {
- returns: "double",
- args: ["ptr"],
- },
- cb_identity_42_uint8_t: {
- returns: "uint8_t",
- args: ["ptr"],
- },
- cb_identity_neg_42_int8_t: {
- returns: "int8_t",
- args: ["ptr"],
- },
- cb_identity_42_uint16_t: {
- returns: "uint16_t",
- args: ["ptr"],
- },
- cb_identity_42_uint32_t: {
- returns: "uint32_t",
- args: ["ptr"],
- },
- cb_identity_42_uint64_t: {
- returns: uint64_t,
- args: ["ptr"],
- },
- cb_identity_neg_42_int16_t: {
- returns: "int16_t",
- args: ["ptr"],
- },
- cb_identity_neg_42_int32_t: {
- returns: "int32_t",
- args: ["ptr"],
- },
- cb_identity_neg_42_int64_t: {
- returns: int64_t,
- args: ["ptr"],
- },
-
- return_a_function_ptr_to_function_that_returns_true: {
- returns: "ptr",
- args: [],
- },
- };
-}
-
-function ffiRunner(types) {
- const {
- symbols: {
- returns_true,
- returns_false,
- return_a_function_ptr_to_function_that_returns_true,
- returns_42_char,
- returns_42_float,
- returns_42_double,
- returns_42_uint8_t,
- returns_neg_42_int8_t,
- returns_42_uint16_t,
- returns_42_uint32_t,
- returns_42_uint64_t,
- returns_neg_42_int16_t,
- returns_neg_42_int32_t,
- returns_neg_42_int64_t,
- identity_char,
- identity_float,
- identity_bool,
- identity_double,
- identity_int8_t,
- identity_int16_t,
- identity_int32_t,
- identity_int64_t,
- identity_uint8_t,
- identity_uint16_t,
- identity_uint32_t,
- identity_uint64_t,
- add_char,
- add_float,
- add_double,
- add_int8_t,
- add_int16_t,
- add_int32_t,
- add_int64_t,
- add_uint8_t,
- add_uint16_t,
- identity_ptr,
- add_uint32_t,
- add_uint64_t,
- does_pointer_equal_42_as_int32_t,
- ptr_should_point_to_42_as_int32_t,
- cb_identity_true,
- cb_identity_false,
- cb_identity_42_char,
- cb_identity_42_float,
- cb_identity_42_double,
- cb_identity_42_uint8_t,
- cb_identity_neg_42_int8_t,
- cb_identity_42_uint16_t,
- cb_identity_42_uint32_t,
- cb_identity_42_uint64_t,
- cb_identity_neg_42_int16_t,
- cb_identity_neg_42_int32_t,
- cb_identity_neg_42_int64_t,
- },
- close,
- } = dlopen("/tmp/bun-ffi-test.dylib", types);
-
- expect(returns_true()).toBe(true);
-
- expect(returns_false()).toBe(false);
-
- expect(returns_42_char()).toBe(42);
- expect(returns_42_uint64_t().valueOf()).toBe(42);
-
- expect(Math.fround(returns_42_float())).toBe(Math.fround(42.41999804973602));
- expect(returns_42_double()).toBe(42.42);
- expect(returns_42_uint8_t()).toBe(42);
- expect(returns_neg_42_int8_t()).toBe(-42);
- expect(returns_42_uint16_t()).toBe(42);
- expect(returns_42_uint32_t()).toBe(42);
- expect(returns_42_uint64_t()).toBe(42);
- expect(returns_neg_42_int16_t()).toBe(-42);
- expect(returns_neg_42_int32_t()).toBe(-42);
- expect(identity_int32_t(10)).toBe(10);
- expect(returns_neg_42_int64_t()).toBe(-42);
-
- expect(identity_char(10)).toBe(10);
-
- expect(identity_float(10.199999809265137)).toBe(10.199999809265137);
-
- expect(identity_bool(true)).toBe(true);
-
- expect(identity_bool(false)).toBe(false);
- expect(identity_double(10.100000000000364)).toBe(10.100000000000364);
-
- expect(identity_int8_t(10)).toBe(10);
- expect(identity_int16_t(10)).toBe(10);
- expect(identity_int64_t(10)).toBe(10);
- expect(identity_uint8_t(10)).toBe(10);
- expect(identity_uint16_t(10)).toBe(10);
- expect(identity_uint32_t(10)).toBe(10);
- expect(identity_uint64_t(10)).toBe(10);
-
- var bigArray = new BigUint64Array(8);
- new Uint8Array(bigArray.buffer).fill(255);
- var bigIntArray = new BigInt64Array(bigArray.buffer);
- expect(identity_uint64_t(bigArray[0])).toBe(bigArray[0]);
- expect(identity_uint64_t(bigArray[0] - BigInt(1))).toBe(
- bigArray[0] - BigInt(1)
- );
- expect(add_uint64_t(BigInt(-1) * bigArray[0], bigArray[0])).toBe(0);
- expect(add_uint64_t(BigInt(-1) * bigArray[0] + BigInt(10), bigArray[0])).toBe(
- 10
- );
- expect(identity_uint64_t(0)).toBe(0);
- expect(identity_uint64_t(100)).toBe(100);
- expect(identity_uint64_t(BigInt(100))).toBe(100);
- expect(identity_int64_t(bigIntArray[0])).toBe(bigIntArray[0]);
- expect(identity_int64_t(bigIntArray[0] - BigInt(1))).toBe(
- bigIntArray[0] - BigInt(1)
- );
-
- expect(add_char(1, 1)).toBe(2);
- expect(add_float(2.4, 2.8)).toBe(Math.fround(5.2));
- expect(add_double(4.2, 0.1)).toBe(4.3);
- expect(add_int8_t(1, 1)).toBe(2);
- expect(add_int16_t(1, 1)).toBe(2);
- expect(add_int32_t(1, 1)).toBe(2);
- expect(add_int64_t(1, 1)).toBe(2);
- expect(add_uint8_t(1, 1)).toBe(2);
- expect(add_uint16_t(1, 1)).toBe(2);
- expect(add_uint32_t(1, 1)).toBe(2);
-
- const cptr = ptr_should_point_to_42_as_int32_t();
- expect(cptr != 0).toBe(true);
- expect(typeof cptr === "number").toBe(true);
- expect(does_pointer_equal_42_as_int32_t(cptr)).toBe(true);
- const buffer = toBuffer(cptr, 0, 4);
- expect(buffer.readInt32(0)).toBe(42);
- expect(new DataView(toArrayBuffer(cptr, 0, 4), 0, 4).getInt32(0, true)).toBe(
- 42
- );
- expect(ptr(buffer)).toBe(cptr);
- expect(new CString(cptr, 0, 1).toString()).toBe("*");
- expect(identity_ptr(cptr)).toBe(cptr);
- const second_ptr = ptr(new Buffer(8));
- expect(identity_ptr(second_ptr)).toBe(second_ptr);
-
- var myCFunction = new CFunction({
- ptr: return_a_function_ptr_to_function_that_returns_true(),
- returns: "bool",
- });
- expect(myCFunction()).toBe(true);
-
- // function identityBool() {
- // return true;
- // }
- // globalThis.identityBool = identityBool;
-
- // const first = native.callback(
- // {
- // returns: "bool",
- // },
- // identityBool
- // );
- // expect(
- // cb_identity_true()
- // ).toBe(true);
-
- // expect(cb_identity_true(first)).toBe(true);
-
- // expect(
- // cb_identity_false(
- // callback(
- // {
- // returns: "bool",
- // },
- // () => false
- // )
- // )
- // ).toBe(false);
-
- // expect(
- // cb_identity_42_char(
- // callback(
- // {
- // returns: "char",
- // },
- // () => 42
- // )
- // )
- // ).toBe(42);
- // expect(
- // cb_identity_42_uint8_t(
- // callback(
- // {
- // returns: "uint8_t",
- // },
- // () => 42
- // )
- // )
- // ).toBe(42);
-
- // cb_identity_neg_42_int8_t(
- // callback(
- // {
- // returns: "int8_t",
- // },
- // () => -42
- // )
- // ).toBe(-42);
-
- // cb_identity_42_uint16_t(
- // callback(
- // {
- // returns: "uint16_t",
- // },
- // () => 42
- // )
- // ).toBe(42);
-
- // cb_identity_42_uint32_t(
- // callback(
- // {
- // returns: "uint32_t",
- // },
- // () => 42
- // )
- // ).toBe(42);
-
- // cb_identity_neg_42_int16_t(
- // callback(
- // {
- // returns: "int16_t",
- // },
- // () => -42
- // )
- // ).toBe(-42);
-
- // cb_identity_neg_42_int32_t(
- // callback(
- // {
- // returns: "int32_t",
- // },
- // () => -42
- // )
- // ).toBe(-42);
-
- close();
-}
-
-it("run ffi fast", () => {
- ffiRunner(getTypes(true));
-});
-
-it("run ffi", () => {
- ffiRunner(getTypes(false));
-});