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