fix(marksilo): review — flerværdi-valg som MultiTextOption, lagerreservation på tværs af runder, vagt kun før start, rutetjek + straks-fejl pauses, rotation fra på lånte vogne, kræver parkering, flow-siloer udelades, slettede vogne og små rester håndteres
This commit is contained in:
@@ -12,13 +12,20 @@ local function check(name, actual, expected)
|
||||
end
|
||||
local loan = {startedMs = 0, lastProgressMs = 0, lastFill = 0}
|
||||
check("kører, tidligt -> behold", S.releaseReason(loan, {adActive = true, controlled = false, fill = 0, moving = true}, 5000), nil)
|
||||
check("AD slukket -> done", S.releaseReason(loan, {adActive = false, controlled = false, fill = 0}, 5000), "done")
|
||||
check("AD slukket efter 40 s -> done", S.releaseReason(loan, {adActive = false, controlled = false, fill = 0}, 40000), "done")
|
||||
check("spiller i vognen -> player", S.releaseReason(loan, {adActive = true, controlled = true, fill = 0}, 5000), "player")
|
||||
check("står stille uden fyld i 120 s -> stuck", S.releaseReason(loan, {adActive = true, controlled = false, fill = 0, moving = false}, 120001), "stuck")
|
||||
check("kører stadig efter 120 s -> behold", S.releaseReason(loan, {adActive = true, controlled = false, fill = 0, moving = true}, 120001), nil)
|
||||
local loading = {startedMs = 0, lastProgressMs = 110000, lastFill = 0}
|
||||
check("fyldning steg for nylig -> behold", S.releaseReason(loading, {adActive = true, controlled = false, fill = 20000, moving = false}, 125000), nil)
|
||||
|
||||
-- I2/I3: vagten gælder kun før turen er kommet i gang; AD der slukker straks uden fremdrift = fejl
|
||||
local going = {startedMs = 0, lastFill = 30000, hasProgressed = true}
|
||||
check("I2 i gang, står i kø 500 s -> behold", S.releaseReason(going, {adActive = true, controlled = false, fill = 30000, moving = false}, 500000), nil)
|
||||
check("I2 aflæsning (fyld falder) er fremdrift", S.releaseReason({startedMs = 0, lastFill = 30000}, {adActive = true, controlled = false, fill = 20000, moving = false}, 500000), nil)
|
||||
check("I3 AD slukket efter 10 s uden fremdrift -> failed", S.releaseReason({startedMs = 0, lastFill = 0}, {adActive = false, controlled = false, fill = 0}, 10000), "failed")
|
||||
check("I3 AD slukket efter 10 s med fremdrift -> done", S.releaseReason({startedMs = 0, lastFill = 0, hasProgressed = true}, {adActive = false, controlled = false, fill = 0}, 10000), "done")
|
||||
|
||||
-- Røgtest af spil-laget med mocks: planNow låner nærmeste tømmevogn, isLoaned = optaget,
|
||||
-- frakobling (setConfig enabled=false) stopper AD og frigiver (Review Focus).
|
||||
do
|
||||
@@ -34,7 +41,9 @@ do
|
||||
ADBuildings = {list = function() return {fieldSilo, farm} end,
|
||||
getMarkers = function(b, role) return {{id = b.id .. "-" .. role}} end}
|
||||
ADFields = {list = function() return {{id = 1}} end, fieldSilos = function() return {fieldSilo, farm} end}
|
||||
local started = {}
|
||||
local started, settingsSet, noPark, noRoute, residue = {}, {}, {}, {}, 0
|
||||
ADRunsController = {store = {runs = {}}, setSetting = function(_, v, name, value) settingsSet[v] = settingsSet[v] or {}; settingsSet[v][name] = value end}
|
||||
ADUnloadWait = {hasRouteTo = function(_, _, id) return not noRoute[id] end}
|
||||
local function makeVehicle(name, x)
|
||||
local module = {active = false}
|
||||
function module:setMode() end
|
||||
@@ -48,18 +57,23 @@ do
|
||||
stopAutoDrive = function(self) self.ad.stateModule.active = false; self.stopped = true end}
|
||||
end
|
||||
local near, far = makeVehicle("Nær", 900), makeVehicle("Fjern", 5000)
|
||||
local adEnv = {AutoDrive = {MODE_PICKUPANDDELIVER = 2,
|
||||
local adEnv = {AutoDrive = {MODE_PICKUPANDDELIVER = 2, RT_NONE = 0,
|
||||
getAllDischargeableUnits = function() return {{fillUnitIndex = 1, object = {
|
||||
getFillUnitCapacity = function() return 40000 end,
|
||||
getFillUnitSupportedFillTypes = function() return {[WHEAT] = true} end,
|
||||
getFillUnitFillLevel = function() return 0 end, getFillUnitFillType = function() return WHEAT end}}} end,
|
||||
getFillUnitFillLevel = function() return residue end, getFillUnitFillType = function() return WHEAT end}}} end,
|
||||
getAllUnits = function() return {} end, getAllFillLevels = function() return 0 end}}
|
||||
ADFieldWork = {
|
||||
getRigs = function() return {
|
||||
{id = "n", vehicle = near, role = "unloader", enabled = true, busy = S.isLoaned(near), controlled = false, x = 900, z = 0},
|
||||
{id = "f", vehicle = far, role = "unloader", enabled = true, busy = S.isLoaned(far), controlled = false, x = 5000, z = 0},
|
||||
{id = "h", vehicle = far, role = "harvester", enabled = true, busy = false, controlled = false, x = 1000, z = 0}} end,
|
||||
getRigs = function()
|
||||
local rigs = {}
|
||||
-- som spillets vehicleSystem: slettede køretøjer er ikke med
|
||||
if not near.isDeleted then table.insert(rigs, {id = "n", vehicle = near, role = "unloader", enabled = true, busy = S.isLoaned(near), controlled = false, x = 900, z = 0}) end
|
||||
if not far.isDeleted then table.insert(rigs, {id = "f", vehicle = far, role = "unloader", enabled = true, busy = S.isLoaned(far), controlled = false, x = 5000, z = 0}) end
|
||||
table.insert(rigs, {id = "h", vehicle = far, role = "harvester", enabled = true, busy = false, controlled = false, x = 1000, z = 0})
|
||||
return rigs
|
||||
end,
|
||||
enableParkAtJobFinished = function() end,
|
||||
parkMarkerId = function(_, v) if noPark[v] then return nil end return 777 end,
|
||||
startAd = function(_, v, _, first, second, fillType) v.ad.stateModule.active = true; table.insert(started, {v = v, first = first, second = second, fillType = fillType}) end,
|
||||
}
|
||||
S.setConfig(ADFieldSiloConfig.with(ADFieldSiloConfig.toggleStore(ADFieldSiloConfig.new(), "farm"), {enabled = true, maxVehicles = 1}))
|
||||
@@ -72,9 +86,52 @@ do
|
||||
check("RØG gårdlager er ikke marksilo", #plan.status, 1)
|
||||
check("RØG vognen er lånt", S.isLoaned(near), true)
|
||||
check("RØG x nået -> ingen flere", #S.planNow(adEnv).dispatch, 0)
|
||||
check("I4 rotation slået fra på lånt vogn", settingsSet[near] ~= nil and settingsSet[near].rotateTargets, 0)
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = false}))
|
||||
check("RØG frakobling stopper AD", near.stopped, true)
|
||||
check("RØG frakobling frigiver", S.isLoaned(near), false)
|
||||
|
||||
-- I5: vogn uden parkeringspunkt lånes ikke (ville blive holdende på lagerets markør)
|
||||
started = {}
|
||||
noPark[near] = true
|
||||
near.stopped = nil
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = true}))
|
||||
S.planNow(adEnv)
|
||||
check("I5 uden parkering -> fjern vogn med parkering", started[1] ~= nil and started[1].v.name, "Fjern")
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = false}))
|
||||
noPark[near] = nil
|
||||
|
||||
-- I3: ingen rute til siloen -> ingen afsendelse
|
||||
started = {}
|
||||
noRoute["fs-load"] = true
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = true}))
|
||||
S.planNow(adEnv)
|
||||
check("I3 ingen rute -> ingen afsendelse", #started, 0)
|
||||
noRoute["fs-load"] = nil
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = false}))
|
||||
|
||||
-- I6: silo der er kilde/mål i et flow er ikke marksilo
|
||||
ADRunsController.store.runs = {{kind = "supply", sourceBuildingIds = {}, targetBuildingIds = {"fs"}, storeBuildingIds = {}}}
|
||||
local silos = S.collectBuildings(adEnv)
|
||||
check("I6 silo i et flow tømmes ikke", #silos, 0)
|
||||
ADRunsController.store.runs = {}
|
||||
|
||||
-- M5: rest under 100 l tæller ikke som last
|
||||
residue = 50
|
||||
local vehicles = S.collectVehicles(adEnv)
|
||||
check("M5 rest på 50 l er ikke last", vehicles[1].cargo, nil)
|
||||
residue = 0
|
||||
|
||||
-- M4: slettet lånt vogn fjernes uden at vælte tick
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = true}))
|
||||
started = {}
|
||||
S.planNow(adEnv)
|
||||
local loaned = started[1] ~= nil and started[1].v or nil
|
||||
if loaned ~= nil then loaned.isDeleted = true end
|
||||
local okTick = pcall(S.tick, adEnv, 2000)
|
||||
check("M4 tick tåler slettet vogn", okTick, true)
|
||||
check("M4 slettet vogn frigivet", loaned ~= nil and S.isLoaned(loaned), false)
|
||||
S.setConfig(ADFieldSiloConfig.with(S.config, {enabled = false}))
|
||||
end
|
||||
|
||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||
|
||||
Reference in New Issue
Block a user