-- Kør: luajit tests/test_adWaitPool.lua (fra repo-roden) -- Wait-puljen: kandidater pr. mappe, reservationer, nærmeste ledige, rutetjek, redirect. dofile("FS25_ADSmartPickup/adSupplyPlanner.lua") dofile("FS25_ADSmartPickup/adWaitPool.lua") 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 markers, wayPoints = {}, {} local function addMarker(id, name, group, x, z) wayPoints[id] = {id = id, x = x, z = z, incoming = {}} local marker = {id = id, markerIndex = #markers + 1, name = name, group = group} table.insert(markers, marker) return marker end local unreachable = {} local adEnv = { ADGraphManager = { getMapMarkers = function() return markers end, getMapMarkerByWayPointId = function(_, id) for _, m in ipairs(markers) do if m.id == id then return m end end end, getWayPointById = function(_, id) return wayPoints[id] end, getPathTo = function(_, vehicle, id) if unreachable[id] then return {} end return {{id = id}} end, pathFromTo = function(_, from, to) if unreachable[to] then return {} end return {{id = to}} end, }, } getWorldTranslation = function(node) return node.x, 0, node.z end addMarker(10, "cow wait 1", "cow wait", 0, 0) addMarker(11, "cow wait 2", "cow wait", 50, 0) addMarker(20, "Wait 3", "General Wait", 10, 0) addMarker(30, "silo 1", "silo", 5, 0) -- W1: kandidater check("W1 kun mappen", #ADWaitPool.getCandidates(adEnv, "cow wait"), 2) check("W1 tom pulje = alle Wait-mapper", #ADWaitPool.getCandidates(adEnv, ""), 3) check("W1 nil = alle", #ADWaitPool.getCandidates(adEnv, nil), 3) -- W2: nærmeste ledige fra vognens position; reserverede springes over; egen reservation OK local v1, v2 = {name = "v1", rootNode = {x = 45, z = 0}}, {name = "v2", rootNode = {x = 45, z = 0}} check("W2 nærmeste", ADWaitPool.pickFree(adEnv, v1, "cow wait").marker.id, 11) ADWaitPool.claim(11, v1) check("W2 reserveret springes over", ADWaitPool.pickFree(adEnv, v2, "cow wait").marker.id, 10) check("W2 egen reservation genbruges", ADWaitPool.pickFree(adEnv, v1, "cow wait").marker.id, 11) -- W3: claim / owner / release check("W3 ejer", ADWaitPool.getOwner(11), v1) ADWaitPool.releaseVehicle(v1) check("W3 frigivet", ADWaitPool.getOwner(11), nil) check("W3 nu ledig for v2", ADWaitPool.pickFree(adEnv, v2, "cow wait").marker.id, 11) -- W4: nåelighed unreachable[11] = true check("W4 uopnåelig nærmeste -> næste", ADWaitPool.pickFree(adEnv, v2, "cow wait", function(c) return ADWaitPool.hasRouteTo(adEnv, v2, c.marker.id) end).marker.id, 10) check("W4 hasRouteTo false", ADWaitPool.hasRouteTo(adEnv, v2, 11), false) check("W4 hasRouteBothWays true", ADWaitPool.hasRouteBothWays(adEnv, v2, 10, 30), true) check("W4 hasRouteBothWays hjem uopnåelig", ADWaitPool.hasRouteBothWays(adEnv, v2, 10, 11), false) unreachable[11] = nil check("W4 intet punkt -> nil", ADWaitPool.pickFree(adEnv, v2, "cow wait", function() return false end), nil) -- W5: getClaims sorteret på mappe, dernæst id ADWaitPool.claim(20, v2) ADWaitPool.claim(10, v1) local claims = ADWaitPool.getClaims(adEnv) check("W5 to reservationer", #claims, 2) check("W5 første = General Wait", claims[1].marker.group, "General Wait") check("W5 anden = cow wait 1", claims[2].marker.id, 10) ADWaitPool.releaseVehicle(v1) ADWaitPool.releaseVehicle(v2) check("W5 alt frigivet", #ADWaitPool.getClaims(adEnv), 0) -- W6: redirect stopper trigger-aktivitet og sætter sti local stopped = {} local task = { destinationID = 99, state = 1, vehicle = {ad = { trailerModule = {isActiveAtTrigger = function() return true end, stopUnloading = function() stopped.unload = true end, stopLoading = function() stopped.load = true end}, drivePathModule = {setPathTo = function(_, id) stopped.pathTo = id end}, }}, } ADWaitPool.STATE_DRIVING = 2 ADWaitPool.redirect(task, 10) check("W6 destination", task.destinationID, 10) check("W6 state driving", task.state, 2) check("W6 setPathTo", stopped.pathTo, 10) check("W6 stopUnloading", stopped.unload, true) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)