1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/utils/test/builder.lua
2020-09-28 20:40:47 +01:00

155 lines
3.6 KiB
Lua

local ModuleStore = require 'utils.test.module_store'
local Context = require 'utils.test.context'
local Public = {}
local is_init = false
local id_count = 0
local function get_id()
id_count = id_count + 1
return id_count
end
local function init_inner(module, depth)
module.id = get_id()
module.depth = depth
local count = 0
local tests = {}
for name, func in pairs(module.test_funcs) do
count = count + 1
tests[#tests + 1] = {
id = get_id(),
name = name,
module = module,
func = func,
context = nil,
current_step = nil,
passed = nil,
error = nil
}
end
module.tests = tests
for _, child in pairs(module.children) do
count = count + init_inner(child, depth + 1)
end
module.count = count
return count
end
function Public.init()
if is_init then
return
end
is_init = true
init_inner(ModuleStore.root_module, 0)
end
function Public.get_root_modules()
Public.init()
return ModuleStore.root_module
end
local function prepare_pre_module_hooks(module, runnables, player)
local startup_func = module.startup_func
if startup_func then
runnables[#runnables + 1] = {
is_hook = true,
name = 'startup',
module = module,
func = startup_func,
context = Context.new(player),
current_step = 0,
error = nil
}
end
end
local function build_pre_module_hooks(module, runnables, player)
if module == nil then
return
end
build_pre_module_hooks(module.parent, runnables, player)
prepare_pre_module_hooks(module, runnables, player)
end
local function prepare_post_module_hooks(module, runnables, player)
local teardown_func = module.teardown_func
if teardown_func then
runnables[#runnables + 1] = {
is_hook = true,
name = 'teardown',
module = module,
func = teardown_func,
context = Context.new(player),
current_step = 0,
error = nil
}
end
end
local function build_post_module_hooks(module, runnables, player)
if module == nil then
return
end
prepare_post_module_hooks(module, runnables, player)
build_post_module_hooks(module.parent, runnables, player)
end
local function prepare_test(test, player)
test.context = Context.new(player)
test.current_step = 0
test.passed = nil
test.error = nil
return test
end
local function prepare_module(module, runnables, player)
module.passed = nil
prepare_pre_module_hooks(module, runnables, player)
for _, test in pairs(module.tests) do
prepare_test(test, player)
runnables[#runnables + 1] = test
end
for _, child in pairs(module.children) do
prepare_module(child, runnables, player)
end
prepare_post_module_hooks(module, runnables, player)
end
function Public.build_test_for_run(test, player)
Public.init()
local runnables = {}
build_pre_module_hooks(test.module, runnables, player)
runnables[#runnables + 1] = prepare_test(test, player)
build_post_module_hooks(test.module, runnables, player)
return runnables
end
function Public.build_module_for_run(module, player)
Public.init()
local runnables = {}
build_pre_module_hooks(module.parent, runnables, player)
prepare_module(module, runnables, player)
build_post_module_hooks(module.parent, runnables, player)
return runnables
end
return Public