local vec3      = require "modules.vec3"
local utils     = require "modules.utils"
local constants = require "modules.constants"

local function tolerance(v, t)
	return math.abs(v - t) < 1e-6
end

describe("utils:", function()
	it("interpolates between two numbers", function()
		assert.is_true(tolerance(utils.lerp(0, 1, 0.5), 0.5))
	end)

	it("interpolates between two vectors", function()
		local a = vec3(0, 0, 0)
		local b = vec3(1, 1, 1)
		local c = vec3(0.5, 0.5, 0.5)
		assert.is.equal(utils.lerp(a, b, 0.5), c)

		a = vec3(5, 5, 5)
		b = vec3(0, 0, 0)
		c = vec3(2.5, 2.5, 2.5)
		assert.is.equal(utils.lerp(a, b, 0.5), c)
	end)

	it("decays exponentially", function()
		local v = utils.decay(0, 1, 0.5, 1)
		assert.is_true(tolerance(v, 0.39346934028737))
	end)

	it("checks a nan", function()
		local a = 0/0
		assert.is_true(utils.is_nan(a))
	end)

	it("rounds a number", function()
		-- round up
		local v = utils.round(1.3252525, 0.01)
		assert.is_true(tolerance(v, 1.33))
		-- round down
		v = utils.round(1.3242525, 0.1)
		assert.is_true(tolerance(v, 1.3))
		-- no precision
		v = utils.round(1.3242525)
		assert.is_true(tolerance(v, 1))
	end)

	it("checks sign", function()
		assert.is.equal(utils.sign(-9), -1)
		assert.is.equal(utils.sign(0), 0)
		assert.is.equal(utils.sign(12), 1)
	end)
end)

--[[
clamp(value, min, max)
deadzone(value, size)
threshold(value, threshold)
tolerance(value, threshold)
map(value, min_in, max_in, min_out, max_out)
lerp(progress, low, high)
smoothstep(progress, low, high)
wrap(value, limit)
is_pot(value)
project_on(out, a, b)
project_from(out, a, b)
mirror_on(out, a, b)
reflect(out, i, n)
refract(out, i, n, ior)
--]]
