mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-11-11 23:54:52 +09:00
73 lines
3.3 KiB
Lua
73 lines
3.3 KiB
Lua
local Suite = ... --- @type Suite<ExpScenario.TestEnv>
|
|
|
|
local valid_state = { order = { { name = "readme", favourite = true } }, open = {}, visible = true }
|
|
|
|
--- Load control/player_settings.lua with a stubbed toolbar, encoding is a "enc:" prefix
|
|
--- @param env ExpScenario.TestEnv
|
|
--- @param toolbar table? Replaces the Gui.toolbar stub
|
|
--- @return table PlayerSettings
|
|
--- @return table restored Calls to set_state as { player name, state }
|
|
local function load(env, toolbar)
|
|
local restored = {}
|
|
env.extend_defines{ events = { on_player_left_game = 4 } }
|
|
env.extend_requires{
|
|
["modules/exp_gui"] = {
|
|
toolbar = toolbar or {
|
|
get_state = function() return valid_state end,
|
|
set_state = function(player, state) restored[#restored + 1] = { player.name, state } end,
|
|
},
|
|
},
|
|
}
|
|
local json_values = { ['{"valid"}'] = valid_state, ['{"wrong shape"}'] = { order = "x" } }
|
|
helpers = {
|
|
encode_string = function(str) return "enc:" .. str end,
|
|
decode_string = function(str) return str:match("^enc:(.*)$") end,
|
|
table_to_json = function(tbl) return tbl == valid_state and '{"valid"}' or "{}" end,
|
|
json_to_table = function(json) return json_values[json] end,
|
|
}
|
|
return env.load_module("control/player_settings"), restored
|
|
end
|
|
|
|
Suite.test("send_toolbar() sends the compressed toolbar when a player leaves", function(env)
|
|
local PlayerSettings = load(env)
|
|
env.add_player{ name = "Alice" }
|
|
PlayerSettings.events[defines.events.on_player_left_game]{ player_index = 1 }
|
|
Suite.eq(env.sent, { { channel = "exp_scenario:toolbar", data = { player_name = "Alice", toolbar = 'enc:{"valid"}' } } }, "sent")
|
|
end)
|
|
|
|
Suite.test("send_toolbar() sends nothing when the toolbar can not be read", function(env)
|
|
local PlayerSettings = load(env, { get_state = function() error("no toolbar") end })
|
|
env.add_player{ name = "Alice" }
|
|
PlayerSettings.events[defines.events.on_player_left_game]{ player_index = 1 }
|
|
Suite.eq(env.sent, {}, "nothing sent")
|
|
Suite.eq(#env.logged, 1, "a warning is logged")
|
|
end)
|
|
|
|
Suite.test("receive_toolbar() restores the toolbar of online players", function(env)
|
|
local PlayerSettings, restored = load(env)
|
|
env.add_player{ name = "Alice" }
|
|
env.add_player{ name = "Bob", connected = false }
|
|
PlayerSettings.receive_toolbar("Alice", 'enc:{"valid"}')
|
|
PlayerSettings.receive_toolbar("Bob", 'enc:{"valid"}')
|
|
PlayerSettings.receive_toolbar("Unknown", 'enc:{"valid"}')
|
|
Suite.eq(restored, { { "Alice", valid_state } }, "only Alice is online")
|
|
end)
|
|
|
|
Suite.test("receive_toolbar() logs malformed toolbars instead of raising", function(env)
|
|
local PlayerSettings, restored = load(env)
|
|
env.add_player{ name = "Alice" }
|
|
for _, toolbar in ipairs{ "not encoded", "enc:not json", 'enc:{"wrong shape"}' } do
|
|
PlayerSettings.receive_toolbar("Alice", toolbar)
|
|
end
|
|
Suite.eq(restored, {}, "nothing is restored")
|
|
Suite.eq(#env.logged, 3, "each one is logged")
|
|
end)
|
|
|
|
Suite.test("receive_toolbar() logs errors from set_state", function(env)
|
|
local PlayerSettings = load(env, { set_state = function() error("Missing toolbox item for removed") end })
|
|
env.add_player{ name = "Alice" }
|
|
PlayerSettings.receive_toolbar("Alice", 'enc:{"valid"}')
|
|
Suite.eq(#env.logged, 1, "a warning is logged")
|
|
end)
|
|
return Suite.run()
|