-------------------------------------------------------------------------------- -- Lua 5.2 compat if not setfenv then -- Lua 5.2 -- based on http://lua-users.org/lists/lua-l/2010-06/msg00314.html -- this assumes f is a function local function findenv(f) local level = 1 repeat local name, value = debug.getupvalue(f, level) if name == '_ENV' then return level, value end level = level + 1 until name == nil return nil end getfenv = function (f) return(select(2, findenv(f)) or _G) end setfenv = function (f, t) local level = findenv(f) if level then debug.setupvalue(f, level, t) end return f end end -------------------------------------------------------------------------------- local SUITE = require('TestSuite').new('resilience') SUITE:setEnviroment{ pretty = require('pretty'), setfenv = setfenv, } -------------------------------------------------------------------------------- -- Prevent usage of unknown options. SUITE:addTest('Dont allow unknown options', function () local error_msg = bad_call(pretty, 'Hello World', { some_random_option = true }) assert(error_msg) end) SUITE:addTest('Dont allow bad types in options', function () local error_msg = bad_call(pretty, 'Hello World', { max_depth = "hello world" }) assert(error_msg) end) SUITE:addTest('Dont allow bad values in recursion', function () local error_msg = bad_call(pretty, 'Hello World', { recursion = "hello world" }) assert(error_msg) end) -------------------------------------------------------------------------------- -- Survive not loading libs -- TODO: Find a way to test this. -------------------------------------------------------------------------------- -- Strange standard libs SUITE:addTest('no_std_lib', function () -- This tests whether one could load the library with an empty env, without -- an error. local env = {} local library = setfenv(loadfile('./library.lua'), env)() for func, func_info in pairs(library) do error(('For some reason %s is defined in the library'):format(func_info.name)) end end) SUITE:addTest('a_very_small_part_of_math', function () -- This tests whether one could load the library with an empty env, without -- an error. local env = { debug = debug, math = { abs = math.abs } } local library = setfenv(loadfile('./library.lua'), env)() assert( library[math.abs], 'Why is math.abs not defined in the library?' ) end) SUITE:addTest('redefined part of math', function () -- This tests whether the library ignores a redefined function of an -- builtin, when defining documentation. local env = { debug = debug, setfenv = setfenv, loadfile = function() end } local library = setfenv(loadfile('./library.lua'), env)() assert( library[env.setfenv], 'Why is setfenv not defined in the library?' ) assert( not library[env.loadfile], 'Why is loadfile defined in the library?' ) end) SUITE:addTest('redefined part of math 2', function () -- This tests whether the library allows a redefined function of an -- builtin, when defining documentation, due to not being able to determine -- the origin of the function. local env = { setfenv = setfenv, loadfile = function() end } local library = setfenv(loadfile('./library.lua'), env)() assert( library[env.setfenv], 'Why is setfenv not defined in the library?' ) assert( library[env.loadfile], 'Why is loadfile not defined in the library?' ) end) -------------------------------------------------------------------------------- return SUITE