Zum Inhalt springen

Modul:Test

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 10. Dezember 2022 um 23:29 Uhr durch Vollbracht (Diskussion | Beiträge) (AZ: Die Seite wurde neu angelegt: --[=[ 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 = {…). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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