Jump to content

Module:Template test case: Difference between revisions

move the logic for finding the options into the exports - it seemed a bit unintuitive to have invocation objects handling argument code as well
(move arg-trimming code to the TableInvocation class)
(move the logic for finding the options into the exports - it seemed a bit unintuitive to have invocation objects handling argument code as well)
Line 59: Line 59:


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Invocation class
-- TestCase class
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


local Invocation = {}
local TestCase = {}
Invocation.__index = Invocation
TestCase.__index = TestCase


function Invocation.new()
function TestCase.new(invocationObj)
local obj = setmetatable({}, TableInvocation)
checkType('TestCase.new', 'invocationObj', invocationObj, 'table')
local obj = setmetatable({}, TestCase)
return obj
return obj
end
end


function Invocation:setOptions(t)
--------------------------------------------------------------------------------
self._options = t
-- Test case display functions
end
--
 
-- Test case display functions produce the wikitext to display the template
function Invocation:getOptions()
-- output for one test case. For example, one function might produce templates
return self._options
-- aligned horizontally, and another function might produce templates aligned
end
-- one below the other.
--
-- They are named functions that accept the following parameters:
-- * templates - an array of subtables containing data about each template to be
--    displayed. These subtables can contain the following values:
--    * result - the expanded wikitext from the template.
--    * invocation - the original unexpanded wikitext that the output was
--        generated from. This may be nil if the invocation is not available.
--    * name - the name of the template.
--    * link - a normal wikilink to the template page (displays as
--        "Template:Foo").
--    * braceLink - a wikilink to the template page formatted like the {{tl}}
--        template, i.e. it displays as "{{Foo}}".
--    * heading - a heading to display above the template output.
--------------------------------------------------------------------------------


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Line 82: Line 97:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


local NowikiInvocation = setmetatable({}, Invocation)
local NowikiInvocation = {}
NowikiInvocation.__index = NowikiInvocation
NowikiInvocation.__index = NowikiInvocation


function NowikiInvocation.new(args)
function NowikiInvocation.new(invocation)
checkType('NowikiInvocation.new', 'args', args, 'table')
local obj = setmetatable({}, NowikiInvocation)
local obj = Invocation.new()
obj.invocation = mw.text.unstrip(invocation)
setmetatable(obj, NowikiInvocation)
 
obj.invocation = mw.text.unstrip(args.invocation)
args.invocation = nil
local options = {}
for k, v in pairs(args) do
options[k] = v
end
obj.options = options
 
return obj
return obj
end
end
Line 129: Line 134:
TableInvocation.__index = TableInvocation
TableInvocation.__index = TableInvocation


function TableInvocation.new(args)
function TableInvocation.new(invokeArgs)
checkType('TableInvocation.new', 'args', args, 'table')
local obj = setmetatable({}, TableInvocation)
local obj = Invocation.new()
setmetatable(obj, TableInvocation)
 
local rawOptions, invokeArgs = {}, {}
for k, v in pairs(args) do
local optionKey = type(k) == 'string' and k:match('^_(.*)$')
if optionKey then
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
rawOptions[optionKey] = v
end
else
invokeArgs[k] = v
end
end
obj.invokeArgs = invokeArgs
obj.invokeArgs = invokeArgs
local options, templateOptions = parseTemplateOptions(rawOptions)
obj:setOptions(options)
obj:setTemplateOptions(templateOptions)
return obj
return obj
end
end
Line 169: Line 153:
}
}
end
end
-------------------------------------------------------------------------------
-- TestCase class
-------------------------------------------------------------------------------
local TestCase = {}
TestCase.__index = TestCase
function TestCase.new(invocationObj)
checkType('TestCase.new', 'invocationObj', invocationObj, 'table')
local obj = setmetatable({}, TestCase)
return obj
end
--------------------------------------------------------------------------------
-- Test case display functions
--
-- Test case display functions produce the wikitext to display the template
-- output for one test case. For example, one function might produce templates
-- aligned horizontally, and another function might produce templates aligned
-- one below the other.
--
-- They are named functions that accept the following parameters:
-- * templates - an array of subtables containing data about each template to be
--    displayed. These subtables can contain the following values:
--    * result - the expanded wikitext from the template.
--    * invocation - the original unexpanded wikitext that the output was
--        generated from. This may be nil if the invocation is not available.
--    * name - the name of the template.
--    * link - a normal wikilink to the template page (displays as
--        "Template:Foo").
--    * braceLink - a wikilink to the template page formatted like the {{tl}}
--        template, i.e. it displays as "{{Foo}}".
--    * heading - a heading to display above the template output.
--------------------------------------------------------------------------------


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Line 222: Line 171:


function p._table(args)
function p._table(args)
local invocation = TableInvocation.new(args)
local options, invokeArgs = {}, {}
for k, v in pairs(args) do
local optionKey = type(k) == 'string' and k:match('^_(.*)$')
if optionKey then
if type(v) == 'string' then
v = v:match('^%s*(.-)%s*$') -- trim whitespace
end
if v ~= '' then
options[optionKey] = v
end
else
invokeArgs[k] = v
end
end
local invocation = TableInvocation.new(invokeArgs)
return invocation
return invocation
end
end
Line 245: Line 208:


function p._nowiki(args)
function p._nowiki(args)
local invocation = NowikiInvocation.new(args)
local invocation = NowikiInvocation.new(args.invocation)
args.invocation = nil
local options = args
return invocation
return invocation
end
end
Cookies help us deliver our services. By using our services, you agree to our use of cookies.