89 lines
6.2 KiB
Lua
89 lines
6.2 KiB
Lua
-- Kør: luajit tests/test_adFieldSiloPlanner.lua (fra repo-roden)
|
|
dofile("FS25_ADSmartPickup/adFieldSiloPlanner.lua")
|
|
local P = ADFieldSiloPlanner
|
|
local WHEAT, CANOLA = 1, 2
|
|
local failures = 0
|
|
local function check(name, actual, expected)
|
|
if actual == expected then print("OK " .. name) else
|
|
failures = failures + 1
|
|
print(string.format("FAIL %s: forventede %s, fik %s", name, tostring(expected), tostring(actual)))
|
|
end
|
|
end
|
|
local function silo(id, x, stock, markerId) return {id = id, name = id, markerId = markerId == nil and (id .. "m") or markerId or nil, x = x, z = 0, stock = stock} end
|
|
local function store(id, x, free) return {id = id, markerId = id .. "m", x = x, z = 0, free = free} end
|
|
local function vehicle(id, x, capacity, carries, cargo) return {id = id, x = x, z = 0, capacity = capacity, carries = carries or {[WHEAT] = true, [CANOLA] = true}, cargo = cargo} end
|
|
local function base(over)
|
|
local input = {silos = {}, stores = {store("farm", 0, {[WHEAT] = 1000000, [CANOLA] = 1000000})}, loans = {}, vehicles = {}, paused = {}, maxVehicles = 2, minLiters = 10000}
|
|
for k, v in pairs(over or {}) do input[k] = v end
|
|
return input
|
|
end
|
|
|
|
-- kvalificering
|
|
local r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 9999})}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("under tærskel -> ingen afsendelse", #r.dispatch, 0)
|
|
check("under tærskel -> ingen status", #r.status, 0)
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 30000}, false)}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("uden markør -> noMarker", r.status[1].state, "noMarker")
|
|
check("uden markør -> ingen afsendelse", #r.dispatch, 0)
|
|
r = P.plan(base({stores = {store("farm", 0, {[CANOLA] = 1000000})}, silos = {silo("A", 500, {[WHEAT] = 30000})}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("ingen gård tager varen -> noFarmStore", r.status[1].state, "noFarmStore")
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 30000})}, vehicles = {vehicle("v1", 400, 50000)}, paused = {[P.key("A", WHEAT)] = true}}))
|
|
check("pause -> paused, ingen afsendelse", r.status[1].state .. #r.dispatch, "paused0")
|
|
|
|
-- afsendelse, fuldeste først, x-loft
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 20000}), silo("B", 900, {[WHEAT] = 80000})}, vehicles = {vehicle("v1", 400, 50000), vehicle("v2", 950, 50000), vehicle("v3", 1000, 50000)}}))
|
|
check("x=2 -> to afsendt", #r.dispatch, 2)
|
|
check("fuldeste silo først", r.dispatch[1].siloId, "B")
|
|
check("nærmeste vogn til B", r.dispatch[1].vehicleId, "v2")
|
|
check("B's rest (30000) får vogn nr. 2", r.dispatch[2].siloId, "B")
|
|
check("lager-markør med", r.dispatch[1].storeMarkerId, "farmm")
|
|
check("liter = vognens kapacitet", r.dispatch[1].liters, 50000)
|
|
check("anden tur = resten", r.dispatch[2].liters, 30000)
|
|
|
|
-- aktive lån tæller mod x og mod siloens rest
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 60000})}, loans = {{siloId = "A", fillType = WHEAT, liters = 50000}}, vehicles = {vehicle("v1", 400, 50000), vehicle("v2", 400, 50000)}}))
|
|
check("lån på vej -> rest 10000 -> én ny vogn", #r.dispatch, 1)
|
|
check("status viser på vej", r.status[1].onWay, 50000)
|
|
r = P.plan(base({maxVehicles = 1, silos = {silo("A", 500, {[WHEAT] = 90000})}, loans = {{siloId = "Z", fillType = WHEAT, liters = 1}}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("x=1 med ét lån ude -> ingen", #r.dispatch, 0)
|
|
check("frie pladser 0", r.freeSlots, 0)
|
|
|
|
-- flere varer i én silo = hver sin opgave
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 40000, [CANOLA] = 20000})}, vehicles = {vehicle("v1", 400, 50000), vehicle("v2", 410, 50000)}}))
|
|
check("to varer -> to afsendelser", #r.dispatch, 2)
|
|
check("fuldeste vare først", r.dispatch[1].fillType, WHEAT)
|
|
|
|
-- vogne der ikke kan
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 40000})}, vehicles = {vehicle("v1", 400, 50000, {[CANOLA] = true}), vehicle("v2", 2000, 50000)}}))
|
|
check("vogn der ikke kan bære varen springes over", r.dispatch[1].vehicleId, "v2")
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 40000})}, vehicles = {vehicle("v1", 400, 50000, nil, CANOLA), vehicle("v2", 2000, 50000)}}))
|
|
check("vogn med anden vare på springes over", r.dispatch[1].vehicleId, "v2")
|
|
r = P.plan(base({silos = {silo("A", 500, {[WHEAT] = 40000})}, vehicles = {vehicle("v1", 400, 0)}}))
|
|
check("vogn uden kapacitet -> ingen", #r.dispatch, 0)
|
|
|
|
-- lagervalg
|
|
r = P.plan(base({stores = {store("near", 400, {[WHEAT] = 20000}), store("far", 5000, {[WHEAT] = 900000})}, silos = {silo("A", 500, {[WHEAT] = 90000})}, vehicles = {vehicle("v1", 400, 50000), vehicle("v2", 400, 50000)}}))
|
|
check("nærmeste lager uden plads til læsset -> det med plads", r.dispatch[1].storeId, "far")
|
|
r = P.plan(base({stores = {store("small", 400, {[WHEAT] = 30000}), store("tiny", 300, {[WHEAT] = 15000})}, silos = {silo("A", 500, {[WHEAT] = 90000})}, vehicles = {vehicle("v1", 400, 50000), vehicle("v2", 400, 50000)}}))
|
|
check("intet har plads til hele læsset -> mest plads", r.dispatch[1].storeId, "small")
|
|
check("reserveret plads: vogn 2 til det andet lager", r.dispatch[2].storeId, "tiny")
|
|
r = P.plan(base({stores = {store("full", 400, {[WHEAT] = 5000})}, silos = {silo("A", 500, {[WHEAT] = 90000})}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("lager med under tærsklen -> noFarmStore", r.status[1].state, "noFarmStore")
|
|
|
|
-- input muteres ikke
|
|
local input = base({silos = {silo("A", 500, {[WHEAT] = 90000})}, vehicles = {vehicle("v1", 400, 50000)}})
|
|
P.plan(input)
|
|
check("input.stores urørt", input.stores[1].free[WHEAT], 1000000)
|
|
|
|
|
|
-- I1: lån på vej til et lager reserverer pladsen på tværs af planlægningsrunder
|
|
r = P.plan(base({stores = {store("s", 400, {[WHEAT] = 30000})}, silos = {silo("A", 500, {[WHEAT] = 90000})},
|
|
loans = {{siloId = "A", fillType = WHEAT, liters = 30000, storeId = "s"}}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("I1 lager fyldt af lån på vej -> ingen ny vogn dertil", #r.dispatch, 0)
|
|
r = P.plan(base({stores = {store("s", 400, {[WHEAT] = 30000}), store("t", 900, {[WHEAT] = 500000})}, silos = {silo("A", 500, {[WHEAT] = 90000})},
|
|
loans = {{siloId = "A", fillType = WHEAT, liters = 30000, storeId = "s"}}, vehicles = {vehicle("v1", 400, 50000)}}))
|
|
check("I1 næste vogn til det andet lager", r.dispatch[1] ~= nil and r.dispatch[1].storeId, "t")
|
|
|
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
|
os.exit(failures == 0 and 0 or 1)
|