function readfile(name) local f = io.open(name, "r") if not f then return nil end local s = f:read("*a") f:close() return s end function similar(s1, s2) return string.lower(string.gsub(s1 or "", "%s", "")) == string.lower(string.gsub(s2 or "", "%s", "")) end function fail(msg) msg = msg or "failed" error(msg, 2) end function compare(input, output) local original = readfile(input) local recovered = readfile(output) if original ~= recovered then fail("comparison failed") else print("ok") end end local G = _G local set = rawset local warn = print local setglobal = function(table, key, value) warn("changed " .. key) set(table, key, value) end setmetatable(G, { __newindex = setglobal })