ahoward-main 2.9.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,18 @@
1
+ require 'main'
2
+
3
+ Main {
4
+ argument 'global-argument'
5
+ option 'global-option'
6
+
7
+ def run() puts 'global-run' end
8
+
9
+ mode 'a' do
10
+ option 'a-option'
11
+ end
12
+
13
+ mode 'b' do
14
+ option 'b-option'
15
+
16
+ def run() puts 'b-run' end
17
+ end
18
+ }
@@ -0,0 +1,27 @@
1
+ require 'main'
2
+
3
+ Main {
4
+ argument('directory'){ description 'the directory to operate on' }
5
+
6
+ option('force'){ description 'use a bigger hammer' }
7
+
8
+ def run
9
+ puts 'this is how we run when no mode is specified'
10
+ end
11
+
12
+ mode 'compress' do
13
+ option('bzip'){ description 'use bzip compression' }
14
+
15
+ def run
16
+ puts 'this is how we run in compress mode'
17
+ end
18
+ end
19
+
20
+ mode 'uncompress' do
21
+ option('delete-after'){ description 'delete orginal file after uncompressing' }
22
+
23
+ def run
24
+ puts 'this is how we run in un-compress mode'
25
+ end
26
+ end
27
+ }
@@ -0,0 +1,10 @@
1
+ require 'main'
2
+
3
+ ARGV.replace %w( 42 ) if ARGV.empty?
4
+
5
+ Main {
6
+ argument( 'foo' )
7
+ option( 'bar' )
8
+
9
+ run { puts "This is what to_options produces: #{params.to_options.inspect}" }
10
+ }
@@ -0,0 +1,36 @@
1
+ require 'main'
2
+
3
+ # block-defaults are instance_eval'd in the main instance and be combined with
4
+ # mixins
5
+ #
6
+ # ./h.rb #=> forty-two
7
+ # ./h.rb a #=> 42
8
+ # ./h.rb b #=> 42.0
9
+ #
10
+
11
+ Main {
12
+ fattr :default_for_foobar => 'forty-two'
13
+
14
+ option(:foobar) do
15
+ default{ default_for_foobar }
16
+ end
17
+
18
+ mixin :foo do
19
+ fattr :default_for_foobar => 42
20
+ end
21
+
22
+ mixin :bar do
23
+ fattr :default_for_foobar => 42.0
24
+ end
25
+
26
+
27
+ run{ p params[:foobar].value }
28
+
29
+ mode :a do
30
+ mixin :foo
31
+ end
32
+
33
+ mode :b do
34
+ mixin :bar
35
+ end
36
+ }
@@ -0,0 +1,861 @@
1
+ $:.unshift '.'
2
+ $:.unshift './lib'
3
+ $:.unshift '..'
4
+ $:.unshift '../lib'
5
+
6
+ require 'stringio'
7
+ require 'test/unit'
8
+ require 'main'
9
+
10
+
11
+ class T < Test::Unit::TestCase
12
+ fattr 'status'
13
+ fattr 'logger'
14
+ fattr 'error'
15
+
16
+ def setup
17
+ @status = nil
18
+ @logger = Logger.new StringIO.new
19
+ @error = nil
20
+ end
21
+
22
+ def teardown
23
+ end
24
+
25
+ def main argv=[], env={}, &b
26
+ at_exit{ exit! }
27
+
28
+ $VERBOSE=nil
29
+ ARGV.replace argv
30
+ ENV.clear
31
+ env.each{|k,v| ENV[k.to_s]=v.to_s}
32
+
33
+ this = self
34
+
35
+ klass = ::Main.create do
36
+ module_eval &b if b
37
+
38
+ define_method :handle_exception do |e|
39
+ if e.respond_to? :status
40
+ this.status = e.status
41
+ else
42
+ raise
43
+ end
44
+ end
45
+
46
+ define_method :handle_throw do |*a|
47
+ end
48
+ end
49
+
50
+ main = klass.new argv, env
51
+
52
+ main.logger = @logger
53
+
54
+ begin
55
+ main.run
56
+ ensure
57
+ this.status ||= main.exit_status
58
+ end
59
+
60
+ main
61
+ end
62
+
63
+
64
+ # basic test
65
+ #
66
+ def test_0000
67
+ assert_nothing_raised{
68
+ main{
69
+ def run() end
70
+ }
71
+ }
72
+ end
73
+ def test_0010
74
+ x = nil
75
+ assert_nothing_raised{
76
+ main{
77
+ define_method(:run){ x = 42 }
78
+ }
79
+ }
80
+ assert x == 42
81
+ end
82
+
83
+ # exit status
84
+ #
85
+ def test_0020
86
+ assert_nothing_raised{
87
+ main{
88
+ def run() end
89
+ }
90
+ }
91
+ assert status == 0
92
+ end
93
+ def test_0030
94
+ assert_nothing_raised{
95
+ main{
96
+ def run() exit 42 end
97
+ }
98
+ }
99
+ assert status == 42
100
+ end
101
+ def test_0040
102
+ assert_nothing_raised{
103
+ fork{
104
+ main{
105
+ def run() exit! 42 end
106
+ }
107
+ }
108
+ Process.wait
109
+ assert $?.exitstatus == 42
110
+ }
111
+ end
112
+ def test_0050
113
+ assert_nothing_raised{
114
+ main{
115
+ def run() exit 42 end
116
+ }
117
+ }
118
+ assert status == 42
119
+ end
120
+ def test_0060
121
+ assert_nothing_raised{
122
+ main{
123
+ def run() raise ArgumentError end
124
+ }
125
+ }
126
+ assert status == 1
127
+ end
128
+ def test_0060
129
+ assert_raises(RuntimeError){
130
+ main{
131
+ def run() exit_status 42; raise end
132
+ }
133
+ }
134
+ assert status == 42
135
+ end
136
+ def test_0070
137
+ assert_raises(ArgumentError){
138
+ main{
139
+ def run() exit_status 42; raise ArgumentError end
140
+ }
141
+ }
142
+ assert status == 42
143
+ end
144
+
145
+ # parameter parsing
146
+ #
147
+ def test_0080
148
+ p = nil
149
+ assert_raises(Main::Parameter::NotGiven){
150
+ main(){
151
+ argument 'foo'
152
+ define_method('run'){ }
153
+ }
154
+ }
155
+ end
156
+ def test_0090
157
+ p = nil
158
+ m = nil
159
+ argv = %w[ 42 ]
160
+ given = nil
161
+ assert_nothing_raised{
162
+ main(argv.dup){
163
+ argument 'foo'
164
+ define_method('run'){ m = self; p = param['foo'] }
165
+ }
166
+ }
167
+ assert p.value == argv.first
168
+ assert p.values == argv
169
+ assert p.given?
170
+ assert m.argv.empty?
171
+ end
172
+ def test_0100
173
+ p = nil
174
+ argv = %w[]
175
+ given = nil
176
+ assert_nothing_raised{
177
+ main(argv){
178
+ p = argument('foo'){ optional }
179
+ define_method('run'){ p = param['foo'] }
180
+ }
181
+ }
182
+ assert p.optional?
183
+ assert !p.required?
184
+ assert p.value == nil
185
+ assert p.values == []
186
+ assert !p.given?
187
+ end
188
+ def test_0101
189
+ p = nil
190
+ argv = %w[]
191
+ given = nil
192
+ assert_nothing_raised{
193
+ main(argv){
194
+ p = argument('foo'){ required false }
195
+ define_method('run'){ p = param['foo'] }
196
+ }
197
+ }
198
+ assert p.optional?
199
+ assert !p.required?
200
+ assert p.value == nil
201
+ assert p.values == []
202
+ assert !p.given?
203
+ end
204
+ def test_0110
205
+ p = nil
206
+ argv = %w[ --foo ]
207
+ assert_nothing_raised{
208
+ main(argv){
209
+ option('foo'){ required }
210
+ define_method('run'){ p = param['foo'] }
211
+ }
212
+ }
213
+ assert p.value == true
214
+ assert p.values ==[true]
215
+ assert p.given?
216
+ end
217
+ def test_0120
218
+ p = nil
219
+ argv = []
220
+ assert_nothing_raised{
221
+ main(argv){
222
+ option 'foo'
223
+ define_method('run'){ p = param['foo'] }
224
+ }
225
+ }
226
+ assert p.value == nil
227
+ assert p.values == []
228
+ assert !p.given?
229
+ end
230
+ def test_0130
231
+ p = nil
232
+ assert_nothing_raised{
233
+ main(%w[--foo=42]){
234
+ option('foo'){ required; argument_required }
235
+ define_method('run'){ p = param['foo']}
236
+ }
237
+ }
238
+ assert p.required?
239
+ assert p.argument_required?
240
+ assert !p.optional?
241
+ end
242
+ def test_0131
243
+ assert_raises(Main::Parameter::NotGiven){
244
+ main(){
245
+ option('foo'){ required; argument_required }
246
+ define_method('run'){}
247
+ }
248
+ }
249
+ end
250
+ def test_0140
251
+ assert_raises(Main::Parameter::MissingArgument){
252
+ main(['--foo']){
253
+ option('foo'){ required; argument_required }
254
+ define_method('run'){}
255
+ }
256
+ }
257
+ end
258
+ def test_0150
259
+ param = nil
260
+ assert_nothing_raised{
261
+ main(%w[--foo=42 --bar=42.0 --foobar=true --barfoo=false --uri=http://foo --x=s]){
262
+ option('foo'){
263
+ required
264
+ argument_required
265
+ cast :int
266
+ }
267
+ option('bar'){
268
+ argument_required
269
+ cast :float
270
+ }
271
+ option('foobar'){
272
+ argument_required
273
+ cast :bool
274
+ }
275
+ option('barfoo'){
276
+ argument_required
277
+ cast :string
278
+ }
279
+ option('uri'){
280
+ argument_required
281
+ cast :uri
282
+ }
283
+ option('x'){
284
+ argument_required
285
+ cast{|x| x.to_s.upcase}
286
+ }
287
+ define_method('run'){ param = params }
288
+ }
289
+ }
290
+ assert param['foo'].value == 42
291
+ assert param['bar'].value == 42.0
292
+ assert param['foobar'].value == true
293
+ assert param['barfoo'].value == 'false'
294
+ assert param['uri'].value == URI.parse('http://foo')
295
+ assert param['x'].value == 'S'
296
+ end
297
+ def test_0160
298
+ p = nil
299
+ assert_nothing_raised{
300
+ main(%w[--foo=42]){
301
+ option('foo'){
302
+ required
303
+ argument_required
304
+ cast :int
305
+ validate{|x| x == 42}
306
+ }
307
+ define_method('run'){ p = param['foo']}
308
+ }
309
+ }
310
+ assert p.value == 42
311
+ assert p.required?
312
+ assert p.argument_required?
313
+ assert !p.optional?
314
+ end
315
+ def test_0170
316
+ assert_raises(Main::Parameter::InValid){
317
+ main(%w[--foo=40]){
318
+ option('foo'){
319
+ required
320
+ argument_required
321
+ cast :int
322
+ validate{|x| x == 42}
323
+ }
324
+ define_method('run'){ }
325
+ }
326
+ }
327
+ end
328
+ def test_0180
329
+ assert_nothing_raised{
330
+ main(%w[--foo=42]){
331
+ option('--foo=foo'){
332
+ required
333
+ # argument_required
334
+ cast :int
335
+ validate{|x| x == 42}
336
+ }
337
+ define_method('run'){ }
338
+ }
339
+ }
340
+ end
341
+ def test_0190
342
+ assert_raises(Main::Parameter::MissingArgument){
343
+ main(%w[--foo]){
344
+ option('--foo=foo'){ }
345
+ define_method('run'){ }
346
+ }
347
+ }
348
+ end
349
+ def test_0200
350
+ p = nil
351
+ assert_nothing_raised{
352
+ main(%w[--foo]){
353
+ option('--foo=[foo]'){ }
354
+ define_method('run'){ p = param['foo'] }
355
+ }
356
+ }
357
+ assert p.value == true
358
+ end
359
+ def test_0210
360
+ p = nil
361
+ assert_nothing_raised{
362
+ main(%w[--foo=42]){
363
+ option('--foo=[foo]'){
364
+ cast :int
365
+ validate{|x| x == 42}
366
+ }
367
+ define_method('run'){ p = param['foo'] }
368
+ }
369
+ }
370
+ assert p.value == 42
371
+ end
372
+ def test_0220
373
+ p = nil
374
+ assert_nothing_raised{
375
+ main(%w[--foo=40 --foo=2]){
376
+ option('--foo=foo'){
377
+ arity 2
378
+ cast :int
379
+ validate{|x| x == 40 or x == 2}
380
+ }
381
+ define_method('run'){ p = param['foo'] }
382
+ }
383
+ }
384
+ assert p.value == 40
385
+ assert p.values == [40,2]
386
+ end
387
+ def test_0230
388
+ p = nil
389
+ assert_nothing_raised{
390
+ main(%w[foo=42]){
391
+ keyword('foo'){
392
+ cast :int
393
+ validate{|x| x == 42}
394
+ }
395
+ define_method('run'){ p = param['foo'] }
396
+ }
397
+ }
398
+ assert p.value == 42
399
+ end
400
+ def test_0240
401
+ foo = nil
402
+ bar = nil
403
+ assert_nothing_raised{
404
+ main(%w[foo= bar]){
405
+ keyword 'foo'
406
+ keyword 'bar'
407
+ define_method('run'){
408
+ foo = param['foo']
409
+ bar = param['bar']
410
+ }
411
+ }
412
+ }
413
+ assert foo.value == ''
414
+ assert bar.value == nil
415
+ end
416
+ def test_0250
417
+ foo = nil
418
+ bar = nil
419
+ assert_nothing_raised{
420
+ main(%w[foo=40 bar=2]){
421
+ keyword('foo'){
422
+ cast :int
423
+ }
424
+ keyword('bar'){
425
+ cast :int
426
+ }
427
+ define_method('run'){
428
+ foo = param['foo']
429
+ bar = param['bar']
430
+ }
431
+ }
432
+ }
433
+ assert foo.value == 40
434
+ assert bar.value == 2
435
+ end
436
+ def test_0260
437
+ foo = nil
438
+ bar = nil
439
+ foobar = nil
440
+ assert_nothing_raised{
441
+ main(%w[foo=40 --bar=2 foobar foo=42]){
442
+ kw('foo'){ cast :int; arity 2 }
443
+ opt('bar='){ cast :int }
444
+ arg 'foobar'
445
+
446
+ define_method('run'){
447
+ foo = param['foo']
448
+ bar = param['bar']
449
+ foobar = param['foobar']
450
+ }
451
+ }
452
+ }
453
+ assert foo.value == 40
454
+ assert foo.values == [40, 42]
455
+ assert bar.value == 2
456
+ assert foobar.value == 'foobar'
457
+ end
458
+ def test_0270
459
+ foo = nil
460
+ assert_nothing_raised{
461
+ main([], 'foo' => '42'){
462
+ env('foo'){ cast :int }
463
+ define_method('run'){
464
+ foo = param['foo']
465
+ }
466
+ }
467
+ }
468
+ assert foo.value == 42
469
+ end
470
+
471
+ # parameter declaration
472
+ #
473
+ def test_0271
474
+ assert_nothing_raised{
475
+ main([]){
476
+ option('--a-sorts-first', '-b')
477
+ run{}
478
+ }
479
+ }
480
+ end
481
+
482
+ # usage
483
+ #
484
+ def test_0280
485
+ assert_nothing_raised{
486
+ u = Main::Usage.new
487
+ }
488
+ end
489
+ def test_0290
490
+ assert_nothing_raised{
491
+ u = Main::Usage.default Main.create
492
+ }
493
+ end
494
+ def test_0300
495
+ assert_nothing_raised{
496
+ chunk = <<-txt
497
+ a
498
+ b
499
+ c
500
+ txt
501
+ assert Main::Util.unindent(chunk) == "a\nb\nc"
502
+ chunk = <<-txt
503
+ a
504
+ b
505
+ c
506
+ txt
507
+ assert Main::Util.unindent(chunk) == "a\n b\n c"
508
+ }
509
+ end
510
+ def test_0310
511
+ assert_nothing_raised{
512
+ u = Main::Usage.new
513
+ u[:name] = 'foobar'
514
+ assert u[:name] = 'foobar'
515
+ assert u['name'] = 'foobar'
516
+ }
517
+ end
518
+ def test_0320
519
+ assert_nothing_raised{
520
+ u = Main::Usage.new
521
+ u[:name] = 'foobar'
522
+ assert u[:name] == 'foobar'
523
+ assert u['name'] == 'foobar'
524
+ u[:name2] = 'barfoo'
525
+ assert u[:name] == 'foobar'
526
+ assert u['name'] == 'foobar'
527
+ assert u[:name2] == 'barfoo'
528
+ assert u['name2'] == 'barfoo'
529
+ u.delete_at :name
530
+ assert u[:name] == nil
531
+ assert u['name'] == nil
532
+ assert u[:name2] == 'barfoo'
533
+ assert u['name2'] == 'barfoo'
534
+ u.delete_at :name2
535
+ assert u[:name] == nil
536
+ assert u['name'] == nil
537
+ assert u[:name2] == nil
538
+ assert u['name2'] == nil
539
+ }
540
+ end
541
+
542
+ # io redirection
543
+ #
544
+ class ::Object
545
+ require 'tempfile'
546
+ def infile buf
547
+ t = Tempfile.new rand.to_s
548
+ t << buf
549
+ t.close
550
+ open t.path, 'r+'
551
+ end
552
+ def outfile
553
+ t = Tempfile.new rand.to_s
554
+ t.close
555
+ open t.path, 'w+'
556
+ end
557
+ end
558
+ def test_0330
559
+ s = "foo\nbar\n"
560
+ sio = StringIO.new s
561
+ $buf = nil
562
+ assert_nothing_raised{
563
+ main{
564
+ stdin sio
565
+ def run
566
+ $buf = STDIN.read
567
+ end
568
+ }
569
+ }
570
+ assert $buf == s
571
+ end
572
+ def test_0340
573
+ s = "foo\nbar\n"
574
+ $sio = StringIO.new s
575
+ $buf = nil
576
+ assert_nothing_raised{
577
+ main{
578
+ def run
579
+ self.stdin = $sio
580
+ $buf = STDIN.read
581
+ end
582
+ }
583
+ }
584
+ assert $buf == s
585
+ end
586
+ def test_0350
587
+ s = "foo\nbar\n"
588
+ $buf = nil
589
+ assert_nothing_raised{
590
+ main{
591
+ stdin infile(s)
592
+ def run
593
+ $buf = STDIN.read
594
+ end
595
+ }
596
+ }
597
+ assert $buf == s
598
+ end
599
+ def test_0360
600
+ sout = outfile
601
+ assert_nothing_raised{
602
+ main{
603
+ stdout sout
604
+ def run
605
+ puts 42
606
+ end
607
+ }
608
+ }
609
+ assert test(?e, sout.path)
610
+ assert IO.read(sout.path) == "42\n"
611
+ end
612
+ def test_0370
613
+ m = nil
614
+ assert_nothing_raised{
615
+ m = main{
616
+ stdout StringIO.new
617
+ def run
618
+ puts 42
619
+ end
620
+ }
621
+ }
622
+ assert m
623
+ assert_nothing_raised{ m.stdout.rewind }
624
+ assert m.stdout.read == "42\n"
625
+ end
626
+
627
+ # main ctor
628
+ #
629
+ def test_0380
630
+ argv = %w( a b c )
631
+ $argv = nil
632
+ assert_nothing_raised{
633
+ main(argv){
634
+ def run
635
+ $argv = @argv
636
+ end
637
+ }
638
+ }
639
+ assert argv == $argv
640
+ end
641
+ def test_0390
642
+ argv = %w( a b c )
643
+ env = {'key' => 'val', 'foo' => 'bar'}
644
+ $argv = nil
645
+ $env = nil
646
+ assert_nothing_raised{
647
+ main(argv, env){
648
+ def run
649
+ $argv = @argv
650
+ $env = @env
651
+ end
652
+ }
653
+ }
654
+ assert argv == $argv
655
+ end
656
+
657
+
658
+ # negative/globbing arity
659
+ #
660
+ def test_0400
661
+ m = nil
662
+ argv = %w( a b c )
663
+ assert_nothing_raised{
664
+ main(argv.dup) {
665
+ argument('zero_or_more'){ arity -1 }
666
+ run{ m = self }
667
+ }
668
+ }
669
+ assert m.param['zero_or_more'].values == argv
670
+ end
671
+ def test_0401
672
+ m = nil
673
+ argv = %w( a b c )
674
+ assert_nothing_raised{
675
+ main(argv.dup) {
676
+ argument('zero_or_more'){ arity -1 }
677
+ run{ m = self }
678
+ }
679
+ }
680
+ assert m.param['zero_or_more'].values == argv
681
+ end
682
+ def test_0410
683
+ m = nil
684
+ argv = %w( a b c )
685
+ assert_nothing_raised{
686
+ main(argv.dup) {
687
+ argument('zero_or_more'){ arity '*' }
688
+ run{ m = self }
689
+ }
690
+ }
691
+ assert m.param['zero_or_more'].values == argv
692
+ end
693
+ def test_0420
694
+ m = nil
695
+ argv = %w( a b c )
696
+ assert_nothing_raised{
697
+ main(argv.dup) {
698
+ argument('one_or_more'){ arity -2 }
699
+ run{ m = self }
700
+ }
701
+ }
702
+ assert m.param['one_or_more'].values == argv
703
+ end
704
+ def test_0430
705
+ m = nil
706
+ argv = %w( a b c )
707
+ assert_nothing_raised{
708
+ main(argv.dup) {
709
+ argument('two_or_more'){ arity -3 }
710
+ run{ m = self }
711
+ }
712
+ }
713
+ assert m.param['two_or_more'].values == argv
714
+ end
715
+ def test_0440
716
+ m = nil
717
+ argv = %w()
718
+ assert_nothing_raised{
719
+ main(argv.dup) {
720
+ argument('zero_or_more'){ arity -1 }
721
+ run{ m = self }
722
+ }
723
+ }
724
+ assert m.param['zero_or_more'].values == argv
725
+ end
726
+ def test_0450
727
+ m = nil
728
+ argv = %w()
729
+ assert_raises(Main::Parameter::NotGiven){
730
+ main(argv.dup) {
731
+ argument('one_or_more'){ arity -2 }
732
+ run{ m = self }
733
+ }
734
+ }
735
+ end
736
+ def test_0460
737
+ m = nil
738
+ argv = %w( a )
739
+ assert_raises(Main::Parameter::Arity){
740
+ main(argv.dup) {
741
+ argument('two_or_more'){ arity -3 }
742
+ run{ m = self }
743
+ }
744
+ }
745
+ end
746
+ def test_0470
747
+ m = nil
748
+ argv = %w( a )
749
+ assert_raises(Main::Parameter::Arity){
750
+ main(argv.dup) {
751
+ argument('two_or_more'){ arity -4 }
752
+ run{ m = self }
753
+ }
754
+ }
755
+ end
756
+
757
+ # sub-command/mode functionality
758
+ #
759
+ def test_0480
760
+ m = nil
761
+ argv = %w( a b )
762
+ assert_nothing_raised{
763
+ main(argv.dup) {
764
+ mode 'a' do
765
+ argument 'b'
766
+ run{ m = self }
767
+ end
768
+ }
769
+ }
770
+ assert m.param['b'].value == 'b'
771
+ end
772
+ def test_0490
773
+ m = nil
774
+ argv = %w( a b c )
775
+ assert_nothing_raised{
776
+ main(argv.dup) {
777
+ mode 'a' do
778
+ mode 'b' do
779
+ argument 'c'
780
+ run{ m = self }
781
+ end
782
+ end
783
+ }
784
+ }
785
+ assert m.param['c'].value == 'c'
786
+ end
787
+
788
+
789
+ # parameter attr/fattr/attribute
790
+ #
791
+ def test_0500
792
+ name = 'arity_zero_paramter_attr'
793
+ m = nil
794
+ argv = %w( )
795
+ assert_raises(Main::Parameter::Arity){
796
+ main(argv.dup) {
797
+ argument(name){ arity 0 }
798
+ run{ m = self }
799
+ }
800
+ }
801
+ end
802
+ def test_0510
803
+ name = 'arity_one_paramter_attr'
804
+ m = nil
805
+ argv = %w( a )
806
+ assert_nothing_raised{
807
+ main(argv.dup) {
808
+ argument(name){ arity 1; attr }
809
+ run{ m = send(name) }
810
+ }
811
+ }
812
+ assert m == argv.first
813
+ end
814
+ def test_0520
815
+ name = 'arity_more_than_one_paramter_attr'
816
+ m = nil
817
+ argv = %w( a b c d)
818
+ [2, 3, 4].each do |a|
819
+ assert_nothing_raised{
820
+ main(argv.dup) {
821
+ argument(name){ arity a; attr }
822
+ run{ m = send(name) }
823
+ }
824
+ }
825
+ assert m == argv.first(a)
826
+ end
827
+ end
828
+ def test_0530
829
+ name = 'arity_negative_one_paramter_attr'
830
+ m = nil
831
+ argvs = %w( ), %w( a ), %w( a b ), %w( a b c )
832
+ argvs.each do |argv|
833
+ assert_nothing_raised{
834
+ main(argv.dup) {
835
+ argument(name){ arity -1; attr }
836
+ run{ m = send(name) }
837
+ }
838
+ }
839
+ assert m == argv
840
+ end
841
+ end
842
+ def test_0540
843
+ name = 'arity_negative_more_than_one_paramter_attr'
844
+ m = nil
845
+ argvs = %w(a b), %w( a b c), %w( a b c d )
846
+ argvs.each do |argv|
847
+ [-2, -3].each do |a|
848
+ assert_nothing_raised{
849
+ main(argv.dup) {
850
+ argument(name){ arity a; attr }
851
+ run{ m = send(name) }
852
+ }
853
+ }
854
+ assert m == argv
855
+ end
856
+ end
857
+ end
858
+
859
+ end
860
+
861
+