<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AUnitTests%2Finvoke</id>
	<title>Modul:UnitTests/invoke - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AUnitTests%2Finvoke"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:UnitTests/invoke&amp;action=history"/>
	<updated>2026-05-21T15:09:04Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:UnitTests/invoke&amp;diff=2917409&amp;oldid=prev</id>
		<title>imported&gt;PerfektesChaos: 2020-04-21</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:UnitTests/invoke&amp;diff=2917409&amp;oldid=prev"/>
		<updated>2020-04-20T22:58:27Z</updated>

		<summary type="html">&lt;p&gt;2020-04-21&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local UnitTests = { suite  = &amp;quot;UnitTests&amp;quot;,&lt;br /&gt;
                    serial = &amp;quot;2020-04-21&amp;quot;,&lt;br /&gt;
                    sub    = &amp;quot;invoke&amp;quot;,&lt;br /&gt;
                    item   = 0 }&lt;br /&gt;
--[=[&lt;br /&gt;
UnitTests/invoke&lt;br /&gt;
Debug any Module from which this is required as a submodule.&lt;br /&gt;
Compare result after invoke and expectation.&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe = UnitTests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( alert )&lt;br /&gt;
    -- Format error by class=error&lt;br /&gt;
    return tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                            :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                            :wikitext( alert ) )&lt;br /&gt;
end -- fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fade( frame, apply, assign, allow )&lt;br /&gt;
    -- Escape wikisyntax into one line&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply   -- string, to be escaped&lt;br /&gt;
    --     assign  -- apply CSS style, if string&lt;br /&gt;
    --     allow   -- permit regular text, if true; else code&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, without line break&lt;br /&gt;
    local r = apply:gsub( string.char( 10 ),&lt;br /&gt;
                          mw.ustring.char( 182 ) )&lt;br /&gt;
    if allow then&lt;br /&gt;
        if assign then&lt;br /&gt;
            local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                             :attr( &amp;quot;style&amp;quot;, assign )&lt;br /&gt;
                             :wikitext( r )&lt;br /&gt;
            r = tostring( e )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local params = { r,&lt;br /&gt;
                         lang=&amp;quot;text&amp;quot;,&lt;br /&gt;
                         inline=&amp;quot;&amp;quot; }&lt;br /&gt;
        if assign then&lt;br /&gt;
            params.style = assign&lt;br /&gt;
        end&lt;br /&gt;
        r = frame:callParserFunction( &amp;quot;#tag:syntaxhighlight&amp;quot;, params )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fade()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fidelity( frame, action, args, alt, accept, approve )&lt;br /&gt;
    -- Show result; append string wikisyntax if differing&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     action   -- string, function&lt;br /&gt;
    --     args     -- table, with forwarded parameter values&lt;br /&gt;
    --     alt      -- table, with displayed parameter values&lt;br /&gt;
    --     accept   -- string, with expectation, or nil&lt;br /&gt;
    --     approve  -- string, with result&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local r, set, story&lt;br /&gt;
    for k, v in pairs( alt ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
            set = string.format( &amp;quot;%d&amp;quot;, k )&lt;br /&gt;
        else&lt;br /&gt;
            set = k&lt;br /&gt;
        end&lt;br /&gt;
        if story then&lt;br /&gt;
            story = story .. &amp;quot;|&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            story = &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        story = string.format( &amp;quot;%s%s=%s&amp;quot;, story, set, v )&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if story then&lt;br /&gt;
        story = story .. &amp;quot;}}&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        story = &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    r = &amp;quot;* &amp;#039;&amp;#039;&amp;quot; .. action .. &amp;quot;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
               .. fade( frame, story ) .. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
    if accept  and  accept ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        r = r .. fade( frame, accept )&lt;br /&gt;
    end&lt;br /&gt;
    if not accept  and  accept ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local e = mw.html.create( &amp;quot;code&amp;quot; )&lt;br /&gt;
                         :wikitext( &amp;quot;|_r_=&amp;quot; )&lt;br /&gt;
        r = string.format( &amp;quot;%s&amp;lt;br /&amp;gt;%s%s&amp;quot;,&lt;br /&gt;
                           r,&lt;br /&gt;
                           tostring( e ),&lt;br /&gt;
                           fade( frame, approve, &amp;quot;color:#8B008B&amp;quot; ) )&lt;br /&gt;
    elseif not approve  and  accept  and  accept ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        r = r .. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; .. fault( &amp;quot;&amp;#039;&amp;#039;no result&amp;#039;&amp;#039;&amp;quot; )&lt;br /&gt;
    elseif accept  and  approve  and  accept ~= approve then&lt;br /&gt;
        local j = -1&lt;br /&gt;
        local m = mw.ustring.len( accept )&lt;br /&gt;
        local n = mw.ustring.len( approve )&lt;br /&gt;
        local i, sub&lt;br /&gt;
        r = r .. &amp;quot;&amp;lt;br /&amp;gt;»&amp;quot;&lt;br /&gt;
        for i = 1, m do&lt;br /&gt;
            if mw.ustring.codepoint( accept, i, i ) ~=&lt;br /&gt;
               mw.ustring.codepoint( approve, i, i ) then&lt;br /&gt;
                j = i - 1&lt;br /&gt;
                break -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        if j &amp;gt; 0 then&lt;br /&gt;
            sub = mw.ustring.sub( accept, 1, j )&lt;br /&gt;
            r   = r .. fade( frame, sub )&lt;br /&gt;
            if n &amp;gt; j then&lt;br /&gt;
                r = r .. &amp;quot;&amp;amp;#182;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if n &amp;gt; j then&lt;br /&gt;
            local style = &amp;quot;color: #FF0000; font-weight: bold;&amp;quot;&lt;br /&gt;
            sub = mw.ustring.sub( approve,  j + 1 )&lt;br /&gt;
            r = string.format( &amp;quot;%s%s&amp;quot;,&lt;br /&gt;
                               r,  fade( frame, sub, style ) )&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;«&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fidelity()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Failsafe.failsafe = function ( atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     atleast  -- string, with required version or &amp;quot;wikidata&amp;quot; or &amp;quot;~&amp;quot;&lt;br /&gt;
    --                 or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2019-10-15&lt;br /&gt;
    local last  = ( atleast == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Failsafe.item&lt;br /&gt;
        since = false&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local entity = mw.wikibase.getEntity( string.format( &amp;quot;Q%d&amp;quot;,&lt;br /&gt;
                                                                 item ) )&lt;br /&gt;
            if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local seek = Failsafe.serialProperty or &amp;quot;P348&amp;quot;&lt;br /&gt;
                local vsn  = entity:formatPropertyValues( seek )&lt;br /&gt;
                if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                   type( vsn.value ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
                   vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    if last  and  vsn.value == Failsafe.serial then&lt;br /&gt;
                        r = false&lt;br /&gt;
                    else&lt;br /&gt;
                        r = vsn.value&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Failsafe.serial then&lt;br /&gt;
            r = Failsafe.serial&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Failsafe.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
function p.f( frame )&lt;br /&gt;
    local self = frame:getTitle()&lt;br /&gt;
    local subject = self:match( &amp;quot;^(.+)/[^/]+$&amp;quot; )&lt;br /&gt;
    local lucky, modt, r&lt;br /&gt;
    lucky, modt = pcall( require, subject )&lt;br /&gt;
    if type( modt ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local fun = frame.args[ &amp;quot;_f_&amp;quot; ]&lt;br /&gt;
        if fun then&lt;br /&gt;
            local funny = modt[ fun ]&lt;br /&gt;
            if funny then&lt;br /&gt;
                local should = frame.args[ &amp;quot;_r_&amp;quot; ]&lt;br /&gt;
                local params = { }&lt;br /&gt;
                local views  = { }&lt;br /&gt;
                for k, v in pairs( frame.args ) do&lt;br /&gt;
                    if type( k ) == &amp;quot;string&amp;quot;&lt;br /&gt;
                       and  k:sub( 1, 1 ) == &amp;quot;_&amp;quot; then&lt;br /&gt;
                        if k:match( &amp;quot;^_%l_$&amp;quot; ) then&lt;br /&gt;
                            k = false&lt;br /&gt;
                        else&lt;br /&gt;
                            k = k:match( &amp;quot;^__(.+)__$&amp;quot; )&lt;br /&gt;
                            if k then&lt;br /&gt;
                                if k:match( &amp;quot;^[0-9]%d*$&amp;quot; ) then&lt;br /&gt;
                                    k = tonumber( k )&lt;br /&gt;
                                end&lt;br /&gt;
                                views[ k ] = v&lt;br /&gt;
                                k          = false&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    if k then&lt;br /&gt;
                        params[ k ] = v&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for k, v&lt;br /&gt;
                frame.args = params&lt;br /&gt;
                lucky, r = pcall( funny, frame )&lt;br /&gt;
                if lucky then&lt;br /&gt;
                    for k, v in pairs( params ) do&lt;br /&gt;
                        if type( views[ k ] ) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
                            views[ k ] = v&lt;br /&gt;
                        end&lt;br /&gt;
                    end -- for k, v&lt;br /&gt;
                    r = fidelity( frame, fun, params, views, should, r )&lt;br /&gt;
                else&lt;br /&gt;
                    r = fault( string.format( &amp;quot;%s %s&amp;quot;, self, r ) )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = fault( string.format( &amp;quot;%s * function %s unknown&amp;quot;,&lt;br /&gt;
                                          subject, fun ) )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = fault( self .. &amp;quot; * no fun&amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = fault( self .. &amp;quot; &amp;quot; .. modt )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.f&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    -- Versioning interface&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local since&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ]&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Failsafe.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe()&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;PerfektesChaos</name></author>
	</entry>
</feed>