optimist 3.0.1 → 3.2.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.
data/optimist.gemspec CHANGED
@@ -22,14 +22,15 @@ specify."
22
22
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
23
23
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
24
24
  spec.metadata = {
25
- "changelog_uri" => "https://github.com/ManageIQ/optimist/blob/master/History.txt",
25
+ "changelog_uri" => "https://github.com/ManageIQ/optimist/blob/master/CHANGELOG.md",
26
26
  "source_code_uri" => "https://github.com/ManageIQ/optimist/",
27
27
  "bug_tracker_uri" => "https://github.com/ManageIQ/optimist/issues",
28
28
  }
29
29
 
30
30
  spec.require_paths = ["lib"]
31
31
 
32
- spec.add_development_dependency "minitest", "~> 5.4.3"
33
- spec.add_development_dependency "rake", "~> 10.0"
34
32
  spec.add_development_dependency "chronic"
33
+ spec.add_development_dependency "manageiq-style"
34
+ spec.add_development_dependency "minitest", "~> 5.4.3"
35
+ spec.add_development_dependency "rake", ">= 10.0"
35
36
  end
data/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:recommended"
5
+ ]
6
+ }
@@ -0,0 +1,168 @@
1
+ require 'test_helper'
2
+
3
+ module Optimist
4
+
5
+ class AlternateNamesTest < ::Minitest::Test
6
+
7
+ def setup
8
+ @p = Parser.new
9
+ end
10
+
11
+ def get_help_string
12
+ assert_raises(Optimist::HelpNeeded) do
13
+ @p.parse(%w(--help))
14
+ end
15
+ sio = StringIO.new "w"
16
+ @p.educate sio
17
+ sio.string
18
+ end
19
+
20
+ def test_altshort
21
+ @p.opt :catarg, "desc", :short => ["c", "-C"]
22
+ opts = @p.parse %w(-c)
23
+ assert_equal true, opts[:catarg]
24
+ opts = @p.parse %w(-C)
25
+ assert_equal true, opts[:catarg]
26
+ err_regex = /option '-C' specified multiple times/
27
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(-c -C) }
28
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(-cC) }
29
+ end
30
+
31
+ def test_altshort_invalid_none
32
+ err_regex = /Cannot use :none with any other values in short option:/
33
+ assert_raises_errmatch(ArgumentError, err_regex) {
34
+ @p.opt :something, "some opt", :short => [:s, :none]
35
+ }
36
+ assert_raises_errmatch(ArgumentError, err_regex) {
37
+ @p.opt :something, "some opt", :short => [:none, :s]
38
+ }
39
+ assert_raises_errmatch(ArgumentError, err_regex) {
40
+ @p.opt :zumthing, "some opt", :short => [:none, :none]
41
+ }
42
+ end
43
+
44
+ def test_altshort_with_multi
45
+ @p.opt :flag, "desc", :short => ["-c", "C", :x], :multi => true
46
+ @p.opt :num, "desc", :short => ["-n", "N"], :multi => true, type: Integer
47
+ @p.parse %w(-c)
48
+ @p.parse %w(-C -c -x)
49
+ @p.parse %w(-c -C)
50
+ @p.parse %w(-c -C -c -C)
51
+ opts = @p.parse %w(-ccCx)
52
+ assert_equal true, opts[:flag]
53
+ @p.parse %w(-c)
54
+ @p.parse %w(-N 1 -n 3)
55
+ @p.parse %w(-n 2 -N 4)
56
+ opts = @p.parse %w(-n 4 -N 3 -n 2 -N 1)
57
+ assert_equal [4, 3, 2, 1], opts[:num]
58
+ end
59
+
60
+ def test_altlong
61
+ @p.opt "goodarg0", "desc", :alt => "zero"
62
+ @p.opt "goodarg1", "desc", :long => "newone", :alt => "one"
63
+ @p.opt "goodarg2", "desc", :alt => "--two"
64
+ @p.opt "goodarg3", "desc", :alt => ["three", "--four", :five]
65
+
66
+ [%w[--goodarg0], %w[--zero]].each do |a|
67
+ opts = @p.parse(a)
68
+ assert opts.goodarg0
69
+ end
70
+
71
+ [%w[--newone], %w[-n], %w[--one]].each do |a|
72
+ opts = @p.parse(a)
73
+ assert opts.goodarg1
74
+ end
75
+
76
+ [%w[--two]].each do |a|
77
+ opts = @p.parse(a)
78
+ assert opts.goodarg2
79
+ end
80
+
81
+ [%w[--three], %w[--four], %w[--five]].each do |a|
82
+ opts = @p.parse(a)
83
+ assert opts.goodarg3
84
+ end
85
+
86
+ [%w[--goodarg1], %w[--missing], %w[-a]].each do |a|
87
+ assert_raises_errmatch(Optimist::CommandlineError, /unknown argument/) { @p.parse(a) }
88
+ end
89
+
90
+ ["", '--', '-bad', '---threedash'].each do |altitem|
91
+ assert_raises_errmatch(ArgumentError, /invalid long option name/) { @p.opt "badarg", "desc", :alt => altitem }
92
+ end
93
+ end
94
+
95
+ def test_altshort_help
96
+ @p.opt :cat, 'cat', short: ['c','C','a','T']
97
+ outstring = get_help_string
98
+ # expect mutliple short-opts to be in the help
99
+ assert_match(/-c, -C, -a, -T, --cat/, outstring)
100
+ end
101
+
102
+
103
+ def test_altlong_help
104
+ @p.opt :cat, 'a cat', alt: :feline
105
+ @p.opt :dog, 'a dog', alt: ['Pooch', :canine]
106
+ @p.opt :fruit, 'a fruit', long: :fig, alt: ['peach', :pear, "--apple"], short: :none
107
+ @p.opt :veg, "gemuse", long: :gemuse, alt: [:groente]
108
+ outstring = get_help_string
109
+
110
+ assert_match(/^\s*-c, --cat, --feline/, outstring)
111
+ assert_match(/^\s*-d, --dog, --Pooch, --canine/, outstring)
112
+
113
+ # expect long-opt to shadow the actual name
114
+ assert_match(/^\s*--fig, --peach, --pear, --apple/, outstring)
115
+ assert_match(/^\s*-g, --gemuse, --groente/, outstring)
116
+
117
+ end
118
+
119
+ def test_alt_duplicates
120
+ # alt duplicates named option
121
+ err_regex = /long option name "cat" is already taken; please specify a \(different\) :long\/:alt/
122
+ assert_raises_errmatch(ArgumentError, err_regex) {
123
+ @p.opt :cat, 'desc', :alt => :cat
124
+ }
125
+ # alt duplicates :long
126
+ err_regex = /long option name "feline" is already taken; please specify a \(different\) :long\/:alt/
127
+ assert_raises_errmatch(ArgumentError, err_regex) {
128
+ @p.opt :cat, 'desc', :long => :feline, :alt => [:feline]
129
+ }
130
+ # alt duplicates itself
131
+ err_regex = /long option name "aaa" is already taken; please specify a \(different\) :long\/:alt/
132
+ assert_raises_errmatch(ArgumentError, err_regex) {
133
+ @p.opt :abc, 'desc', :alt => [:aaa, :aaa]
134
+ }
135
+ end
136
+
137
+ def test_altlong_collisions
138
+ @p.opt :fat, 'desc'
139
+ @p.opt :raton, 'desc', :long => :rat
140
+ @p.opt :bat, 'desc', :alt => [:baton, :twirl]
141
+
142
+ # :alt collision with named option
143
+ err_regex = /long option name "fat" is already taken; please specify a \(different\) :long\/:alt/
144
+ assert_raises_errmatch(ArgumentError, err_regex) {
145
+ @p.opt :cat, 'desc', :alt => :fat
146
+ }
147
+
148
+ # :alt collision with :long option
149
+ err_regex = /long option name "cat" is already taken; please specify a \(different\) :long\/:alt/
150
+ assert_raises_errmatch(ArgumentError, err_regex) {
151
+ @p.opt :cat, 'desc', :alt => :rat
152
+ }
153
+
154
+ # :named option collision with existing :alt option
155
+ err_regex = /long option name "baton" is already taken; please specify a \(different\) :long\/:alt/
156
+ assert_raises_errmatch(ArgumentError, err_regex) {
157
+ @p.opt :baton, 'desc'
158
+ }
159
+
160
+ # :long option collision with existing :alt option
161
+ err_regex = /long option name "twirl" is already taken; please specify a \(different\) :long\/:alt/
162
+ assert_raises_errmatch(ArgumentError, err_regex) {
163
+ @p.opt :whirl, 'desc', :long => 'twirl'
164
+ }
165
+
166
+ end
167
+ end
168
+ end
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Optimist
4
- class CommandlineErrorTest < ::MiniTest::Test
4
+ class CommandlineErrorTest < ::Minitest::Test
5
5
  def test_class
6
6
  assert_kind_of Exception, cle("message")
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module Optimist
4
- class HelpNeededTest < ::MiniTest::Test
4
+ class HelpNeededTest < ::Minitest::Test
5
5
  def test_class
6
6
  assert_kind_of Exception, hn("message")
7
7
  end
@@ -0,0 +1,141 @@
1
+ require 'test_helper'
2
+
3
+ module Optimist
4
+
5
+ class ParserConstraintTest < ::Minitest::Test
6
+ def setup
7
+ @p = Parser.new
8
+ end
9
+
10
+ def parser
11
+ @p ||= Parser.new
12
+ end
13
+
14
+ def test_conflicts
15
+ @p.opt :one
16
+ err_regex = /unknown option 'two'/
17
+ assert_raises_errmatch(ArgumentError, err_regex) { @p.conflicts :one, :two }
18
+ @p.opt :two
19
+ @p.conflicts :one, :two
20
+ @p.parse %w(--one)
21
+ @p.parse %w(--two)
22
+ err_regex = /only one of --one, --two can be given/
23
+
24
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --two) }
25
+
26
+ @p.opt :hello
27
+ @p.opt :yellow
28
+ @p.opt :mellow
29
+ @p.opt :jello
30
+ @p.conflicts :hello, :yellow, :mellow, :jello
31
+ err_regex = /only one of --hello, --yellow, --mellow, --jello can be given/
32
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello --yellow --mellow --jello) }
33
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello --mellow --jello) }
34
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello --jello) }
35
+
36
+ @p.parse %w(--hello)
37
+ @p.parse %w(--jello)
38
+ @p.parse %w(--yellow)
39
+ @p.parse %w(--mellow)
40
+
41
+ @p.parse %w(--mellow --one)
42
+ @p.parse %w(--mellow --two)
43
+
44
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--mellow --two --jello) }
45
+ err_regex = /only one of --one, --two can be given/
46
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --mellow --two --jello) }
47
+ end
48
+
49
+ def test_conflict_error_messages
50
+ @p.opt :one
51
+ @p.opt "two"
52
+ @p.conflicts :one, "two"
53
+ err_regex = %r/only one of --one, --two can be given/
54
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --two) }
55
+ end
56
+
57
+ def test_either
58
+ @p.opt :one
59
+ err_regex = /unknown option 'two'/
60
+ assert_raises_errmatch(ArgumentError, err_regex) { @p.either :one, :two }
61
+ @p.opt :two
62
+ @p.either :one, :two
63
+ @p.parse %w(--one)
64
+ @p.parse %w(--two)
65
+ err_regex = /one and only one of --one, --two is required/
66
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --two) }
67
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w() }
68
+
69
+ @p.opt :hello
70
+ @p.opt :yellow
71
+ @p.opt :mellow
72
+ @p.opt :jello
73
+ @p.either :hello, :yellow, :mellow, :jello
74
+ err_regex = /one and only one of --hello, --yellow, --mellow, --jello is required/
75
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --hello --yellow --mellow --jello) }
76
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--two --hello --mellow --jello) }
77
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --hello --jello) }
78
+
79
+ @p.parse %w(--hello --one)
80
+ @p.parse %w(--jello --two)
81
+ @p.parse %w(--mellow --one)
82
+ @p.parse %w(--mellow --two)
83
+
84
+ err_regex = /one and only one of/
85
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--mellow --two --jello) }
86
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --mellow --two --jello) }
87
+ end
88
+
89
+ def test_either_error_messages
90
+ @p.opt :one
91
+ @p.opt :two
92
+ @p.opt :three
93
+ @p.either :one, :two, :three
94
+ err_regex = %r/one and only one of --one, --two, --three is required/
95
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one --two) }
96
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--three --two --one) }
97
+ end
98
+
99
+ def test_depends
100
+ @p.opt :one
101
+ err_regex = /unknown option 'two'/
102
+ assert_raises_errmatch(ArgumentError, err_regex) { @p.depends :one, :two }
103
+ @p.opt :two
104
+ @p.depends :one, :two
105
+ @p.parse %w(--one --two)
106
+ err_regex = /--one, --two have a dependency and must be given together/
107
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one) }
108
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--two) }
109
+
110
+ @p.opt :hello
111
+ @p.opt :yellow
112
+ @p.opt :mellow
113
+ @p.opt :jello
114
+ @p.depends :hello, :yellow, :mellow, :jello
115
+ @p.parse %w(--hello --yellow --mellow --jello)
116
+ err_regex = /-hello, --yellow, --mellow, --jello have a dependency and must be given together/
117
+
118
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello --mellow --jello) }
119
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello --jello) }
120
+
121
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--hello) }
122
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--mellow) }
123
+
124
+ @p.parse %w(--hello --yellow --mellow --jello --one --two)
125
+ @p.parse %w(--hello --yellow --mellow --jello --one --two a b c)
126
+
127
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--mellow --two --jello --one) }
128
+ end
129
+
130
+ def test_depends_error_messages
131
+ @p.opt :one
132
+ @p.opt "two"
133
+ @p.depends :one, "two"
134
+
135
+ @p.parse %w(--one --two)
136
+ err_regex = %r/--one, --two have a dependency and must be given together/
137
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--one) }
138
+ assert_raises_errmatch(CommandlineError, err_regex) { @p.parse %w(--two) }
139
+ end
140
+ end
141
+ end
@@ -2,7 +2,7 @@ require 'stringio'
2
2
  require 'test_helper'
3
3
 
4
4
  module Optimist
5
- class ParserEduateTest < ::MiniTest::Test
5
+ class ParserEduateTest < ::Minitest::Test
6
6
  def setup
7
7
  end
8
8
 
@@ -158,6 +158,27 @@ module Optimist
158
158
  assert help[1] =~ /Default/
159
159
  assert help[2] =~ /default/
160
160
  end
161
+
162
+ def test_help_has_grammatical_permitted_text
163
+ parser.opt :arg1, 'description with period.', :type => :strings, :permitted => %w(foo bar)
164
+ parser.opt :arg2, 'description without period', :type => :strings, :permitted => %w(foo bar)
165
+ sio = StringIO.new 'w'
166
+ parser.educate sio
167
+
168
+ help = sio.string.split "\n"
169
+ assert help[1] =~ /Permitted/
170
+ assert help[2] =~ /permitted/
171
+ end
172
+
173
+ def test_help_with_permitted_range
174
+ parser.opt :rating, 'rating', permitted: 1..5
175
+ parser.opt :hex, 'hexadecimal', permitted: /^[0-9a-f]/i
176
+ sio = StringIO.new 'w'
177
+ parser.educate sio
178
+ help = sio.string.split "\n"
179
+ assert_match %r{rating \(permitted: 1\.\.5\)}, help[1]
180
+ assert_match %r{hexadecimal \(permitted: \/\^\[0-9a-f\]\/i\)}, help[2]
181
+ end
161
182
  ############
162
183
 
163
184
  private
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
 
4
4
  module Optimist
5
5
 
6
- class ParserOptTest < ::MiniTest::Test
6
+ class ParserOptTest < ::Minitest::Test
7
7
 
8
8
  private
9
9
 
@@ -2,7 +2,7 @@ require 'stringio'
2
2
  require 'test_helper'
3
3
 
4
4
  module Optimist
5
- class ParserParseTest < ::MiniTest::Test
5
+ class ParserParseTest < ::Minitest::Test
6
6
 
7
7
  # TODO: parse
8
8
  # resolve_default_short_options!
@@ -37,7 +37,7 @@ module Optimist
37
37
 
38
38
  def test_version_needed_unset
39
39
  parser.opt "arg"
40
- assert_raises(CommandlineError) { parser.parse %w(-v) }
40
+ assert_raises_errmatch(CommandlineError, /unknown argument '-v'/) { parser.parse %w(-v) }
41
41
  end
42
42
 
43
43
  def test_version_needed
@@ -54,7 +54,7 @@ module Optimist
54
54
 
55
55
  def test_version_only_appears_if_set
56
56
  parser.opt "arg"
57
- assert_raises(CommandlineError) { parser.parse %w(-v) }
57
+ assert_raises_errmatch(CommandlineError, /unknown argument '-v'/) { parser.parse %w(-v) }
58
58
  end
59
59
 
60
60
  def test_version_with_other_args
@@ -0,0 +1,121 @@
1
+ require 'stringio'
2
+ require 'test_helper'
3
+
4
+ module Optimist
5
+
6
+ class ParserPermittedTest < ::Minitest::Test
7
+ def setup
8
+ @p = Parser.new
9
+ end
10
+
11
+ def test_permitted_flags_filter_inputs
12
+ @p.opt "arg", "desc", :type => :strings, :permitted => %w(foo bar)
13
+
14
+ result = @p.parse(%w(--arg foo))
15
+ assert_equal ["foo"], result["arg"]
16
+ assert_raises_errmatch(CommandlineError, /option '--arg' only accepts one of: foo, bar/) { @p.parse(%w(--arg baz)) }
17
+ end
18
+
19
+ def test_permitted_invalid_scalar_value
20
+ err_regexp = /permitted values for option "(bad|mad|sad)" must be either nil, Range, Regexp or an Array/
21
+ assert_raises_errmatch(ArgumentError, err_regexp) {
22
+ @p.opt 'bad', 'desc', :permitted => 1
23
+ }
24
+ assert_raises_errmatch(ArgumentError, err_regexp) {
25
+ @p.opt 'mad', 'desc', :permitted => "A"
26
+ }
27
+ assert_raises_errmatch(ArgumentError, err_regexp) {
28
+ @p.opt 'sad', 'desc', :permitted => :abcd
29
+ }
30
+ end
31
+
32
+ def test_permitted_with_string_array
33
+ @p.opt 'fiz', 'desc', :type => 'string', :permitted => ['foo', 'bar']
34
+ @p.parse(%w(--fiz foo))
35
+ assert_raises_errmatch(CommandlineError, /option '--fiz' only accepts one of: foo, bar/) {
36
+ @p.parse(%w(--fiz buz))
37
+ }
38
+ end
39
+ def test_permitted_with_symbol_array
40
+ @p.opt 'fiz', 'desc', :type => 'string', :permitted => %i[dog cat]
41
+ @p.parse(%w(--fiz dog))
42
+ @p.parse(%w(--fiz cat))
43
+ assert_raises_errmatch(CommandlineError, /option '--fiz' only accepts one of: dog, cat/) {
44
+ @p.parse(%w(--fiz rat))
45
+ }
46
+ end
47
+
48
+ def test_permitted_with_numeric_array
49
+ @p.opt 'mynum', 'desc', :type => Integer, :permitted => [1,2,4]
50
+ @p.parse(%w(--mynum 1))
51
+ @p.parse(%w(--mynum 4))
52
+ assert_raises_errmatch(CommandlineError, /option '--mynum' only accepts one of: 1, 2, 4/) {
53
+ @p.parse(%w(--mynum 3))
54
+ }
55
+ end
56
+
57
+ def test_permitted_with_string_range
58
+ @p.opt 'fiz', 'desc', :type => String, :permitted => 'A'..'z'
59
+ opts = @p.parse(%w(--fiz B))
60
+ assert_equal opts['fiz'], "B"
61
+ opts = @p.parse(%w(--fiz z))
62
+ assert_equal opts['fiz'], "z"
63
+ assert_raises_errmatch(CommandlineError, /option '--fiz' only accepts value in range of: A\.\.z/) {
64
+ @p.parse(%w(--fiz @))
65
+ }
66
+ end
67
+
68
+ def test_permitted_with_integer_range
69
+ @p.opt 'fiz', 'desc', :type => Integer, :permitted => 1..3
70
+ opts = @p.parse(%w(--fiz 1))
71
+ assert_equal opts['fiz'], 1
72
+ opts = @p.parse(%w(--fiz 3))
73
+ assert_equal opts['fiz'], 3
74
+ assert_raises_errmatch(CommandlineError, /option '--fiz' only accepts value in range of: 1\.\.3/) {
75
+ @p.parse(%w(--fiz 4))
76
+ }
77
+ end
78
+
79
+ def test_permitted_with_float_range
80
+ @p.opt 'fiz', 'desc', :type => Float, :permitted => 1.2 .. 3.5
81
+ opts = @p.parse(%w(--fiz 1.2))
82
+ assert_in_epsilon opts['fiz'], 1.2
83
+ opts = @p.parse(%w(--fiz 2.7))
84
+ assert_in_epsilon opts['fiz'], 2.7
85
+ opts = @p.parse(%w(--fiz 3.5))
86
+ assert_in_epsilon opts['fiz'], 3.5
87
+ err_regexp = /option '--fiz' only accepts value in range of: 1\.2\.\.3\.5/
88
+ assert_raises_errmatch(CommandlineError, err_regexp) {
89
+ @p.parse(%w(--fiz 3.51))
90
+ }
91
+ assert_raises_errmatch(CommandlineError, err_regexp) {
92
+ @p.parse(%w(--fiz 1.19))
93
+ }
94
+ end
95
+
96
+ def test_permitted_with_regexp
97
+ @p.opt 'zipcode', 'desc', :type => String, :permitted => /^[0-9]{5}$/
98
+ @p.parse(%w(--zipcode 39762))
99
+ err_regexp = %r|option '--zipcode' only accepts value matching: /\^\[0-9\]\{5\}\$/|
100
+ assert_raises_errmatch(CommandlineError, err_regexp) {
101
+ @p.parse(%w(--zipcode A9A9AA))
102
+ }
103
+ end
104
+ def test_permitted_with_reason
105
+ # test all keys passed into the formatter for the permitted_response
106
+ @p.opt 'zipcode', 'desc', type: String, permitted: /^[0-9]{5}$/,
107
+ permitted_response: "opt %{arg} should be a zipcode but you have %{value}"
108
+ @p.opt :wig, 'wig', type: Integer, permitted: 1..4,
109
+ permitted_response: "opt %{arg} exceeded four wigs (%{valid_string}), %{permitted}, but you gave '%{given}'"
110
+ err_regexp = %r|opt --zipcode should be a zipcode but you have A9A9AA|
111
+ assert_raises_errmatch(CommandlineError, err_regexp) {
112
+ @p.parse(%w(--zipcode A9A9AA))
113
+ }
114
+ err_regexp = %r|opt --wig exceeded four wigs \(value in range of: 1\.\.4\), 1\.\.4, but you gave '5'|
115
+ assert_raises_errmatch(CommandlineError, err_regexp) {
116
+ @p.parse(%w(--wig 5))
117
+ }
118
+ end
119
+
120
+ end
121
+ end