8c76790ece
Lagervarer tømmes stadig mindst-fyldte-først; varer hvis tanke løber fulde og stopper produktionen hentes fyldest-først (ADSupplyPlanner.FULLEST_FIRST_FILL_TYPES). Strategien vises i loggen. fix: en trigger foran næsen tæller aldrig som markørens egen (tolerance 2 -> 0). Markør-drift i ensilage-rækken lod næste tanks rør (1,9 m foran) vinde. Verificeret mod savegame: 40/40 siloer, 7/7 ensilage-tanke, 0 dropof.
67 lines
3.6 KiB
Lua
67 lines
3.6 KiB
Lua
-- Kør: luajit tests/test_adSupplyPlanner.lua (fra repo-roden)
|
|
-- Tester de rene behovs-funktioner; ingen spil- eller AutoDrive-mocks nødvendige.
|
|
|
|
dofile("FS25_ADSmartPickup/adSupplyPlanner.lua")
|
|
|
|
local HAY, GRASS, SILAGE = 20, 21, 22
|
|
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
|
|
|
|
-- scoreNeed: tommere lager scorer højere; ugyldig kapacitet giver 0
|
|
check("tomt scorer højere end halvfuldt", ADSupplyPlanner.scoreNeed(0, 1000, 1000) > ADSupplyPlanner.scoreNeed(500, 1000, 500), true)
|
|
check("kapacitet 0 giver score 0", ADSupplyPlanner.scoreNeed(0, 0, 0), 0)
|
|
|
|
-- rankNeeds: mest trængende først, fulde springes over, input muteres ikke
|
|
local needs = {
|
|
{fillType = HAY, level = 80000, capacity = 100000},
|
|
{fillType = GRASS, level = 20000, capacity = 100000},
|
|
{fillType = SILAGE, level = 99500, capacity = 100000},
|
|
}
|
|
local ranked = ADSupplyPlanner.rankNeeds(needs)
|
|
check("fuld ingrediens springes over", #ranked, 2)
|
|
check("mest trængende først", ranked[1].fillType, GRASS)
|
|
check("dernæst næstmest trængende", ranked[2].fillType, HAY)
|
|
check("freeSpace beregnes", ranked[1].freeSpace, 80000)
|
|
check("input muteres ikke", needs[1].freeSpace, nil)
|
|
check("tom liste giver tom liste", #ADSupplyPlanner.rankNeeds({}), 0)
|
|
|
|
-- rankNeeds: deterministisk ved lige score (laveste fillType først)
|
|
local tie = ADSupplyPlanner.rankNeeds({
|
|
{fillType = SILAGE, level = 0, capacity = 5000},
|
|
{fillType = HAY, level = 0, capacity = 5000},
|
|
})
|
|
check("lige score -> laveste fillType først", tie[1].fillType, HAY)
|
|
|
|
-- resolveIngredients
|
|
local multi = {HAY, GRASS}
|
|
local resolved = ADSupplyPlanner.resolveIngredients(nil, multi)
|
|
check("multi-valg bliver ingrediensliste", #resolved, 2)
|
|
check("listen er en kopi", resolved ~= multi, true)
|
|
check("enkelt-valg uden tilstand -> nil", ADSupplyPlanner.resolveIngredients(nil, {HAY}), nil)
|
|
local state = {ingredients = {HAY, GRASS, SILAGE}, narrowedTo = GRASS}
|
|
check("indsnævret valg genbruger gemt liste", #ADSupplyPlanner.resolveIngredients(state, {GRASS}), 3)
|
|
check("bruger valgte andet -> nil", ADSupplyPlanner.resolveIngredients(state, {HAY}), nil)
|
|
check("nyt multi-valg erstatter gemt liste", #ADSupplyPlanner.resolveIngredients(state, {HAY, SILAGE}), 2)
|
|
check("ugyldigt valg -> nil", ADSupplyPlanner.resolveIngredients(state, nil), nil)
|
|
|
|
-- Kildestrategi: lager-siloer tømmes mindst-først; tanke der løber fulde (mælk, gylle) fyldest-først
|
|
check("mælk hentes fyldest-først", ADSupplyPlanner.prefersFullestSource({"MILK"}), true)
|
|
check("gylle hentes fyldest-først", ADSupplyPlanner.prefersFullestSource({"LIQUIDMANURE"}), true)
|
|
check("roer hentes mindst-først", ADSupplyPlanner.prefersFullestSource({"SUGARBEET"}), false)
|
|
check("blandet valg -> mindst-først", ADSupplyPlanner.prefersFullestSource({"MILK", "WHEAT"}), false)
|
|
check("ukendt/tomt valg -> mindst-først", ADSupplyPlanner.prefersFullestSource({}), false)
|
|
check("mindst-først: lavere niveau er bedre", ADSupplyPlanner.isBetterSource(100, 500, false), true)
|
|
check("mindst-først: højere niveau er ikke bedre", ADSupplyPlanner.isBetterSource(900, 500, false), false)
|
|
check("fyldest-først: højere niveau er bedre", ADSupplyPlanner.isBetterSource(900, 500, true), true)
|
|
check("første kandidat er altid bedre end ingen", ADSupplyPlanner.isBetterSource(900, nil, false), true)
|
|
|
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
|
os.exit(failures == 0 and 0 or 1)
|