Module:Template test case: Difference between revisions
(tentative TestCase class syntax) |
(start creating Invocation classes for getting template invocations from the arguments) |
||
Line 1: | Line 1: | ||
-- This module provides several methods to generate test cases. | -- This module provides several methods to generate test cases. | ||
local mTableTools = require('Module:TableTools') | |||
local libraryUtil = require('libraryUtil') | local libraryUtil = require('libraryUtil') | ||
local | local checkType = libraryUtil.checkType | ||
------------------------------------------------------------------------------- | |||
-- Helper functions | |||
------------------------------------------------------------------------------- | |||
--[[ | |||
local function validateTemplateOptions() | |||
-- Add the template names for the first two templates if they weren't | |||
-- specified. | |||
do | |||
local title = mw.title.getCurrentTitle().basePageTitle | |||
local template | |||
if title.namespace == 10 then | |||
template = title.text | |||
elseif title.namespace == 0 then | |||
template = ':' .. title.prefixedText | |||
else | |||
template = title.prefixedText | |||
end | |||
local templatePage = title.prefixedText | |||
templateOptions[1] = templateOptions[1] or {} | |||
templateOptions[1].templatePage = templateOptions[1].template or templatePage | |||
templateOptions[1].template = templateOptions[1].template or template | |||
templateOptions[2] = templateOptions[2] or {} | |||
templateOptions[2].templatePage = templateOptions[2].template or templatePage .. '/sandbox' | |||
templateOptions[2].template = templateOptions[2].template or template .. '/sandbox' | |||
end | |||
-- Validate options for three or more templates. | |||
if #templateOptions >= 3 then | |||
for i = 3, #templateOptions do | |||
local template = templateOptions[i].template | |||
if not template then | |||
error('arguments for a third or subsequent ' .. | |||
'template were found, but no template name ' .. | |||
'was specified', 3) | |||
end | |||
end | |||
end | |||
end | |||
--]] | |||
local function parseTemplateOptions(origOptions) | |||
-- Given a table of raw options, returns a table of general options | |||
-- and template options. | |||
local templateOptions = mTableTools.numData(origOptions, true) | |||
local options = templateOptions.other | |||
templateOptions.other = nil | |||
return options, templateOptions | |||
end | |||
------------------------------------------------------------------------------- | |||
-- Invocation class | |||
------------------------------------------------------------------------------- | |||
local Invocation = {} | |||
Invocation.__index = Invocation | |||
function Invocation.new() | |||
local obj = setmetatable({}, TableInvocation) | |||
return obj | |||
end | |||
function Invocation:setOptions(t) | |||
self._options = t | |||
end | |||
function Invocation:getOptions() | |||
return self._options | |||
end | |||
function Invocation:setTemplateOptions(t) | |||
self._templateOptions = t | |||
end | |||
function Invocation:getTemplateOptions() | |||
return self._templateOptions | |||
end | |||
------------------------------------------------------------------------------- | |||
-- Nowiki invocation class | |||
------------------------------------------------------------------------------- | |||
local NowikiInvocation = setmetatable({}, Invocation) | |||
NowikiInvocation.__index = NowikiInvocation | |||
function NowikiInvocation.new(args) | |||
checkType('NowikiInvocation.new', 'args', args, 'table') | |||
local obj = Invocation.new() | |||
setmetatable(obj, NowikiInvocation) | |||
local options = {} | |||
return obj | |||
end | |||
function NowikiInvocation:getInvocation(template) | |||
end | |||
function NowikiInvocation:getOutput(template) | |||
end | |||
------------------------------------------------------------------------------- | |||
-- Table invocation class | |||
------------------------------------------------------------------------------- | |||
local TableInvocation = {} | |||
TableInvocation.__index = TableInvocation | |||
function TableInvocation.new(args) | |||
checkType('TableInvocation.new', 'args', args, 'table') | |||
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 | |||
rawOptions[optionKey] = v | |||
else | |||
invokeArgs[k] = v | |||
end | |||
end | |||
obj.invokeArgs = invokeArgs | |||
local options, templateOptions = parseTemplateOptions(rawOptions) | |||
obj:setOptions(options) | |||
obj:setTemplateOptions(templateOptions) | |||
return obj | |||
end | |||
function NowikiInvocation:getInvocation(template) | |||
end | |||
function NowikiInvocation:getOutput(template) | |||
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 | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
Line 27: | Line 177: | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- | -- Exports | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
Revision as of 03:10, 23 November 2014
Documentation for this module may be created at Module:Template test case/doc
-- This module provides several methods to generate test cases. local mTableTools = require('Module:TableTools') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType ------------------------------------------------------------------------------- -- Helper functions ------------------------------------------------------------------------------- --[[ local function validateTemplateOptions() -- Add the template names for the first two templates if they weren't -- specified. do local title = mw.title.getCurrentTitle().basePageTitle local template if title.namespace == 10 then template = title.text elseif title.namespace == 0 then template = ':' .. title.prefixedText else template = title.prefixedText end local templatePage = title.prefixedText templateOptions[1] = templateOptions[1] or {} templateOptions[1].templatePage = templateOptions[1].template or templatePage templateOptions[1].template = templateOptions[1].template or template templateOptions[2] = templateOptions[2] or {} templateOptions[2].templatePage = templateOptions[2].template or templatePage .. '/sandbox' templateOptions[2].template = templateOptions[2].template or template .. '/sandbox' end -- Validate options for three or more templates. if #templateOptions >= 3 then for i = 3, #templateOptions do local template = templateOptions[i].template if not template then error('arguments for a third or subsequent ' .. 'template were found, but no template name ' .. 'was specified', 3) end end end end --]] local function parseTemplateOptions(origOptions) -- Given a table of raw options, returns a table of general options -- and template options. local templateOptions = mTableTools.numData(origOptions, true) local options = templateOptions.other templateOptions.other = nil return options, templateOptions end ------------------------------------------------------------------------------- -- Invocation class ------------------------------------------------------------------------------- local Invocation = {} Invocation.__index = Invocation function Invocation.new() local obj = setmetatable({}, TableInvocation) return obj end function Invocation:setOptions(t) self._options = t end function Invocation:getOptions() return self._options end function Invocation:setTemplateOptions(t) self._templateOptions = t end function Invocation:getTemplateOptions() return self._templateOptions end ------------------------------------------------------------------------------- -- Nowiki invocation class ------------------------------------------------------------------------------- local NowikiInvocation = setmetatable({}, Invocation) NowikiInvocation.__index = NowikiInvocation function NowikiInvocation.new(args) checkType('NowikiInvocation.new', 'args', args, 'table') local obj = Invocation.new() setmetatable(obj, NowikiInvocation) local options = {} return obj end function NowikiInvocation:getInvocation(template) end function NowikiInvocation:getOutput(template) end ------------------------------------------------------------------------------- -- Table invocation class ------------------------------------------------------------------------------- local TableInvocation = {} TableInvocation.__index = TableInvocation function TableInvocation.new(args) checkType('TableInvocation.new', 'args', args, 'table') 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 rawOptions[optionKey] = v else invokeArgs[k] = v end end obj.invokeArgs = invokeArgs local options, templateOptions = parseTemplateOptions(rawOptions) obj:setOptions(options) obj:setTemplateOptions(templateOptions) return obj end function NowikiInvocation:getInvocation(template) end function NowikiInvocation:getOutput(template) 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. -------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------