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

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 = ffi.fn({ ffi.int, ffi.int }, ffi.int)

	local add_int_caller = add_int:caller(lib:find("add_int"))

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

	add_int_caller:call(resultBox, arg1, arg2)
	local result = ffi.int:from(resultBox)

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

test_add_int()

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

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

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

	mul_int_caller:call(resultBox, arg1, arg2)
	local result = ffi.int:from(resultBox)

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

test_mul_int()