-- This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
print("testing coverage")

function foo()
	local x = 1
	local y = 2
	assert(x + y)
end

function bar()
	local function one(x)
		return x
	end

	local two = function(x)
		return x
	end

	one(1)
end

function validate(stats, hits, misses)
	local checked = {}

	for _,l in ipairs(hits) do
		if not (stats[l] and stats[l] > 0) then
			return false, string.format("expected line %d to be hit", l)
		end
		checked[l] = true
	end

	for _,l in ipairs(misses) do
		if not (stats[l] and stats[l] == 0) then
			return false, string.format("expected line %d to be missed", l)
		end
		checked[l] = true
	end

	for k,v in pairs(stats) do
		if type(k) == "number" and not checked[k] then
			return false, string.format("expected line %d to be absent", k)
		end
	end

	return true
end

foo()
c = getcoverage(foo)
assert(#c == 1)
assert(c[1].name == "foo")
assert(c[1].linedefined == 4)
assert(c[1].depth == 0)
assert(validate(c[1], {5, 6, 7}, {}))

bar()
c = getcoverage(bar)
assert(#c == 3)
assert(c[1].name == "bar")
assert(c[1].linedefined == 10)
assert(c[1].depth == 0)
assert(validate(c[1], {11, 15, 19}, {}))
assert(c[2].name == "one")
assert(c[2].linedefined == 11)
assert(c[2].depth == 1)
assert(validate(c[2], {12}, {}))
assert(c[3].name == nil)
assert(c[3].linedefined == 15)
assert(c[3].depth == 1)
assert(validate(c[3], {}, {16}))

return 'OK'