technic-cd2025/technic/spec/network_spec.lua

418 lines
13 KiB
Lua

dofile("spec/test_helpers.lua")
--[[
Technic network unit tests.
Execute busted at technic source directory.
--]]
-- Load fixtures required by tests
fixture("minetest")
fixture("minetest/player")
fixture("minetest/protection")
fixture("pipeworks")
fixture("network")
sourcefile("machines/network")
sourcefile("machines/register/cables")
sourcefile("machines/LV/cables")
sourcefile("machines/MV/cables")
sourcefile("machines/HV/cables")
sourcefile("machines/register/generator")
sourcefile("machines/HV/generator")
world.layout({
{{x=100,y=100,z=100}, "technic:lv_cable"},
{{x=101,y=100,z=100}, "technic:lv_cable"},
{{x=102,y=100,z=100}, "technic:lv_cable"},
{{x=103,y=100,z=100}, "technic:lv_cable"},
{{x=104,y=100,z=100}, "technic:lv_cable"},
{{x=100,y=101,z=100}, "technic:switching_station"},
{{x=100,y=200,z=100}, "technic:mv_cable"},
{{x=101,y=200,z=100}, "technic:mv_cable"},
{{x=102,y=200,z=100}, "technic:mv_cable"},
{{x=103,y=200,z=100}, "technic:mv_cable"},
{{x=104,y=200,z=100}, "technic:mv_cable"},
{{x=100,y=201,z=100}, "technic:switching_station"},
{{x=100,y=300,z=100}, "technic:hv_cable"},
{{x=101,y=300,z=100}, "technic:hv_cable"},
{{x=102,y=300,z=100}, "technic:hv_cable"},
{{x=103,y=300,z=100}, "technic:hv_cable"},
{{x=104,y=300,z=100}, "technic:hv_cable"},
{{x=100,y=301,z=100}, "technic:switching_station"},
-- For network lookup function -> returns correct network for position
{{x=100,y=500,z=100}, "technic:hv_cable"},
{{x=101,y=500,z=100}, "technic:hv_cable"},
{{x=102,y=500,z=100}, "technic:hv_cable"},
{{x=103,y=500,z=100}, "technic:hv_cable"},
{{x=104,y=500,z=100}, "technic:hv_cable"},
{{x=100,y=501,z=100}, "technic:hv_generator"},
{{x=101,y=501,z=100}, "technic:hv_cable"},
{{x=102,y=501,z=100}, "technic:switching_station"},
{{x=100,y=502,z=100}, "technic:hv_cable"},
{{x=101,y=502,z=100}, "technic:hv_cable"},
})
describe("Power network helper", function()
-- Simple network position fixtures
local net_id = 65536
local pos = { x = -32768, y = -32767, z = -32768 }
local sw_pos = { x = -32768, y = -32766, z = -32768 }
describe("network lookup functions", function()
it("does not fail if network missing", function()
assert.is_nil( technic.remove_network(9999) )
end)
it("returns correct position for network", function()
assert.same(pos, technic.network2pos(net_id) )
assert.same(sw_pos, technic.network2sw_pos(net_id) )
end)
it("returns correct network for position", function()
local net_id = technic.create_network({x=100,y=501,z=100})
assert.same(net_id, technic.pos2network({x=100,y=500,z=100}) )
assert.same(net_id, technic.sw_pos2network({x=100,y=501,z=100}) )
end)
it("returns nil tier for empty position", function()
assert.is_nil(technic.sw_pos2tier({x=9999,y=9999,z=9999}))
end)
it("returns correct tier for switching station position", function()
-- World is defined in fixtures/network.lua
assert.same("LV", technic.sw_pos2tier({x=100,y=101,z=100}))
assert.same("MV", technic.sw_pos2tier({x=100,y=201,z=100}))
assert.same("HV", technic.sw_pos2tier({x=100,y=301,z=100}))
end)
end)
describe("network constructors/destructors", function()
-- Build network
local net_id = technic.create_network({x=100,y=501,z=100})
assert.is_number(net_id)
it("creates network", function()
assert.is_hashed(technic.networks[net_id])
end)
it("builds network", function()
local net = technic.networks[net_id]
-- Network table is valid
assert.is_indexed(net.PR_nodes)
assert.is_indexed(net.RE_nodes)
assert.is_indexed(net.BA_nodes)
assert.equals(9, count(net.all_nodes))
assert.is_hashed(net.all_nodes)
end)
it("does not add duplicates to network", function()
local net = technic.networks[net_id]
-- Local network table is still valid
assert.equals(1, count(net.PR_nodes))
assert.equals(0, count(net.RE_nodes))
assert.equals(0, count(net.BA_nodes))
assert.equals(9, count(net.all_nodes))
-- FIXME: This might be wrong if technic.cables should contain only cables and not machines
assert.equals(9, count(technic.cables))
end)
it("removes network", function()
technic.remove_network(net_id)
assert.is_nil(technic.networks[net_id])
-- TODO: Verify that there's no lefover positions in technic.cables
end)
end)
--[[ TODO:
technic.remove_network_node
--]]
describe("Power network timeout functions technic.touch_node and technic.get_timeout", function()
it("returns zero if no data available", function()
assert.equals(0,
technic.get_timeout("LV", {x=9999,y=9999,z=9999})
)
assert.equals(0,
technic.get_timeout("HV", {x=9999,y=9999,z=9999})
)
end)
it("returns timeout if data is available", function()
technic.touch_node("LV", {x=123,y=123,z=123}, 42)
assert.equals(42,
technic.get_timeout("LV", {x=123,y=123,z=123})
)
technic.touch_node("HV", {x=123,y=123,z=123}, 74)
assert.equals(74,
technic.get_timeout("HV", {x=123,y=123,z=123})
)
end)
end)
end)
-- Clean up, left following here just for easy copy pasting stuff from previous proj
--[[
describe("Metatool API protection", function()
it("metatool.is_protected bypass privileges", function()
local value = metatool.is_protected(ProtectedPos(), Player(), "test_priv", true)
assert.equals(false, value)
end)
it("metatool.is_protected no bypass privileges", function()
local value = metatool.is_protected(ProtectedPos(), Player(), "test_priv2", true)
assert.equals(true, value)
end)
it("metatool.is_protected bypass privileges, unprotected", function()
local value = metatool.is_protected(UnprotectedPos(), Player(), "test_priv", true)
assert.equals(false, value)
end)
it("metatool.is_protected no bypass privileges, unprotected", function()
local value = metatool.is_protected(UnprotectedPos(), Player(), "test_priv2", true)
assert.equals(false, value)
end)
end)
describe("Metatool API tool namespace", function()
it("Create invalid namespace", function()
local tool = { ns = metatool.ns, name = 'invalid' }
local value = tool:ns("invalid", {
testkey = "testvalue"
})
assert.is_nil(metatool:ns("testns"))
end)
it("Get nonexistent namespace", function()
assert.is_nil(metatool.ns("nonexistent"))
end)
it("Create tool namespace", function()
-- FIXME: Hack to get fake tool available, replace with real tool
local tool = { ns = metatool.ns, name = 'mytool' }
metatool.tools["metatool:mytool"] = tool
-- Actual tests
local value = tool:ns({
testkey = "testvalue"
})
local expected = {
testkey = "testvalue"
}
assert.same(expected, metatool.ns("mytool"))
end)
end)
describe("Metatool API tool registration", function()
it("Register tool default configuration", function()
-- Tool registration
local definition = {
description = 'UnitTestTool Description',
name = 'UnitTestTool',
texture = 'utt.png',
recipe = {{'air'},{'air'},{'air'}},
on_read_node = function(tooldef, player, pointed_thing, node, pos)
local data, group = tooldef:copy(node, pos, player)
return data, group, "on_read_node description"
end,
on_write_node = function(tooldef, data, group, player, pointed_thing, node, pos)
tooldef:paste(node, pos, player, data, group)
end,
}
local tool = metatool:register_tool('testtool0', definition)
assert.is_table(tool)
assert.equals("metatool:testtool0", tool.name)
assert.is_table(tool)
assert.equals(definition.description, tool.description)
assert.equals(definition.name, tool.nice_name)
assert.equals(definition.on_read_node, tool.on_read_node)
assert.equals(definition.on_write_node, tool.on_write_node)
-- Test configurable tool attributes
assert.is_nil(tool.privs)
assert.same({}, tool.settings)
-- Namespace creation
local mult = function(a,b) return a * b end
tool:ns({ k1 = "v1", fn = mult })
-- Retrieve namespace and and execute tests
local ns = metatool.ns("testtool0")
assert.same({ k1 = "v1", fn = mult }, ns)
assert.equals(8, ns.fn(2,4))
end)
it("Register tool with configuration", function()
-- Tool registration
local definition = {
description = 'UnitTestTool Description',
name = 'UnitTestTool',
texture = 'utt.png',
recipe = {{'air'},{'air'},{'air'}},
on_read_node = function(tooldef, player, pointed_thing, node, pos)
local data, group = tooldef:copy(node, pos, player)
return data, group, "on_read_node description"
end,
on_write_node = function(tooldef, data, group, player, pointed_thing, node, pos)
tooldef:paste(node, pos, player, data, group)
end,
}
local tool = metatool:register_tool('testtool2', definition)
assert.is_table(tool)
assert.equals("metatool:testtool2", tool.name)
assert.is_table(tool)
assert.equals(definition.description, tool.description)
assert.equals(definition.name, tool.nice_name)
assert.equals(definition.on_read_node, tool.on_read_node)
assert.equals(definition.on_write_node, tool.on_write_node)
-- Test configurable tool attributes
assert.equals("test_testtool2_privs", tool.privs)
local expected_settings = {
extra_config_key = "testtool2_extra_config_value",
}
assert.same(expected_settings, tool.settings)
-- Namespace creation
local sum = function(a,b) return a + b end
tool:ns({ k1 = "v1", fn = sum })
-- Retrieve namespace and and execute tests
local ns = metatool.ns("testtool2")
assert.same({ k1 = "v1", fn = sum }, ns)
assert.equals(9, ns.fn(2,7))
end)
end)
describe("Metatool API node registration", function()
it("Register node default configuration", function()
local tool = metatool.tool("testtool0")
assert.is_table(tool)
assert.equals("metatool:testtool0", tool.name)
assert.is_table(tool)
local definition = {
name = 'testnode1',
nodes = {
"testnode1",
"nonexistent1",
"testnode2",
"nonexistent2",
},
tooldef = {
group = 'test node',
protection_bypass_write = "default_bypass_write_priv",
copy = function(node, pos, player)
print("nodedef copy callback executed")
end,
paste = function(node, pos, player, data)
print("nodedef paste callback executed")
end,
}
}
tool:load_node_definition(definition)
assert.is_table(tool.nodes)
assert.is_table(tool.nodes.testnode1)
assert.is_table(tool.nodes.testnode2)
assert.is_nil(tool.nodes.nonexistent1)
assert.is_nil(tool.nodes.nonexistent2)
assert.is_function(tool.nodes.testnode1.before_read)
assert.is_function(tool.nodes.testnode2.before_write)
assert.equals(definition.tooldef.copy, tool.nodes.testnode1.copy)
assert.equals(definition.tooldef.paste, tool.nodes.testnode2.paste)
assert.equals("default_bypass_write_priv", definition.tooldef.protection_bypass_write)
local expected_settings = {
protection_bypass_write = "default_bypass_write_priv"
}
assert.same(expected_settings, tool.nodes.testnode1.settings)
assert.same(expected_settings, tool.nodes.testnode2.settings)
end)
it("Register node with configuration", function()
local tool = metatool.tool("testtool2")
assert.is_table(tool)
assert.equals("metatool:testtool2", tool.name)
assert.is_table(tool)
local definition = {
name = 'testnode2',
nodes = {
"testnode1",
"nonexistent1",
"testnode2",
"nonexistent2",
},
tooldef = {
group = 'test node',
protection_bypass_write = "default_bypass_write_priv",
copy = function(node, pos, player)
print("nodedef copy callback executed")
end,
paste = function(node, pos, player, data)
print("nodedef paste callback executed")
end,
}
}
tool:load_node_definition(definition)
assert.is_table(tool.nodes)
assert.is_table(tool.nodes.testnode1)
assert.is_table(tool.nodes.testnode2)
assert.is_nil(tool.nodes.nonexistent1)
assert.is_nil(tool.nodes.nonexistent2)
assert.is_function(tool.nodes.testnode1.before_read)
assert.is_function(tool.nodes.testnode2.before_write)
assert.equals(definition.tooldef.copy, tool.nodes.testnode1.copy)
assert.equals(definition.tooldef.paste, tool.nodes.testnode2.paste)
assert.equals("testtool2_testnode2_bypass_write", tool.nodes.testnode1.protection_bypass_write)
assert.equals("testtool2_testnode2_bypass_write", tool.nodes.testnode2.protection_bypass_write)
assert.equals("testtool2_testnode2_bypass_info", tool.nodes.testnode1.protection_bypass_info)
assert.equals("testtool2_testnode2_bypass_info", tool.nodes.testnode2.protection_bypass_info)
assert.equals("testtool2_testnode2_bypass_read", tool.nodes.testnode1.protection_bypass_read)
assert.equals("testtool2_testnode2_bypass_read", tool.nodes.testnode2.protection_bypass_read)
local expected_settings = {
protection_bypass_write = "testtool2_testnode2_bypass_write",
protection_bypass_info = "testtool2_testnode2_bypass_info",
protection_bypass_read = "testtool2_testnode2_bypass_read",
}
assert.same(expected_settings, tool.nodes.testnode1.settings)
assert.same(expected_settings, tool.nodes.testnode2.settings)
end)
end)
--]]