Drop coverage stats for sources outside of technic directory (technic_cnc, technic_worldgen) Update technic API functions for tests (were exported just for tests, now part of API) Move CNC tests, use shared fixtures for tests
192 lines
5.8 KiB
Lua
192 lines
5.8 KiB
Lua
require("mineunit")
|
|
--[[
|
|
Technic network unit tests.
|
|
Execute mineunit at technic source directory.
|
|
--]]
|
|
|
|
-- Load complete technic mod
|
|
fixture("technic")
|
|
|
|
mineunit:set_modpath("technic", "../technic")
|
|
mineunit:set_current_modname("technic")
|
|
sourcefile("../technic/init")
|
|
mineunit:restore_current_modname()
|
|
|
|
sourcefile("init")
|
|
|
|
describe("Technic CNC", function()
|
|
|
|
local player = Player("SX")
|
|
|
|
-- Helper function to execute netowork
|
|
local function run_network(times)
|
|
times = times or 1
|
|
for i=1, times do
|
|
-- Globalstep every second instead of every 0.1 seconds
|
|
mineunit:execute_globalstep(1)
|
|
end
|
|
end
|
|
|
|
-- Helper function to place itemstack into machine inventory
|
|
local function place_itemstack(pos, itemstack, listname)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
if not inv:room_for_item(listname or "src", itemstack) then
|
|
inv:set_stack(listname or "src", 1, ItemStack())
|
|
end
|
|
inv:add_item(listname or "src", itemstack)
|
|
end
|
|
|
|
-- Get itemstack in inventory for inspection without removing it
|
|
local function get_itemstack(pos, listname, index)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
return inv:get_stack(listname or "dst", index or 1)
|
|
end
|
|
|
|
local function clear_itemstack(pos, listname)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
for index=1, inv:get_size(listname or "dst") do
|
|
inv:set_stack(listname or "dst", index, ItemStack())
|
|
end
|
|
end
|
|
|
|
-- Execute on mods loaded callbacks to finish loading.
|
|
mineunit:mods_loaded()
|
|
-- Tell mods that 1 minute passed already to execute all weird minetest.after hacks.
|
|
mineunit:execute_globalstep(60)
|
|
|
|
local cnc_pos = {x=0,y=1,z=0}
|
|
local program, product_count = next(technic_cnc.products)
|
|
|
|
describe("technic:cnc", function()
|
|
|
|
setup(function()
|
|
world.clear()
|
|
for x = 0, 4 do
|
|
world.place_node({x=x,y=0,z=0}, "technic:lv_cable", player)
|
|
end
|
|
world.place_node(cnc_pos, "technic:cnc", player)
|
|
world.place_node({x=1,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=2,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=3,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=4,y=1,z=0}, "technic:switching_station", player)
|
|
end)
|
|
|
|
it("produces items", function()
|
|
clear_itemstack(cnc_pos)
|
|
local id = technic.pos2network(cnc_pos)
|
|
local net = technic.networks[id]
|
|
assert.not_nil(net)
|
|
|
|
-- Fill input inventory and select program
|
|
local on_receive_fields = minetest.registered_nodes["technic:cnc"].on_receive_fields
|
|
assert.equals("function", type(on_receive_fields))
|
|
place_itemstack(cnc_pos, "default:wood 99")
|
|
on_receive_fields(cnc_pos, nil, {[program] = true}, player)
|
|
|
|
-- Run network and check results
|
|
run_network(10)
|
|
local products = get_itemstack(cnc_pos)
|
|
assert.is_ItemStack(products)
|
|
assert.gt(products:get_count(), product_count)
|
|
end)
|
|
|
|
it("uses energy", function()
|
|
clear_itemstack(cnc_pos)
|
|
place_itemstack(cnc_pos, "default:wood 99")
|
|
local id = technic.pos2network(cnc_pos)
|
|
local net = technic.networks[id]
|
|
assert.not_nil(net)
|
|
|
|
-- Run network and check results
|
|
run_network()
|
|
assert.equal(net.demand, 450)
|
|
end)
|
|
|
|
end)
|
|
|
|
describe("technic:cnc_mk2", function()
|
|
|
|
setup(function()
|
|
world.clear()
|
|
for x = 0, 7 do
|
|
world.place_node({x=x,y=0,z=0}, "technic:lv_cable", player)
|
|
end
|
|
world.place_node(cnc_pos, "technic:cnc_mk2", player)
|
|
world.place_node({x=1,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=2,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=3,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=4,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=5,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=6,y=1,z=0}, "technic:lv_solar_array", player)
|
|
world.place_node({x=7,y=1,z=0}, "technic:switching_station", player)
|
|
end)
|
|
|
|
it("produces items", function()
|
|
clear_itemstack(cnc_pos)
|
|
local id = technic.pos2network(cnc_pos)
|
|
local net = technic.networks[id]
|
|
assert.not_nil(net)
|
|
|
|
-- Fill input inventory and select program
|
|
local on_receive_fields = minetest.registered_nodes["technic:cnc_mk2"].on_receive_fields
|
|
assert.equals("function", type(on_receive_fields))
|
|
place_itemstack(cnc_pos, "default:wood 99")
|
|
on_receive_fields(cnc_pos, nil, {[program] = true}, player)
|
|
|
|
-- Run network and check results
|
|
run_network(10)
|
|
local products = get_itemstack(cnc_pos)
|
|
assert.is_ItemStack(products)
|
|
assert.gt(products:get_count(), product_count)
|
|
end)
|
|
|
|
it("uses energy", function()
|
|
clear_itemstack(cnc_pos)
|
|
place_itemstack(cnc_pos, "default:wood 99")
|
|
local id = technic.pos2network(cnc_pos)
|
|
local net = technic.networks[id]
|
|
assert.not_nil(net)
|
|
|
|
-- Run network and check results
|
|
run_network()
|
|
assert.equal(900, net.demand)
|
|
end)
|
|
|
|
it("disabling and enabling", function()
|
|
clear_itemstack(cnc_pos)
|
|
local id = technic.pos2network(cnc_pos)
|
|
local net = technic.networks[id]
|
|
assert.not_nil(net)
|
|
|
|
-- Fill input inventory and select program
|
|
local on_receive_fields = minetest.registered_nodes["technic:cnc_mk2"].on_receive_fields
|
|
assert.equals("function", type(on_receive_fields))
|
|
place_itemstack(cnc_pos, "default:wood 99")
|
|
on_receive_fields(cnc_pos, nil, {[program] = true}, player)
|
|
|
|
-- Clear and disable machine
|
|
local meta = minetest.get_meta(cnc_pos)
|
|
technic_cnc.disable(meta)
|
|
|
|
-- Run network and check results
|
|
run_network(10)
|
|
local products = get_itemstack(cnc_pos)
|
|
assert.is_true(products:is_empty())
|
|
assert.equal(0, net.demand)
|
|
|
|
-- Is enabled again when user selects program
|
|
on_receive_fields(cnc_pos, nil, {[program] = true}, player)
|
|
run_network(10)
|
|
products = get_itemstack(cnc_pos)
|
|
assert.is_ItemStack(products)
|
|
assert.gt(products:get_count(), product_count)
|
|
assert.equal(900, net.demand)
|
|
end)
|
|
|
|
end)
|
|
|
|
end)
|