mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-18 11:44:42 +02:00
importer for skins now w file picker
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
-- Skins tab Import button: picker plumbing + path/drop install (SKINIMP-01..05).
|
||||
package.path = "./?.lua;./?/init.lua;" .. package.path
|
||||
if not _G.love then _G.love = require("tests.love_stub") end
|
||||
|
||||
local S = require("tests.harness").suite("skin import picker")
|
||||
local eq = S.eq
|
||||
local check = S.check
|
||||
|
||||
local RomImporter = require("src.import.RomImporter")
|
||||
local TouchSkin = require("src.core.TouchSkin")
|
||||
|
||||
love.system = love.system or {}
|
||||
local saved = {
|
||||
pickFile = love.system.pickFile,
|
||||
getPickedFile = love.system.getPickedFile,
|
||||
getPickError = love.system.getPickError,
|
||||
installArchive = TouchSkin.installArchive,
|
||||
}
|
||||
|
||||
local installed
|
||||
TouchSkin.installArchive = function(name, data)
|
||||
installed = { name = name, data = data }
|
||||
if not data or data == "" then return nil, "empty archive" end
|
||||
return (name:match("([^/\\]+)$") or name):gsub("%.[Zz][Ii][Pp]$", "")
|
||||
end
|
||||
|
||||
local function freshImporter(fields)
|
||||
local imp = RomImporter.new(function() end, { launcher = true })
|
||||
imp.tab = "skins"
|
||||
imp._skins = {}
|
||||
imp._ensureSkins = function(self) return self._skins end
|
||||
for k, v in pairs(fields or {}) do imp[k] = v end
|
||||
return imp
|
||||
end
|
||||
|
||||
-- SKINIMP-01: a picker path installs as a skin, not a mod
|
||||
installed = nil
|
||||
local imp = freshImporter()
|
||||
local tmp = os.tmpname() .. ".zip"
|
||||
local f = assert(io.open(tmp, "wb"))
|
||||
f:write("PK\3\4skin-archive")
|
||||
f:close()
|
||||
imp:_installSkinZip(tmp)
|
||||
os.remove(tmp)
|
||||
check(installed ~= nil, "an absolute picker path reaches TouchSkin.installArchive")
|
||||
eq(installed.data, "PK\3\4skin-archive", "the picked file's bytes are installed")
|
||||
check(imp._skinNotice and imp._skinNotice.ok, "a good pick reports success")
|
||||
|
||||
-- SKINIMP-02: a dropped file still installs, and both paths land on the tab
|
||||
installed = nil
|
||||
imp = freshImporter({ tab = "red" })
|
||||
imp:filedropped({
|
||||
getFilename = function() return "/tmp/dropped_skin.zip" end,
|
||||
getSize = function() return 4 end,
|
||||
open = function() return true end,
|
||||
read = function() return "PKZP" end,
|
||||
close = function() return true end,
|
||||
})
|
||||
check(installed == nil, "a zip dropped off the skins tab is still a mod")
|
||||
installed = nil
|
||||
imp = freshImporter()
|
||||
imp:filedropped({
|
||||
getFilename = function() return "/tmp/dropped_skin.zip" end,
|
||||
getSize = function() return 4 end,
|
||||
open = function() return true end,
|
||||
read = function() return "PKZP" end,
|
||||
close = function() return true end,
|
||||
})
|
||||
eq(installed and installed.name, "/tmp/dropped_skin.zip",
|
||||
"a zip dropped on the skins tab installs as a skin")
|
||||
eq(imp.tab, "skins", "the skin install stays on the skins tab")
|
||||
|
||||
-- SKINIMP-03: the mobile bridge borrows the mod picker kind
|
||||
local requestedKind
|
||||
love.system.pickFile = function(kind)
|
||||
requestedKind = kind
|
||||
return true
|
||||
end
|
||||
love.system.getPickedFile = function() return nil end
|
||||
love.system.getPickError = function() return nil end
|
||||
imp = freshImporter({ nativePicker = true })
|
||||
imp:chooseSkin()
|
||||
eq(requestedKind, "mod", "chooseSkin opens the .zip picker")
|
||||
eq(imp.pickerPendingKind, "skin", "the pending pick is routed to the skins tab")
|
||||
|
||||
-- SKINIMP-04: the picked file comes back through update() as a skin
|
||||
installed = nil
|
||||
love.system.getPickedFile = function()
|
||||
love.system.getPickedFile = function() return nil end
|
||||
return "/picked/from_bridge.zip"
|
||||
end
|
||||
imp._installSkinZip = function(self, source)
|
||||
self.installedSource = source
|
||||
self._skinNotice = { ok = true, text = "Imported from_bridge" }
|
||||
end
|
||||
imp:update(0)
|
||||
eq(imp.installedSource, "/picked/from_bridge.zip",
|
||||
"update() hands the picked path to the skin installer")
|
||||
eq(imp.pickerPendingKind, nil, "the pending kind clears once consumed")
|
||||
|
||||
-- SKINIMP-05: a picker error lands on the skins notice, not the mods one
|
||||
love.system.getPickedFile = function() return nil end
|
||||
love.system.getPickError = function()
|
||||
love.system.getPickError = function() return nil end
|
||||
return "picker refused"
|
||||
end
|
||||
imp = freshImporter({ nativePicker = true, pickerPendingKind = "skin" })
|
||||
imp:update(0)
|
||||
check(imp._skinNotice and not imp._skinNotice.ok,
|
||||
"a failed skin pick reports on the skins tab")
|
||||
eq(imp.modNotice, nil, "a failed skin pick leaves the mods notice alone")
|
||||
|
||||
love.system.pickFile = saved.pickFile
|
||||
love.system.getPickedFile = saved.getPickedFile
|
||||
love.system.getPickError = saved.getPickError
|
||||
TouchSkin.installArchive = saved.installArchive
|
||||
|
||||
S.finish()
|
||||
Reference in New Issue
Block a user