-- Standalone test of accessibility/history.lua coalescing + review cursor. package.path = "./?.lua;" .. package.path -- Stub the speech module before history requires it. local spoken = {} package.loaded["accessibility.speech"] = { normalise = function(t) if t == nil then return nil end t = tostring(t):gsub("[\r\n]+", ". "):gsub("%s+", " "):gsub("^%s+",""):gsub("%s+$","") if t == "" then return nil end return t end, interrupt = function(t) spoken[#spoken+1] = t end, say = function(t) spoken[#spoken+1] = t end, } love = { system = { setClipboardText = function() end } } local history = require("accessibility.history") local failures = 0 local function check(label, got, want) if got ~= want then failures = failures + 1 print(string.format("FAIL %-42s got=%q want=%q", label, tostring(got), tostring(want))) else print(string.format("ok %-42s %s", label, tostring(got))) end end -- 1. plain append check("first append", history.append("You hit the rat."), "You hit the rat.") -- 2. coalescing matches the game's (xN) rendering history.append("You feel cold.") check("repeat -> x2", history.append("You feel cold."), "You feel cold. (x2)") check("repeat -> x3", history.append("You feel cold."), "You feel cold. (x3)") check("entry count after folds", history.count(), 2) -- 3. a different message breaks the fold check("new message", history.append("The rat dies."), "The rat dies.") check("entry count", history.count(), 3) -- 4. normalisation: newlines collapse, empties rejected check("nil rejected", history.append(nil), nil) check("blank rejected", history.append(" "), nil) check("newlines collapsed", history.append("a\nb"), "a. b") -- 5. review cursor spoken = {} history.reviewLast() check("reviewLast speaks newest", spoken[#spoken], "a. b. Last message") spoken = {} history.reviewPrevious() check("reviewPrevious steps back", spoken[#spoken], "The rat dies.") spoken = {} history.reviewFirst() check("reviewFirst", spoken[#spoken], "You hit the rat. First message") spoken = {} history.reviewPrevious() check("clamps at first", spoken[#spoken], "You hit the rat. First message") -- 6. cursor holds still while new lines arrive (the key requirement) history.reviewFirst() history.append("Something new happened.") spoken = {} history.reviewNext() check("cursor not yanked to tail", spoken[#spoken], "You feel cold. (x3)") -- 7. empty history history.clear() spoken = {} history.reviewNext() check("empty history", spoken[#spoken], "No messages") check("count after clear", history.count(), 0) print(failures == 0 and "\nALL PASS" or ("\n" .. failures .. " FAILURE(S)")) os.exit(failures == 0 and 0 or 1)