-- Kør: luajit tests/test_adCpBridge.lua (fra repo-roden) -- Kun getWorkWidth: variabel bredde (Unrealistic Pack) vinder over AI-markørernes grundbredde. dofile("FS25_ADSmartPickup/adCpBridge.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 function withMarkers(width) return {getAIMarkers = function() return 1, 2, 3, 4, width end} end -- W1: læssevogn med variabel bredde 20,4 + 20,4 = 40,8 m, AI-markører siger 2,4 m local wagon = withMarkers(2.4) wagon.getVariableWorkWidth = function(_, isLeft) return isLeft and 20.4 or -20.4, nil, true end local tractor = {getAttachedImplements = function() return {{object = wagon}} end} check("W1 variabel bredde", ADCpBridge.getWorkWidth(tractor), 40.8) -- W2: ugyldig variabel bredde -> AI-markører local plain = withMarkers(9.5) plain.getVariableWorkWidth = function() return 0, nil, false end check("W2 AI-markører", ADCpBridge.getWorkWidth(plain), 9.5) -- W3: selvkørende slåmaskine uden redskaber, kun variabel bredde local mower = {getVariableWorkWidth = function(_, isLeft) return isLeft and 20.4 or -20.4, nil, true end} check("W3 selvkørende", ADCpBridge.getWorkWidth(mower), 40.8) -- W4: Courseplays egen bredde (HUD'en) vinder — det er den marken køres med local cpVehicle = {getVariableWorkWidth = function(_, isLeft) return isLeft and 20.4 or -0.4, nil, true end, getCourseGeneratorSettings = function() return {workWidth = {getValue = function() return 40.8 end}} end} check("W4 Courseplay-bredde", ADCpBridge.getWorkWidth(cpVehicle), 40.8) -- W5: Courseplay-indstilling 0/ugyldig -> egen beregning local zeroCp = {getVariableWorkWidth = function(_, isLeft) return isLeft and 5 or -5, nil, true end, getCourseGeneratorSettings = function() return {workWidth = {getValue = function() return 0 end}} end} check("W5 CP 0 -> egen beregning", ADCpBridge.getWorkWidth(zeroCp), 10) -- WO: skårets sideforskydning på en river, målt fra nedlægningsområdet (venstre positiv), minus rivens -- egen CP-forskydning. Noder er tal; localToLocal-mock giver nodens x i traktorens ramme. local nodeX = {[11] = 2.0, [12] = 4.0, [21] = -1.0, [22] = 1.0} function localToLocal(node) return nodeX[node] or 0, 0, 0 end local function rake(dropIndex, runtime) local areas = { {start = 1, width = 2, height = 3, dropWindrowWorkAreaIndex = runtime and dropIndex or nil}, {start = 10, width = 11, height = 12}, {start = 20, width = 21, height = 22}, } return {spec_windrower = {}, spec_workArea = {workAreas = areas}, configFileName = "rake.xml"} end local sideRake = rake(2, true) local tractorWithRake = {rootNode = 100, getAttachedImplements = function() return {{object = sideRake}} end, getCpSettings = function() return {toolOffsetX = {getValue = function() return 0.5 end}} end} check("WO1 sideriver (runtime-felt)", ADCpBridge.getWindrowOffset(tractorWithRake), 2.5) local centerRake = rake(3, true) local tractorCenter = {rootNode = 100, getAttachedImplements = function() return {{object = centerRake}} end} check("WO2 midterrive", ADCpBridge.getWindrowOffset(tractorCenter), 0) -- WO3: runtime-felt mangler -> riverens XML (workArea(0) windrower#dropWindrowWorkAreaIndex = 2) ADCpBridge.readDropIndicesFromXml = function(fileName) return fileName == "rake.xml" and {[1] = 2} or {} end local xmlRake = rake(2, false) local tractorXml = {rootNode = 100, getAttachedImplements = function() return {{object = xmlRake}} end} check("WO3 fra XML", ADCpBridge.getWindrowOffset(tractorXml), 3) check("WO4 ingen river -> nil", ADCpBridge.getWindrowOffset({rootNode = 100}), nil) -- SR: sprøjte/spreder -> rolle ud fra fyldet check("SR gødning", ADCpBridge.sprayRoleForFillType("FERTILIZER"), "fertilizer") check("SR flydende", ADCpBridge.sprayRoleForFillType("LIQUIDFERTILIZER"), "fertilizer") check("SR gylle", ADCpBridge.sprayRoleForFillType("LIQUIDMANURE"), "fertilizer") check("SR møg", ADCpBridge.sprayRoleForFillType("MANURE"), "fertilizer") check("SR digestat", ADCpBridge.sprayRoleForFillType("DIGESTATE"), "fertilizer") check("SR kalk", ADCpBridge.sprayRoleForFillType("LIME"), "limer") check("SR ukrudt", ADCpBridge.sprayRoleForFillType("HERBICIDE"), "weeder") check("SR vand/ukendt", ADCpBridge.sprayRoleForFillType("WATER"), nil) -- HF: høsterens afgrøder fra skærebordet (liste eller opslag); finsnitter tager ingen local list = ADCpBridge.harvestFruitSet({fruitTypes = {3, 5}}) check("HF liste", list[3] and list[5], true) local lookup = ADCpBridge.harvestFruitSet({fruitTypes = {[3] = true}}) check("HF opslag", lookup[3], true) local forage = ADCpBridge.harvestFruitSet({fruitTypes = {3}, fruitTypeConverters = {[3] = {}}}) check("HF finsnitter tager intet", next(forage), nil) check("HF fruitTypeIndices", ADCpBridge.harvestFruitSet({fruitTypeIndices = {7}})[7], true) -- PL: plantbar i perioden local fruitPlant = {growthDataSeasonal = {periods = {[3] = {plantingAllowed = true}, [4] = {plantingAllowed = false}}}} check("PL tilladt", ADCpBridge.isPlantableIn(fruitPlant, 3), true) check("PL ikke nu", ADCpBridge.isPlantableIn(fruitPlant, 4), false) check("PL ukendt data = tilladt", ADCpBridge.isPlantableIn({}, 4), true) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)