1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-01-18 03:21:47 +02:00
RedMew/utils/test/runner.lua
2020-09-19 14:48:08 +01:00

99 lines
2.4 KiB
Lua

local Token = require 'utils.token'
local Task = require 'utils.task'
local ModuleStore = require 'utils.test.module_store'
local Steps = require 'utils.test.steps'
local pcall = pcall
local Public = {}
local function build_tests_inner(module, tests)
for name, func in pairs(module.tests) do
tests[#tests + 1] = {name = name, func = func, context = Steps.new()}
end
for _, child in pairs(module.children) do
build_tests_inner(child, tests)
end
end
local function build_tests(module)
local tests = {}
build_tests_inner(module, tests)
return tests
end
local function print_error(test_name, error_message)
game.print(table.concat {"Failed - '", test_name, "': ", tostring(error_message)}, {r = 1})
end
local function print_success(test_name)
game.print(table.concat {"Passed - '", test_name, "'"}, {g = 1})
end
local function run_test(test)
local success, return_value = pcall(test.func, test.context)
if not success then
print_error(test.name, return_value)
return false
end
local next_func = test.context._func
if not next_func then
print_success(test.name)
return true
end
return nil
end
local function print_summary(count, fail_count)
local pass_count = count - fail_count
game.print(table.concat {pass_count, ' of ', count, ' tests passed.'})
end
local run_tests_token
local function run_tests(data)
local index = data.index
local test = data.tests[index]
if test == nil then
print_summary(data.count, data.fail_count)
return
end
local success = run_test(test)
if success == false then
data.count = data.count + 1
data.fail_count = data.fail_count + 1
data.index = index + 1
Task.set_timeout_in_ticks(1, run_tests_token, data)
return
end
if success == true then
data.count = data.count + 1
data.index = index + 1
Task.set_timeout_in_ticks(1, run_tests_token, data)
return
end
local context = test.context
test.func = context._func
test.context = context._child
Task.set_timeout_in_ticks(context._delay or 1, run_tests_token, data)
end
run_tests_token = Token.register(run_tests)
function Public.run(module)
local tests = build_tests(module or ModuleStore.root_module)
run_tests({tests = tests, index = 1, count = 0, fail_count = 0})
end
_G.run_tests = Public.run
return Public