<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ALua-mock%2FProgrammableFn</id>
	<title>Module:Lua-mock/ProgrammableFn - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ALua-mock%2FProgrammableFn"/>
	<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Lua-mock/ProgrammableFn&amp;action=history"/>
	<updated>2026-04-17T02:44:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://moasspedia.org/w/index.php?title=Module:Lua-mock/ProgrammableFn&amp;diff=2624&amp;oldid=prev</id>
		<title>Wikipedia&gt;Mr. Stradivarius: fix ValueMatcher import</title>
		<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Lua-mock/ProgrammableFn&amp;diff=2624&amp;oldid=prev"/>
		<updated>2019-05-01T14:48:28Z</updated>

		<summary type="html">&lt;p&gt;fix ValueMatcher import&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--- @classmod ProgrammableFn&lt;br /&gt;
--- Creates an easily programmable function for testing purposes.&lt;br /&gt;
-- Multiple behaviours can be defined.&lt;br /&gt;
-- A behaviour consists of a set of arguments and a set of return values.&lt;br /&gt;
-- If the function is called with these arguments it will return the programmed&lt;br /&gt;
-- return values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local ValueMatcher = require &amp;#039;Module:Lua-mock/ValueMatcher&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local ProgrammableFn = {}&lt;br /&gt;
ProgrammableFn.__index = ProgrammableFn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function behaviourReturnValues( behaviour )&lt;br /&gt;
    local next = behaviour.nextReturnSet&lt;br /&gt;
&lt;br /&gt;
    local returnSet = behaviour.returnSets[next]&lt;br /&gt;
&lt;br /&gt;
    if next &amp;lt; #behaviour.returnSets then&lt;br /&gt;
        next = next + 1&lt;br /&gt;
    else&lt;br /&gt;
        next = 1&lt;br /&gt;
    end&lt;br /&gt;
    behaviour.nextReturnSet = next&lt;br /&gt;
&lt;br /&gt;
    return table.unpack(returnSet)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ProgrammableFn:__call( ... )&lt;br /&gt;
    local behaviour = self:_findMatchingBehaviour({...})&lt;br /&gt;
    if not behaviour then&lt;br /&gt;
        error(&amp;#039;No matching behaviour for call.&amp;#039;, 2)&lt;br /&gt;
    end&lt;br /&gt;
    return behaviourReturnValues(behaviour)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ProgrammableFn:_findMatchingBehaviour( arguments )&lt;br /&gt;
    for _,behaviour in ipairs(self.behaviours) do&lt;br /&gt;
        if ValueMatcher.matches(arguments, behaviour.arguments) then&lt;br /&gt;
            return behaviour&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Creates a new behaviour entry or extends to one.&lt;br /&gt;
--&lt;br /&gt;
-- @param specification&lt;br /&gt;
-- The specification is a table, that contains the arguments that must match to&lt;br /&gt;
-- trigger this behaviour and the values that will be returned then.&lt;br /&gt;
-- Both are optional and can be passed like this:&lt;br /&gt;
-- `whenCalled{with={1,2}, thenReturn={3}}`&lt;br /&gt;
function ProgrammableFn:whenCalled( specification )&lt;br /&gt;
    local arguments = specification.with or {}&lt;br /&gt;
    local returnSet = specification.thenReturn or {}&lt;br /&gt;
&lt;br /&gt;
    local behaviour = self:_findMatchingBehaviour(arguments)&lt;br /&gt;
    if behaviour then&lt;br /&gt;
        table.insert(behaviour.returnSets, returnSet)&lt;br /&gt;
    else&lt;br /&gt;
        behaviour = {&lt;br /&gt;
            arguments = arguments,&lt;br /&gt;
            returnSets = { returnSet },&lt;br /&gt;
            nextReturnSet = 1&lt;br /&gt;
        }&lt;br /&gt;
        table.insert(self.behaviours, behaviour)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ProgrammableFn:reset()&lt;br /&gt;
    self.behaviours = {}&lt;br /&gt;
    return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return function()&lt;br /&gt;
    local self = {&lt;br /&gt;
        behaviours = {}&lt;br /&gt;
    }&lt;br /&gt;
    return setmetatable(self, ProgrammableFn)&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Mr. Stradivarius</name></author>
	</entry>
</feed>