diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index a235441c..d60df0e7 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -330,6 +330,7 @@ local function commandOutput(command) end local IMPORTS_DIR = "imports" +local MODS_INBOX_DIR = "imports/mods" local ROM_BYTES = 1024 * 1024 -- Strip only a validated sdmc:/ prefix for OpenMTP/DBI relative paths. @@ -349,6 +350,19 @@ function RomImporter:ensureImportsDir() return false end +-- NX mod zip inbox (separate from ROM imports/). Parent imports/ first — +-- love.filesystem.createDirectory does not create nested parents. +function RomImporter:ensureModsInboxDir() + self:ensureImportsDir() + local info = love.filesystem.getInfo(MODS_INBOX_DIR) + if info and info.type == "directory" then return true end + if info then return false end + if love.filesystem.createDirectory then + return love.filesystem.createDirectory(MODS_INBOX_DIR) + end + return false +end + function RomImporter:_setNxInboxNotice(version) version = version or self.tab or "red" local saveDir = love.filesystem.getSaveDirectory() @@ -361,6 +375,17 @@ function RomImporter:_setNxInboxNotice(version) } end +function RomImporter:_setNxModsInboxNotice() + local saveDir = love.filesystem.getSaveDirectory() + local rel = RomImporter.mtpHintPath(saveDir) + if rel ~= "" and rel:sub(-1) ~= "/" then rel = rel .. "/" end + self.modNotice = { + ok = true, + text = Strings("Copy your .zip into:\n%s/imports/mods/\nDBI MTP → 1: SD Card/%simports/mods/", + saveDir, rel), + } +end + local function listRomPaths(dir) local paths = {} for _, name in ipairs(love.filesystem.getDirectoryItems(dir)) do diff --git a/tests/rom_importer_nx_mods_inbox_test.lua b/tests/rom_importer_nx_mods_inbox_test.lua new file mode 100644 index 00000000..352dd86e --- /dev/null +++ b/tests/rom_importer_nx_mods_inbox_test.lua @@ -0,0 +1,100 @@ +-- NX mods zip inbox: ensure imports/mods/, MTP hint (NXMOD-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("rom importer NX mods inbox") +local eq = S.eq +local check = S.check + +local RomImporter = require("src.import.RomImporter") + +love.system = love.system or {} +love.filesystem = love.filesystem or {} + +local saved = { + getOS = love.system.getOS, + getSaveDirectory = love.filesystem.getSaveDirectory, + createDirectory = love.filesystem.createDirectory, + remove = love.filesystem.remove, +} + +love.system.getOS = function() return "NX" end +love.filesystem.getSaveDirectory = function() + return "sdmc:/switch/gen1recomp/pokemon-love2d" +end + +local createdDirs = {} +love.filesystem.createDirectory = function(name) + createdDirs[name] = true + return true +end + +local removed = {} +love.filesystem.remove = function(name) + removed[name] = true + return saved.remove(name) +end + +package.loaded["src.core.Platform"] = nil +package.loaded["src.import.RomImporter"] = nil +RomImporter = require("src.import.RomImporter") + +local function clearModsInbox() + for _, name in ipairs(love.filesystem.getDirectoryItems("imports/mods") or {}) do + love.filesystem.remove("imports/mods/" .. name) + end + for _, name in ipairs(love.filesystem.getDirectoryItems("imports") or {}) do + love.filesystem.remove("imports/" .. name) + end +end + +local function freshImporter() + clearModsInbox() + createdDirs = {} + removed = {} + package.loaded["src.import.RomImporter"] = nil + RomImporter = require("src.import.RomImporter") + return setmetatable({ + isNX = true, + android = false, + launcher = true, + workState = nil, + tab = "mods", + modNotice = nil, + mods = {}, + ensureImportsDir = RomImporter.ensureImportsDir, + ensureModsInboxDir = RomImporter.ensureModsInboxDir, + _setNxModsInboxNotice = RomImporter._setNxModsInboxNotice, + }, RomImporter) +end + +-- NXMOD-01: ensureModsInboxDir creates imports/mods/ under save FS +createdDirs = {} +local ri = freshImporter() +ri:ensureModsInboxDir() +check(createdDirs.imports or createdDirs["imports/mods"], + "ensureModsInboxDir creates parent imports/ or nested path") +check(createdDirs["imports/mods"], + "ensureModsInboxDir creates imports/mods/") + +-- NXMOD-01: notice/hint includes save dir + relative imports/mods/ MTP path +ri = freshImporter() +ri:_setNxModsInboxNotice() +check(ri.modNotice ~= nil, "NX mods inbox notice is set") +check(ri.modNotice.text:find("sdmc:/switch/gen1recomp/pokemon-love2d/imports/mods/", 1, true), + "mods notice contains runtime save path + imports/mods/") +check(ri.modNotice.text:find("DBI MTP", 1, true) ~= nil, + "mods notice contains OpenMTP-oriented hint") +check(ri.modNotice.text:find("switch/gen1recomp/pokemon-love2d/imports/mods/", 1, true), + "hint uses sdmc-stripped relative imports/mods/ path") + +-- Cleanup + restore stubs +clearModsInbox() +love.system.getOS = saved.getOS +love.filesystem.getSaveDirectory = saved.getSaveDirectory +love.filesystem.createDirectory = saved.createDirectory +love.filesystem.remove = saved.remove +package.loaded["src.core.Platform"] = nil +package.loaded["src.import.RomImporter"] = nil + +S.finish() diff --git a/tests/run_tests.lua b/tests/run_tests.lua index 7d9f0588..d8a85a42 100644 --- a/tests/run_tests.lua +++ b/tests/run_tests.lua @@ -3375,6 +3375,7 @@ runSuites({ "tests/platform_nx_shell_gate_test.lua" }) runSuites({ "tests/platform_nx_network_gate_test.lua" }) runSuites({ "tests/rom_importer_nx_flags_test.lua" }) runSuites({ "tests/rom_importer_nx_inbox_test.lua" }) +runSuites({ "tests/rom_importer_nx_mods_inbox_test.lua" }) -- ---------------------------------------------- parity workstream tests -- Each tests/parity_*.lua is a self-contained file (own bootstrap + check, -- error()s if any assertion fails). Globbed, so dropping a new parity