optimist 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/optimist.gemspec CHANGED
@@ -22,7 +22,7 @@ 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
  }
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