mirror of
https://github.com/pesde-pkg/scripts.git
synced 2024-12-12 15:00:37 +00:00
74 lines
2.2 KiB
Text
74 lines
2.2 KiB
Text
|
--> Run tests using frktest runner
|
||
|
|
||
|
local fs = require("@lune/fs")
|
||
|
local process = require("@lune/process")
|
||
|
|
||
|
local frktest = require("../../lune_packages/frktest")
|
||
|
local reporter = require("./reporter")
|
||
|
|
||
|
-- HACK: Cast require to allow for dynamic paths in strict mode
|
||
|
-- A more proper solution would be to use luau.load instead, but
|
||
|
-- frktest requires its global state to be modified by test suites
|
||
|
local require = require :: (
|
||
|
path: string
|
||
|
) -> (
|
||
|
test: typeof(setmetatable(
|
||
|
{} :: {
|
||
|
case: (name: string, fn: () -> nil) -> (),
|
||
|
suite: (name: string, fn: () -> ()) -> (),
|
||
|
},
|
||
|
{ __index = frktest.test }
|
||
|
))
|
||
|
) -> ()
|
||
|
|
||
|
local function discoverTests(dir: string)
|
||
|
local tests = {}
|
||
|
for _, file in fs.readDir(dir) do
|
||
|
local fullPath = `{dir}/{file}`
|
||
|
|
||
|
-- Look for files ending in `.spec.luau` as tests
|
||
|
if fs.isFile(fullPath) and string.sub(file, -10) == ".spec.luau" then
|
||
|
table.insert(tests, fullPath)
|
||
|
end
|
||
|
|
||
|
-- Recurse for directories
|
||
|
if fs.isDir(fullPath) then
|
||
|
local moreTests = discoverTests(fullPath)
|
||
|
|
||
|
-- Why are the indices starting at 0???? What????
|
||
|
table.move(moreTests, 0, #moreTests, #tests, tests)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return tests
|
||
|
end
|
||
|
|
||
|
local allowedTests = process.args
|
||
|
for _, test in discoverTests("src") do
|
||
|
-- If we are given any arguments, we only run those tests, otherwise,
|
||
|
-- we run all the tests
|
||
|
|
||
|
-- So, to include only a certain set of test files, you can provide either
|
||
|
-- the full path to the test file (with or without the extension) or the test
|
||
|
-- file name
|
||
|
local withoutExt = string.sub(test, 1, -6)
|
||
|
local isAllowed = #process.args == 0
|
||
|
or table.find(allowedTests, `tests/{test}`)
|
||
|
or table.find(allowedTests, withoutExt)
|
||
|
or table.find(allowedTests, `tests/{withoutExt}`)
|
||
|
|
||
|
local constructors = {
|
||
|
case = frktest.test.case,
|
||
|
suite = frktest.test.suite,
|
||
|
}
|
||
|
|
||
|
if not isAllowed then
|
||
|
constructors.case = frktest.test.skip.case
|
||
|
constructors.suite = frktest.test.skip.suite
|
||
|
end
|
||
|
|
||
|
require(`../../{test}`)(setmetatable(constructors, { __index = frktest.test }))
|
||
|
end
|
||
|
|
||
|
reporter.init()
|
||
|
process.exit(tonumber(frktest.run()))
|