Module:ConvertNumeric/testcases

-- Unit tests for Module:ConvertNumeric. Click talk page to run tests.

local p = require('Module:UnitTests')

local frame = mw.getCurrentFrame()

local function get_error_text(wikitext)

local message = frame:preprocess(wikitext):match('<[^>]+>(.-)<[^>]+>')

message = message:match('at line %d+: (.+)%.$') or message

return message

end

function p:test_numeral_to_english()

self:preprocess_equals_many('{{#invoke:ConvertNumeric | numeral_to_english |', '}}', {

{'0', 'zero'},

{'1', 'one'},

{' 1 ', 'one'}, -- test whitespace around number

{'3 + 5', 'eight'}, -- test expression support

{'1 | case=u', 'One'},

{'1 | case=U', 'One'},

{'-1', 'negative one'},

{'-1 | negative=minus', 'minus one'},

{'70', 'seventy'},

{'42', 'forty-two'},

{'123', 'one hundred and twenty-three'},

{'123 | sp=us', 'one hundred twenty-three'},

{'123 | adj=on', 'one-hundred-and-twenty-three'},

{'1050', 'one thousand and fifty'},

{'1050 | sp=us', 'one thousand fifty'},

{'0.25', 'zero point two five'},

{'.25', 'zero point two five'},

{'0 | ord=on', 'zeroth'},

{'33 | ord=on', 'thirty-third'},

{'40 | ord=on', 'fortieth'},

{'5000000000 | ord=on', 'five billionth'},

{'0 | pl=on', 'zeros'},

{'76 | pl=on', 'seventy-sixes'},

{'1000000000000000000000000000001', 'one nonillion and one'},

{'1.23E3', 'one thousand two hundred and thirty'},

{'123E-4', 'zero point zero one two three'},

{'1001001001001000 | lk=on', 'one quadrillion one trillion one billion one million one thousand'},

{'1001001001001000 | lk=billion,quadrillion', 'one quadrillion one trillion one billion one million one thousand'},

{'5E30', 'five nonillion'},

{'-123456789.25', 'negative one hundred twenty-three million four hundred fifty-six thousand seven hundred and eighty-nine point two five'},

{'0 | zero=foo', 'foo'},

{'0 | ord=on | zero=none', 'none'},

{'1 | numerator=2 | denominator=3', 'one and two-thirds'},

{'| numerator=2 | denominator=3', 'two-thirds'},

{'1 | denominator=2', 'one and a half'},

{'1 | numerator=3 | denominator=2', 'one and three-halves'},

{'1 | numerator=1 | denominator=4', 'one and a quarter'},

{'1 | numerator=1 | denominator=4 | sp=us', 'one and a fourth'},

{'1 | numerator=1 | denominator=4 | one=one', 'one and one-quarter'},

{'1 | numerator=1 | denominator=4 | sp=us | one=one', 'one and one-fourth'},

{'9 | numerator=3 | denominator=4', 'nine and three-quarters'},

{'9 | numerator=3 | denominator=4 | sp=us', 'nine and three-fourths'},

{'23 | numerator=12 | denominator=16', 'twenty-three and twelve-sixteenths'},

})

end

function p:test_numeral_to_english_error()

local cases = {'', 'a', '.', 'e', 'E', 'E1', '.E1', '+', '-', '123a', 'a123', '0.1a', '-a123' }

local nowiki = mw.text.nowiki

for _, case in ipairs(cases) do

local wikitext = '{{#invoke:ConvertNumeric | numeral_to_english |' .. case .. '}}'

self:equals(nowiki(wikitext), get_error_text(wikitext), 'Invalid decimal numeral')

end

end

function p:test_numeral_to_english_round()

self:preprocess_equals_many('{{#invoke:ConvertNumeric | numeral_to_english |', '}}', {

{'1 | round=on', 'one'},

{'37 | round=on', 'thirty-seven'},

{'190 | round=on', 'two hundred'},

{'110 | round=up', 'two hundred'},

{'190 | round=down', 'one hundred'},

{'87654321 | round=on', 'ninety million'},

{'12345678 | round=on', 'twelve million'},

{'-190 | round=on', 'negative two hundred'},

{'-190 | round=up', 'negative one hundred'},

{'-110 | round=down', 'negative two hundred'},

{'0.25 | round=on', 'zero'},

{'0.5 | round=on', 'one'},

{'-0.25 | round=on', 'zero'},

{'-0.5 | round=on', 'negative one'},

{'0.01 | round=up', 'one'},

{'0.99 | round=down', 'zero'},

{'-0.01 | round=down', 'negative one'},

{'-0.99 | round=up', 'zero'},

})

end

function p:test_decToHex()

self:preprocess_equals(

'{{#invoke:ConvertNumeric|decToHex|10 20 40 1024 78912345|minlength=4}}',

'000A 0014 0028 0400 4B41B59'

)

end

return p