Files
gen1recomp/tests/drivers/mart_split_stack_bug2671.lua
T

129 lines
4.6 KiB
Lua

-- engine/events/pokemart.asm:152
-- engine/items/inventory.asm:59
-- POKEPORT_DRIVER=tests/drivers/mart_split_stack_bug2671.lua POKEPORT_IDENTITY=bsa1005-red-2671 POKEPORT_VERSION=red love .
return function(game)
local U = dofile("tests/drivers/util.lua")
local DIR = os.getenv("POKEPORT_SHOT_DIR") or os.getenv("SHOT_DIR") or "/tmp/shots"
local Bag = require("src.inventory.Bag")
local Menu = require("src.ui.Menu")
local ListMenu = require("src.ui.ListMenu")
local QuantityBox = require("src.ui.QuantityBox")
local ChoiceBox = require("src.ui.ChoiceBox")
local TextBox = require("src.render.TextBox")
local failures = 0
local function check(label, ok)
if not ok then failures = failures + 1 end
U.log(ok and "PASS" or "FAIL", label)
return ok
end
local function top() return game.stack:top() end
local function topIs(cls) return getmetatable(top()) == cls end
local function waitFor(pred, frames)
for _ = 1, frames or 300 do
if pred() then return true end
U.wait(1)
end
return pred()
end
local function rows()
local out = {}
for _, r in ipairs(Bag.rows(game.save, game.data)) do
out[#out + 1] = r.id .. "x" .. tostring(r.count)
end
return table.concat(out, ",")
end
local function finish()
U.log(failures == 0 and "PASS mart_split_stack_bug2671"
or ("FAIL mart_split_stack_bug2671 (" .. failures .. " failures)"))
love.event.quit(failures == 0 and 0 or 1)
U.wait(600)
end
local MONEY = 104276
local ok, err = pcall(function()
game.save.money = MONEY
game.save.inventory = { X_ACCURACY = 2, POTION = 3 }
game.save.bagOrder = { "X_ACCURACY", "POTION" }
U.teleport(game, "CELADON_MART_5F", 5, 5, "up")
U.wait(10)
for _ = 1, 60 do
if topIs(Menu) then break end
U.tap(game, "a")
U.wait(4)
end
if not check("the X item clerk's mart menu opens", topIs(Menu)) then return end
local menu = top()
U.tap(game, "a")
if not check("BUY opens the list", waitFor(function() return topIs(ListMenu) end, 300)) then return end
local list = top()
check("the cursor is on X ACCURACY", list.items[list.index].value == "X_ACCURACY")
U.wait(4)
U.tap(game, "a")
if not check("the quantity box opens", waitFor(function() return topIs(QuantityBox) end, 30)) then return end
local qty = top()
check("the selector max stays 99", qty.max == 99)
U.wait(4)
U.tap(game, "down")
U.wait(4)
check("DOWN wraps to x99", qty.qty == 99)
U.still(game, DIR .. "/2671_01_buy_x99.png")
U.tap(game, "a")
if not check("YES/NO opens", waitFor(function()
if topIs(TextBox) and top().waiting then U.tap(game, "a") end
return topIs(ChoiceBox)
end, 600)) then return end
U.wait(4)
U.tap(game, "a")
local receipt
check("the clerk hands the items over", waitFor(function()
local t = top()
if getmetatable(t) == TextBox and t.pages then
local text = table.concat(t.pages[1] or {}, " ")
if text:find("Here you are", 1, true) then receipt = t return true end
if text:find("carry", 1, true) then return true end
end
return false
end, 600) and receipt ~= nil)
check("94050 is paid", game.save.money == MONEY - 94050)
check("the bag holds 101 X ACCURACY", game.save.inventory.X_ACCURACY == 101)
check("the overflow sits in a new last slot: " .. rows(),
rows() == "X_ACCURACYx99,POTIONx3,X_ACCURACYx2")
waitFor(function() return receipt.done end, 600)
U.still(game, DIR .. "/2671_02_here_you_are.png")
for _ = 1, 30 do
if top() == list then break end
U.tap(game, "a")
U.wait(4)
end
U.tap(game, "b")
if not check("B returns to BUY/SELL/QUIT", waitFor(function()
if topIs(TextBox) and top().waiting then U.tap(game, "a") end
return top() == menu
end, 600)) then return end
U.wait(4)
U.tap(game, "down")
U.wait(4)
U.tap(game, "a")
if not check("SELL opens the bag list", waitFor(function() return topIs(ListMenu) end, 300)) then return end
local sellList = top()
U.wait(30)
local counts = {}
for _, it in ipairs(sellList.items) do
if not it.cancel then counts[#counts + 1] = it.value .. "x" .. tostring(it.count) end
end
check("the sell list shows two X ACCURACY rows: " .. table.concat(counts, ","),
table.concat(counts, ",") == "X_ACCURACYx99,POTIONx3,X_ACCURACYx2")
U.still(game, DIR .. "/2671_03_sell_list_split_rows.png")
end)
if not ok then
failures = failures + 1
U.log("FAIL driver error:", tostring(err))
end
finish()
end