scripts/.lune/tests/init.luau
Erica Marigold 83ab6bf97f
feat: test setup using frktest & more
* Sets up a test runner system and includes unit tests for existing
  generators using Rojo's test files.
* Configure Luau analysis and disables unnecessary lints.
* Make sync config generator accept a third options argument with a
  `force` option to generate configs even when there is a
  `default.project.json` present in the `projectDir`.
2024-12-03 14:58:15 +00:00

74 lines
No EOL
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()))