-- Kør: luajit tests/test_adHitch.lua (fra repo-roden) dofile("FS25_ADSmartPickup/adHitch.lua") local H = ADHitch 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 -- markørnavne -> handling + navn (store/små bogstaver ligegyldigt) local function parsed(name) local a, n = H.parseMarker(name) return tostring(a) .. "|" .. tostring(n) end check("navn: Connect Bredal", parsed("Connect Bredal"), "attach|Bredal") check("navn: små bogstaver", parsed("connect bredal"), "attach|bredal") check("navn: dansk Kobl", parsed("Kobl Vogn 2"), "attach|Vogn 2") check("navn: kun Connect", parsed("Connect"), "attach|") check("navn: Connected er ikke en koblingsmarkør", parsed("Connected silo"), "nil|nil") check("navn: almindelig markør", parsed("Bredal"), "nil|nil") check("navn: nil", parsed(nil), "nil|nil") check("navn: Afkobl Bredal", parsed("Afkobl Bredal"), "detach|Bredal") check("navn: Kobl af er afkobling, ikke kobling", parsed("Kobl af Bredal"), "detach|Bredal") check("navn: Detach", parsed("detach"), "detach|") check("navn: Disconnect", parsed("Disconnect Vogn"), "detach|Vogn") -- bagerste redskaber: kun led bag traktoren (z < 0 i traktorens rum), ikke frontvægt/frontlæsser local rear = H.rearImplements({{name = "vægt", z = 3.1}, {name = "Bredal", z = -2.4}, {name = "læsser", z = 1.5}, {name = "plov", z = -1}}) check("bag: kun bagerste", #rear, 2) check("bag: første", rear[1].name, "Bredal") -- ankomst: AD er stoppet, traktoren står stille tæt på markøren check("ankomst: stoppet ved markør", H.hasArrived({adActive = false, distance = 1.2, speed = 0.1}), true) check("ankomst: AD kører stadig", H.hasArrived({adActive = true, distance = 0.5, speed = 0}), false) check("ankomst: for langt væk", H.hasArrived({adActive = false, distance = 9, speed = 0}), false) check("ankomst: ruller stadig", H.hasArrived({adActive = false, distance = 1, speed = 3}), false) -- efter at have bakket hen til vognen står traktoren længere fra markøren check("ankomst: bakket til vognen, udvidet afstand", H.hasArrived({adActive = false, distance = 9, speed = 0, arriveDistance = 13}), true) local crept = H.step(H.newJob(1, "Connect x", "attach"), {adActive = false, distance = 9, speed = 3, arriveDistance = 13}, 4000, false) check("vagt: bakket, ruller lidt -> ikke 'stoppedAway'", crept.state, "driving") -- vagten: efter ankomst forsøges koblingen et stykke tid, derefter opgives den local job = H.newJob(25, "Connect Bredal", "attach") check("job: venter på AD", job.state, "driving") check("job: handling", job.action, "attach") H.step(job, {adActive = true, distance = 30, speed = 10}, 1000, false) check("job: kører stadig", job.state, "driving") H.step(job, {adActive = false, distance = 1, speed = 0}, 500, false) check("job: ankommet, kobling ikke lykkedes endnu", job.state, "acting") H.step(job, {adActive = false, distance = 1, speed = 0}, 500, true) check("job: koblet på", job.state, "done") local failJob = H.newJob(25, "Connect Bredal", "attach") H.step(failJob, {adActive = false, distance = 1, speed = 0}, 500, false) for _ = 1, 20 do H.step(failJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("job: opgivet efter vagt-tid", failJob.state, "failed") check("job: årsag", failJob.reason, "noAttachable") local dropJob = H.newJob(9, "Afkobl Bredal", "detach") H.step(dropJob, {adActive = false, distance = 1, speed = 0}, 500, false) for _ = 1, 45 do H.step(dropJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("job: afkobling opgivet", dropJob.reason, "nothingToDetach") local lostJob = H.newJob(25, "Connect Bredal", "attach") H.step(lostJob, {adActive = false, distance = 40, speed = 0}, 500, false) check("job: AD ikke startet endnu (opstart-frist)", lostJob.state, "driving") H.step(lostJob, {adActive = true, distance = 40, speed = 5}, 500, false) H.step(lostJob, {adActive = false, distance = 40, speed = 0}, 500, false) check("job: AD stoppede langt fra markøren", lostJob.state, "failed") check("job: årsag stoppet undervejs", lostJob.reason, "stoppedAway") -- tur: "Connect Bredal > Start" -> to markørnavne local route = H.parseTrip("Connect", "Bredal", ">", "Start", ">", "Afkobl", "Bredal", ">", "Start") check("tur: antal trin", #route, 4) check("tur: første", route[1], "Connect Bredal") check("tur: tredje", route[3], "Afkobl Bredal") check("tur: ét trin", #H.parseTrip("Start"), 1) check("tur: tomme trin droppes", #H.parseTrip("Start", ">", ">", "Stop"), 2) -- trin: handling pr. markør; almindelige markører = ankom (og vent, hvis ikke sidste) check("trin: connect", H.stepAction("Connect Bredal"), "attach") check("trin: afkobl", H.stepAction("Afkobl Bredal"), "detach") check("trin: almindelig", H.stepAction("Start"), "arrive") check("vent: mellem trin", H.waitAfter("arrive", 2, 4), H.ROUTE_WAIT_MS) check("vent: ikke efter sidste", H.waitAfter("arrive", 4, 4), 0) check("vent: ikke efter kobling", H.waitAfter("attach", 1, 4), 0) local arriveJob = H.newJob(1, "Start", "arrive") H.step(arriveJob, {adActive = false, distance = 1, speed = 0}, 250, false) H.step(arriveJob, {adActive = false, distance = 1, speed = 0}, 250, true) check("trin: ankom er færdig", arriveJob.state, "done") local markers = {{name = "Start", id = 1}, {name = "Connect Bredal", id = 9}} check("markør: navn uden hensyn til store/små", H.findMarker(markers, "connect bredal").id, 9) check("markør: ukendt", H.findMarker(markers, "Stald"), nil) -- Connect = kun kobl på; i en tur kobles vognen af ved sin egen AD-parkering check("connect: kobl på", H.resolveAction("attach", false), "attach") check("connect med vogn: stadig kobl på (ingen vending)", H.resolveAction("attach", false), "attach") check("vognens parkering: kobl af", H.resolveAction("arrive", true), "detach") check("almindelig markør", H.resolveAction("arrive", false), "arrive") check("afkobl forbliver afkobl", H.resolveAction("detach", false), "detach") -- hjemtur: hvert puljeredskabs parkering (afkobles der), så traktorens egen parkering local home = H.homeRoute({4}, 2) check("hjem: to trin", #home, 2); check("hjem: redskab først", home[1], 4); check("hjem: traktor sidst", home[2], 2) check("hjem: uden redskab kun traktor", #H.homeRoute({}, 2), 1) check("hjem: samme parkering to gange tæller én", #H.homeRoute({4, 4}, 2), 2) check("hjem: uden traktorparkering", #H.homeRoute({4}, nil), 1) -- afbrydelse: et hente-job kan annulleres (Stop alt, høst slut, spilleren overtager) ADFieldWork = ADFieldWork or {startAd = function() end} Logging = Logging or {info = function() end, warning = function() end} local stubEnv = {ADGraphManager = {getMapMarkerByWayPointId = function() return {name = "Connect X"} end}, AutoDrive = {MODE_DRIVETO = 1}} local tractorStub = {getFullName = function() return "T" end, stopAutoDrive = function(v) v.stopped = true end} H.fetch(stubEnv, tractorStub, 9, function() end) check("annullér: job fandtes", H.cancel(tractorStub), true) check("annullér: AD stoppet", tractorStub.stopped, true) check("annullér: intet job tilbage", H.cancel(tractorStub), false) -- afkobling må tage længere tid (redskabet skal måske foldes ud først) local foldJob = H.newJob(4, "Plov", "detach") H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) for _ = 1, 16 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("afkobling: stadig i gang efter 8 s (folder ud)", foldJob.state, "acting") for _ = 1, 30 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("afkobling: opgivet efter sin frist", foldJob.state, "failed") -- afkobling bekræftes: først "done" når intet sidder bag traktoren efter et forsøg (in-game 29/9: loggede -- "koblede af", men vognen sad der stadig, og traktoren kørte med den) check("afkobl: redskab bagpå -> forsøg", H.detachStep(1, false), "attempt") check("afkobl: forsøgt, sidder der stadig -> forsøg igen", H.detachStep(1, true), "attempt") check("afkobl: forsøgt, intet bagpå -> færdig", H.detachStep(0, true), "done") check("afkobl: intet bagpå fra start", H.detachStep(0, false), "nothing") -- transport ved stop: sluk, løft, fold (in-game 29/9: redskaber kørte udfoldet hjem efter stop) check("transport: tændt+sænket+udfoldet", table.concat(H.stowActions({turnedOn = true, lowered = true, unfolded = true, canFold = true}), ","), "turnOff,raise,fold") check("transport: allerede klar", #H.stowActions({}), 0) check("transport: kan ikke foldes -> kun sluk/løft", table.concat(H.stowActions({turnedOn = true, lowered = true, unfolded = true, canFold = false}), ","), "turnOff,raise") check("transport: kun udfoldet", table.concat(H.stowActions({unfolded = true, canFold = true}), ","), "fold") print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)