Difference between revisions of "Module:ConvertNumeric/testcases"

From blackwiki
Jump to navigation Jump to search
blackwiki>Dcoetzee
(Generalize run_tests in preparation for refactoring by looping over methods)
m (43 revisions imported)
 
(30 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
-- Unit tests for [[Module:ConvertNumeric]]. Click talk page to run tests.
 
-- Unit tests for [[Module:ConvertNumeric]]. Click talk page to run tests.
 +
local p = require('Module:UnitTests')
  
local p = {}
+
local frame = mw.getCurrentFrame()
 +
local function get_error_text(wikitext)
 +
local message = frame:preprocess(wikitext):match('<strong class="error"><[^>]+>(.-)<[^>]+></strong>')
 +
message = message:match('at line %d+: (.+)%.$') or message
 +
return message
 +
end
  
local frame, tick, cross
+
function p:test_numeral_to_english()
local result_table = "{|class=\"wikitable\"\n! !! Text !! Expected !! Actual\n|-\n"
+
self:preprocess_equals_many('{{#invoke:ConvertNumeric | numeral_to_english |', '}}', {
local num_failures = 0
+
{'0', 'zero'},
 +
{'1', 'one'},
 +
{' 1 ', 'one'}, -- test whitespace around number
 +
{'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 [[Orders_of_magnitude_(numbers)#1015|quadrillion]] one [[Orders_of_magnitude_(numbers)#1012|trillion]] one [[Orders_of_magnitude_(numbers)#109|billion]] one million one thousand'},
 +
{'1001001001001000 | lk=billion,quadrillion', 'one [[Orders_of_magnitude_(numbers)#1015|quadrillion]] one trillion one [[Orders_of_magnitude_(numbers)#109|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 preprocess_equals(text, expected)
+
function p:test_numeral_to_english_error()
    local actual = frame:preprocess(text)
+
local cases = {'', 'a', '.', 'e', 'E', 'E1', '.E1', '+', '-', '123a', 'a123', '0.1a', '-a123' }
    if actual == expected then
+
local nowiki = mw.text.nowiki
        result_table = result_table .. '| ' .. tick
+
for _, case in ipairs(cases) do
    else
+
local wikitext = '{{#invoke:ConvertNumeric | numeral_to_english |' .. case .. '}}'
        result_table = result_table .. '| ' .. cross
+
self:equals(nowiki(wikitext), get_error_text(wikitext), 'Invalid decimal numeral')
        num_failures = num_failures + 1
+
end
    end
 
    result_table = result_table .. ' || <nowiki>' .. text:gsub('%|', '&#124;') .. '</nowiki> || ' .. expected .. ' || ' .. actual .. "\n|-\n"
 
 
end
 
end
  
function p.test_numeral_to_english()
+
function p:test_numeral_to_english_round()
    local prefix = '{{#invoke:ConvertNumeric | numeral_to_english |'
+
self:preprocess_equals_many('{{#invoke:ConvertNumeric | numeral_to_english |', '}}', {
    preprocess_equals(prefix .. '0}}', 'zero')
+
{'1 | round=on', 'one'},
    preprocess_equals(prefix .. '1}}', 'one')
+
{'37 | round=on', 'thirty-seven'},
    preprocess_equals(prefix .. ' 1 }}', 'one') -- test whitespace around number
+
{'190 | round=on', 'two hundred'},
    preprocess_equals(prefix .. '-1}}', 'negative one')
+
{'110 | round=up', 'two hundred'},
    preprocess_equals(prefix .. '-1 | negative=minus}}', 'minus one')
+
{'190 | round=down', 'one hundred'},
    preprocess_equals(prefix .. '70}}', 'seventy')
+
{'87654321 | round=on', 'ninety million'},
    preprocess_equals(prefix .. '42}}', 'forty-two')
+
{'12345678 | round=on', 'twelve million'},
    preprocess_equals(prefix .. '33 | ord=on}}', 'thirty-third')
+
{'-190 | round=on', 'negative two hundred'},
    preprocess_equals(prefix .. '40 | ord=on}}', 'fortieth')
+
{'-190 | round=up', 'negative one hundred'},
    preprocess_equals(prefix .. '76 | pl=on}}', 'seventy-sixes')
+
{'-110 | round=down', 'negative two hundred'},
    preprocess_equals(prefix .. '-123456789.25 }}', 'negative one hundred twenty-three million four hundred fifty-six thousand seven hundred and eighty-nine point two five')
+
{'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
 
end
  
function p.run_tests(frame_arg)
+
function p:test_decToHex()
    frame = frame_arg
+
self:preprocess_equals(
    tick = frame:preprocess('{{Tick}}')
+
'{{#invoke:ConvertNumeric|decToHex|10 20 40 1024 78912345|minlength=4}}',
    cross = frame:preprocess('{{Cross}}')
+
'000A 0014 0028 0400 4B41B59'
   
+
)
    for key,value in pairs(p) do
 
        if key:find('^test') then value() end
 
    end
 
 
 
    result_table = result_table .. "|}"
 
    return (num_failures == 0 and "<font color=\"#008000\">'''All tests passed.'''</font>" or "<font color=\"#800000\">'''" .. num_failures .. " tests failed.'''</font>") .. "\n\n" .. frame:preprocess(result_table)
 
 
end
 
end
  
 
return p
 
return p

Latest revision as of 15:54, 26 September 2020

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

-- 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('<strong class="error"><[^>]+>(.-)<[^>]+></strong>')
	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
		{'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 [[Orders_of_magnitude_(numbers)#1015|quadrillion]] one [[Orders_of_magnitude_(numbers)#1012|trillion]] one [[Orders_of_magnitude_(numbers)#109|billion]] one million one thousand'},
		{'1001001001001000 | lk=billion,quadrillion', 'one [[Orders_of_magnitude_(numbers)#1015|quadrillion]] one trillion one [[Orders_of_magnitude_(numbers)#109|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