aboutsummaryrefslogtreecommitdiff
path: root/integration/bunjs-only-snippets/ffi.test.js
blob: 1a18ae2cdc4a0c28e226b9e6b39592cfc4d991da (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
import { describe, it, expect } from "bun:test";

it("ffi print", () => {
  Bun.dlprint({
    add: {
      params: ["int32_t", "int32_t"],
      return_type: "int32_t",
    },
  })[0];
});

it("ffi run", () => {
  const types = {
    returns_true: {
      return_type: "bool",
      params: [],
    },
    returns_false: {
      return_type: "bool",
      params: [],
    },
    returns_42_char: {
      return_type: "char",
      params: [],
    },
    // returns_42_float: {
    //   return_type: "float",
    //   params: [],
    // },
    // returns_42_double: {
    //   return_type: "double",
    //   params: [],
    // },
    returns_42_uint8_t: {
      return_type: "uint8_t",
      params: [],
    },
    returns_neg_42_int8_t: {
      return_type: "int8_t",
      params: [],
    },
    returns_42_uint16_t: {
      return_type: "uint16_t",
      params: [],
    },
    returns_42_uint32_t: {
      return_type: "uint32_t",
      params: [],
    },
    // // returns_42_uint64_t: {
    // //   return_type: "uint64_t",
    // //   params: [],
    // // },
    returns_neg_42_int16_t: {
      return_type: "int16_t",
      params: [],
    },
    returns_neg_42_int32_t: {
      return_type: "int32_t",
      params: [],
    },
    // returns_neg_42_int64_t: {
    //   return_type: "int64_t",
    //   params: [],
    // },

    identity_char: {
      return_type: "char",
      params: ["char"],
    },
    // identity_float: {
    //   return_type: "float",
    //   params: ["float"],
    // },
    identity_bool: {
      return_type: "bool",
      params: ["bool"],
    },
    // identity_double: {
    //   return_type: "double",
    //   params: ["double"],
    // },
    identity_int8_t: {
      return_type: "int8_t",
      params: ["int8_t"],
    },
    identity_int16_t: {
      return_type: "int16_t",
      params: ["int16_t"],
    },
    identity_int32_t: {
      return_type: "int32_t",
      params: ["int32_t"],
    },
    // identity_int64_t: {
    //   return_type: "int64_t",
    //   params: ["int64_t"],
    // },
    identity_uint8_t: {
      return_type: "uint8_t",
      params: ["uint8_t"],
    },
    identity_uint16_t: {
      return_type: "uint16_t",
      params: ["uint16_t"],
    },
    identity_uint32_t: {
      return_type: "uint32_t",
      params: ["uint32_t"],
    },
    // identity_uint64_t: {
    //   return_type: "uint64_t",
    //   params: ["uint64_t"],
    // },

    add_char: {
      return_type: "char",
      params: ["char", "char"],
    },
    add_float: {
      return_type: "float",
      params: ["float", "float"],
    },
    add_double: {
      return_type: "double",
      params: ["double", "double"],
    },
    add_int8_t: {
      return_type: "int8_t",
      params: ["int8_t", "int8_t"],
    },
    add_int16_t: {
      return_type: "int16_t",
      params: ["int16_t", "int16_t"],
    },
    add_int32_t: {
      return_type: "int32_t",
      params: ["int32_t", "int32_t"],
    },
    // add_int64_t: {
    //   return_type: "int64_t",
    //   params: ["int64_t", "int64_t"],
    // },
    add_uint8_t: {
      return_type: "uint8_t",
      params: ["uint8_t", "uint8_t"],
    },
    add_uint16_t: {
      return_type: "uint16_t",
      params: ["uint16_t", "uint16_t"],
    },
    add_uint32_t: {
      return_type: "uint32_t",
      params: ["uint32_t", "uint32_t"],
    },
    // add_uint64_t: {
    //   return_type: "uint64_t",
    //   params: ["uint64_t", "uint64_t"],
    // },
  };
  console.log(Bun.dlprint(types)[0]);
  const {
    symbols: {
      returns_true,
      returns_false,
      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,
      add_uint32_t,
      add_uint64_t,
    },
    close,
  } = Bun.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_float()).toBe(42);
  //   expect(returns_42_double()).toBe(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(returns_neg_42_int64_t()).toBe(-42);
  expect(identity_char(10)).toBe(10);
  //   expect(identity_float(10.1)).toBe(10.1);
  expect(identity_bool(true)).toBe(true);
  expect(identity_bool(false)).toBe(false);
  //   expect(identity_double(10.1)).toBe(10.1);
  expect(identity_int8_t(10)).toBe(10);
  expect(identity_int16_t(10)).toBe(10);
  expect(identity_int32_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(add_char(1, 1)).toBe(2);
  //   expect(add_float(1.1, 1.1)).toBe(2.2);
  //   expect(add_double(1.1, 1.1)).toBe(2.2);
  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);
  //   expect(add_uint64_t(1, 1)).toBe(2);
  close();
});
``;