Files
gen1recomp/tests/drivers/errorhandler_probe_bug1517_test.lua
T
bryanthaboi c0f4315cd8 Fix Gen 1/2 battle, menu, PC and audio parity gaps; wire luacheck into CI
CLOSES #1484, CLOSES #1486, CLOSES #1513, CLOSES #1517, CLOSES #1556, CLOSES #1564, CLOSES #1567
2026-08-21 19:22:34 -04:00

47 lines
2.2 KiB
Lua

-- Driver: #1517's other half, the error handler that hid the crash.
--
-- boot.lua's deferErrhand picks `love.errorhandler or love.errhand`, so a
-- love.errorhandler that returns nil ends love.run's `while func do` loop and
-- the process leaves to the OS with no error screen and nothing on stdout.
-- LOVE 11.5 pre-populates love.errhand only, so main.lua capturing
-- love.errorhandler captured nil and every Lua error in every shipped build
-- exited silently. Measured on the installed 11.5:
-- love.errorhandler type: nil / love.errhand type: function
--
-- Nothing here can be a unit test: the deliverable is whether a human sees
-- LOVE's blue error screen or an app that vanishes.
--
-- POKEPORT_TOUCH=0 \
-- POKEPORT_DRIVER=tests/drivers/errorhandler_probe_bug1517_test.lua love .
--
-- Pre-fix: the window closes on the first drawn frame after the probe arms,
-- exit 1, no output. Post-fix: the blue screen reads "bug1517: error-handler
-- probe" plus the lua-error.log hint, and stays up until it is dismissed.
return function(game)
local U = dofile("tests/drivers/util.lua")
U.log("[1517] love.errorhandler at boot was: "
.. (rawget(love, "errorhandler") and "a function" or "nil"))
U.log("[1517] love.errhand is: " .. type(rawget(love, "errhand")))
U.wait(30)
-- Raise from a draw callback, not from this coroutine: main.lua resumes the
-- driver under coroutine.resume and prints its errors itself, which is the
-- one path that does NOT reach love.errorhandler. StateStack:draw only
-- calls the states it is actually holding, so the probe goes on the live
-- top state rather than on game.overworld, which is not on the stack while
-- the title screen or the load menu is up.
local target = game.stack:top()
U.log("[1517] arming the probe on " .. tostring(target and target.screenId))
local realDraw = target.draw
target.draw = function(self, ...)
if realDraw then realDraw(self, ...) end
error("bug1517: error-handler probe")
end
U.log("[1517] armed; the next drawn frame raises from love.draw")
U.log("[1517] you should now see LOVE's blue error screen, not a closed app")
while true do coroutine.yield() end
end