Module:Template test case: Difference between revisions

    (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