Jump to content
Search

The new Ubuntu Wiki is live. Legacy content may be unavailable and page links may have changed. Read the announcement on Discourse.

Module:Arguments/testcases

From Ubuntu Wiki

Documentation for this module may be created at Module:Arguments/testcases/doc

--[[
Module:Arguments/tests
Unit tests for Module:Arguments
--]]

local ScribuntoUnit = require('Module:ScribuntoUnit')
local Arguments = require('Module:Arguments')
local suite = ScribuntoUnit:new()

-- ----------------------------------------------------------------------------
-- Helper function to mock the Scribunto frame and parent frame
-- ----------------------------------------------------------------------------
local function createMockFrame(frameArgs, parentArgs)
    local frame = {
        args = frameArgs or {}
    }
    if parentArgs then
        frame.getParent = function()
            return { args = parentArgs }
        end
    else
        frame.getParent = function()
            return nil
        end
    end
    return frame
end

-- ----------------------------------------------------------------------------
-- Tests
-- ----------------------------------------------------------------------------

function suite:testDefaultBehavior()
    local frame = createMockFrame(
        { [1] = "  val1  ", [2] = "", [3] = "val3" }, -- frame args
        { ["a"] = "  A  ", ["b"] = "" }              -- parent args
    )
    local args = Arguments.getArgs(frame)

    self:assertEquals("val1", args[1], "Should trim whitespace from frame args")
    self:assertEquals(nil, args[2], "Should remove blank frame args")
    self:assertEquals("val3", args[3], "Should retain normal frame args")
    self:assertEquals("A", args.a, "Should fetch and trim parent args")
    self:assertEquals(nil, args.b, "Should remove blank parent args")
end

function suite:testDisableTrim()
    local frame = createMockFrame({ [1] = "  val1  " })
    local args = Arguments.getArgs(frame, { trim = false })
    
    self:assertEquals("  val1  ", args[1], "Should preserve whitespace when trim=false")
end

function suite:testDisableRemoveBlanks()
    local frame = createMockFrame({ [1] = "" })
    local args = Arguments.getArgs(frame, { removeBlanks = false })
    
    self:assertEquals("", args[1], "Should preserve empty strings when removeBlanks=false")
end

function suite:testFrameOnly()
    local frame = createMockFrame({ [1] = "frame_val" }, { [1] = "parent_val" })
    local args = Arguments.getArgs(frame, { frameOnly = true })
    
    self:assertEquals("frame_val", args[1], "Should only fetch from frame")
    self:assertEquals(nil, args[2], "Should ignore parent frame")
end

function suite:testParentOnly()
    local frame = createMockFrame({ [1] = "frame_val" }, { [1] = "parent_val" })
    local args = Arguments.getArgs(frame, { parentOnly = true })
    
    self:assertEquals("parent_val", args[1], "Should only fetch from parent frame")
end

function suite:testPrecedence()
    local frame = createMockFrame({ ["conflict"] = "frame_val" }, { ["conflict"] = "parent_val" })
    
    -- Default precedence: Frame wins
    local argsDefault = Arguments.getArgs(frame)
    self:assertEquals("frame_val", argsDefault.conflict, "Frame should override parent by default")
    
    -- parentFirst precedence: Parent wins
    local argsParentFirst = Arguments.getArgs(frame, { parentFirst = true })
    self:assertEquals("parent_val", argsParentFirst.conflict, "Parent should override frame when parentFirst=true")
end

function suite:testValueFunc()
    local frame = createMockFrame({ ["num"] = "42", ["str"] = "hello" })
    
    -- A custom function that converts a specific parameter into a number
    local function myValueFunc(key, val)
        if key == "num" then
            return tonumber(val)
        end
        return val
    end
    
    local args = Arguments.getArgs(frame, { valueFunc = myValueFunc })
    
    self:assertEquals(42, args.num, "valueFunc should transform '42' string to a number")
    self:assertEquals("number", type(args.num), "Type should be translated to number")
    self:assertEquals("hello", args.str, "valueFunc should leave other values unchanged")
end

function suite:testPairsIterator()
    local frame = createMockFrame(
        { ["a"] = "1", ["b"] = "" }, 
        { ["c"] = "3", ["a"] = "ignored" }
    )
    local args = Arguments.getArgs(frame)
    
    local iteratedKeys = {}
    for k, v in pairs(args) do
        iteratedKeys[k] = v
    end
    
    self:assertEquals("1", iteratedKeys.a, "Pairs should iterate over frame args and respect precedence")
    self:assertEquals(nil, iteratedKeys.b, "Pairs should skip blank args (if stripped)")
    self:assertEquals("3", iteratedKeys.c, "Pairs should iterate over parent args")
end

return suite