diff --git a/FS25_ADSmartPickup/adFieldStorage.lua b/FS25_ADSmartPickup/adFieldStorage.lua index 979abb0..e15a42d 100644 --- a/FS25_ADSmartPickup/adFieldStorage.lua +++ b/FS25_ADSmartPickup/adFieldStorage.lua @@ -1,17 +1,41 @@ -- AD Field Storage --- Markernes trin/plan og markflåden gemmes i savegame-mappen ved siden af runs. +-- Markernes trin/plan og markflåden gemmes i savegame-mappen ved siden af runs. Hvert felt modellen gemmer +-- (ADFieldModel.toRecord) står i FIELD_TYPES med sin XML-type — en test sikrer at intet felt glemmes. ADFieldStorage = {} ADFieldStorage.FILE_NAME = "ADSmartPickup_fields.xml" ADFieldStorage.ROOT = "ADSmartPickupFields" +ADFieldStorage.FIELD_TYPES = { + id = "Int", stage = "String", mode = "String", product = "String", rake = "Int", store = "String", + rigs = "Int", unloaders = "Int", mulch = "Int", lime = "Int", soil = "String", sow = "Int", + sowFruit = "String", roll = "Int", fertilize = "Int", weed = "Int", + kind = "String", lastFruit = "String", care = "String", + mowWidth = "Float", mowVehicle = "String", rakeVehicle = "String", windrowOffset = "String", +} + function ADFieldStorage.getPath() local runsPath = ADRunsStorage ~= nil and ADRunsStorage.getPath() or nil if runsPath == nil then return nil end return (string.gsub(runsPath, ADRunsStorage.FILE_NAME .. "$", ADFieldStorage.FILE_NAME)) end +function ADFieldStorage.writeRecord(xmlFile, key, record) + for name, kind in pairs(ADFieldStorage.FIELD_TYPES) do + local value = record[name] + if value ~= nil then xmlFile["set" .. kind](xmlFile, key .. "#" .. name, value) end + end +end + +function ADFieldStorage.readRecord(xmlFile, key) + local record = {} + for name, kind in pairs(ADFieldStorage.FIELD_TYPES) do + record[name] = xmlFile["get" .. kind](xmlFile, key .. "#" .. name) + end + return record +end + function ADFieldStorage.save(state) local path = ADFieldStorage.getPath() if path == nil then return false end @@ -19,18 +43,7 @@ function ADFieldStorage.save(state) if xmlFile == nil then return false end local index = 0 for _, field in pairs(state.fields) do - local record = ADFieldModel.toRecord(field) - local key = string.format("%s.field(%d)", ADFieldStorage.ROOT, index) - xmlFile:setInt(key .. "#id", record.id) - xmlFile:setString(key .. "#stage", record.stage) - xmlFile:setString(key .. "#mode", record.mode) - xmlFile:setString(key .. "#product", record.product) - xmlFile:setInt(key .. "#rake", record.rake) - xmlFile:setString(key .. "#store", record.store) - xmlFile:setFloat(key .. "#mowWidth", record.mowWidth) - xmlFile:setString(key .. "#mowVehicle", record.mowVehicle) - xmlFile:setString(key .. "#rakeVehicle", record.rakeVehicle) - xmlFile:setString(key .. "#windrowOffset", record.windrowOffset) + ADFieldStorage.writeRecord(xmlFile, string.format("%s.field(%d)", ADFieldStorage.ROOT, index), ADFieldModel.toRecord(field)) index = index + 1 end local vehicleIndex = 0 @@ -50,14 +63,7 @@ function ADFieldStorage.load() local xmlFile = XMLFile.load("ADSmartPickupFields", path) if xmlFile == nil then return result end xmlFile:iterate(ADFieldStorage.ROOT .. ".field", function(_, key) - local field = ADFieldModel.fromRecord({ - id = xmlFile:getInt(key .. "#id"), stage = xmlFile:getString(key .. "#stage"), - mode = xmlFile:getString(key .. "#mode"), product = xmlFile:getString(key .. "#product"), - rake = xmlFile:getInt(key .. "#rake"), store = xmlFile:getString(key .. "#store"), - mowWidth = xmlFile:getFloat(key .. "#mowWidth"), mowVehicle = xmlFile:getString(key .. "#mowVehicle"), - rakeVehicle = xmlFile:getString(key .. "#rakeVehicle"), - windrowOffset = xmlFile:getString(key .. "#windrowOffset"), - }) + local field = ADFieldModel.fromRecord(ADFieldStorage.readRecord(xmlFile, key)) if field.id ~= nil then result.fields[field.id] = field end end) xmlFile:iterate(ADFieldStorage.ROOT .. ".fleet.vehicle", function(_, key) diff --git a/tests/test_adFieldStorage.lua b/tests/test_adFieldStorage.lua new file mode 100644 index 0000000..af4aa95 --- /dev/null +++ b/tests/test_adFieldStorage.lua @@ -0,0 +1,42 @@ +-- Kør: luajit tests/test_adFieldStorage.lua (fra repo-roden) +-- Lagringen skal dække HVERT felt modellen gemmer (FIELD_TYPES), og en mark skal overleve en tur gennem XML. +dofile("FS25_ADSmartPickup/adFieldModel.lua") +dofile("FS25_ADSmartPickup/adFieldStorage.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 + +-- falsk XMLFile: gemmer værdier pr. nøgle +local function fakeXml() + local values = {} + local xml = {} + for _, kind in ipairs({"Int", "String", "Float"}) do + xml["set" .. kind] = function(_, key, value) values[key] = value end + xml["get" .. kind] = function(_, key) return values[key] end + end + return xml +end + +local field = ADFieldModel.with(ADFieldModel.startCare(ADFieldModel.newField(77), "weeding"), { + kind = "harvest", lastFruit = "WHEAT", mowWidth = 40.8, mowVehicleId = "v1", rakeVehicleId = "v2", windrowOffset = -2.5, + plan = {mode = "auto", product = "harvest", rake = true, storeBuildingIds = {"b1"}, rigs = 3, unloaders = 2, + mulch = true, lime = false, soil = "plow", sow = true, sowFruit = "CANOLA", roll = true, fertilize = false, weed = false}, +}) +local record = ADFieldModel.toRecord(field) +for key in pairs(record) do + check("ST1 felt med i lagringen: " .. key, ADFieldStorage.FIELD_TYPES[key] ~= nil, true) +end +local xml = fakeXml() +ADFieldStorage.writeRecord(xml, "k", record) +local back = ADFieldModel.fromRecord(ADFieldStorage.readRecord(xml, "k")) +local again = ADFieldModel.toRecord(back) +for key, value in pairs(record) do + check("ST2 rundtur: " .. key, tostring(again[key]), tostring(value)) +end + +print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) +os.exit(failures == 0 and 0 or 1)