Modul:Test
Erscheinungsbild
Vorlagenprogrammierung | Diskussionen | Lua | Unterseiten | |||
Modul | Deutsch | English
|
Modul: | Dokumentation |
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
--[=[ Test 2022-12-10
test a module
Autor: Vollbracht
* test.single(frame)
{{#invoke:Test|single |module=<module name> |expected=<html or wikitext>
|func=<function to be tested>
|<key=value> |<key=value> ... }}
{{#invoke:Test|single |module=<module name> |expected=<html or wikitext>
|func=<function to be tested>
|unnamed=<value>{!}<value>{!} ... }}
]=]
local p = {}
local err = {
[[<code><nowiki>{{#invoke:Test|single|module=<module name>
|expected=<html or wikitext> |func=<function to be tested>
|<key=value> |<key=value> ... }}</nowiki></code>]],
[[<code><nowiki>{{#invoke:Test|tr|module=<module name>
|expected=<html or wikitext> |func=<function to be tested>
|<key=value> |<key=value> ... }}</nowiki></code>]],
[[module not found: %s! Try module=<module name without preceeding "Module:"]],
[[No service "%s" exported by module "%s".]],
[[ Perhaps try "exportService=<service exported by module>"]],
[[No function %s.%s exported by module %s.]]
}
p.single = function(frame)
if not frame.args then return err[1] end
local modName = frame.args.module
if not modName then return err[1] end
frame.args.module = nil
local runtimeErr = ""
local testparams = nil
local funcName = frame.args.func
if not funcName then return err[1] end
frame.args.func = nil
local runtimeErrHandler = function(err)
runtimeErr = err
end
local success, Module = pcall(require, modName)
if not success or not Module then
mw.log(success)
return string.format(err[3], modName)
end
local func = Module[funcName]
local xpc = function()
return func(testparams)
end
local actualValue = ""
local call = ""
local expected = frame.args.expected
frame.args.expected = nil
if func then
call = '{{#invoke:' .. modName .. '|' .. funcName .. '(frame)'
local u = frame.args.unnamed
if u then
frame.args.unnamed = nil
if u:find('{!}', true) then
u = mw.text.split(u, '{!}', true)
for _, s in ipairs(u) do
table.insert(frame.args, s)
call = call .. '|' .. s
end
else
table.insert(frame.args, u)
call = call .. '|' .. u
end
else
for k, v in pairs(frame.args) do
call = call .. '|' .. k .. '=' .. v .. ' '
end
end
call = '<code><nowiki>' .. call .. '}}</nowiki></code>'
testparams = frame
success, runtimeErr, actualValue = xpcall(xpc, runtimeErrHandler)
if not success then
mw.log(call)
return call .. ' with error: ' .. runtimeErr
end
else
local exportName = frame.args.exportService
local export = nil
if exportName then
frame.args.exportService = nil
export = Module[exportName]
if not export then
return string.format(err[4], exportName, modName)
end
func = Module[export][funcName]
call = modName .. ' provided ' .. exportName .. '.' .. funcName
else
export = Module.service
if not export then
return string.format(err[4], "service", modName) .. err[5]
end
func = Module.service[funcName]
call = modName .. ' provided service.' .. funcName .. '('
end
if not func then
return string.format(err[6], "service", funcName, modName) .. err[5]
end
local uParam = frame.args.unnamed
if uParam then
frame.args.unnamed = nil
if uParam:find('{!}', true) then
local u = mw.text.split(uParam, '{!}', true)
table.insert(frame.args, u[1])
for i = 2, #u do
table.insert(frame.args, u[i])
call = call .. ', ' .. u[i]
end
else
table.insert(frame.args, uParam)
call = call .. uParam
end
end
call = call .. ')'
success, runtimeErr, actualValue = xpcall( func, runtimeErrHandler,
frame,
table.unpack(frame.args))
if not success then
mw.log(call)
return call .. ' with error: ' .. runtimeErr
end
end
local result = '{|\n!call\n|' .. call .. '\n|-\n!actual value\n|'
.. actualValue .. '\n|-\n'
if not expected then
result = result
.. '|colspan="2"|following call whould indicate success:\n|-\n'
.. '|colspan="2"|<code><nowiki>{{#invoke:Test{{!}}single {{!}}'
.. 'module=' .. modName .. ' {{!}}'
if exportName then
result = result .. 'exportService=' .. exportName .. ' {{!}}'
end
if uParam then
result = result .. 'unnamed=' .. uParam .. ' {{!}}'
else
for k, v in pairs(frame.args) do
result = result .. k .. '=' .. v .. ' {{!}}'
end
end
l = #result - 5
return result:sub(1, l) .. '}}</nowiki></code>\n|}'
end
if actualValue == expected then return result .. '|}' end
result = result .. '!expected value\n|' .. expected .. '\n|-\n'
local aList = mw.text.split(actualValue)
local eList = mw.text.split(actualValue)
local i = 1
local startS = ""
while i < #aList and i < #eList and aList[i] == eList[i] do
startS = startS .. aList[i]
i = i + 1
end
if startS ~= "" then
startS = '<span style="background-color:#bfa"><code><nowiki>'
.. startS .. '</nowiki></code></span>'
end
local ia = #aList
local ie = #eList
local endS = ""
while i < ia and i < ie and aList[ia] == eList[ie] do
endS = aList[ia] .. endS
ia = ia - 1
ie = ie - 1
end
if endS ~= "" then
endS = '<span style="background-color:#bfa"><code><nowiki>' .. endS
.. '</nowiki></code></span>'
end
local errSa = ""
if i <= ia then errSa = actualValue:sub(i, ia) end
if errSa ~= "" then
errSa = '<span style="background-color:#fba"><code><nowiki>'.. errSa
.. '</nowiki></code></span>'
else
errSa = '<span style="background-color:#fba"><code><nowiki>[__]</nowiki'
.. '></code></span>'
end
local errSe = ""
if i <= ie then errSe = expected:sub(i, ie) end
if errSe ~= "" then
errSe = '<span style="background-color:#fba"><code><nowiki>'.. errSa
.. '</nowiki></code></span>'
end
return result .. '|rowspan="2"|' .. startS .. errSa .. endS
.. '\n|-\n|rowspan="2"|' .. startS .. errSe .. endS .. '\n|}'
end
return p