@@ -63,45 +63,45 @@ describe("Testing cliargs library parsing commandlines", function()
6363
6464 it (" tests no arguments set, nor provided" , function ()
6565 local args = {}
66- result = cli :parse (args )
66+ local result = cli :parse (args )
6767 assert .are .same (result , {})
6868 end )
6969
7070 it (" tests uses global arg if arguments set not passed in" , function ()
7171 _G .arg = { " --version" }
72- defaults = populate_flags (cli )
72+ local defaults = populate_flags (cli )
7373 defaults .v = true
7474 defaults .version = true
75- result = cli :parse (true --[[ no print]] )
75+ local result = cli :parse (true --[[ no print]] )
7676 assert .are .same (result , defaults )
7777 end )
7878
7979 it (" tests only optionals, nothing provided" , function ()
8080 local args = {}
81- defaults = populate_optionals (cli )
82- result = cli :parse (args )
81+ local defaults = populate_optionals (cli )
82+ local result = cli :parse (args )
8383 assert .are .same (result , defaults )
8484 end )
8585
8686 it (" tests only required, all provided" , function ()
8787 local args = { " some_file" }
8888 populate_required (cli )
89- result = cli :parse (args )
89+ local result = cli :parse (args )
9090 assert .are .same (result , { [" INPUT" ] = " some_file" })
9191 end )
9292
9393 it (" tests only optionals, all provided" , function ()
9494 local args = { " -o" , " /dev/cdrom" , " --compress=lzma" }
9595 populate_optionals (cli )
96- result = cli :parse (args )
96+ local result = cli :parse (args )
9797 assert .are .same (result , { o = " /dev/cdrom" , c = " lzma" , compress = " lzma" })
9898 end )
9999
100100 it (" tests optionals + required, all provided" , function ()
101101 local args = { " -o" , " /dev/cdrom" , " -c" , " lzma" , " some_file" }
102102 populate_required (cli )
103103 populate_optionals (cli )
104- result = cli :parse (args )
104+ local result = cli :parse (args )
105105 assert .are .same (result , {
106106 o = " /dev/cdrom" ,
107107 c = " lzma" , compress = " lzma" ,
@@ -110,50 +110,87 @@ describe("Testing cliargs library parsing commandlines", function()
110110 end )
111111
112112 it (" tests optional using -short-key notation" , function ()
113- defaults = populate_optionals (cli )
113+ local defaults = populate_optionals (cli )
114114 defaults .c = " lzma"
115115 defaults .compress = " lzma"
116116
117- result = cli :parse ({ " -c" , " lzma" })
117+ local result = cli :parse ({ " -c" , " lzma" })
118118 assert .are .same (result , defaults )
119119 end )
120120
121121 it (" tests option using -short-key value notation" , function ()
122122 _G .arg = { " -out" , " outfile" }
123123 cli :add_opt (" -out VALUE" , " output file" )
124- defaults = { out = " outfile" }
125- result = cli :parse ()
124+ local defaults = { out = " outfile" }
125+ local result = cli :parse ()
126126 assert .are .same (result , defaults )
127127 end )
128128
129129 it (" tests optional using --expanded-key notation, --x=VALUE" , function ()
130- defaults = populate_optionals (cli )
130+ local defaults = populate_optionals (cli )
131131 defaults .c = " lzma"
132132 defaults .compress = " lzma"
133133
134- result = cli :parse ({ " --compress=lzma" })
134+ local result = cli :parse ({ " --compress=lzma" })
135135
136136 assert .are .same (result , defaults )
137137 end )
138138
139139 it (" tests optional using alternate --expanded-key notation, --x VALUE" , function ()
140- defaults = populate_optionals (cli )
140+ local defaults = populate_optionals (cli )
141141 defaults .c = " lzma"
142142 defaults .compress = " lzma"
143143
144- result = cli :parse ({ " --compress" , " lzma" })
144+ local result = cli :parse ({ " --compress" , " lzma" })
145145
146146 assert .are .same (result , defaults )
147147 end )
148148
149+ describe (" no-flag" , function ()
150+ it (" can set default to false for flag" , function ()
151+ cli :add_flag (" -R, --[no-]recursive" , " copy recursively" , false )
152+ local expected = { R = false , recursive = false }
153+ local result = cli :parse ({})
154+ assert .are .same (expected , result )
155+ end )
156+
157+ it (" can set default to true for flag" , function ()
158+ cli :add_flag (" -R, --[no-]recursive" , " copy recursively" , true )
159+ local expected = { R = true , recursive = true }
160+ local result = cli :parse ({})
161+ assert .are .same (expected , result )
162+ end )
163+
164+ it (" sets flag value to false" , function ()
165+ cli :add_flag (" -k, --[no-]keep-going" , " continue as much as possible after an error" , true )
166+ local expected = { k = false , [' keep-going' ] = false }
167+ local result = cli :parse ({ " --no-keep-going" })
168+ assert .are .same (expected , result )
169+ end )
170+
171+ it (" sets flag value true then overwrites to false" , function ()
172+ cli :add_flag (" -k, --[no-]keep-going" , " continue as much as possible after an error" , true )
173+ local expected = { k = false , [' keep-going' ] = false }
174+ local result = cli :parse ({ " -k" , " --no-keep-going" })
175+ assert .are .same (expected , result )
176+ end )
177+
178+ it (" sets flag value false then overwrites to true" , function ()
179+ cli :add_flag (" -k, --[no-]keep-going" , " continue as much as possible after an error" , true )
180+ local expected = { k = true , [' keep-going' ] = true }
181+ local result = cli :parse ({ " --no-keep-going" , " --keep-going" })
182+ assert .are .same (expected , result )
183+ end )
184+ end )
185+
149186 describe (" multiple values for a single key" , function ()
150187 it (" should work for keys that explicitly permit it" , function ()
151188 cli :add_option (" -k, --key=VALUE" , " key that can be specified multiple times" , {})
152189
153- defaults = { key = {" value1" , " value2" , " value3" } }
190+ local defaults = { key = {" value1" , " value2" , " value3" } }
154191 defaults .k = defaults .key
155192
156- result = cli :parse ({ " --key" , " value1" , " -k" , " value2" , " --key=value3" })
193+ local result = cli :parse ({ " --key" , " value1" , " -k" , " value2" , " --key=value3" })
157194
158195 assert .are .same (result , defaults )
159196 end )
@@ -177,32 +214,32 @@ describe("Testing cliargs library parsing commandlines", function()
177214
178215 describe (" flag options" , function ()
179216 it (" should turn them on using the -short-key notation" , function ()
180- defaults = populate_flags (cli )
217+ local defaults = populate_flags (cli )
181218 defaults .v = true
182219 defaults .version = true
183- result = cli :parse ({ " -v" })
220+ local result = cli :parse ({ " -v" })
184221 assert .are .same (result , defaults )
185222 end )
186223
187224 it (" should turn them on using the --expanded-key notation" , function ()
188- defaults = populate_flags (cli )
225+ local defaults = populate_flags (cli )
189226 defaults .v = true
190227 defaults .version = true
191- result = cli :parse ({ " --version" })
228+ local result = cli :parse ({ " --version" })
192229 assert .are .same (result , defaults )
193230 end )
194231
195232 describe (" given a -short-key only flag option" , function ()
196233 it (" works" , function ()
197234 cli :add_flag (" -d" , " script will run in DEBUG mode" )
198- result = cli :parse ({ " -d" })
235+ local result = cli :parse ({ " -d" })
199236 assert .are .same (result , { d = true })
200237 end )
201238 end )
202239
203240 describe (" given an --expanded-key only flag option" , function ()
204241 it (" works" , function ()
205- defaults = populate_flags (cli )
242+ local defaults = populate_flags (cli )
206243 defaults .verbose = true
207244 result = cli :parse ({ " --verbose" })
208245 assert .are .same (result , defaults )
@@ -211,11 +248,9 @@ describe("Testing cliargs library parsing commandlines", function()
211248
212249 describe (" given a value for a flag" , function ()
213250 it (" bails" , function ()
214- local err
215-
216- defaults = populate_flags (cli )
251+ local defaults = populate_flags (cli )
217252 defaults .verbose = true
218- result , err = cli :parse ({ " --verbose=something" }, true --[[ no print]] )
253+ local result , err = cli :parse ({ " --verbose=something" }, true --[[ no print]] )
219254
220255 assert (result == nil , " Adding a value to a flag must error out" )
221256 assert (type (err ) == " string" , " Expected an error string" )
@@ -226,14 +261,14 @@ describe("Testing cliargs library parsing commandlines", function()
226261 it (" tests optionals + required, no optionals and to little required provided, " , function ()
227262 populate_required (cli )
228263 populate_optionals (cli )
229- result = cli :parse ({}, true --[[ no print]] )
264+ local result = cli :parse ({}, true --[[ no print]] )
230265 assert .is .falsy (result )
231266 end )
232267
233268 it (" tests optionals + required, no optionals and too many required provided, " , function ()
234269 populate_required (cli )
235270 populate_optionals (cli )
236- result = cli :parse ({ " some_file" , " some_other_file" }, true --[[ no print]] )
271+ local result = cli :parse ({ " some_file" , " some_other_file" }, true --[[ no print]] )
237272 assert .is .falsy (result )
238273 end )
239274
@@ -250,63 +285,62 @@ describe("Testing cliargs library parsing commandlines", function()
250285
251286 it (" tests bad short-key notation, -x=VALUE" , function ()
252287 populate_optionals (cli )
253- result = cli :parse ({ " -o=some_file" }, true --[[ no print]] )
288+ local result = cli :parse ({ " -o=some_file" }, true --[[ no print]] )
254289 assert .is .falsy (result )
255290 end )
256291
257292 it (" tests unknown option" , function ()
258293 populate_optionals (cli )
259- result = cli :parse ({ " --foo=bar" }, true --[[ no print]] )
294+ local result = cli :parse ({ " --foo=bar" }, true --[[ no print]] )
260295 assert .is .falsy (result )
261296 end )
262297
263298 it (" tests unknown flag" , function ()
264299 populate_optionals (cli )
265- result = cli :parse ({ " --foo" }, true --[[ no print]] )
300+ local result = cli :parse ({ " --foo" }, true --[[ no print]] )
266301 assert .is .falsy (result )
267302 end )
268303
269304 it (" tests optarg only, defaults, multiple allowed" , function ()
270305 defaults = populate_optarg (3 )
271- result ,err = cli :parse (true --[[ no print]] )
306+ local result ,err = cli :parse (true --[[ no print]] )
272307 assert .is .same (defaults , result )
273308 end )
274309
275310 it (" tests optarg only, defaults, 1 allowed" , function ()
276311 defaults = populate_optarg (1 )
277- result = cli :parse (true --[[ no print]] )
312+ local result = cli :parse (true --[[ no print]] )
278313 assert .is .same (defaults , result )
279314 end )
280315
281316 it (" tests optarg only, values, multiple allowed" , function ()
282317 defaults = populate_optarg (3 )
283- result = cli :parse ({" /output1/" , " /output2/" }, true --[[ no print]] )
318+ local result = cli :parse ({" /output1/" , " /output2/" }, true --[[ no print]] )
284319 assert .is .same (result , { OUTPUT = {" /output1/" , " /output2/" }})
285320 end )
286321
287322 it (" tests optarg only, values, 1 allowed" , function ()
288- defaults = populate_optarg (1 )
289- result = cli :parse ({" /output/" }, true --[[ no print]] )
323+ local defaults = populate_optarg (1 )
324+ local result = cli :parse ({" /output/" }, true --[[ no print]] )
290325 assert .is .same (result , { OUTPUT = " /output/" })
291326 end )
292327
293328 it (" tests optarg only, too many values" , function ()
294- defaults = populate_optarg (1 )
295- result = cli :parse ({" /output1/" , " /output2/" }, true --[[ no print]] )
329+ local defaults = populate_optarg (1 )
330+ local result = cli :parse ({" /output1/" , " /output2/" }, true --[[ no print]] )
296331 assert .is .same (result , nil )
297332 end )
298333
299334 it (" tests optarg only, too many values" , function ()
300335 populate_required ()
301336 populate_optarg (1 )
302- result = cli :parse ({" /input/" , " /output/" }, true --[[ no print]] )
337+ local result = cli :parse ({" /input/" , " /output/" }, true --[[ no print]] )
303338 assert .is .same (result , { INPUT = " /input/" , OUTPUT = " /output/" })
304339 end )
305340
306341 it (" tests clearing the default of an optional" , function ()
307- local err
308342 populate_optionals (cli )
309- result , err = cli :parse ({ " --compress=" }, true --[[ no print]] )
343+ local result , err = cli :parse ({ " --compress=" }, true --[[ no print]] )
310344 assert .are .equal (nil ,err )
311345 -- are_not.equal is not working when comparing against a nil as
312346 -- of luassert-1.2-1, using is.truthy instead for now
@@ -361,6 +395,16 @@ describe("Testing cliargs library parsing commandlines", function()
361395 assert .are .equal (nil , cb .altkey )
362396 end )
363397
398+ it (" tests callback for no-flags" , function ()
399+ cli :add_flag (" -k, --[no-]long-key" , " key description" , callback )
400+ local expected = { k = false , [" long-key" ] = false }
401+ local result = cli :parse ({ " --no-long-key" })
402+ assert .are .same (expected , result )
403+ assert .are .equal (" long-key" , cb .key )
404+ assert .are .equal (false , cb .value )
405+ assert .are .equal (" k" , cb .altkey )
406+ end )
407+
364408 it (" tests callback returning error" , function ()
365409 cli :set_name (' myapp' )
366410 cli :add_option (" -k, --long-key=VALUE" , " key description" , " " , callback_fail )
0 commit comments