benry-cmdopt 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,727 @@
1
+ # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
4
+ require_relative './shared'
5
+
6
+
7
+ Oktest.scope do
8
+
9
+
10
+ def new_test_schema()
11
+ sc = Benry::CmdOpt::Schema.new
12
+ sc.add(:help , "-h, --help" , "show help message.")
13
+ sc.add(:version, "--version" , "print version")
14
+ sc.add(:file , "-f, --file=<FILE>" , "filename")
15
+ sc.add(:indent , "-i, --indent[=<WIDTH>]", "enable indent", type: Integer)
16
+ sc
17
+ end
18
+
19
+
20
+ topic Benry::CmdOpt::Schema do
21
+
22
+
23
+ topic '#parse()' do
24
+
25
+ before do
26
+ @schema = Benry::CmdOpt::Schema.new
27
+ end
28
+
29
+ spec "[!qw0ac] parses command option definition string." do
30
+ sc = @schema
31
+ tuple = sc.__send__(:parse_optdef, "-h, --help")
32
+ ok {tuple} == ['h', 'help', nil, nil]
33
+ tuple = sc.__send__(:parse_optdef, "-h")
34
+ ok {tuple} == ['h', nil, nil, nil]
35
+ tuple = sc.__send__(:parse_optdef, "--help")
36
+ ok {tuple} == [nil, 'help', nil, nil]
37
+ end
38
+
39
+ spec "[!ae733] parses command option definition which has a required param." do
40
+ sc = @schema
41
+ tuple = sc.__send__(:parse_optdef, "-f, --file=<FILE>")
42
+ ok {tuple} == ['f', 'file', '<FILE>', true]
43
+ tuple = sc.__send__(:parse_optdef, "-f <FILE>")
44
+ ok {tuple} == ['f', nil, '<FILE>', true]
45
+ tuple = sc.__send__(:parse_optdef, "--file=<FILE>")
46
+ ok {tuple} == [nil, 'file', '<FILE>', true]
47
+ end
48
+
49
+ spec "[!4h05c] parses command option definition which has an optional param." do
50
+ sc = @schema
51
+ tuple = sc.__send__(:parse_optdef, "-i, --indent[=<WIDTH>]")
52
+ ok {tuple} == ['i', 'indent', '<WIDTH>', false]
53
+ tuple = sc.__send__(:parse_optdef, "-i[<WIDTH>]")
54
+ ok {tuple} == ['i', nil, '<WIDTH>', false]
55
+ tuple = sc.__send__(:parse_optdef, "--indent[=<WIDTH>]")
56
+ ok {tuple} == [nil, 'indent', '<WIDTH>', false]
57
+ end
58
+
59
+ spec "[!b7jo3] raises SchemaError when command option definition is invalid." do
60
+ sc = @schema
61
+ pr = proc {
62
+ tuple = sc.__send__(:parse_optdef, "-i, --indent <WIDTH>")
63
+ }
64
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
65
+ "-i, --indent <WIDTH>: Invalid option definition (use '=--indent' instead of ' --indent').")
66
+ end
67
+
68
+ end
69
+
70
+
71
+ topic '#dup()' do
72
+
73
+ before do
74
+ @schema = Benry::CmdOpt::Schema.new
75
+ @schema.add(:help , "-h" , "print help")
76
+ end
77
+
78
+ spec "[!lxb0o] copies self object." do
79
+ this = @schema
80
+ other = @schema.dup()
81
+ #
82
+ this_items = this.instance_variable_get(:@items)
83
+ other_items = other.instance_variable_get(:@items)
84
+ ok {this_items} != nil
85
+ ok {other_items} != nil
86
+ ok {other_items} == this_items
87
+ ok {other_items.object_id} != this_items.object_id
88
+ #
89
+ this.add(:silent, "-s", "silent")
90
+ other.add(:quiet, "-q", "quiet")
91
+ ok {this.option_help()} == (" -h : print help\n" +
92
+ " -s : silent\n")
93
+ ok {other.option_help()} == (" -h : print help\n" +
94
+ " -q : quiet\n")
95
+ end
96
+
97
+ end
98
+
99
+
100
+ topic '#copy_from()' do
101
+
102
+ before do
103
+ @schema1 = Benry::CmdOpt::Schema.new
104
+ @schema1.add(:help, "-h" , "print help")
105
+ @schema2 = Benry::CmdOpt::Schema.new
106
+ @schema2.add(:version, "-v" , "print version")
107
+ @schema2.add(:debug , "-D" , "debug mode")
108
+ end
109
+
110
+ spec "[!6six3] copy schema items from others." do
111
+ @schema1.copy_from(@schema2)
112
+ tuples = @schema1.each.collect {|x| [x.key, x.optdef, x.desc] }
113
+ ok {tuples} == [
114
+ [:help , "-h", "print help"],
115
+ [:version, "-v", "print version"],
116
+ [:debug , "-D", "debug mode"],
117
+ ]
118
+ end
119
+
120
+ spec "[!vt88s] copy schema items except items specified by 'except:' kwarg." do
121
+ @schema1.copy_from(@schema2, except: [:debug])
122
+ tuples = @schema1.each.collect {|x| [x.key, x.optdef, x.desc] }
123
+ ok {tuples} == [
124
+ [:help, "-h", "print help"],
125
+ [:version, "-v", "print version"],
126
+ ]
127
+ end
128
+
129
+ end
130
+
131
+
132
+ topic '#add()' do
133
+
134
+ before do
135
+ @schema = Benry::CmdOpt::Schema.new
136
+ end
137
+
138
+ spec "[!7hi2d] takes command option definition string." do
139
+ sc = @schema
140
+ sc.add(:indent, "-i, --indent=<WIDTH>", "print help")
141
+ items = sc.instance_eval { @items }
142
+ ok {items.length} == 1
143
+ ok {items[0]}.is_a?(Benry::CmdOpt::SchemaItem)
144
+ ok {items[0].key} == :indent
145
+ ok {items[0].short} == 'i'
146
+ ok {items[0].long} == 'indent'
147
+ ok {items[0].param} == '<WIDTH>'
148
+ ok {items[0].required?} == true
149
+ ok {items[0].type} == nil
150
+ ok {items[0].rexp} == nil
151
+ ok {items[0].enum} == nil
152
+ ok {items[0].callback} == nil
153
+ end
154
+
155
+ spec "[!p9924] option key is omittable only when long option specified." do
156
+ sc = @schema
157
+ sc.add(nil, "-m, --max-num=<N>", nil)
158
+ items = sc.instance_eval { @items }
159
+ ok {items[0].key} == :max_num
160
+ end
161
+
162
+ spec "[!jtp7z] raises SchemaError when key is nil and no long option." do
163
+ sc = @schema
164
+ pr = proc { sc.add(nil, "-i <N>", nil) }
165
+ msg = "add(nil, \"-i <N>\"): Long option required when option key (1st arg) not specified."
166
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError, msg)
167
+ end
168
+
169
+ spec "[!rpl98] when long option is 'foo-bar' then key name is ':foo_bar'." do
170
+ sc = @schema
171
+ sc.add(nil, "--foo-bar", nil)
172
+ items = sc.instance_eval { @items }
173
+ ok {items[0].key} == :foo_bar
174
+ end
175
+
176
+ spec "[!97sn0] raises SchemaError when ',' is missing between short and long options." do
177
+ sc = @schema
178
+ pr = proc { sc.add(:exec, '-x --exec=ARG', "exec") }
179
+ msg = "add(:exec, \"-x --exec=ARG\"): Missing ',' between short option and long options."
180
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError, msg)
181
+ end
182
+
183
+ spec "[!yht0v] keeps command option definitions." do
184
+ sc = @schema
185
+ sc.add(:indent, "-i, --indent[=<WIDTH>]", "indent width",
186
+ range: (1..2), value: 8, detail: "(description)", tag: :ab,
187
+ type: Integer, rexp: /\A\d+\z/, enum: [2, 4, 8]) {|v| v.to_i }
188
+ items = sc.instance_eval { @items }
189
+ ok {items.length} == 1
190
+ ok {items[0]}.is_a?(Benry::CmdOpt::SchemaItem)
191
+ ok {items[0].key} == :indent
192
+ ok {items[0].short} == 'i'
193
+ ok {items[0].long} == 'indent'
194
+ ok {items[0].param} == '<WIDTH>'
195
+ ok {items[0].required?} == false
196
+ ok {items[0].type} == Integer
197
+ ok {items[0].rexp} == /\A\d+\z/
198
+ ok {items[0].enum} == [2, 4, 8]
199
+ ok {items[0].range} == (1..2)
200
+ ok {items[0].detail} == "(description)"
201
+ ok {items[0].value} == 8
202
+ ok {items[0].tag} == :ab
203
+ ok {items[0].callback}.is_a?(Proc)
204
+ ok {items[0].callback.arity} == 1
205
+ end
206
+
207
+ spec "[!kuhf9] type, rexp, enum, and range are can be passed as positional args as well as keyword args." do
208
+ sc = @schema
209
+ sc.add(:key, "--optdef=xx", "desc", Integer, /\A\d+\z/, [2,4,8], (2..8))
210
+ item = sc.each.first
211
+ ok {item.type} == Integer
212
+ ok {item.rexp} == /\A\d+\z/
213
+ ok {item.enum} == [2,4,8]
214
+ ok {item.range} == (2..8)
215
+ end
216
+
217
+ spec "[!e3emy] raises error when positional arg is not one of class, regexp, array, nor range." do
218
+ sc = @schema
219
+ pr = proc { sc.add(:key, "--optdef=xx", "desc", "value") }
220
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
221
+ '"value": Expected one of class, regexp, array or range, but got String.')
222
+ end
223
+
224
+ spec "[!rhhji] raises SchemaError when key is not a Symbol." do
225
+ sc = @schema
226
+ pr = proc {
227
+ sc.add("-i, --indent[=<WIDTH>]", "indent width", nil)
228
+ }
229
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
230
+ 'add("-i, --indent[=<WIDTH>]", "indent width"): The first arg should be a Symbol as an option key.')
231
+ end
232
+
233
+ spec "[!vq6eq] raises SchemaError when help message is missing." do
234
+ sc = @schema
235
+ pr = proc {
236
+ begin
237
+ sc.add(:indent, "-i, --indent[=<WIDTH>]", type: Array) # Ruby 2
238
+ rescue ArgumentError
239
+ sc.add(:indent, "-i, --indent[=<WIDTH>]", {type: Array}) # Ruby 3
240
+ end
241
+ }
242
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
243
+ 'add(:indent, "-i, --indent[=<WIDTH>]"): Help message required as 3rd argument.')
244
+ end
245
+
246
+
247
+ end
248
+
249
+
250
+ topic '#add_item()' do
251
+
252
+ spec "[!qyjp9] raises SchemaError if invalid item added." do
253
+ sc = Benry::CmdOpt::Schema.new
254
+ sc.add(:quiet, "-q, --quiet", "quiet mode")
255
+ #
256
+ item1 = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet", "q", nil, nil, false)
257
+ pr = proc { sc.add_item(item1) }
258
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
259
+ "quiet: Option key duplicated.")
260
+ #
261
+ item2 = Benry::CmdOpt::SchemaItem.new(:quiet2, "-q", "quiet", "q", nil, nil, false)
262
+ pr = proc { sc.add_item(item2) }
263
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
264
+ "-q: Short option duplicated (key: quiet2 and quiet).")
265
+ #
266
+ item3 = Benry::CmdOpt::SchemaItem.new(:quiet3, "--quiet", "quiet", nil, "quiet", nil, false)
267
+ pr = proc { sc.add_item(item3) }
268
+ ok {pr}.raise?(Benry::CmdOpt::SchemaError,
269
+ "--quiet: Long option duplicated (key: quiet3 and quiet).")
270
+ end
271
+
272
+ spec "[!a693h] adds option item into current schema." do
273
+ item = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet", "q", nil, nil, false)
274
+ sc = Benry::CmdOpt::Schema.new
275
+ sc.add_item(item)
276
+ ok {sc.to_s} == <<"END"
277
+ -q : quiet
278
+ END
279
+ end
280
+
281
+ end
282
+
283
+
284
+ topic '#_validate_item()' do
285
+
286
+ before do
287
+ @schema = Benry::CmdOpt::Schema.new
288
+ @schema.add(:quiet, "-q, --quiet", "quiet mode")
289
+ end
290
+
291
+ spec "[!ewl20] returns error message if option key duplicated." do
292
+ item = Benry::CmdOpt::SchemaItem.new(:quiet, "-q", "quiet mode", "q", nil, nil, false)
293
+ ret = @schema.__send__(:_validate_item, item)
294
+ ok {ret} == "quiet: Option key duplicated."
295
+ end
296
+
297
+ spec "[!xg56v] returns error message if short option duplicated." do
298
+ item = Benry::CmdOpt::SchemaItem.new(:quiet2, "-q", "quiet mode", "q", nil, nil, false)
299
+ ret = @schema.__send__(:_validate_item, item)
300
+ ok {ret} == "-q: Short option duplicated (key: quiet2 and quiet)."
301
+ end
302
+
303
+ spec "[!izezi] returns error message if long option duplicated." do
304
+ item = Benry::CmdOpt::SchemaItem.new(:quiet3, "--quiet", "quiet mode", nil, "quiet", nil, false)
305
+ ret = @schema.__send__(:_validate_item, item)
306
+ ok {ret} == "--quiet: Long option duplicated (key: quiet3 and quiet)."
307
+ end
308
+
309
+ end
310
+
311
+
312
+ topic '#option_help()' do
313
+
314
+ before do
315
+ sc = Benry::CmdOpt::Schema.new
316
+ sc.add(:help , "-h, --help" , "show help message.")
317
+ sc.add(:version, " --version" , "print version")
318
+ sc.add(:file , "-f, --file=<FILE>" , "filename")
319
+ sc.add(:indent , "-i, --indent[=<WIDTH>]", "enable indent", type: Integer)
320
+ sc.add(:debug , "-d, --debug" , nil)
321
+ @schema = sc
322
+ end
323
+
324
+ spec "[!0aq0i] can take integer as width." do
325
+ helpmsg = @schema.option_help(41)
326
+ ok {helpmsg} == <<END
327
+ -h, --help : show help message.
328
+ --version : print version
329
+ -f, --file=<FILE> : filename
330
+ -i, --indent[=<WIDTH>] : enable indent
331
+ END
332
+ s = helpmsg.each_line.first.split(':')[0]
333
+ ok {s.length} == 41+3
334
+ end
335
+
336
+ spec "[!pcsah] can take format string." do
337
+ helpmsg = @schema.option_help("%-42s: %s")
338
+ ok {helpmsg} == <<END
339
+ -h, --help : show help message.
340
+ --version : print version
341
+ -f, --file=<FILE> : filename
342
+ -i, --indent[=<WIDTH>] : enable indent
343
+ END
344
+ s = helpmsg.each_line.first.split(':')[0]
345
+ ok {s.length} == 42+0
346
+ end
347
+
348
+ spec "[!dndpd] detects option width automatically when nothing specified." do
349
+ helpmsg = @schema.option_help()
350
+ ok {helpmsg} == <<END
351
+ -h, --help : show help message.
352
+ --version : print version
353
+ -f, --file=<FILE> : filename
354
+ -i, --indent[=<WIDTH>] : enable indent
355
+ END
356
+ s = helpmsg.each_line.to_a.last.split(':')[0]
357
+ ok {s.length} == 25
358
+ end
359
+
360
+ spec "[!v7z4x] skips option help if help message is not specified." do
361
+ helpmsg = @schema.option_help()
362
+ ok {helpmsg} !~ /debug/
363
+ end
364
+
365
+ spec "[!to1th] includes all option help when `all` is true." do
366
+ helpmsg = @schema.option_help(nil, all: true)
367
+ ok {helpmsg} =~ /debug/
368
+ ok {helpmsg} == <<END
369
+ -h, --help : show help message.
370
+ --version : print version
371
+ -f, --file=<FILE> : filename
372
+ -i, --indent[=<WIDTH>] : enable indent
373
+ -d, --debug :
374
+ END
375
+ end
376
+
377
+ spec "[!848rm] supports multi-lines help message." do
378
+ sc = Benry::CmdOpt::Schema.new
379
+ sc.add(:mode, "-m, --mode=<MODE>", "output mode",
380
+ detail: <<"END")
381
+ v, verbose: print many output
382
+ q, quiet: print litte output
383
+ c, compact: print summary output
384
+ END
385
+ actual = sc.option_help()
386
+ expected = <<END
387
+ -m, --mode=<MODE> : output mode
388
+ v, verbose: print many output
389
+ q, quiet: print litte output
390
+ c, compact: print summary output
391
+ END
392
+ ok {actual} == expected
393
+ end
394
+
395
+ spec "[!a4qe4] option should not be hidden if description is empty string." do
396
+ sc = Benry::CmdOpt::Schema.new
397
+ sc.add(:debug , "-D", nil) # hidden
398
+ sc.add(:trace, "-T", "trace", hidden: true) # hidden
399
+ sc.add(:what , "-W", "") # NOT hidden!
400
+ ok {sc.option_help()} == <<END
401
+ -W :
402
+ END
403
+ end
404
+
405
+ fixture :schema_with_importance do
406
+ sc = Benry::CmdOpt::Schema.new
407
+ sc.add(:help , "-h, --help" , "help message")
408
+ sc.add(:trace , "-T, --trace", "trace" , important: true)
409
+ sc.add(:debug , "-D, --debug", "debug mode" , important: false)
410
+ sc.add(:quiet , "-q, --quiet", "quiet mode")
411
+ sc
412
+ end
413
+
414
+ spec "[!jrwb6] decorates help message according to `important:` value of option." do
415
+ |schema_with_importance|
416
+ sc = schema_with_importance
417
+ ok {sc.option_help()} == <<END
418
+ -h, --help : help message
419
+ \e[1m -T, --trace : trace\e[0m
420
+ \e[2m -D, --debug : debug mode\e[0m
421
+ -q, --quiet : quiet mode
422
+ END
423
+ end
424
+
425
+ spec "[!9nlfb] not decorate help message when stdout is not a tty." do
426
+ |schema_with_importance|
427
+ sc = schema_with_importance
428
+ output = nil
429
+ capture_sio() {
430
+ ok {$stdout}.NOT.tty?
431
+ output = sc.option_help()
432
+ }
433
+ ok {output} == <<END
434
+ -h, --help : help message
435
+ -T, --trace : trace
436
+ -D, --debug : debug mode
437
+ -q, --quiet : quiet mode
438
+ END
439
+ end
440
+
441
+ end
442
+
443
+
444
+ topic '#_default_format()' do
445
+
446
+ before do
447
+ sc = Benry::CmdOpt::Schema.new
448
+ sc.add(:help , "-h, --help" , "show help message.")
449
+ sc.add(:version, " --version" , "print version")
450
+ sc.add(:file , "-f, --file=<FILE>" , "filename")
451
+ sc.add(:indent , "-i, --indent[=<WIDTH>]", "enable indent", type: Integer)
452
+ sc.add(:debug , "-d, --debug" , nil)
453
+ @schema = sc
454
+ end
455
+
456
+ spec "[!kkh9t] returns format string." do
457
+ ret = @schema.__send__(:_default_format)
458
+ ok {ret} == " %-22s : %s"
459
+ end
460
+
461
+ spec "[!hr45y] detects preffered option width." do
462
+ ret = @schema.__send__(:_default_format, 10, 20)
463
+ ok {ret} == " %-20s : %s"
464
+ ret = @schema.__send__(:_default_format, 30, 40)
465
+ ok {ret} == " %-30s : %s"
466
+ ret = @schema.__send__(:_default_format, 10, 40)
467
+ ok {ret} == " %-22s : %s"
468
+ end
469
+
470
+ spec "[!bmr7d] changes min_with according to options." do
471
+ sc = Benry::CmdOpt::Schema.new
472
+ sc.add(:help , '-h', "help")
473
+ sc.add(:version, '-v', "version")
474
+ ok {sc.__send__(:_default_format, nil, 40)} == " %-8s : %s"
475
+ #
476
+ sc.add(:file , '-f <FILE>', "filename")
477
+ ok {sc.__send__(:_default_format, nil, 40)} == " %-14s : %s"
478
+ #
479
+ sc.add(:force , '--force', "forcedly")
480
+ ok {sc.__send__(:_default_format, nil, 40)} == " %-14s : %s"
481
+ #
482
+ sc.add(:mode , '-m, --mode=<MODE>', "verbose/quiet")
483
+ ok {sc.__send__(:_default_format, nil, 40)} == " %-20s : %s"
484
+ end
485
+
486
+ end
487
+
488
+
489
+ topic '#_preferred_option_width()' do
490
+
491
+ spec "[!kl91t] shorten option help min width when only single options which take no arg." do
492
+ sc = Benry::CmdOpt::Schema.new
493
+ sc.add(:help , '-h', "help")
494
+ sc.add(:version, '-v', "version")
495
+ ok {sc.__send__(:_preferred_option_width)} == 8
496
+ end
497
+
498
+ spec "[!0koqb] widen option help min width when any option takes an arg." do
499
+ sc = Benry::CmdOpt::Schema.new
500
+ sc.add(:help , '-h', "help")
501
+ sc.add(:indent , '-i[<N>]', "indent")
502
+ ok {sc.__send__(:_preferred_option_width)} == 14
503
+ end
504
+
505
+ spec "[!kl91t] widen option help min width when long option exists." do
506
+ sc = Benry::CmdOpt::Schema.new
507
+ sc.add(:help , '-h', "help")
508
+ sc.add(:version, '-v, --version', "version")
509
+ ok {sc.__send__(:_preferred_option_width)} == 14
510
+ #
511
+ sc.add(:file, '--file=<FILE>', "filename")
512
+ ok {sc.__send__(:_preferred_option_width)} == 20
513
+ end
514
+
515
+ end
516
+
517
+
518
+ topic '#to_s()' do
519
+
520
+ spec "[!rrapd] '#to_s' is an alias to '#option_help()'." do
521
+ schema = Benry::CmdOpt::Schema.new
522
+ schema.add(:help , "-h, --help" , "show help message")
523
+ schema.add(:version, " --version" , "print version")
524
+ ok {schema.to_s} == schema.option_help()
525
+ end
526
+
527
+ end
528
+
529
+
530
+ topic '#each_option_and_desc()' do
531
+
532
+ before do
533
+ sc = Benry::CmdOpt::Schema.new
534
+ sc.add(:help, "-h, --help", "show help message")
535
+ sc.add(:version, " --version", "print version")
536
+ sc.add(:debug , "-d, --debug" , nil) # hidden
537
+ sc.add(:DEBUG , "-D, --DEBUG" , "debug mode", hidden: true) # hidden
538
+ @schema = sc
539
+ end
540
+
541
+ spec "[!4b911] yields each optin definition str and help message." do
542
+ pairs = []
543
+ @schema.each_option_and_desc {|opt, desc| pairs << [opt, desc] }
544
+ ok {pairs} == [
545
+ ["-h, --help" , "show help message"], # not hiddden
546
+ [" --version" , "print version"], # not hidden
547
+ ]
548
+ end
549
+
550
+ spec "[!cl8zy] when 'all' flag is false, not yield hidden items." do
551
+ pairs = []
552
+ @schema.each_option_and_desc(all: false) {|opt, desc| pairs << [opt, desc] }
553
+ ok {pairs} == [
554
+ ["-h, --help" , "show help message"], # not hiddden
555
+ [" --version" , "print version"], # not hidden
556
+ ]
557
+ end
558
+
559
+ spec "[!tc4bk] when 'all' flag is true, yields even hidden items." do
560
+ pairs = []
561
+ @schema.each_option_and_desc(all: true) {|opt, desc| pairs << [opt, desc] }
562
+ ok {pairs} == [
563
+ ["-h, --help" , "show help message"], # not hiddden
564
+ [" --version" , "print version"], # not hidden
565
+ ["-d, --debug" , nil], # hidden
566
+ ["-D, --DEBUG" , "debug mode"], # hidden
567
+ ]
568
+ end
569
+
570
+ spec "[!03sux] returns enumerator object if block not given." do
571
+ ## when 'all: true'
572
+ xs = @schema.each_option_and_desc(all: true)
573
+ ok {xs}.is_a?(Enumerator)
574
+ ok {xs.collect {|x, _| x }} == ["-h, --help", " --version", "-d, --debug", "-D, --DEBUG"]
575
+ ## when 'all: false'
576
+ xs = @schema.each_option_and_desc(all: false)
577
+ ok {xs}.is_a?(Enumerator)
578
+ ok {xs.collect {|x, _| x }} == ["-h, --help", " --version"]
579
+ end
580
+
581
+ spec "[!zbxyv] returns self." do
582
+ ret = @schema.each_option_and_desc { nil }
583
+ ok {ret}.same? @schema
584
+ end
585
+
586
+ end
587
+
588
+
589
+ topic '#each()' do
590
+
591
+ before do
592
+ @schema = Benry::CmdOpt::Schema.new
593
+ @schema.add(:help , "-h, --help" , "help message")
594
+ @schema.add(:version, " --version", "print version")
595
+ end
596
+
597
+ spec "[!y4k1c] yields each option item." do
598
+ items = []
599
+ @schema.each {|x| items << x }
600
+ ok {items.length} == 2
601
+ ok {items[0]}.is_a?(Benry::CmdOpt::SchemaItem)
602
+ ok {items[1]}.is_a?(Benry::CmdOpt::SchemaItem)
603
+ ok {items[0].key} == :help
604
+ ok {items[1].key} == :version
605
+ keys = @schema.each.collect {|x| x.key }
606
+ ok {keys} == [:help, :version]
607
+ end
608
+
609
+ end
610
+
611
+
612
+ topic '#empty?()' do
613
+
614
+ spec "[!um8am] returns false if any item exists, else returns true." do
615
+ schema = Benry::CmdOpt::Schema.new
616
+ ok {schema.empty?()} == true
617
+ schema.add(:help , "-h, --help" , "help message")
618
+ ok {schema.empty?()} == false
619
+ end
620
+
621
+ spec "[!icvm1] ignores hidden items if 'all: false' kwarg specified." do
622
+ schema = Benry::CmdOpt::Schema.new
623
+ schema.add(:debug , "-D", nil)
624
+ schema.add(:trace, "-T", "trace", hidden: true)
625
+ ok {schema.empty?()} == false
626
+ ok {schema.empty?(all: true)} == false
627
+ ok {schema.empty?(all: false)} == true
628
+ end
629
+
630
+ end
631
+
632
+
633
+ topic '#get()' do
634
+
635
+ before do
636
+ @schema = Benry::CmdOpt::Schema.new
637
+ @schema.add(:help , "-h, --help" , "help message")
638
+ @schema.add(:version, " --version", "print version")
639
+ end
640
+
641
+ spec "[!3wjfp] finds option item object by key." do
642
+ item = @schema.get(:help)
643
+ ok {item.key} == :help
644
+ item = @schema.get(:version)
645
+ ok {item.key} == :version
646
+ end
647
+
648
+ spec "[!0spll] returns nil if key not found." do
649
+ ok {@schema.get(:debug)} == nil
650
+ end
651
+
652
+ end
653
+
654
+
655
+ topic '#delete()' do
656
+
657
+ before do
658
+ @schema = Benry::CmdOpt::Schema.new
659
+ @schema.add(:help , "-h, --help" , "help message")
660
+ @schema.add(:version, " --version", "print version")
661
+ end
662
+
663
+ spec "[!l86rb] deletes option item corresponding to key." do
664
+ keys = @schema.each.collect {|x| x.key }
665
+ ok {keys} == [:help, :version]
666
+ @schema.delete(:help)
667
+ keys = @schema.each.collect {|x| x.key }
668
+ ok {keys} == [:version]
669
+ end
670
+
671
+ spec "[!rq0aa] returns deleted item." do
672
+ item = @schema.delete(:version)
673
+ ok {item} != nil
674
+ ok {item.key} == :version
675
+ end
676
+
677
+ end
678
+
679
+
680
+ topic '#find_short_option()' do
681
+
682
+ before do
683
+ @schema = new_test_schema()
684
+ end
685
+
686
+ spec "[!b4js1] returns option definition matched to short name." do
687
+ x = @schema.find_short_option('h')
688
+ ok {x.key} == :help
689
+ x = @schema.find_short_option('f')
690
+ ok {x.key} == :file
691
+ x = @schema.find_short_option('i')
692
+ ok {x.key} == :indent
693
+ end
694
+
695
+ spec "[!s4d1y] returns nil when nothing found." do
696
+ ok {@schema.find_short_option('v')} == nil
697
+ end
698
+
699
+ end
700
+
701
+
702
+ topic '#find_long_option()' do
703
+
704
+ before do
705
+ @schema = new_test_schema()
706
+ end
707
+
708
+ spec "[!atmf9] returns option definition matched to long name." do
709
+ x = @schema.find_long_option('help')
710
+ ok {x.key} == :help
711
+ x = @schema.find_long_option('file')
712
+ ok {x.key} == :file
713
+ x = @schema.find_long_option('indent')
714
+ ok {x.key} == :indent
715
+ end
716
+
717
+ spec "[!6haoo] returns nil when nothing found." do
718
+ ok {@schema.find_long_option('lib')} == nil
719
+ end
720
+
721
+ end
722
+
723
+
724
+ end
725
+
726
+
727
+ end