mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
ca381aa289
- change Restart command to use server.start_game (offers setting the mod pack). - Change danger ores and crashsite maps to use the new restart command.
391 lines
14 KiB
Lua
391 lines
14 KiB
Lua
local Declare = require 'utils.test.declare'
|
|
local Helper = require 'utils.test.helper'
|
|
local RestartCommand = require 'features.restart_command'
|
|
local Assert = require 'utils.test.assert'
|
|
local Gui = require 'utils.gui'
|
|
local Command = require 'utils.command'
|
|
|
|
local function test_teardown(context)
|
|
RestartCommand.set_start_game_data({type = RestartCommand.game_types.scenario, name = '', mod_pack = nil})
|
|
|
|
context:add_teardown(function()
|
|
local main_frame = context.player.gui.center[RestartCommand._main_frame_name]
|
|
if main_frame and main_frame.valid then
|
|
Gui.destroy(main_frame)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function declare_test(name, func)
|
|
local function test_func(context)
|
|
test_teardown(context)
|
|
func(context)
|
|
end
|
|
|
|
Declare.test(name, test_func)
|
|
end
|
|
|
|
local function assert_view_matches_start_game_data(player, is_save, is_scenario, name, is_mod_pack_set, mod_pack_name)
|
|
local center = player.gui.center
|
|
local scenario_radio_button = Helper.get_gui_element_by_name(center, RestartCommand._scenario_radio_button_name)
|
|
local save_radio_button = Helper.get_gui_element_by_name(center, RestartCommand._save_radio_button_name)
|
|
local name_textfield = Helper.get_gui_element_by_name(center, RestartCommand._name_textfield_name)
|
|
local set_mod_pack_checkbox = Helper.get_gui_element_by_name(center, RestartCommand._set_mod_pack_checkbox_name)
|
|
local mod_pack_name_textfield = Helper.get_gui_element_by_name(center, RestartCommand._mod_pack_name_textfield_name)
|
|
|
|
Assert.equal(is_scenario, scenario_radio_button.state)
|
|
Assert.equal(is_save, save_radio_button.state)
|
|
Assert.equal(name, name_textfield.text)
|
|
Assert.equal(is_mod_pack_set, set_mod_pack_checkbox.state)
|
|
Assert.equal(mod_pack_name, mod_pack_name_textfield.text)
|
|
end
|
|
|
|
local function assert_start_game_data(type, name, mod_pack)
|
|
local start_game_data = RestartCommand.get_start_game_data()
|
|
|
|
Assert.equal(type, start_game_data.type)
|
|
Assert.equal(name, start_game_data.name)
|
|
Assert.equal(mod_pack, start_game_data.mod_pack)
|
|
end
|
|
|
|
local function run_config_command(player, parameter)
|
|
Command._raise_command('config-restart', player.index, parameter or '')
|
|
end
|
|
|
|
local function run_restart_command(player, parameter)
|
|
Command._raise_command('restart', player.index, parameter or '')
|
|
end
|
|
|
|
local function run_abort_command(player)
|
|
Command._raise_command('abort', player.index)
|
|
end
|
|
|
|
Declare.module({'features', 'restart_command'}, function()
|
|
local inital_start_game_data
|
|
|
|
Declare.module_startup(function()
|
|
inital_start_game_data = RestartCommand.get_start_game_data()
|
|
end)
|
|
|
|
Declare.module_teardown(function()
|
|
RestartCommand.set_start_game_data(inital_start_game_data)
|
|
end)
|
|
|
|
declare_test('Shows start game data when scenario.', function(context)
|
|
-- Arrange.
|
|
local start_game_data = {
|
|
type = RestartCommand.game_types.scenario,
|
|
name = 'some_name',
|
|
mod_pack = 'some_mod_pack'
|
|
}
|
|
RestartCommand.set_start_game_data(start_game_data)
|
|
|
|
-- Act.
|
|
run_config_command(context.player)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_view_matches_start_game_data(context.player, false, true, start_game_data.name, true,
|
|
start_game_data.mod_pack)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Shows start game data when save.', function(context)
|
|
-- Arrange.
|
|
local start_game_data = {type = RestartCommand.game_types.save, name = 'some_name', mod_pack = 'some_mod_pack'}
|
|
RestartCommand.set_start_game_data(start_game_data)
|
|
|
|
-- Act.
|
|
run_config_command(context.player)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_view_matches_start_game_data(context.player, true, false, start_game_data.name, true,
|
|
start_game_data.mod_pack)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Shows start game data when no mod pack.', function(context)
|
|
-- Arrange.
|
|
local start_game_data = {type = RestartCommand.game_types.scenario, name = 'some_name'}
|
|
RestartCommand.set_start_game_data(start_game_data)
|
|
|
|
-- Act.
|
|
run_config_command(context.player)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_view_matches_start_game_data(context.player, false, true, start_game_data.name, false, '')
|
|
end)
|
|
end)
|
|
|
|
declare_test('Shows start game data when mod pack empty string.', function(context)
|
|
-- Arrange.
|
|
local start_game_data = {type = RestartCommand.game_types.scenario, name = 'some_name', mod_pack = ''}
|
|
RestartCommand.set_start_game_data(start_game_data)
|
|
|
|
-- Act.
|
|
run_config_command(context.player)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_view_matches_start_game_data(context.player, false, true, start_game_data.name, true,
|
|
start_game_data.mod_pack)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Requires admin to run command.', function(context)
|
|
-- Arrange.
|
|
local player = context.player
|
|
Helper.modify_lua_object(context, player, 'admin', false)
|
|
Helper.modify_lua_object(context, game, 'get_player', function()
|
|
return player
|
|
end)
|
|
|
|
-- Act.
|
|
run_config_command(player)
|
|
|
|
-- Assert.
|
|
local center = player.gui.center
|
|
local main_frame = Helper.get_gui_element_by_name(center, RestartCommand._main_frame_name)
|
|
Assert.is_nil(main_frame)
|
|
end)
|
|
|
|
declare_test('get returns start game data.', function(context)
|
|
-- Arrange.
|
|
local player = context.player
|
|
local actual = nil
|
|
Helper.modify_lua_object(context, player, 'print', function(str)
|
|
actual = str
|
|
end)
|
|
Helper.modify_lua_object(context, game, 'get_player', function()
|
|
return player
|
|
end)
|
|
|
|
local start_game_data = {
|
|
type = RestartCommand.game_types.scenario,
|
|
name = 'some_name',
|
|
mod_pack = 'some_mod_pack'
|
|
}
|
|
RestartCommand.set_start_game_data(start_game_data)
|
|
|
|
-- Act.
|
|
run_config_command(player, 'get')
|
|
|
|
-- Assert.
|
|
local expected = [[
|
|
Start Game Data:
|
|
Type: scenario
|
|
Name: some_name
|
|
Mod Pack: some_mod_pack]]
|
|
Assert.equal(expected, actual)
|
|
end)
|
|
|
|
declare_test('set does set start game data.', function(context)
|
|
-- Act.
|
|
run_config_command(context.player, "set {type = '" .. RestartCommand.game_types.save
|
|
.. "', name = 'new_name', mod_pack = 'new_mod_pack_name'}")
|
|
|
|
-- Assert.
|
|
local start_game_data = RestartCommand.get_start_game_data()
|
|
Assert.equal(RestartCommand.game_types.save, start_game_data.type)
|
|
Assert.equal('new_name', start_game_data.name)
|
|
Assert.equal('new_mod_pack_name', start_game_data.mod_pack)
|
|
end)
|
|
|
|
for _, data in pairs({'new_name', ' new_name ', "'new_name'", '"new_name"', " 'new_name'"}) do
|
|
declare_test('set does set start game data for string ' .. data, function(context)
|
|
-- Act.
|
|
run_config_command(context.player, 'set ' .. data)
|
|
|
|
-- Assert.
|
|
local start_game_data = RestartCommand.get_start_game_data()
|
|
Assert.equal(RestartCommand.game_types.scenario, start_game_data.type)
|
|
Assert.equal('new_name', start_game_data.name)
|
|
Assert.equal(nil, start_game_data.mod_pack)
|
|
end)
|
|
end
|
|
|
|
declare_test('Close button closes gui', function(context)
|
|
-- Arrange.
|
|
local player = context.player
|
|
run_config_command(player)
|
|
|
|
local center = player.gui.center
|
|
local close_button = Helper.get_gui_element_by_name(center, RestartCommand._close_button_name)
|
|
|
|
-- Act.
|
|
context:next(function()
|
|
Helper.click(close_button)
|
|
end)
|
|
|
|
-- Assert
|
|
context:next(function()
|
|
local main_frame = Helper.get_gui_element_by_name(center, RestartCommand._main_frame_name)
|
|
Assert.is_nil(main_frame)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Can change start game data from gui.', function(context)
|
|
-- Arrange.
|
|
local player = context.player
|
|
run_config_command(player)
|
|
|
|
local center = player.gui.center
|
|
local save_radio_button = Helper.get_gui_element_by_name(center, RestartCommand._save_radio_button_name)
|
|
local name_textfield = Helper.get_gui_element_by_name(center, RestartCommand._name_textfield_name)
|
|
local mod_pack_checkbox = Helper.get_gui_element_by_name(center, RestartCommand._set_mod_pack_checkbox_name)
|
|
local mod_pack_name_textfield = Helper.get_gui_element_by_name(center,
|
|
RestartCommand._mod_pack_name_textfield_name)
|
|
|
|
-- Act.
|
|
Helper.click(save_radio_button)
|
|
Helper.set_text(name_textfield, 'new_name')
|
|
Helper.set_checkbox(mod_pack_checkbox, true)
|
|
Helper.set_text(mod_pack_name_textfield, 'new_mod_pack_name')
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_start_game_data(RestartCommand.game_types.save, 'new_name', 'new_mod_pack_name')
|
|
end)
|
|
end)
|
|
|
|
declare_test('Can change start game data to scenario from gui.', function(context)
|
|
-- Arrange.
|
|
RestartCommand.set_start_game_data({type = RestartCommand.game_types.save})
|
|
local player = context.player
|
|
run_config_command(player)
|
|
|
|
local center = player.gui.center
|
|
local scenario_radio_button = Helper.get_gui_element_by_name(center, RestartCommand._scenario_radio_button_name)
|
|
|
|
-- Act.
|
|
Helper.click(scenario_radio_button)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_start_game_data(RestartCommand.game_types.scenario, '', nil)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Can change start game data to no mod pack from gui.', function(context)
|
|
-- Arrange.
|
|
RestartCommand.set_start_game_data({mod_pack = 'some_mod_pack'})
|
|
local player = context.player
|
|
run_config_command(player)
|
|
|
|
local center = player.gui.center
|
|
local mod_pack_checkbox = Helper.get_gui_element_by_name(center, RestartCommand._set_mod_pack_checkbox_name)
|
|
local mod_pack_name_textfield = Helper.get_gui_element_by_name(center,
|
|
RestartCommand._mod_pack_name_textfield_name)
|
|
|
|
-- Act.
|
|
Helper.set_checkbox(mod_pack_checkbox, false)
|
|
|
|
-- Assert.
|
|
context:next(function()
|
|
assert_start_game_data(RestartCommand.game_types.scenario, '', nil)
|
|
Assert.equal('some_mod_pack', mod_pack_name_textfield.text)
|
|
end)
|
|
end)
|
|
|
|
declare_test('Mod pack is remembered when not set and gui is closed and reopened.', function(context)
|
|
-- Arrange.
|
|
RestartCommand.set_start_game_data({mod_pack = 'some_mod_pack'})
|
|
local player = context.player
|
|
run_config_command(player)
|
|
|
|
local center = player.gui.center
|
|
local mod_pack_checkbox = Helper.get_gui_element_by_name(center, RestartCommand._set_mod_pack_checkbox_name)
|
|
local close_button = Helper.get_gui_element_by_name(center, RestartCommand._close_button_name)
|
|
|
|
Helper.set_checkbox(mod_pack_checkbox, false)
|
|
|
|
context:next(function()
|
|
Helper.click(close_button)
|
|
end):next(function()
|
|
-- Make sure gui closed
|
|
local main_frame = Helper.get_gui_element_by_name(center, RestartCommand._main_frame_name)
|
|
Assert.is_nil(main_frame)
|
|
end):next(function()
|
|
-- Reopen gui.
|
|
run_config_command(player)
|
|
end):next(function()
|
|
assert_start_game_data(RestartCommand.game_types.scenario, '', nil)
|
|
|
|
local mod_pack_name_textfield = Helper.get_gui_element_by_name(center,
|
|
RestartCommand._mod_pack_name_textfield_name)
|
|
Assert.equal('some_mod_pack', mod_pack_name_textfield.text)
|
|
|
|
-- Re-enable mod pack
|
|
mod_pack_checkbox = Helper.get_gui_element_by_name(center, RestartCommand._set_mod_pack_checkbox_name)
|
|
Helper.set_checkbox(mod_pack_checkbox, true)
|
|
end):next(function()
|
|
assert_start_game_data(RestartCommand.game_types.scenario, '', 'some_mod_pack')
|
|
|
|
local mod_pack_name_textfield = Helper.get_gui_element_by_name(center,
|
|
RestartCommand._mod_pack_name_textfield_name)
|
|
Assert.equal('some_mod_pack', mod_pack_name_textfield.text)
|
|
end)
|
|
end)
|
|
|
|
declare_test('restart command starts restart.', function(context)
|
|
-- Arrange.
|
|
RestartCommand.set_start_game_data({name = 'new_name', type = RestartCommand.game_types.scenario})
|
|
|
|
local player = context.player
|
|
|
|
context:add_teardown(function()
|
|
run_abort_command(player)
|
|
end)
|
|
|
|
local output = {}
|
|
|
|
local function game_print(str)
|
|
output[#output + 1] = str
|
|
end
|
|
|
|
Helper.modify_lua_object(context, game, 'print', game_print)
|
|
|
|
-- Act.
|
|
run_restart_command(player)
|
|
|
|
-- Assert.
|
|
Assert.array_contains(output, 'Server restart initiated by ' .. player.name)
|
|
Assert.array_contains(output, 'Next map: new_name')
|
|
end)
|
|
|
|
for _, argument in pairs({'other_game', '{name = "other_game", type = "scenario"}'}) do
|
|
declare_test('restart command starts restart and sets start data with argument ' .. argument, function(context)
|
|
-- Arrange.
|
|
RestartCommand.set_start_game_data({
|
|
name = 'new_name',
|
|
type = RestartCommand.game_types.save,
|
|
mod_pack = 'mod_pack'
|
|
})
|
|
|
|
local player = context.player
|
|
|
|
context:add_teardown(function()
|
|
run_abort_command(player)
|
|
end)
|
|
|
|
local output = {}
|
|
|
|
local function game_print(str)
|
|
output[#output + 1] = str
|
|
end
|
|
|
|
Helper.modify_lua_object(context, game, 'print', game_print)
|
|
|
|
-- Act.
|
|
run_restart_command(player, argument)
|
|
|
|
-- Assert.
|
|
Assert.array_contains(output, 'Server restart initiated by ' .. player.name)
|
|
Assert.array_contains(output, 'Next map: other_game')
|
|
assert_start_game_data(RestartCommand.game_types.scenario, 'other_game', nil)
|
|
end)
|
|
end
|
|
end)
|