-- Unit tests for [[Module:Roman/sandbox]]. Click talk page to run tests.

local moduleName = 'Roman/sandbox' -- assigning this to a variable as it is later used to generate an #invoke statement.
local mainFuncName = 'main'
local mm = require('Module:' .. moduleName)
local suite = require('Module:UnitTests')

function suite.buildInvocation(funcName, args)
    args = args or {}
    local argsClone = mw.clone(args)
    -- Build a module invocation equivalent to the args table. Taken from [[Module:Unsubst]].
    -- Numbered args first.
    local ret = '{{#invoke:' .. moduleName .. '|' .. funcName
    for k, v in ipairs(argsClone) do
        v = tostring(v)
        if string.find(v, '=', 1, true) then
            -- likely something like 1=foo=bar, we need to do it as a named arg
            break
        end
        ret = ret .. '|' .. v
        argsClone[k] = nil
    end
    for k, v in pairs(argsClone) do
        k = tostring(k)
        v = tostring(v)
        ret = ret .. '|' .. k .. '=' .. v
    end
    return ret .. '}}'
end

function suite:getInvokeResult(funcName, args, convertNumber) -- Unless convertNumber is false, the number is converted to a number, if possible, on re-entry to Lua.
    args = args or {}
    local invocation = self.buildInvocation(funcName, args)
    local result = self.frame:preprocess(invocation)
    if convertNumber ~= false and tonumber(result) then
        return tonumber(result)
    else
        return result
    end
end

function suite:assertInvokeEquals(expected, funcName, args, convertNumber)
    args = args or {}
    local invokeResult = self:getInvokeResult(funcName, args, convertNumber)
    self:preprocess_equals(invokeResult, expected)
end

function suite:assertInvokeEqual(funcName, testTable, convertNumber)
    testTable = testTable or {}
    local expected = testTable[1]
    local args = testTable[2] or {}
    self:assertInvokeEquals(expected, funcName, args, convertNumber)
end

function suite:assertInvokeEqualMany(funcName, testTables, convertNumber)
    for i, testTable in ipairs(testTables) do
        self:assertInvokeEqual(funcName, testTable, convertNumber)
    end
end

function suite:test_genericNumbers()
    local args = {
        {'N', {'0'}}, {'I', {'1'}}, {'II', {'2'}}, {'IV', {'4'}}, {'V', {'5'}},
        {'VI', {'6'}}, {'VIII', {'8'}}, {'IX', {'9'}}, {'X', {'10'}},
        {'XI', {'11'}}, {'XIV', {'14'}}, {'XV', {'15'}}, {'XVI', {'16'}},
        {'XIX', {'19'}}, {'XX', {'20'}}, {'XXI', {'21'}}, {'XXIV', {'24'}},
        {'XXV', {'25'}}, {'XXVI', {'26'}}, {'XXXIV', {'34'}}, {'XXXV', {'35'}},
        {'XXXVIII', {'38'}}, {'XXXIX', {'39'}}, {'XL', {'40'}}, {'XLI', {'41'}},
        {'XLIV', {'44'}}, {'XLV', {'45'}}, {'XLIX', {'49'}}, {'L', {'50'}},
        {'LXXXVIII', {'88'}}, {'LXXXIX', {'89'}}, {'XC', {'90'}}, {'XCI', {'91'}},
        {'XCIV', {'94'}}, {'XCV', {'95'}}, {'XCVIII', {'98'}}, {'XCIX', {'99'}},
        {'C', {'100'}}, {'CI', {'101'}}, {'CIV', {'104'}}, {'CV', {'105'}},
        {'CIX', {'109'}}, {'CX', {'110'}},
        {'MCCXXXIV', {'1234'}},
        {'MDCXLVIII', {'1648'}},
        {'MMCMXCIX', {'2999'}},
        {'MMM', {'3000'}},
    }
    -- unsure how to test cases with overline
    self:assertInvokeEqualMany('main', args)
end

function suite:test_outOfRangeNumbers()
    local args = {
        {'N/A', {'5000000'}},
        {'N/A', {'5000010'}},
        {'N/A', {'3000000000'}},
    }
    self:assertInvokeEqualMany('main', args)
end

function suite:test_MessageArg()
    local args = {
        {'N', {'0', 'too big'}},
        {'I', {'1', 'too big'}},
        {'V', {'5', 'too big'}},
        {'X', {'10', 'too big'}},
        {'L', {'50', 'too big'}},
        {'C', {'100', 'too big'}},
        {'D', {'500', 'too big'}},
        {'M', {'1000', 'too big'}},
        {'too big', {'5000000', 'too big'}},
        {'too big', {'5000010', 'too big'}},
        {'too big', {'3000000000', 'too big'}},
    }
    self:assertInvokeEqualMany('main', args)
end

function suite:test_MessageArgWithFractionArg()
    -- Note, 'fraction=yes' before 'too big' cannot happen with the template
    local args = {
        {'N', {'0', 'too big', 'fraction=yes'}},
        {'I', {'1', 'too big', 'fraction=yes'}},
        {'M', {'1000', 'too big', 'fraction=yes'}},
        {'too big', {'5000000', 'too big', 'fraction=yes'}},
        {'too big', {'5000010', 'too big', 'fraction=yes'}},
        {'too big', {'3000000000', 'too big', 'fraction=yes'}},
    }
    self:assertInvokeEqualMany('main', args)
end

--[[
function suite:test_decimalsBetweenZeroAndOne()
    local args = {
        {'»', {'0.0001', '', 'fraction=yes'}},
        {'»', {'0.0005', '', 'fraction=yes'}},
        {'»', {'0.000578703', '', 'fraction=yes'}},
        {'»', {'0.000578704', '', 'fraction=yes'}},
        {'℈', {'0.00347222', '', 'fraction=yes'}},
        {'℈', {'0.00347223', '', 'fraction=yes'}},
        {'ƻ', {'0.007', '', 'fraction=yes'}},
        {'Ƨ', {'0.0139', '', 'fraction=yes'}},
        {'Ɔ', {'0.02084', '', 'fraction=yes'}},
        {'ƧƧ', {'0.0278', '', 'fraction=yes'}},
        {'Є', {'0.04167', '', 'fraction=yes'}},
        {'•', {'0.08334', '', 'fraction=yes'}},
        {'•ЄƧ℈»', {'0.142858', '', 'fraction=yes'}},
        {"''':'''", {'0.1667', '', 'fraction=yes'}},
        {"''':'''•", {'0.25', '', 'fraction=yes'}},
        {"'''::'''", {'0.3333', '', 'fraction=yes'}},
        {"''':'''•''':'''", {'0.41666', '', 'fraction=yes'}},
        {'S', {0.5, '', 'fraction=yes'}},
        {"S''':'''•", {'0.75', '', 'fraction=yes'}},
        {"S''':'''•''':'''ЄƧƧƻ℈»»»»", {'0.9999', '', 'fraction=yes'}},
    }
    self:assertInvokeEqualMany('main', args)
end
--]]

--[[
function suite:test_fractionsBetweenZeroAndOne()
    local args = {
        {'S', {'1/2', 'hi', 'fraction=yes'}}
    }
    self:assertInvokeEqualMany('main', args)
end
--]]

return suite
"https://si.wikipedia.org/w/index.php?title=Module:Roman/testcases&oldid=616927" වෙතින් සම්ප්‍රවේශනය කෙරිණි