mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-09-21 17:04:00 +00:00
- The registry is a Suite, created around the environment factory it runs its tests with, so the plugin's env.lua reads as: build environments, hand the test files a suite of them. The suite returned there becomes `...` in each test file, which is now said where it happens. - pass and fail are the primitives every other check goes through. eq and deep_eq assert rather than compare, failing with both values in the detail. - Stubs are extended through extend_requires, extend_script, extend_game and extend_defines, a recursive merge which raises when a value already exists, rather than by mutating the tables. The strict labels carry the factorio class names. - The stubs record registered metatables and can save and load the script data the way factorio does: functions are refused and only registered metatables survive. env.save_load() uses it, and a new on_load test shows role methods and held roles surviving the round trip, which only passes because the module registers its metatable. - The names helper moved out of the shared framework, it is role specific. - Tests are named after the function or method they cover, on both sides: the lua tests read as "role:assign applies locally and is sent", and the javascript files wrap their tests in the class they exercise with subtests per method. module.test.js is control.test.js, after the file it covers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
92 lines
3.2 KiB
Lua
92 lines
3.2 KiB
Lua
--[[-- Test environment for module/control.lua
|
|
The module specific extension between the shared stubs and the test files: it
|
|
creates environments which combine the stubs with a fresh copy of the roles
|
|
module and the fixtures below, and hands each test file a suite built around
|
|
that factory.
|
|
|
|
Run as a chunk by test/lua/runner.js, receiving the shared folder. The suite
|
|
returned here becomes `...` in each test file.
|
|
]]
|
|
|
|
local shared_root = ... --- @type string
|
|
local source = assert(debug.getinfo(1, "S")).source
|
|
local plugin_root = assert(source:match("^@(.*)/test/lua/env%.lua$"))
|
|
|
|
local Stubs = assert(loadfile(shared_root .. "/stubs.lua"))()
|
|
local Framework = assert(loadfile(shared_root .. "/framework.lua"))()
|
|
|
|
--- Standard fixture: permission names sent once and referenced by zero based index
|
|
local permission_names = {
|
|
"core.admin", -- 0
|
|
"exp_scenario.command.kill", -- 1
|
|
"exp_scenario.command.jail", -- 2
|
|
"exp_scenario.player.admin", -- 3
|
|
"exp_scenario.gui.readme", -- 4
|
|
"exp_scenario.command.assign_role", -- 5
|
|
}
|
|
|
|
local function meta(order, extra)
|
|
local m = { id = 0, order = order }
|
|
for k, v in pairs(extra or {}) do m[k] = v end
|
|
return m
|
|
end
|
|
|
|
--- Standard fixture: the roles as the controller would send them on initialise
|
|
local function role_records()
|
|
return {
|
|
{ id = 0, name = "Cluster Admin", permissions = { 0 }, meta = meta(1, { short_hand = "SYS" }) },
|
|
{ id = 5, name = "Moderator", permissions = { 1, 2, 3, 5 }, meta = meta(2, { color = { r = 0, g = 170, b = 0 } }) },
|
|
{ id = 6, name = "Regular", permissions = { 1 }, meta = meta(3) },
|
|
{ id = 7, name = "Jail", permissions = {}, meta = meta(4, { priority = 1, block_auto_assign = true }) },
|
|
{ id = 1, name = "Player", permissions = { 4 }, meta = meta(5), is_default = true },
|
|
{ id = 9, name = "Gone", permissions = {}, meta = meta(6), is_deleted = true },
|
|
}
|
|
end
|
|
|
|
--- Create an independent environment with a fresh copy of the roles module
|
|
local function make_env()
|
|
local env = Stubs.new()
|
|
|
|
env.Roles = assert(loadfile(plugin_root .. "/module/control.lua"))()
|
|
env.Roles.on_server_startup()
|
|
|
|
--- Get a role by name, failing the test when it does not exist
|
|
function env.R(name)
|
|
return (assert(env.Roles.get_role_by_name(name), "No role named " .. name))
|
|
end
|
|
|
|
--- Names of an array of roles
|
|
function env.names(roles)
|
|
local rtn = {}
|
|
for index, role in ipairs(roles) do
|
|
rtn[index] = role.name
|
|
end
|
|
return rtn
|
|
end
|
|
|
|
--- An assignment record as the controller would send it
|
|
function env.assignment(name, role_ids)
|
|
return { name = name, role_ids = role_ids }
|
|
end
|
|
|
|
--- Load the standard fixture and the given assignments
|
|
function env.initialise(assignments)
|
|
env.Roles.initialise{
|
|
permission_names = permission_names,
|
|
roles = role_records(),
|
|
assignments = assignments or {},
|
|
}
|
|
end
|
|
|
|
--- Save and load the map, as far as the roles module can tell
|
|
local stub_save_load = env.save_load
|
|
function env.save_load()
|
|
stub_save_load()
|
|
env.Roles.on_load()
|
|
end
|
|
|
|
return env
|
|
end
|
|
|
|
return Framework.new_suite(make_env)
|