feat: ADSupplyPlanner — behovsrangering og ingrediensliste-tilstand
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
-- 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)
|
||||
|
||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
Reference in New Issue
Block a user