local ffi = require("@lune/ffi")
local c = ffi.c

local testdir = "./tests/ffi/external_math"
local compile = require("../utility/compile")
compile(`{testdir}/lib.c`, `{testdir}/lib.so`)
local lib = ffi.open(`{testdir}/lib.so`)

local function test_add_int()
	local add_int_info = c.fn({ c.int, c.int }, c.int)

	local add_int_callable = add_int_info:callable(lib:find("add_int"))

	local result_box = ffi.box(c.int.size)
	local arg1 = c.int:box(100)
	local arg2 = c.int:box(200)

	add_int_callable(result_box, arg1:ref(), arg2:ref())
	local result = c.int:readData(result_box)

	assert(result == 300, `add_int failed. result expected 300, got {result}`)
end

test_add_int()

local function test_mul_int()
	local mul_int = c.fn({ c.int, c.int }, c.int)

	local mul_int_caller = mul_int:callable(lib:find("mul_int"))

	local resultBox = ffi.box(c.int.size)
	local arg1 = c.int:box(100)
	local arg2 = c.int:box(200)

	mul_int_caller(resultBox, arg1:ref(), arg2:ref())
	local result = c.int:readData(resultBox)

	assert(result == 20000, `mul_int failed. result expected 20000, got {result}`)
end

test_mul_int()