feat(marker): generisk lagring af alle plan-felter (test sikrer at intet felt glemmes)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user