<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://wiki.nightscout.cz/index.php?action=history&amp;feed=atom&amp;title=Modul%3AArguments%2Ftestcases</id>
	<title>Modul:Arguments/testcases - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.nightscout.cz/index.php?action=history&amp;feed=atom&amp;title=Modul%3AArguments%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="http://wiki.nightscout.cz/index.php?title=Modul:Arguments/testcases&amp;action=history"/>
	<updated>2026-05-01T07:11:27Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>http://wiki.nightscout.cz/index.php?title=Modul:Arguments/testcases&amp;diff=347&amp;oldid=prev</id>
		<title>Maska: naimportována 1 revize</title>
		<link rel="alternate" type="text/html" href="http://wiki.nightscout.cz/index.php?title=Modul:Arguments/testcases&amp;diff=347&amp;oldid=prev"/>
		<updated>2021-03-23T11:52:13Z</updated>

		<summary type="html">&lt;p&gt;naimportována 1 revize&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;cs&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Starší verze&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Verze z 23. 3. 2021, 13:52&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;cs&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Žádný rozdíl)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Maska</name></author>
	</entry>
	<entry>
		<id>http://wiki.nightscout.cz/index.php?title=Modul:Arguments/testcases&amp;diff=346&amp;oldid=prev</id>
		<title>Module&gt;Capankajsmilyo: +</title>
		<link rel="alternate" type="text/html" href="http://wiki.nightscout.cz/index.php?title=Modul:Arguments/testcases&amp;diff=346&amp;oldid=prev"/>
		<updated>2019-05-22T11:25:27Z</updated>

		<summary type="html">&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require('Module:Arguments/sandbox').getArgs&lt;br /&gt;
local ScribuntoUnit = require('Module:ScribuntoUnit')&lt;br /&gt;
local suite = ScribuntoUnit:new()&lt;br /&gt;
local libName = 'Arguments'&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Default values&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local d = {} &lt;br /&gt;
d.frameTitle = 'Frame title'&lt;br /&gt;
d.parentTitle = 'Parent title'&lt;br /&gt;
&lt;br /&gt;
-- Precedence-testing values&lt;br /&gt;
d.firstFrameArg = 'first frame argument'&lt;br /&gt;
d.firstParentArg = 'first parent argument'&lt;br /&gt;
d.secondParentArg = 'second parent argument'&lt;br /&gt;
d.uniqueFrameArg = 'unique frame argument'&lt;br /&gt;
d.uniqueFrameArgKey = 'uniqueFrameArgKey'&lt;br /&gt;
d.uniqueParentArg = 'unique parent argument'&lt;br /&gt;
d.uniqueParentArgKey = 'uniqueParentArgKey'&lt;br /&gt;
&lt;br /&gt;
-- Trimming and whitespace values.&lt;br /&gt;
-- Whitespace gets trimmed from named parameters, so keys for these need&lt;br /&gt;
-- to be numbers to make this a proper test.&lt;br /&gt;
d.blankArg = ''&lt;br /&gt;
d.blankArgKey = 100 &lt;br /&gt;
d.spacesArg = '\n   '&lt;br /&gt;
d.spacesArgKey = 101&lt;br /&gt;
d.untrimmedArg = '\n   foo bar   '&lt;br /&gt;
d.untrimmedArgKey = 102&lt;br /&gt;
d.trimmedArg = 'foo bar'&lt;br /&gt;
d.valueFuncValue = 'valueFuncValue'&lt;br /&gt;
d.defaultValueFunc = function() return d.valueFuncValue end&lt;br /&gt;
d.translate = {&lt;br /&gt;
	foo = 'F00',&lt;br /&gt;
	bar = '8@r',&lt;br /&gt;
	baz = '8@z',&lt;br /&gt;
	qux = 'qUx'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Helper to run all tests using sandbox version of the library from the debug console. To run against main lib, use  =p.run()&lt;br /&gt;
function suite.runSandbox()&lt;br /&gt;
    local frame = mw.getCurrentFrame():newChild{title='testcases', args={module=libName .. '/sandbox', displayMode='log'}}&lt;br /&gt;
    return suite.run(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Allow test runner to use the sandbox and the primary versions of the library with the same testcases&lt;br /&gt;
function suite:module()&lt;br /&gt;
    return require('Module:' .. (self.frame and self.frame.args.module or libName))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
       Library-specific tests&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite.getFrames(frameTitle, frameArgs, parentTitle, parentArgs)&lt;br /&gt;
	frameTitle = frameTitle or d.frameTitle&lt;br /&gt;
	frameArgs = frameArgs or {&lt;br /&gt;
		d.firstFrameArg,&lt;br /&gt;
		[d.uniqueFrameArgKey] = d.uniqueFrameArg,&lt;br /&gt;
		[d.blankArgKey] = d.blankArg,&lt;br /&gt;
		[d.spacesArgKey] = d.spacesArg,&lt;br /&gt;
		[d.untrimmedArgKey] = d.untrimmedArg&lt;br /&gt;
	}&lt;br /&gt;
	parentTitle = parentTitle or d.parentTitle&lt;br /&gt;
	parentArgs = parentArgs or {&lt;br /&gt;
		d.firstParentArg,&lt;br /&gt;
		d.secondParentArg,&lt;br /&gt;
		[d.uniqueParentArgKey] = d.uniqueParentArg&lt;br /&gt;
	}&lt;br /&gt;
	local currentFrame = mw.getCurrentFrame()&lt;br /&gt;
	local parent = currentFrame:newChild{title = parentTitle, args = parentArgs}&lt;br /&gt;
	local frame = parent:newChild{title = frameTitle, args = frameArgs}&lt;br /&gt;
	return frame, parent&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite.getDefaultArgs(options, frameTitle, frameArgs, parentTitle, parentArgs)&lt;br /&gt;
	local frame, parent = suite.getFrames(frameTitle, frameArgs, parentTitle, parentArgs)&lt;br /&gt;
	local args = getArgs(frame, options)&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertError(func, ...)&lt;br /&gt;
	-- Asserts that executing the function func results in an error.&lt;br /&gt;
	-- Parameters after func are func's arguments.&lt;br /&gt;
	local success, msg = pcall(func, ...)&lt;br /&gt;
	self:assertFalse(success)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertNumberOfIterations(expected, iterator, t)&lt;br /&gt;
	local noIterations = 0&lt;br /&gt;
	for k, v in iterator(t) do&lt;br /&gt;
		noIterations = noIterations + 1&lt;br /&gt;
	end&lt;br /&gt;
	self:assertEquals(expected, noIterations)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test precedence&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:assertDefaultPrecedence(args)&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	self:assertEquals(d.secondParentArg, args[2])&lt;br /&gt;
	self:assertEquals(d.uniqueFrameArg, args[d.uniqueFrameArgKey])&lt;br /&gt;
	self:assertEquals(d.uniqueParentArg, args[d.uniqueParentArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDefaultPrecedence()&lt;br /&gt;
	self:assertDefaultPrecedence(suite.getDefaultArgs())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDefaultPrecedenceThroughWrapper()&lt;br /&gt;
	self:assertDefaultPrecedence(suite.getDefaultArgs{wrappers = {d.parentTitle}, parentOnly = false})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDefaultPrecedenceThroughNonWrapper()&lt;br /&gt;
	self:assertDefaultPrecedence(suite.getDefaultArgs({wrappers = d.parentTitle, frameOnly = false}, nil, nil, 'Not the parent title'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertParentFirst(args)&lt;br /&gt;
	self:assertEquals(d.firstParentArg, args[1])&lt;br /&gt;
	self:assertEquals(d.secondParentArg, args[2])&lt;br /&gt;
	self:assertEquals(d.uniqueFrameArg, args[d.uniqueFrameArgKey])&lt;br /&gt;
	self:assertEquals(d.uniqueParentArg, args[d.uniqueParentArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentFirst()&lt;br /&gt;
	self:assertParentFirst(suite.getDefaultArgs{parentFirst = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentFirstThroughWrapper()&lt;br /&gt;
	self:assertParentFirst(suite.getDefaultArgs{wrappers = {d.parentTitle}, parentOnly = false, parentFirst = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentFirstThroughNonWrapper()&lt;br /&gt;
	self:assertParentFirst(suite.getDefaultArgs({wrappers = d.parentTitle, frameOnly = false, parentFirst = true}, nil, nil, 'Not the parent title'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertParentOnly(args)&lt;br /&gt;
	self:assertEquals(d.firstParentArg, args[1])&lt;br /&gt;
	self:assertEquals(d.secondParentArg, args[2])&lt;br /&gt;
	self:assertEquals(nil, args[d.uniqueFrameArgKey])&lt;br /&gt;
	self:assertEquals(d.uniqueParentArg, args[d.uniqueParentArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentOnly()&lt;br /&gt;
	self:assertParentOnly(suite.getDefaultArgs{parentOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentOnlyThroughWrapper()&lt;br /&gt;
	self:assertParentOnly(suite.getDefaultArgs{wrappers = {d.parentTitle}})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParentOnlyThroughSandboxWrapper()&lt;br /&gt;
	self:assertParentOnly(suite.getDefaultArgs({wrappers = d.parentTitle}, nil, nil, d.parentTitle .. '/sandbox'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertFrameOnly(args)&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	self:assertEquals(nil, args[2])&lt;br /&gt;
	self:assertEquals(d.uniqueFrameArg, args[d.uniqueFrameArgKey])&lt;br /&gt;
	self:assertEquals(nil, args[d.uniqueParentArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFrameOnly()&lt;br /&gt;
	self:assertFrameOnly(suite.getDefaultArgs{frameOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFrameOnlyThroughNonWrapper()&lt;br /&gt;
	self:assertFrameOnly(suite.getDefaultArgs({wrappers = d.parentTitle}, nil, nil, 'Not the parent title'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDefaultPrecedenceWithWhitespace()&lt;br /&gt;
	local frame, parent = suite.getFrames(&lt;br /&gt;
		d.frameTitle,&lt;br /&gt;
		{'  '},&lt;br /&gt;
		d.parentTitle,&lt;br /&gt;
		{d.firstParentArg}&lt;br /&gt;
	)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	self:assertEquals(d.firstParentArg, args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test trimming and blank removal&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testDefaultTrimmingAndBlankRemoval()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(nil, args[d.blankArgKey])&lt;br /&gt;
	self:assertEquals(nil, args[d.spacesArgKey])&lt;br /&gt;
	self:assertEquals(d.trimmedArg, args[d.untrimmedArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testRemoveBlanksButNoTrimming()&lt;br /&gt;
	local args = suite.getDefaultArgs{trim = false}&lt;br /&gt;
	self:assertEquals(nil, args[d.blankArgKey])&lt;br /&gt;
	self:assertEquals(nil, args[d.spacesArgKey])&lt;br /&gt;
	self:assertEquals(d.untrimmedArg, args[d.untrimmedArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrimButNoBlankRemoval()&lt;br /&gt;
	local args = suite.getDefaultArgs{removeBlanks = false}&lt;br /&gt;
	self:assertEquals(d.blankArg, args[d.blankArgKey])&lt;br /&gt;
	self:assertEquals('', args[d.spacesArgKey])&lt;br /&gt;
	self:assertEquals(d.trimmedArg, args[d.untrimmedArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoTrimOrBlankRemoval()&lt;br /&gt;
	local args = suite.getDefaultArgs{trim = false, removeBlanks = false}&lt;br /&gt;
	self:assertEquals(d.blankArg, args[d.blankArgKey])&lt;br /&gt;
	self:assertEquals(d.spacesArg, args[d.spacesArgKey])&lt;br /&gt;
	self:assertEquals(d.untrimmedArg, args[d.untrimmedArgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test valueFunc&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testValueFunc()&lt;br /&gt;
	local args = suite.getDefaultArgs{valueFunc = d.defaultValueFunc}&lt;br /&gt;
	self:assertEquals(d.valueFuncValue, args['some random key: sdfaliwyda'])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testValueFuncPrecedence()&lt;br /&gt;
	local args = suite.getDefaultArgs{&lt;br /&gt;
		trim = false,&lt;br /&gt;
		removeBlanks = false,&lt;br /&gt;
		valueFunc = d.defaultValueFunc&lt;br /&gt;
	}&lt;br /&gt;
	self:assertEquals(d.valueFuncValue, args[1])&lt;br /&gt;
	self:assertEquals(d.valueFuncValue, args['some random key: gekjabawyvy'])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testValueFuncKey()&lt;br /&gt;
	local args = suite.getDefaultArgs{valueFunc = function(key, value)&lt;br /&gt;
		return 'valueFunc key: '.. key&lt;br /&gt;
	end}&lt;br /&gt;
	self:assertEquals('valueFunc key: foo', args.foo)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testValueFuncValue()&lt;br /&gt;
	local args = suite.getDefaultArgs{valueFunc = function(key, value)&lt;br /&gt;
		return 'valueFunc value: '.. value&lt;br /&gt;
	end}&lt;br /&gt;
	self:assertEquals(&lt;br /&gt;
		'valueFunc value: ' .. d.uniqueFrameArg,&lt;br /&gt;
		args[d.uniqueFrameArgKey]&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test adding new arguments&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testAddingNewArgs()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(nil, args.newKey)&lt;br /&gt;
	args.newKey = 'some new key'&lt;br /&gt;
	self:assertEquals('some new key', args.newKey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testAddingNewBlankArgs()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(nil, args.newKey)&lt;br /&gt;
	args.newKey = ''&lt;br /&gt;
	self:assertEquals('', args.newKey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testAddingNewSpacesArgs()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(nil, args.newKey)&lt;br /&gt;
	args.newKey = ' '&lt;br /&gt;
	self:assertEquals(' ', args.newKey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testOverwriting()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	args[1] = 'a new first frame argument'&lt;br /&gt;
	self:assertEquals('a new first frame argument', args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testOverwritingWithNil()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	args[1] = nil&lt;br /&gt;
	self:assertEquals(nil, args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testOverwritingWithBlank()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	args[1] = ''&lt;br /&gt;
	self:assertEquals('', args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testOverwritingWithSpaces()&lt;br /&gt;
	local args = suite.getDefaultArgs()&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	args[1] = ' '&lt;br /&gt;
	self:assertEquals(' ', args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testReadOnly()&lt;br /&gt;
	local args = suite.getDefaultArgs{readOnly = true}&lt;br /&gt;
	local function testFunc()&lt;br /&gt;
		args.newKey = 'some new value'&lt;br /&gt;
	end&lt;br /&gt;
	self:assertError(testFunc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoOverwriteExistingKey()&lt;br /&gt;
	local args = suite.getDefaultArgs{noOverwrite = true}&lt;br /&gt;
	self:assertEquals(d.firstFrameArg, args[1])&lt;br /&gt;
	local function testFunc()&lt;br /&gt;
		args[1] = 'a new first frame argument'&lt;br /&gt;
	end&lt;br /&gt;
	self:assertError(testFunc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoOverwriteNewKey()&lt;br /&gt;
	local args = suite.getDefaultArgs{noOverwrite = true}&lt;br /&gt;
	self:assertEquals(nil, args.newKey)&lt;br /&gt;
	args.newKey = 'some new value'&lt;br /&gt;
	self:assertEquals('some new value', args.newKey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test bad input&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testBadFrameInput()&lt;br /&gt;
	self:assertError(getArgs, 'foo')&lt;br /&gt;
	self:assertError(getArgs, 9)&lt;br /&gt;
	self:assertError(getArgs, true)&lt;br /&gt;
	self:assertError(getArgs, function() return true end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testBadOptionsInput()&lt;br /&gt;
	self:assertError(getArgs, {}, 'foo')&lt;br /&gt;
	self:assertError(getArgs, {}, 9)&lt;br /&gt;
	self:assertError(getArgs, {}, true)&lt;br /&gt;
	self:assertError(getArgs, {}, function() return true end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testBadValueFuncInput()&lt;br /&gt;
	self:assertError(getArgs, {}, {valueFunc = 'foo'})&lt;br /&gt;
	self:assertError(getArgs, {}, {valueFunc = 9})&lt;br /&gt;
	self:assertError(getArgs, {}, {valueFunc = true})&lt;br /&gt;
	self:assertError(getArgs, {}, {valueFunc = {}})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test iterator metamethods&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testPairs()&lt;br /&gt;
	local args = getArgs{'foo', 'bar', baz = 'qux'}&lt;br /&gt;
	self:assertNumberOfIterations(3, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testIpairs()&lt;br /&gt;
	local args = getArgs{'foo', 'bar', baz = 'qux'}&lt;br /&gt;
	self:assertNumberOfIterations(2, ipairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoNilsinPairs()&lt;br /&gt;
	-- Test that when we use pairs, we don't iterate over any nil values&lt;br /&gt;
	-- that have been memoized.&lt;br /&gt;
	local args = getArgs{''}&lt;br /&gt;
	local temp = args[1] -- Memoizes the nil&lt;br /&gt;
	self:assertNumberOfIterations(0, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoNilsinIpairs()&lt;br /&gt;
	-- Test that when we use ipairs, we don't iterate over any nil values&lt;br /&gt;
	-- that have been memoized.&lt;br /&gt;
	local args = getArgs{''}&lt;br /&gt;
	local temp = args[1] -- Memoizes the nil&lt;br /&gt;
	self:assertNumberOfIterations(0, ipairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDeletedArgsInPairs()&lt;br /&gt;
	-- Test that when we use pairs, we don't iterate over any values that have&lt;br /&gt;
	-- been explicitly set to nil.&lt;br /&gt;
	local args = getArgs{'foo'}&lt;br /&gt;
	args[1] = nil&lt;br /&gt;
	self:assertNumberOfIterations(0, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDeletedArgsInIpairs()&lt;br /&gt;
	-- Test that when we use ipairs, we don't iterate over any values that have&lt;br /&gt;
	-- been explicitly set to nil.&lt;br /&gt;
	local args = getArgs{'foo'}&lt;br /&gt;
	args[1] = nil&lt;br /&gt;
	self:assertNumberOfIterations(0, ipairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoNilsInPairsAfterIndex()&lt;br /&gt;
	-- Test that when we use pairs, we don't iterate over any nils that&lt;br /&gt;
	-- might have been memoized after a value that is not present in the&lt;br /&gt;
	-- original args table is indexed.&lt;br /&gt;
	local args = getArgs{}&lt;br /&gt;
	local temp = args.someRandomValue -- Memoizes the nil&lt;br /&gt;
	self:assertNumberOfIterations(0, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoNilsInPairsAfterNewindex()&lt;br /&gt;
	-- Test that when we use pairs, we don't iterate over any nils that&lt;br /&gt;
	-- might have been memoized after a value that is not present in the&lt;br /&gt;
	-- original args table is added to the args table.&lt;br /&gt;
	local args = getArgs{}&lt;br /&gt;
	args.newKey = nil -- The nil is memoized&lt;br /&gt;
	self:assertNumberOfIterations(0, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoTableLengthChangeWhileIterating()&lt;br /&gt;
	-- Test that the number of arguments doesn't change if we index the&lt;br /&gt;
	-- args table while iterating.&lt;br /&gt;
	-- (Note that the equivalent test is not needed for new arg table&lt;br /&gt;
	-- indexes, as that would be a user error - doing so produces&lt;br /&gt;
	-- undetermined behaviour in Lua's next() function.)&lt;br /&gt;
	local args = getArgs{'foo', 'bar', baz = 'qux'}&lt;br /&gt;
	self:assertNumberOfIterations(3, pairs, args)&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local temp = args[k .. 'foo']&lt;br /&gt;
	end&lt;br /&gt;
	self:assertNumberOfIterations(3, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPairsPrecedenceWithWhitespace()&lt;br /&gt;
	local frame, parent = suite.getFrames(&lt;br /&gt;
		d.frameTitle,&lt;br /&gt;
		{'  '},&lt;br /&gt;
		d.parentTitle,&lt;br /&gt;
		{d.firstParentArg}&lt;br /&gt;
	)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local actual&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		actual = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertEquals(d.firstParentArg, actual)&lt;br /&gt;
	-- Check that we have actually iterated.&lt;br /&gt;
	self:assertNumberOfIterations(1, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPairsPrecedenceWithNil()&lt;br /&gt;
	local frame, parent = suite.getFrames(&lt;br /&gt;
		d.frameTitle,&lt;br /&gt;
		{},&lt;br /&gt;
		d.parentTitle,&lt;br /&gt;
		{d.firstParentArg}&lt;br /&gt;
	)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local actual&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		actual = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertEquals(d.firstParentArg, actual)&lt;br /&gt;
	-- Check that we have actually iterated.&lt;br /&gt;
	self:assertNumberOfIterations(1, pairs, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testIpairsEarlyExit()&lt;br /&gt;
	local mt = {}&lt;br /&gt;
	function mt.__index(t, k)&lt;br /&gt;
		if k == 1 then&lt;br /&gt;
			return 'foo'&lt;br /&gt;
		elseif k == 2 then&lt;br /&gt;
			return 'bar'&lt;br /&gt;
		elseif k == 3 then&lt;br /&gt;
			error('Expanded argument 3 unnecessarily')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	function mt.__pairs(t)&lt;br /&gt;
		error('Called pairs unnecessarily')&lt;br /&gt;
	end&lt;br /&gt;
	function mt.__ipairs(t)&lt;br /&gt;
		-- Works just like the default ipairs, except respecting __index&lt;br /&gt;
		return function(t, i)&lt;br /&gt;
			local v = t[i + 1]&lt;br /&gt;
			if v ~= nil then&lt;br /&gt;
				return i + 1, v&lt;br /&gt;
			end&lt;br /&gt;
		end, t, 0&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(setmetatable({}, mt))&lt;br /&gt;
	for k,v in ipairs(args) do&lt;br /&gt;
		if v == 'bar' then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
-- Test argument translation&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testTranslationIndex()&lt;br /&gt;
	local args = getArgs({F00 = 'one', ['8@r'] = 'two', ['8@z'] = 'three', qUx = 'four', foo = 'nope', untranslated = 'yep'}, {translate = d.translate})&lt;br /&gt;
	self:assertEquals('one', args.foo)&lt;br /&gt;
	self:assertEquals('two', args.bar)&lt;br /&gt;
	self:assertEquals('three', args.baz)&lt;br /&gt;
	self:assertEquals('four', args.qux)&lt;br /&gt;
	self:assertEquals('yep', args.untranslated)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTranslationPairsWithAutoBacktranslate()&lt;br /&gt;
	local args = getArgs({F00 = 'one', ['8@r'] = 'two', ['8@z'] = 'three', qUx = 'four', foo = 'nope', untranslated = 'yep'}, {translate = d.translate})&lt;br /&gt;
	local cleanArgs = {}&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		cleanArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertDeepEquals(&lt;br /&gt;
		{&lt;br /&gt;
			foo = 'one',&lt;br /&gt;
			bar = 'two',&lt;br /&gt;
			baz = 'three',&lt;br /&gt;
			qux = 'four',&lt;br /&gt;
			untranslated = 'yep'&lt;br /&gt;
		},&lt;br /&gt;
		cleanArgs&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTranslationPairsWithBacktranslate()&lt;br /&gt;
	local args = getArgs({F00 = 'one', ['8@r'] = 'two', ['8@z'] = 'three', qUx = 'four', foo = 'nope', untranslated = 'yep'}, {translate = d.translate, backtranslate = {F00 = 'foo'}})&lt;br /&gt;
	local cleanArgs = {}&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		cleanArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertDeepEquals(&lt;br /&gt;
		{&lt;br /&gt;
			foo = 'one',&lt;br /&gt;
			['8@r'] = 'two',&lt;br /&gt;
			['8@z'] = 'three',&lt;br /&gt;
			qUx = 'four',&lt;br /&gt;
			untranslated = 'yep'&lt;br /&gt;
		},&lt;br /&gt;
		cleanArgs&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTranslationPairsWithoutBacktranslate()&lt;br /&gt;
	local args = getArgs({F00 = 'one', ['8@r'] = 'two', ['8@z'] = 'three', qUx = 'four', foo = 'nope', untranslated = 'yep'}, {translate = d.translate, backtranslate = false})&lt;br /&gt;
	local cleanArgs = {}&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		cleanArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertDeepEquals(&lt;br /&gt;
		{&lt;br /&gt;
			F00 = 'one',&lt;br /&gt;
			['8@r'] = 'two',&lt;br /&gt;
			['8@z'] = 'three',&lt;br /&gt;
			qUx = 'four',&lt;br /&gt;
			foo = 'nope',&lt;br /&gt;
			untranslated = 'yep'&lt;br /&gt;
		},&lt;br /&gt;
		cleanArgs&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTranslationNewindex()&lt;br /&gt;
	local args = getArgs({F00 = 'one', ['8@r'] = 'two', ['8@z'] = 'three', qUx = 'four', foo = 'nope', untranslated = 'yep'}, {translate = d.translate, backtranslate = false})&lt;br /&gt;
	args.foo = 'changed1'&lt;br /&gt;
	args.untranslated = 'changed2'&lt;br /&gt;
	local cleanArgs = {}&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		cleanArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	self:assertDeepEquals(&lt;br /&gt;
		{&lt;br /&gt;
			F00 = 'changed1',&lt;br /&gt;
			['8@r'] = 'two',&lt;br /&gt;
			['8@z'] = 'three',&lt;br /&gt;
			qUx = 'four',&lt;br /&gt;
			foo = 'nope',&lt;br /&gt;
			untranslated = 'changed2'&lt;br /&gt;
		},&lt;br /&gt;
		cleanArgs&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:test_argument()&lt;br /&gt;
	local currentFrame = mw.getCurrentFrame()&lt;br /&gt;
	currentFrame.args[5] = 555;&lt;br /&gt;
	local args = getArgs(currentFrame)&lt;br /&gt;
	self:assertEquals('nil', type(args.foo))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return suite&lt;/div&gt;</summary>
		<author><name>Module&gt;Capankajsmilyo</name></author>
	</entry>
</feed>