feat[player]: Save and restore player inventories during test

Save complete players inventories, and added unit tests on players
This commit is contained in:
Yves-Marie Haussonne 2024-10-02 19:59:39 +02:00
parent bbe0722e94
commit 3bc13b5c9f
4 changed files with 82 additions and 6 deletions

View File

@ -13,3 +13,14 @@ services:
RUN_TESTS: ${RUN_TESTS}
STOP_SERVER: ${STOP_SERVER}
FAILFAST: ${FAILFAST}
client1:
image: ${CLIENT_IMAGE}
restart: on-failure:10
depends_on:
- "server"
environment:
SERVER: server
PORT: 30000
PLAYERNAME: player1
RANDOM_INPUT: 0
PASSWORD: test

View File

@ -375,7 +375,7 @@ test_harness.dump = function(o)
end
end
local save_players = function(players)
test_harness.save_players = function(players)
local players_data = {}
for _, p in ipairs(players) do
local player_obj = nil
@ -389,17 +389,19 @@ local save_players = function(players)
end
players_data[player_name] = {
position = player_obj:get_pos(),
privs = test_harness.table_copy(minetest.get_player_privs(player_name))
privs = test_harness.table_copy(minetest.get_player_privs(player_name)),
inventory = test_harness.table_copy(player_obj:get_inventory():get_lists())
}
end
return players_data
end
local restore_players = function(players_data)
test_harness.restore_players = function(players_data)
for player_name, data in pairs(players_data) do
local player = minetest.get_player_by_name(player_name)
player:set_pos(data.position)
minetest.set_player_privs(player_name, data.privs)
player:get_inventory():set_lists(data.inventory)
end
end
@ -457,7 +459,7 @@ local run_player_tests = function(list_player_tests)
end
area.assign(vec(0, 0, 0), wanted, function()
area.clear()
local player_data = save_players(test.players)
local player_data = test_harness.save_players(test.players)
local ok, err = pcall(test.func)
test.result = { ok = ok, err = err }
print(string.format(":%s:%-60s %s", test.mod, test.name, ok and "pass" or "FAIL"))
@ -472,7 +474,7 @@ local run_player_tests = function(list_player_tests)
end
end
end
restore_players(player_data)
test_harness.restore_players(player_data)
test_run_callback()
end)
end

View File

@ -51,3 +51,9 @@ register_test("pattern", function()
assert(get_node(pos1).name == testnode1)
check.pattern(pos1, pos2, pattern)
end)
for _, name in ipairs({
"players",
}) do
dofile(minetest.get_modpath("test_harness") .. "/test/" .. name .. ".lua")
end

57
test/players.lua Normal file
View File

@ -0,0 +1,57 @@
local register_test = test_harness.get_test_registrator("test_harness")
local vec = vector.new
register_test("Tests utilities for players")
register_test("save_players", function()
local player1 = minetest.get_player_by_name("player1")
local itemstack = ItemStack("default:stone 30")
player1:get_inventory():add_item("main", itemstack)
local player_data = test_harness.save_players({"player1"})
assert(player_data ~= nil)
assert(player_data["player1"] ~= nil)
assert(player_data["player1"].position ~= nil)
assert(player_data["player1"].position == vec(0,0,0))
assert(player_data["player1"].privs ~= nil)
assert(player_data["player1"].inventory ~= nil)
assert(player_data["player1"].inventory.main ~= nil)
assert(#player_data["player1"].inventory.main > 0)
assert(player_data["player1"].inventory.main[1] ~= nil)
assert(player_data["player1"].inventory.main[1]:get_name() == "default:stone")
assert(player_data["player1"].inventory.main[1]:get_count() == 30)
end, { players={ "player1" },})
register_test("restore_players", function()
local player_data = { ["player1"] = {
position= vec(1,2,3),
privs= { ["noclip"] = true,["interact"] = true,["debug"] = true,["fly"] = true,["basic_debug"] = true, ["shout"] = true },
inventory= {
["craftpreview"] = { ItemStack("") },
["craftresult"] = { ItemStack(""),} ,
["main"] = { ItemStack("default:stone 30"), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""),} ,
["craft"] = { ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""),} ,
}
} }
local player1 = minetest.get_player_by_name("player1")
assert(not (player1:get_inventory():contains_item("main", "default:stone")))
assert(player1:get_pos() == vec(0,0,0))
assert(minetest.get_player_privs("player1")["fast"])
assert(not minetest.get_player_privs("player1")["shout"])
test_harness.restore_players(player_data)
assert(player1:get_inventory():contains_item("main", "default:stone"))
assert(player1:get_pos() == vec(1,2,3))
assert(minetest.get_player_privs("player1")["shout"])
assert(not minetest.get_player_privs("player1")["fast"])
end, { players={ "player1" },})