Module:Template test case

    From Nonbinary Wiki
    Revision as of 03:10, 23 November 2014 by wikipedia>Mr. Stradivarius (start creating Invocation classes for getting template invocations from the arguments)

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