-- lib-sporel.launcher-test — P.3.4 -- 11 assertions: 5 FSM transitions + 1 FSM stability + 5 Engine-Surface existence. -- (measure_text runtime-behavior check dropped — needs Raylib font, not loaded in headless test-mode.) -- Pattern follows P.3.1 Test-Module-Pattern; TAP output via engine.test.* -- FSM-Source: byte-identical Kopie aus modules/lib-sporel.launcher/fsm.lua. -- Sporel-Resolver lehnt module-als-dep ab (nur lib-deps werden resolved), -- daher hat dieses Test-Modul seine eigene fsm.lua. Drift wird via Smoke- -- diff-check verhindert (siehe smoke.sh P0-S15-pre). local M = {} local fsm = dofile(engine.module.dir_of("lib-sporel.launcher-test") .. "/fsm.lua") function M.run_tests(ctx) -- FSM transitions (5) engine.test.equals(fsm.next(fsm.STATE_LIST, "esc"), fsm.STATE_QUIT_CONFIRM, "list+esc -> quit_confirm") engine.test.equals(fsm.next(fsm.STATE_QUIT_CONFIRM, "esc"), fsm.STATE_LIST, "quit_confirm+esc -> list") engine.test.equals(fsm.next(fsm.STATE_QUIT_CONFIRM, "enter"), fsm.EXIT, "quit_confirm+enter -> exit") engine.test.equals(fsm.next(fsm.STATE_QUIT_CONFIRM, "click_yes"), fsm.EXIT, "quit_confirm+click_yes -> exit") engine.test.equals(fsm.next(fsm.STATE_QUIT_CONFIRM, "click_no"), fsm.STATE_LIST, "quit_confirm+click_no -> list") -- FSM stability (1) engine.test.equals(fsm.next(fsm.STATE_LIST, "click_module"), fsm.STATE_LIST, "list+click_module -> list (switch is side-effect)") -- Engine-surface existence (6) engine.test.assert(type(engine.module.list) == "function", "engine.module.list is function") engine.test.assert(type(engine.module.dir_of) == "function", "engine.module.dir_of is function") engine.test.assert(type(engine.render.draw_text) == "function", "engine.render.draw_text is function") engine.test.assert(type(engine.render.measure_text) == "function", "engine.render.measure_text is function") engine.test.assert(type(engine.module.list()) == "table", "engine.module.list() returns table") end return M