Module:Template test case: Difference between revisions

    From Nonbinary Wiki
    (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 checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
    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:


    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    -- TestCase class
    -- Exports
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    local TestCase = {}
    TestCase.__index = TestCase
    function TestCase.new(t)
    -- Validate the input
    checkTypeForNamedArg('TestCase.new', 'invocation', t.invocation, 'table')
    checkTypeForNamedArg('TestCase.new', 'templates', t.templates, 'table')
    checkTypeForNamedArg('TestCase.new', 'options', t.options, 'table', true)
    t.options = t.options or {}
    local obj = setmetatable({}, TestCase)
    return obj
    end

    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
    -------------------------------------------------------------------------------