Change soft-fail to use the config, rather than env
[rbx.git] / test / rubygems / test_gem_command.rb
blob9ed57b3692772f7761079f21a1f870ff20c61904
1 #!/usr/bin/env ruby
2 #--
3 # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4 # All rights reserved.
5 # See LICENSE.txt for permissions.
6 #++
8 require 'test/unit'
9 require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
10 require 'rubygems/command'
12 class Gem::Command
13   public :parser
14 end
16 class TestGemCommand < RubyGemTestCase
18   def setup
19     super
21     @xopt = nil
23     Gem::Command.common_options.clear
24     Gem::Command.common_options <<  [
25       ['-x', '--exe', 'Execute'], lambda do |*a|
26         @xopt = true
27       end
28     ]
30     @cmd_name = 'doit'
31     @cmd = Gem::Command.new @cmd_name, 'summary'
32   end
34   def test_self_add_specific_extra_args
35     added_args = %w[--all]
36     @cmd.add_option '--all' do |v,o| end
38     Gem::Command.add_specific_extra_args @cmd_name, added_args
40     assert_equal added_args, Gem::Command.specific_extra_args(@cmd_name)
42     h = @cmd.add_extra_args []
44     assert_equal added_args, h
45   end
47   def test_self_add_specific_extra_args_unknown
48     added_args = %w[--definitely_not_there]
50     Gem::Command.add_specific_extra_args @cmd_name, added_args
52     assert_equal added_args, Gem::Command.specific_extra_args(@cmd_name)
54     h = @cmd.add_extra_args []
56     assert_equal [], h
57   end
59   def test_add_option_overlapping_common_and_local_options
60     @cmd.add_option('-x', '--zip', 'BAD!') do end
61     @cmd.add_option('-z', '--exe', 'BAD!') do end
62     @cmd.add_option('-x', '--exe', 'BAD!') do end
64     assert_match %r|-x, --zip|, @cmd.parser.to_s
65     assert_match %r|-z, --exe|, @cmd.parser.to_s
66     assert_no_match %r|-x, --exe|, @cmd.parser.to_s
67   end
69   def test_basic_accessors
70     assert_equal "doit", @cmd.command
71     assert_equal "gem doit", @cmd.program_name
72     assert_equal "summary", @cmd.summary
73   end
75   def test_common_option_in_class
76     assert Array === Gem::Command.common_options
77   end
79   def test_defaults
80     @cmd.add_option('-h', '--help [COMMAND]', 'Get help on COMMAND') do |value, options|
81       options[:help] = value
82     end
84     @cmd.defaults = { :help => true }
86     @cmd.when_invoked do |options|
87       assert options[:help], "Help options should default true"
88     end
90     use_ui @ui do
91       @cmd.invoke
92     end
94     assert_match %r|Usage: gem doit|, @ui.output
95   end
97   def test_invoke
98     done = false
99     @cmd.when_invoked { done = true }
101     use_ui @ui do
102       @cmd.invoke
103     end
105     assert done
106   end
108   def test_invode_with_bad_options
109     use_ui @ui do
110       @cmd.when_invoked do true end
112       ex = assert_raise(OptionParser::InvalidOption) do
113         @cmd.invoke('-zzz')
114       end
116       assert_match(/invalid option:/, ex.message)
117     end
118   end
120   def test_invoke_with_common_options
121     @cmd.when_invoked do true end
123     use_ui @ui do
124       @cmd.invoke "-x"
125     end
127     assert @xopt, "Should have done xopt"
128   end
130   # Returning false from the command handler invokes the usage output.
131   def test_invoke_with_help
132     done = false
134     use_ui @ui do
135       @cmd.add_option('-h', '--help [COMMAND]', 'Get help on COMMAND') do |value, options|
136         options[:help] = true
137         done = true
138       end
140       @cmd.invoke('--help')
142       assert done
143     end
145     assert_match(/Usage/, @ui.output)
146     assert_match(/gem doit/, @ui.output)
147     assert_match(/\[options\]/, @ui.output)
148     assert_match(/-h/, @ui.output)
149     assert_match(/--help \[COMMAND\]/, @ui.output)
150     assert_match(/Get help on COMMAND/, @ui.output)
151     assert_match(/-x/, @ui.output)
152     assert_match(/--exe/, @ui.output)
153     assert_match(/Execute/, @ui.output)
154     assert_match(/Common Options:/, @ui.output)
155   end
157   def test_invoke_with_options
158     @cmd.add_option('-h', '--help [COMMAND]', 'Get help on COMMAND') do |value, options|
159       options[:help] = true
160     end
162     @cmd.when_invoked do |opts|
163       assert opts[:help]
164     end
166     use_ui @ui do
167       @cmd.invoke '-h'
168     end
170     assert_match %r|Usage: gem doit|, @ui.output
171   end
173   def test_option_recognition
174     @cmd.add_option('-h', '--help [COMMAND]', 'Get help on COMMAND') do |value, options|
175       options[:help] = true
176     end
177     @cmd.add_option('-f', '--file FILE', 'File option') do |value, options|
178       options[:help] = true
179     end
180     assert @cmd.handles?(['-x'])
181     assert @cmd.handles?(['-h'])
182     assert @cmd.handles?(['-h', 'command'])
183     assert @cmd.handles?(['--help', 'command'])
184     assert @cmd.handles?(['-f', 'filename'])
185     assert @cmd.handles?(['--file=filename'])
186     assert ! @cmd.handles?(['-z'])
187     assert ! @cmd.handles?(['-f'])
188     assert ! @cmd.handles?(['--toothpaste'])
190     args = ['-h', 'command']
191     @cmd.handles?(args)
192     assert_equal ['-h', 'command'], args
193   end