Module:Arguments/testcases
Appearance
![]() | This is the test cases page for the module Module:Arguments. Results of the test cases. |
localgetArgs=require('Module:Arguments/sandbox').getArgslocalScribuntoUnit=require('Module:ScribuntoUnit')localsuite=ScribuntoUnit:new()---------------------------------------------------------------------------- Default values--------------------------------------------------------------------------locald={}d.frameTitle='Frame title'd.parentTitle='Parent title'-- Precedence-testing valuesd.firstFrameArg='first frame argument'd.firstParentArg='first parent argument'd.secondParentArg='second parent argument'd.uniqueFrameArg='unique frame argument'd.uniqueFrameArgKey='uniqueFrameArgKey'd.uniqueParentArg='unique parent argument'd.uniqueParentArgKey='uniqueParentArgKey'-- Trimming and whitespace values.-- Whitespace gets trimmed from named parameters, so keys for these need-- to be numbers to make this a proper test.d.blankArg=''d.blankArgKey=100d.spacesArg='\n 'd.spacesArgKey=101d.untrimmedArg='\n foo bar 'd.untrimmedArgKey=102d.trimmedArg='foo bar'd.valueFuncValue='valueFuncValue'd.defaultValueFunc=function()returnd.valueFuncValueendd.translate={foo='F00',bar='8@r',baz='8@z',qux='qUx'}---------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------functionsuite.getFrames(frameTitle,frameArgs,parentTitle,parentArgs)frameTitle=frameTitleord.frameTitleframeArgs=frameArgsor{d.firstFrameArg,[d.uniqueFrameArgKey]=d.uniqueFrameArg,[d.blankArgKey]=d.blankArg,[d.spacesArgKey]=d.spacesArg,[d.untrimmedArgKey]=d.untrimmedArg}parentTitle=parentTitleord.parentTitleparentArgs=parentArgsor{d.firstParentArg,d.secondParentArg,[d.uniqueParentArgKey]=d.uniqueParentArg}localcurrentFrame=mw.getCurrentFrame()localparent=currentFrame:newChild{title=parentTitle,args=parentArgs}localframe=parent:newChild{title=frameTitle,args=frameArgs}returnframe,parentendfunctionsuite.getDefaultArgs(options,frameTitle,frameArgs,parentTitle,parentArgs)localframe,parent=suite.getFrames(frameTitle,frameArgs,parentTitle,parentArgs)localargs=getArgs(frame,options)returnargsendfunctionsuite:assertError(func,...)-- Asserts that executing the function func results in an error.-- Parameters after func are func's arguments.localsuccess,msg=pcall(func,...)self:assertFalse(success)endfunctionsuite:assertNumberOfIterations(expected,iterator,t)localnoIterations=0fork,viniterator(t)donoIterations=noIterations+1endself:assertEquals(expected,noIterations)end---------------------------------------------------------------------------- Test precedence--------------------------------------------------------------------------functionsuite:assertDefaultPrecedence(args)self:assertEquals(d.firstFrameArg,args[1])self:assertEquals(d.secondParentArg,args[2])self:assertEquals(d.uniqueFrameArg,args[d.uniqueFrameArgKey])self:assertEquals(d.uniqueParentArg,args[d.uniqueParentArgKey])endfunctionsuite:testDefaultPrecedence()self:assertDefaultPrecedence(suite.getDefaultArgs())endfunctionsuite:testDefaultPrecedenceThroughWrapper()self:assertDefaultPrecedence(suite.getDefaultArgs{wrappers={d.parentTitle},parentOnly=false})endfunctionsuite:testDefaultPrecedenceThroughNonWrapper()self:assertDefaultPrecedence(suite.getDefaultArgs({wrappers=d.parentTitle,frameOnly=false},nil,nil,'Not the parent title'))endfunctionsuite:assertParentFirst(args)self:assertEquals(d.firstParentArg,args[1])self:assertEquals(d.secondParentArg,args[2])self:assertEquals(d.uniqueFrameArg,args[d.uniqueFrameArgKey])self:assertEquals(d.uniqueParentArg,args[d.uniqueParentArgKey])endfunctionsuite:testParentFirst()self:assertParentFirst(suite.getDefaultArgs{parentFirst=true})endfunctionsuite:testParentFirstThroughWrapper()self:assertParentFirst(suite.getDefaultArgs{wrappers={d.parentTitle},parentOnly=false,parentFirst=true})endfunctionsuite:testParentFirstThroughNonWrapper()self:assertParentFirst(suite.getDefaultArgs({wrappers=d.parentTitle,frameOnly=false,parentFirst=true},nil,nil,'Not the parent title'))endfunctionsuite:assertParentOnly(args)self:assertEquals(d.firstParentArg,args[1])self:assertEquals(d.secondParentArg,args[2])self:assertEquals(nil,args[d.uniqueFrameArgKey])self:assertEquals(d.uniqueParentArg,args[d.uniqueParentArgKey])endfunctionsuite:testParentOnly()self:assertParentOnly(suite.getDefaultArgs{parentOnly=true})endfunctionsuite:testParentOnlyThroughWrapper()self:assertParentOnly(suite.getDefaultArgs{wrappers={d.parentTitle}})endfunctionsuite:testParentOnlyThroughSandboxWrapper()self:assertParentOnly(suite.getDefaultArgs({wrappers=d.parentTitle},nil,nil,d.parentTitle..'/sandbox'))endfunctionsuite:assertFrameOnly(args)self:assertEquals(d.firstFrameArg,args[1])self:assertEquals(nil,args[2])self:assertEquals(d.uniqueFrameArg,args[d.uniqueFrameArgKey])self:assertEquals(nil,args[d.uniqueParentArgKey])endfunctionsuite:testFrameOnly()self:assertFrameOnly(suite.getDefaultArgs{frameOnly=true})endfunctionsuite:testFrameOnlyThroughNonWrapper()self:assertFrameOnly(suite.getDefaultArgs({wrappers=d.parentTitle},nil,nil,'Not the parent title'))endfunctionsuite:testDefaultPrecedenceWithWhitespace()localframe,parent=suite.getFrames(d.frameTitle,{' '},d.parentTitle,{d.firstParentArg})localargs=getArgs(frame)self:assertEquals(d.firstParentArg,args[1])end---------------------------------------------------------------------------- Test trimming and blank removal--------------------------------------------------------------------------functionsuite:testDefaultTrimmingAndBlankRemoval()localargs=suite.getDefaultArgs()self:assertEquals(nil,args[d.blankArgKey])self:assertEquals(nil,args[d.spacesArgKey])self:assertEquals(d.trimmedArg,args[d.untrimmedArgKey])endfunctionsuite:testRemoveBlanksButNoTrimming()localargs=suite.getDefaultArgs{trim=false}self:assertEquals(nil,args[d.blankArgKey])self:assertEquals(nil,args[d.spacesArgKey])self:assertEquals(d.untrimmedArg,args[d.untrimmedArgKey])endfunctionsuite:testTrimButNoBlankRemoval()localargs=suite.getDefaultArgs{removeBlanks=false}self:assertEquals(d.blankArg,args[d.blankArgKey])self:assertEquals('',args[d.spacesArgKey])self:assertEquals(d.trimmedArg,args[d.untrimmedArgKey])endfunctionsuite:testNoTrimOrBlankRemoval()localargs=suite.getDefaultArgs{trim=false,removeBlanks=false}self:assertEquals(d.blankArg,args[d.blankArgKey])self:assertEquals(d.spacesArg,args[d.spacesArgKey])self:assertEquals(d.untrimmedArg,args[d.untrimmedArgKey])end---------------------------------------------------------------------------- Test valueFunc--------------------------------------------------------------------------functionsuite:testValueFunc()localargs=suite.getDefaultArgs{valueFunc=d.defaultValueFunc}self:assertEquals(d.valueFuncValue,args['some random key: sdfaliwyda'])endfunctionsuite:testValueFuncPrecedence()localargs=suite.getDefaultArgs{trim=false,removeBlanks=false,valueFunc=d.defaultValueFunc}self:assertEquals(d.valueFuncValue,args[1])self:assertEquals(d.valueFuncValue,args['some random key: gekjabawyvy'])endfunctionsuite:testValueFuncKey()localargs=suite.getDefaultArgs{valueFunc=function(key,value)return'valueFunc key: '..keyend}self:assertEquals('valueFunc key: foo',args.foo)endfunctionsuite:testValueFuncValue()localargs=suite.getDefaultArgs{valueFunc=function(key,value)return'valueFunc value: '..valueend}self:assertEquals('valueFunc value: '..d.uniqueFrameArg,args[d.uniqueFrameArgKey])end---------------------------------------------------------------------------- Test adding new arguments--------------------------------------------------------------------------functionsuite:testAddingNewArgs()localargs=suite.getDefaultArgs()self:assertEquals(nil,args.newKey)args.newKey='some new key'self:assertEquals('some new key',args.newKey)endfunctionsuite:testAddingNewBlankArgs()localargs=suite.getDefaultArgs()self:assertEquals(nil,args.newKey)args.newKey=''self:assertEquals('',args.newKey)endfunctionsuite:testAddingNewSpacesArgs()localargs=suite.getDefaultArgs()self:assertEquals(nil,args.newKey)args.newKey=' 'self:assertEquals(' ',args.newKey)endfunctionsuite:testOverwriting()localargs=suite.getDefaultArgs()self:assertEquals(d.firstFrameArg,args[1])args[1]='a new first frame argument'self:assertEquals('a new first frame argument',args[1])endfunctionsuite:testOverwritingWithNil()localargs=suite.getDefaultArgs()self:assertEquals(d.firstFrameArg,args[1])args[1]=nilself:assertEquals(nil,args[1])endfunctionsuite:testOverwritingWithBlank()localargs=suite.getDefaultArgs()self:assertEquals(d.firstFrameArg,args[1])args[1]=''self:assertEquals('',args[1])endfunctionsuite:testOverwritingWithSpaces()localargs=suite.getDefaultArgs()self:assertEquals(d.firstFrameArg,args[1])args[1]=' 'self:assertEquals(' ',args[1])endfunctionsuite:testReadOnly()localargs=suite.getDefaultArgs{readOnly=true}localfunctiontestFunc()args.newKey='some new value'endself:assertError(testFunc)endfunctionsuite:testNoOverwriteExistingKey()localargs=suite.getDefaultArgs{noOverwrite=true}self:assertEquals(d.firstFrameArg,args[1])localfunctiontestFunc()args[1]='a new first frame argument'endself:assertError(testFunc)endfunctionsuite:testNoOverwriteNewKey()localargs=suite.getDefaultArgs{noOverwrite=true}self:assertEquals(nil,args.newKey)args.newKey='some new value'self:assertEquals('some new value',args.newKey)end---------------------------------------------------------------------------- Test bad input--------------------------------------------------------------------------functionsuite:testBadFrameInput()self:assertError(getArgs,'foo')self:assertError(getArgs,9)self:assertError(getArgs,true)self:assertError(getArgs,function()returntrueend)endfunctionsuite:testBadOptionsInput()self:assertError(getArgs,{},'foo')self:assertError(getArgs,{},9)self:assertError(getArgs,{},true)self:assertError(getArgs,{},function()returntrueend)endfunctionsuite:testBadValueFuncInput()self:assertError(getArgs,{},{valueFunc='foo'})self:assertError(getArgs,{},{valueFunc=9})self:assertError(getArgs,{},{valueFunc=true})self:assertError(getArgs,{},{valueFunc={}})end---------------------------------------------------------------------------- Test iterator metamethods--------------------------------------------------------------------------functionsuite:testPairs()localargs=getArgs{'foo','bar',baz='qux'}self:assertNumberOfIterations(3,pairs,args)endfunctionsuite:testIpairs()localargs=getArgs{'foo','bar',baz='qux'}self:assertNumberOfIterations(2,ipairs,args)endfunctionsuite:testNoNilsinPairs()-- Test that when we use pairs, we don't iterate over any nil values-- that have been memoized.localargs=getArgs{''}localtemp=args[1]-- Memoizes the nilself:assertNumberOfIterations(0,pairs,args)endfunctionsuite:testNoNilsinIpairs()-- Test that when we use ipairs, we don't iterate over any nil values-- that have been memoized.localargs=getArgs{''}localtemp=args[1]-- Memoizes the nilself:assertNumberOfIterations(0,ipairs,args)endfunctionsuite:testDeletedArgsInPairs()-- Test that when we use pairs, we don't iterate over any values that have-- been explicitly set to nil.localargs=getArgs{'foo'}args[1]=nilself:assertNumberOfIterations(0,pairs,args)endfunctionsuite:testDeletedArgsInIpairs()-- Test that when we use ipairs, we don't iterate over any values that have-- been explicitly set to nil.localargs=getArgs{'foo'}args[1]=nilself:assertNumberOfIterations(0,ipairs,args)endfunctionsuite:testNoNilsInPairsAfterIndex()-- Test that when we use pairs, we don't iterate over any nils that-- might have been memoized after a value that is not present in the-- original args table is indexed.localargs=getArgs{}localtemp=args.someRandomValue-- Memoizes the nilself:assertNumberOfIterations(0,pairs,args)endfunctionsuite:testNoNilsInPairsAfterNewindex()-- Test that when we use pairs, we don't iterate over any nils that-- might have been memoized after a value that is not present in the-- original args table is added to the args table.localargs=getArgs{}args.newKey=nil-- The nil is memoizedself:assertNumberOfIterations(0,pairs,args)endfunctionsuite:testNoTableLengthChangeWhileIterating()-- Test that the number of arguments doesn't change if we index the-- args table while iterating.-- (Note that the equivalent test is not needed for new arg table-- indexes, as that would be a user error - doing so produces-- undetermined behaviour in Lua's next() function.)localargs=getArgs{'foo','bar',baz='qux'}self:assertNumberOfIterations(3,pairs,args)fork,vinpairs(args)dolocaltemp=args[k..'foo']endself:assertNumberOfIterations(3,pairs,args)endfunctionsuite:testPairsPrecedenceWithWhitespace()localframe,parent=suite.getFrames(d.frameTitle,{' '},d.parentTitle,{d.firstParentArg})localargs=getArgs(frame)localactualfork,vinpairs(args)doactual=vendself:assertEquals(d.firstParentArg,actual)-- Check that we have actually iterated.self:assertNumberOfIterations(1,pairs,args)endfunctionsuite:testPairsPrecedenceWithNil()localframe,parent=suite.getFrames(d.frameTitle,{},d.parentTitle,{d.firstParentArg})localargs=getArgs(frame)localactualfork,vinpairs(args)doactual=vendself:assertEquals(d.firstParentArg,actual)-- Check that we have actually iterated.self:assertNumberOfIterations(1,pairs,args)endfunctionsuite:testIpairsEarlyExit()localmt={}functionmt.__index(t,k)ifk==1thenreturn'foo'elseifk==2thenreturn'bar'elseifk==3thenerror('Expanded argument 3 unnecessarily')endendfunctionmt.__pairs(t)error('Called pairs unnecessarily')endfunctionmt.__ipairs(t)-- Works just like the default ipairs, except respecting __indexreturnfunction(t,i)localv=t[i+1]ifv~=nilthenreturni+1,vendend,t,0endlocalargs=getArgs(setmetatable({},mt))fork,vinipairs(args)doifv=='bar'thenbreakendendend---------------------------------------------------------------------------- Test argument translation--------------------------------------------------------------------------functionsuite:testTranslationIndex()localargs=getArgs({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},{translate=d.translate})self:assertEquals('one',args.foo)self:assertEquals('two',args.bar)self:assertEquals('three',args.baz)self:assertEquals('four',args.qux)self:assertEquals('yep',args.untranslated)endfunctionsuite:testTranslationPairsWithAutoBacktranslate()localargs=getArgs({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},{translate=d.translate})localcleanArgs={}fork,vinpairs(args)docleanArgs[k]=vendself:assertDeepEquals({foo='one',bar='two',baz='three',qux='four',untranslated='yep'},cleanArgs)endfunctionsuite:testTranslationPairsWithBacktranslate()localargs=getArgs({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},{translate=d.translate,backtranslate={F00='foo'}})localcleanArgs={}fork,vinpairs(args)docleanArgs[k]=vendself:assertDeepEquals({foo='one',['8@r']='two',['8@z']='three',qUx='four',untranslated='yep'},cleanArgs)endfunctionsuite:testTranslationPairsWithoutBacktranslate()localargs=getArgs({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},{translate=d.translate,backtranslate=false})localcleanArgs={}fork,vinpairs(args)docleanArgs[k]=vendself:assertDeepEquals({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},cleanArgs)endfunctionsuite:testTranslationNewindex()localargs=getArgs({F00='one',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='yep'},{translate=d.translate,backtranslate=false})args.foo='changed1'args.untranslated='changed2'localcleanArgs={}fork,vinpairs(args)docleanArgs[k]=vendself:assertDeepEquals({F00='changed1',['8@r']='two',['8@z']='three',qUx='four',foo='nope',untranslated='changed2'},cleanArgs)endfunctionsuite:test_argument()localcurrentFrame=mw.getCurrentFrame()currentFrame.args[5]=555;localargs=getArgs(currentFrame)self:assertEquals('nil',type(args.foo))endreturnsuite