mirror of
https://github.com/minetest/minetest.git
synced 2024-11-26 17:43:45 +01:00
Fix InvRef
bugs and add unit tests (#14591)
This commit is contained in:
parent
815b5cb086
commit
05d5dc4cec
@ -7456,6 +7456,7 @@ An `InvRef` is a reference to an inventory.
|
|||||||
* returns `false` on error (e.g. invalid `listname` or `size`)
|
* returns `false` on error (e.g. invalid `listname` or `size`)
|
||||||
* `get_width(listname)`: get width of a list
|
* `get_width(listname)`: get width of a list
|
||||||
* `set_width(listname, width)`: set width of list; currently used for crafting
|
* `set_width(listname, width)`: set width of list; currently used for crafting
|
||||||
|
* returns `false` on error (e.g. invalid `listname` or `width`)
|
||||||
* `get_stack(listname, i)`: get a copy of stack index `i` in list
|
* `get_stack(listname, i)`: get a copy of stack index `i` in list
|
||||||
* `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
|
* `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
|
||||||
* `get_list(listname)`: returns full list (list of `ItemStack`s)
|
* `get_list(listname)`: returns full list (list of `ItemStack`s)
|
||||||
|
@ -184,6 +184,7 @@ dofile(modpath .. "/itemstack_equals.lua")
|
|||||||
dofile(modpath .. "/content_ids.lua")
|
dofile(modpath .. "/content_ids.lua")
|
||||||
dofile(modpath .. "/metadata.lua")
|
dofile(modpath .. "/metadata.lua")
|
||||||
dofile(modpath .. "/raycast.lua")
|
dofile(modpath .. "/raycast.lua")
|
||||||
|
dofile(modpath .. "/inventory.lua")
|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
73
games/devtest/mods/unittests/inventory.lua
Normal file
73
games/devtest/mods/unittests/inventory.lua
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
local item_with_meta = ItemStack({name = "air", meta = {test = "abc"}})
|
||||||
|
|
||||||
|
local test_list = {
|
||||||
|
ItemStack("air"),
|
||||||
|
ItemStack(""),
|
||||||
|
ItemStack(item_with_meta),
|
||||||
|
}
|
||||||
|
|
||||||
|
local function compare_lists(a, b)
|
||||||
|
if not a or not b or #a ~= #b then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
for i=1, #a do
|
||||||
|
if not ItemStack(a[i]):equals(ItemStack(b[i])) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function test_inventory()
|
||||||
|
local inv = minetest.create_detached_inventory("test")
|
||||||
|
|
||||||
|
inv:set_lists({test = {""}})
|
||||||
|
assert(inv:get_list("test"))
|
||||||
|
|
||||||
|
assert(inv:get_size("test") == 1)
|
||||||
|
assert(inv:set_size("test", 3))
|
||||||
|
assert(not inv:set_size("test", -1))
|
||||||
|
|
||||||
|
assert(inv:get_width("test") == 0)
|
||||||
|
assert(inv:set_width("test", 3))
|
||||||
|
assert(not inv:set_width("test", -1))
|
||||||
|
|
||||||
|
inv:set_stack("test", 1, "air")
|
||||||
|
inv:set_stack("test", 3, item_with_meta)
|
||||||
|
assert(not inv:is_empty("test"))
|
||||||
|
assert(compare_lists(inv:get_list("test"), test_list))
|
||||||
|
|
||||||
|
assert(inv:add_item("test", "air") == ItemStack())
|
||||||
|
assert(inv:add_item("test", item_with_meta) == ItemStack())
|
||||||
|
assert(inv:get_stack("test", 1) == ItemStack("air 2"))
|
||||||
|
|
||||||
|
assert(inv:room_for_item("test", "air 99"))
|
||||||
|
inv:set_stack("test", 2, "air 99")
|
||||||
|
assert(not inv:room_for_item("test", "air 99"))
|
||||||
|
inv:set_stack("test", 2, "")
|
||||||
|
|
||||||
|
assert(inv:contains_item("test", "air"))
|
||||||
|
assert(not inv:contains_item("test", "air 99"))
|
||||||
|
assert(inv:contains_item("test", item_with_meta, true))
|
||||||
|
|
||||||
|
-- Items should be removed in reverse and combine with first stack removed
|
||||||
|
assert(inv:remove_item("test", "air") == item_with_meta)
|
||||||
|
item_with_meta:set_count(2)
|
||||||
|
assert(inv:remove_item("test", "air 2") == item_with_meta)
|
||||||
|
assert(inv:remove_item("test", "air") == ItemStack("air"))
|
||||||
|
assert(inv:is_empty("test"))
|
||||||
|
|
||||||
|
-- Failure of set_list(s) should not change inventory
|
||||||
|
local before = inv:get_list("test")
|
||||||
|
pcall(inv.set_lists, inv, {test = true})
|
||||||
|
pcall(inv.set_list, inv, "test", true)
|
||||||
|
local after = inv:get_list("test")
|
||||||
|
assert(compare_lists(before, after))
|
||||||
|
|
||||||
|
local location = inv:get_location()
|
||||||
|
assert(minetest.remove_detached_inventory("test"))
|
||||||
|
assert(not minetest.get_inventory(location))
|
||||||
|
end
|
||||||
|
|
||||||
|
unittests.register("test_inventory", test_inventory)
|
@ -151,19 +151,28 @@ int InvRef::l_set_width(lua_State *L)
|
|||||||
NO_MAP_LOCK_REQUIRED;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
InvRef *ref = checkObject<InvRef>(L, 1);
|
InvRef *ref = checkObject<InvRef>(L, 1);
|
||||||
const char *listname = luaL_checkstring(L, 2);
|
const char *listname = luaL_checkstring(L, 2);
|
||||||
|
|
||||||
int newwidth = luaL_checknumber(L, 3);
|
int newwidth = luaL_checknumber(L, 3);
|
||||||
|
if (newwidth < 0) {
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
Inventory *inv = getinv(L, ref);
|
Inventory *inv = getinv(L, ref);
|
||||||
if(inv == NULL){
|
if(inv == NULL){
|
||||||
return 0;
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
InventoryList *list = inv->getList(listname);
|
InventoryList *list = inv->getList(listname);
|
||||||
if(list){
|
if(list){
|
||||||
list->setWidth(newwidth);
|
list->setWidth(newwidth);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
reportInventoryChange(L, ref);
|
reportInventoryChange(L, ref);
|
||||||
return 0;
|
lua_pushboolean(L, true);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_stack(self, listname, i) -> itemstack
|
// get_stack(self, listname, i) -> itemstack
|
||||||
@ -264,19 +273,19 @@ int InvRef::l_set_lists(lua_State *L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make a temporary inventory in case reading fails
|
// Make a temporary inventory in case reading fails
|
||||||
Inventory *tempInv(inv);
|
Inventory tempInv(*inv);
|
||||||
tempInv->clear();
|
tempInv.clear();
|
||||||
|
|
||||||
Server *server = getServer(L);
|
Server *server = getServer(L);
|
||||||
|
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
luaL_checktype(L, 2, LUA_TTABLE);
|
luaL_checktype(L, 2, LUA_TTABLE);
|
||||||
while (lua_next(L, 2)) {
|
while (lua_next(L, 2)) {
|
||||||
const char *listname = lua_tostring(L, -2);
|
const char *listname = luaL_checkstring(L, -2);
|
||||||
read_inventory_list(L, -1, tempInv, listname, server);
|
read_inventory_list(L, -1, &tempInv, listname, server);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
inv = tempInv;
|
*inv = tempInv;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user