mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
76ede1171e
- Save Editor (Gen 3): - Added full support for EV, IV, Nature, Ability, and Ribbons editing for Gen 3 Pokémon. - Implemented stat calculations, personality-based nature derivation, and Gen 3 save data structures. - Added comprehensive unit test suite in tests/save_editor_gen3_ev_iv_tests.lua. - GBA Extraction & Graphics: - Added zero-copy ARM-safe ROM accessor and fast LZ77 string decompression. - Fixed bag chrome decompression string-buffer indexing preventing solid-color renders. - Fixed TM Case HM badge tile offset and palette mapping. - Added builtin moves fallback in src/core/game3/battle/builtin_moves.lua. - Improved parallel extraction resilience, desktop fallback search paths, and prefix handling. - Android & Launchers: - Added dynamic high-res app launcher shortcuts and color palettes for all supported games. - Updated Android icon generator and intent dispatch handlers.
109 lines
4.1 KiB
Lua
109 lines
4.1 KiB
Lua
-- tests/engine/android_shortcuts_payload_test.lua
|
|
-- Tests Android dynamic shortcuts synchronization, launch options intent resolution,
|
|
-- and love.handlers.intent_game in-process game hot-swapping.
|
|
-- luajit tests/engine/android_shortcuts_payload_test.lua
|
|
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local T = require("tests.harness")
|
|
local check, eq = T.check, T.eq
|
|
love = love or require("tests.love_stub")
|
|
|
|
require("main")
|
|
|
|
-- 1. Verify LaunchOptions handles getLaunchGame on Android
|
|
local LaunchOptions = require("src.core.LaunchOptions")
|
|
|
|
local savedOS = love.system and love.system.getOS
|
|
local savedGetLaunchGame = love.system and love.system.getLaunchGame
|
|
|
|
love.system = love.system or {}
|
|
love.system.getOS = function() return "Android" end
|
|
love.system.getLaunchGame = function() return "gold" end
|
|
|
|
local game, slot = LaunchOptions.resolve({})
|
|
check(game == "gold", "LaunchOptions resolves intent game from love.system.getLaunchGame on Android")
|
|
|
|
local gameCli, slotCli = LaunchOptions.resolve({ "--game=red" })
|
|
check(gameCli == "red", "CLI --game flag overrides intent game")
|
|
|
|
-- 2. Verify RomImporter.syncAndroidShortcuts ranking and 4-item cap
|
|
local RomImporter = require("src.import.RomImporter")
|
|
|
|
local originalIsReady = RomImporter.isReady
|
|
local capturedShortcuts = nil
|
|
|
|
love.system.updateShortcuts = function(versions)
|
|
capturedShortcuts = versions
|
|
return true
|
|
end
|
|
|
|
-- Mock isReady
|
|
RomImporter.isReady = function(v)
|
|
return v == "red" or v == "gold" or v == "blue" or v == "yellow"
|
|
or v == "silver" or v == "crystal" or v == "firered" or v == "leafgreen"
|
|
end
|
|
|
|
local ok = RomImporter.syncAndroidShortcuts("gold")
|
|
check(ok == true, "syncAndroidShortcuts returns true on Android")
|
|
check(#capturedShortcuts == 4, "syncAndroidShortcuts caps at 4 items")
|
|
check(capturedShortcuts[1] == "gold", "activeVersion 'gold' is placed first")
|
|
check(capturedShortcuts[2] == "red" and capturedShortcuts[3] == "blue"
|
|
and capturedShortcuts[4] == "yellow",
|
|
"the rest follow GameVersion.ORDER until the cap")
|
|
|
|
capturedShortcuts = nil
|
|
RomImporter.syncAndroidShortcuts("silver")
|
|
check(#capturedShortcuts == 4, "a fifth ready game does not widen the payload")
|
|
check(capturedShortcuts[1] == "silver", "activeVersion 'silver' is placed first")
|
|
|
|
capturedShortcuts = nil
|
|
RomImporter.syncAndroidShortcuts("crystal")
|
|
check(#capturedShortcuts == 4, "nor does a sixth")
|
|
check(capturedShortcuts[1] == "crystal", "activeVersion 'crystal' is placed first")
|
|
check(capturedShortcuts[2] == "red" and capturedShortcuts[3] == "blue"
|
|
and capturedShortcuts[4] == "yellow",
|
|
"and the rest still follow GameVersion.ORDER until the cap")
|
|
|
|
capturedShortcuts = nil
|
|
RomImporter.syncAndroidShortcuts("firered")
|
|
check(#capturedShortcuts == 4, "firered shortcut sync caps at 4")
|
|
check(capturedShortcuts[1] == "firered", "activeVersion 'firered' is placed first")
|
|
|
|
capturedShortcuts = nil
|
|
RomImporter.syncAndroidShortcuts("leafgreen")
|
|
check(#capturedShortcuts == 4, "leafgreen shortcut sync caps at 4")
|
|
check(capturedShortcuts[1] == "leafgreen", "activeVersion 'leafgreen' is placed first")
|
|
|
|
-- Test with subset of ready games (e.g. only Red and Gold)
|
|
RomImporter.isReady = function(v)
|
|
return v == "red" or v == "gold"
|
|
end
|
|
|
|
capturedShortcuts = nil
|
|
RomImporter.syncAndroidShortcuts("red")
|
|
check(#capturedShortcuts == 2, "syncAndroidShortcuts only includes ready ROMs")
|
|
check(capturedShortcuts[1] == "red" and capturedShortcuts[2] == "gold", "ready ROMs correctly passed")
|
|
|
|
-- Test on non-Android platform (safe no-op)
|
|
love.system.getOS = function() return "Linux" end
|
|
capturedShortcuts = nil
|
|
local nonAndroidOk = RomImporter.syncAndroidShortcuts("red")
|
|
check(nonAndroidOk == false, "syncAndroidShortcuts safely no-ops on non-Android")
|
|
check(capturedShortcuts == nil, "no shortcuts updated on non-Android")
|
|
|
|
-- 3. Verify love.handlers.intent_game definition
|
|
check(type(love.handlers.intent_game) == "function", "main.lua defines love.handlers.intent_game")
|
|
|
|
-- Restore
|
|
RomImporter.isReady = originalIsReady
|
|
if savedOS then
|
|
love.system.getOS = savedOS
|
|
else
|
|
love.system.getOS = nil
|
|
end
|
|
love.system.getLaunchGame = savedGetLaunchGame
|
|
love.system.updateShortcuts = nil
|
|
|
|
T.finish("android_shortcuts_payload_test")
|