local test = require 'pl.test' local lapp = require 'pl.lapp' local k = 1 function check (spec,args,match) local args = lapp(spec,args) for k,v in pairs(args) do if type(v) == 'userdata' then args[k]:close(); args[k] = '' end end test.asserteq(args,match) end -- force Lapp to throw an error, rather than just calling os.exit() lapp.show_usage_error = 'throw' function check_error(spec,args,msg) arg = args local ok,err = pcall(lapp,spec) test.assertmatch(err,msg) end local parmtest = [[ Testing 'array' parameter handling -o,--output... (string) -v... ]] check (parmtest,{'-o','one'},{output={'one'},v={false}}) check (parmtest,{'-o','one','-v'},{output={'one'},v={true}}) check (parmtest,{'-o','one','-vv'},{output={'one'},v={true,true}}) check (parmtest,{'-o','one','-o','two'},{output={'one','two'},v={false}}) local simple = [[ Various flags and option types -p A simple optional flag, defaults to false -q,--quiet A simple flag with long name -o (string) A required option with argument (default stdin) Optional input file parameter... ]] check(simple, {'-o','in'}, {quiet=false,p=false,o='in',input=''}) check(simple, {'-o','help','-q','test-lapp.lua'}, {quiet=true,p=false,o='help',input='',input_name='test-lapp.lua'}) local longs = [[ --open (string) ]] check(longs,{'--open','folder'},{open='folder'}) local extras1 = [[ (string) A bunch of files ]] check(extras1,{'one','two'},{files={'one','two'}}) -- any extra parameters go into the array part of the result local extras2 = [[ (string) A file ]] check(extras2,{'one','two'},{file='one','two'}) local extended = [[ --foo (string default 1) -s,--speed (slow|medium|fast default medium) -n (1..10 default 1) -p print -v verbose ]] check(extended,{},{foo='1',speed='medium',n=1,p=false,v=false}) check(extended,{'-pv'},{foo='1',speed='medium',n=1,p=true,v=true}) check(extended,{'--foo','2','-s','fast'},{foo='2',speed='fast',n=1,p=false,v=false}) check(extended,{'--foo=2','-s=fast','-n2'},{foo='2',speed='fast',n=2,p=false,v=false}) check_error(extended,{'--speed','massive'},"value 'massive' not in slow|medium|fast") check_error(extended,{'-n','x'},"unable to convert to number: x") check_error(extended,{'-n','12'},"n out of range")