rspec-core 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/History.markdown +22 -0
  2. data/Rakefile +2 -2
  3. data/features/command_line/README.md +6 -0
  4. data/features/command_line/configure.feature +16 -14
  5. data/features/command_line/example_name_option.feature +3 -3
  6. data/features/command_line/format_option.feature +73 -0
  7. data/features/command_line/line_number_appended_to_path.feature +1 -1
  8. data/features/command_line/line_number_option.feature +2 -2
  9. data/features/command_line/tag.feature +7 -7
  10. data/features/configuration/read_options_from_file.feature +29 -16
  11. data/features/hooks/before_and_after_hooks.feature +9 -14
  12. data/features/hooks/filtering.feature +174 -0
  13. data/features/step_definitions/additional_cli_steps.rb +4 -0
  14. data/features/subject/attribute_of_subject.feature +68 -18
  15. data/lib/rspec/core/command_line_configuration.rb +16 -16
  16. data/lib/rspec/core/configuration.rb +14 -15
  17. data/lib/rspec/core/configuration_options.rb +46 -22
  18. data/lib/rspec/core/example.rb +16 -6
  19. data/lib/rspec/core/example_group.rb +11 -11
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +2 -1
  21. data/lib/rspec/core/hooks.rb +8 -8
  22. data/lib/rspec/core/option_parser.rb +13 -3
  23. data/lib/rspec/core/pending.rb +2 -0
  24. data/lib/rspec/core/rake_task.rb +1 -1
  25. data/lib/rspec/core/subject.rb +2 -0
  26. data/lib/rspec/core/version.rb +1 -1
  27. data/lib/rspec/core/world.rb +2 -2
  28. data/spec/rspec/core/configuration_options_spec.rb +147 -151
  29. data/spec/rspec/core/configuration_spec.rb +67 -19
  30. data/spec/rspec/core/example_spec.rb +12 -10
  31. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +25 -1
  32. data/spec/rspec/core/formatters/html_formatted-1.8.6.html +5 -5
  33. data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +37 -24
  34. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +5 -5
  35. data/spec/rspec/core/formatters/html_formatted-1.9.1.html +5 -5
  36. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +5 -5
  37. data/spec/rspec/core/formatters/html_formatter_spec.rb +7 -7
  38. data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +19 -19
  39. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +51 -33
  40. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +19 -19
  41. data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +26 -26
  42. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +26 -26
  43. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +7 -7
  44. data/spec/rspec/core/hooks_filtering_spec.rb +54 -0
  45. data/spec/rspec/core/option_parser_spec.rb +53 -17
  46. data/spec/rspec/core/rake_task_spec.rb +21 -0
  47. data/spec/spec_helper.rb +1 -1
  48. metadata +14 -8
@@ -147,7 +147,8 @@ module RSpec
147
147
  exception = example.execution_result[:exception]
148
148
  output.puts "#{short_padding}#{index.next}) #{example.full_description}"
149
149
  output.puts "#{long_padding}#{red("Failure/Error:")} #{red(read_failed_line(exception, example).strip)}"
150
- exception.message.split("\n").each { |line| output.puts "#{long_padding}#{red(line)}" }
150
+ output.puts "#{long_padding}#{red(exception.class.name << ":")}" unless exception.class.name =~ /RSpec/
151
+ exception.message.split("\n").each { |line| output.puts "#{long_padding} #{red(line)}" }
151
152
 
152
153
  example.example_group.ancestors.push(example.example_group).each do |group|
153
154
  if group.metadata[:shared_group_name]
@@ -10,8 +10,8 @@ module RSpec
10
10
  @block = block
11
11
  end
12
12
 
13
- def options_apply?(group)
14
- !group || group.apply?(:all?, options)
13
+ def options_apply?(example_or_group)
14
+ !example_or_group || example_or_group.apply?(:all?, options)
15
15
  end
16
16
 
17
17
  def to_proc
@@ -50,8 +50,8 @@ module RSpec
50
50
  end
51
51
 
52
52
  class HookCollection < Array
53
- def find_hooks_for(group)
54
- dup.reject {|hook| !hook.options_apply?(group)}
53
+ def find_hooks_for(example_or_group)
54
+ self.class.new(select {|hook| hook.options_apply?(example_or_group)})
55
55
  end
56
56
  end
57
57
 
@@ -112,12 +112,12 @@ module RSpec
112
112
  hooks[hook][scope].run_all!(example_group_instance)
113
113
  end
114
114
 
115
- def run_hook_filtered(hook, scope, group, example_group_instance)
116
- find_hook(hook, scope, group).run_all(example_group_instance)
115
+ def run_hook_filtered(hook, scope, group, example_group_instance, example = nil)
116
+ find_hook(hook, scope, group, example).run_all(example_group_instance)
117
117
  end
118
118
 
119
- def find_hook(hook, scope, example_group_class)
120
- hooks[hook][scope].find_hooks_for(example_group_class)
119
+ def find_hook(hook, scope, example_group_class, example = nil)
120
+ hooks[hook][scope].find_hooks_for(example || example_group_class)
121
121
  end
122
122
 
123
123
  private
@@ -48,11 +48,17 @@ module RSpec::Core
48
48
  ' [h]tml',
49
49
  ' [t]extmate',
50
50
  ' custom formatter class name') do |o|
51
- options[:formatter] = o
51
+ options[:formatters] ||= []
52
+ options[:formatters] << [o]
52
53
  end
53
54
 
54
- parser.on('-o', '--out FILE', 'output to a file instead of STDOUT') do |o|
55
- options[:output_stream] = File.open(o,'w')
55
+ parser.on('-o', '--out FILE',
56
+ 'Write output to a file instead of STDOUT. This option applies',
57
+ 'to the previously specified --format, or the default format if',
58
+ 'no format is specified.'
59
+ ) do |o|
60
+ options[:formatters] ||= [['progress']]
61
+ options[:formatters].last << o
56
62
  end
57
63
 
58
64
  parser.on_tail('-h', '--help', "You're looking at it.") do
@@ -69,6 +75,10 @@ module RSpec::Core
69
75
  options[:line_number] = o
70
76
  end
71
77
 
78
+ parser.on('-O', '--options PATH', 'Specify the path to an options file') do |path|
79
+ options[:custom_options_file] = path
80
+ end
81
+
72
82
  parser.on('-p', '--profile', 'Enable profiling of examples with output of the top 10 slowest examples') do |o|
73
83
  options[:profile_examples] = o
74
84
  end
@@ -4,6 +4,8 @@ module RSpec
4
4
  DEFAULT_MESSAGE = 'No reason given'
5
5
 
6
6
  def pending(*args)
7
+ return self.class.before(:each) { pending(*args) } unless example
8
+
7
9
  options = args.last.is_a?(Hash) ? args.pop : {}
8
10
  message = args.first || DEFAULT_MESSAGE
9
11
 
@@ -149,7 +149,7 @@ module RSpec
149
149
  if ENV['SPEC']
150
150
  FileList[ ENV['SPEC'] ]
151
151
  else
152
- FileList[ pattern ].map { |f| %["#{f}"] }
152
+ FileList[ pattern ].map { |f| f.gsub(/"/, '\"').gsub(/'/, "\\\\'") }
153
153
  end
154
154
  end
155
155
 
@@ -1,3 +1,5 @@
1
+ require 'ostruct'
2
+
1
3
  module RSpec
2
4
  module Core
3
5
  module Subject
@@ -1,7 +1,7 @@
1
1
  module RSpec # :nodoc:
2
2
  module Core # :nodoc:
3
3
  module Version # :nodoc:
4
- STRING = '2.3.1'
4
+ STRING = '2.4.0'
5
5
  end
6
6
  end
7
7
  end
@@ -81,8 +81,8 @@ module RSpec
81
81
 
82
82
  include RSpec::Core::Hooks
83
83
 
84
- def find_hook(hook, scope, group)
85
- @configuration.find_hook(hook, scope, group)
84
+ def find_hook(hook, scope, group, example = nil)
85
+ @configuration.find_hook(hook, scope, group, example)
86
86
  end
87
87
 
88
88
  private
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'ostruct'
3
+ require 'tmpdir'
4
4
 
5
5
  describe RSpec::Core::ConfigurationOptions do
6
6
 
@@ -10,7 +10,7 @@ describe RSpec::Core::ConfigurationOptions do
10
10
  coo
11
11
  end
12
12
 
13
- def options_from_args(*args)
13
+ def parse_options(*args)
14
14
  config_options_object(*args).options
15
15
  end
16
16
 
@@ -27,114 +27,108 @@ describe RSpec::Core::ConfigurationOptions do
27
27
  opts = config_options_object(*%w[--require a/path -f a/formatter])
28
28
  config = double("config").as_null_object
29
29
  config.should_receive(:requires=).ordered
30
- config.should_receive(:formatter=).ordered
30
+ config.should_receive(:add_formatter).ordered
31
31
  opts.configure(config)
32
32
  end
33
33
  end
34
34
 
35
- describe 'color_enabled' do
36
- example "-c, --colour, or --color are parsed as true" do
37
- options_from_args('-c').should include(:color_enabled => true)
38
- options_from_args('--color').should include(:color_enabled => true)
39
- options_from_args('--colour').should include(:color_enabled => true)
35
+ describe "-c, --color, and --colour" do
36
+ it "sets :color_enabled => true" do
37
+ parse_options('-c').should include(:color_enabled => true)
38
+ parse_options('--color').should include(:color_enabled => true)
39
+ parse_options('--colour').should include(:color_enabled => true)
40
40
  end
41
+ end
41
42
 
42
- example "--no-color is parsed as false" do
43
- options_from_args('--no-color').should include(:color_enabled => false)
43
+ describe "--no-color" do
44
+ it "sets :color_enabled => false" do
45
+ parse_options('--no-color').should include(:color_enabled => false)
44
46
  end
45
47
  end
46
48
 
47
- describe 'load path additions' do
48
- example "-I parses like it does w/ ruby command" do
49
- options_from_args('-I', 'a_dir').should include(:libs => ['a_dir'])
49
+ describe "-I" do
50
+ example "adds to :libs" do
51
+ parse_options('-I', 'a_dir').should include(:libs => ['a_dir'])
50
52
  end
51
- example "-I can be used more than once" do
52
- options_from_args('-I', 'dir_1', '-I', 'dir_2').should include(:libs => ['dir_1','dir_2'])
53
+ example "can be used more than once" do
54
+ parse_options('-I', 'dir_1', '-I', 'dir_2').should include(:libs => ['dir_1','dir_2'])
53
55
  end
54
56
  end
55
57
 
56
58
  describe '--require' do
57
- example "--requires files" do
58
- options_from_args('--require', 'a/path').should include(:requires => ['a/path'])
59
+ example "requires files" do
60
+ parse_options('--require', 'a/path').should include(:requires => ['a/path'])
59
61
  end
60
- example "--require can be used more than once" do
61
- options_from_args('--require', 'path/1', '--require', 'path/2').should include(:requires => ['path/1','path/2'])
62
+ example "can be used more than once" do
63
+ parse_options('--require', 'path/1', '--require', 'path/2').should include(:requires => ['path/1','path/2'])
62
64
  end
63
65
  end
64
66
 
65
- describe 'format' do
66
- example '-f or --format with an argument should parse' do
67
- options_from_args('--format', 'd').should include(:formatter => 'd')
68
- options_from_args('-f', 'd').should include(:formatter => 'd')
69
- options_from_args('-fd').should include(:formatter => 'd')
67
+ describe "--format, -f" do
68
+ it "sets :formatter" do
69
+ parse_options('--format', 'd').should include(:formatters => [['d']])
70
+ parse_options('-f', 'd').should include(:formatters => [['d']])
71
+ parse_options('-fd').should include(:formatters => [['d']])
70
72
  end
71
73
 
72
- example "-f/--format can accept a class name" do
73
- options_from_args('-fSome::Formatter::Class').should include(:formatter => 'Some::Formatter::Class')
74
+ example "can accept a class name" do
75
+ parse_options('-fSome::Formatter::Class').should include(:formatters => [['Some::Formatter::Class']])
74
76
  end
75
77
  end
76
78
 
77
- describe 'profile_examples' do
78
- example "-p or --profile should be parsed as true" do
79
- options_from_args('-p').should include(:profile_examples => true)
80
- options_from_args('--profile').should include(:profile_examples => true)
79
+ describe "--profile, -p" do
80
+ it "sets :profile_examples => true" do
81
+ parse_options('-p').should include(:profile_examples => true)
82
+ parse_options('--profile').should include(:profile_examples => true)
81
83
  end
82
84
  end
83
85
 
84
- describe 'line_number' do
85
- it "is parsed from -l or --line_number" do
86
- options_from_args('-l','3').should include(:line_number => '3')
87
- options_from_args('--line_number','3').should include(:line_number => '3')
86
+ describe '--line_number' do
87
+ it "sets :line_number" do
88
+ parse_options('-l','3').should include(:line_number => '3')
89
+ parse_options('--line_number','3').should include(:line_number => '3')
88
90
  end
89
91
  end
90
92
 
91
- describe "example" do
92
- it "is parsed from --example or -e" do
93
- options_from_args('--example','foo').should include(:full_description => /foo/)
94
- options_from_args('-e','bar').should include(:full_description => /bar/)
93
+ describe "--example" do
94
+ it "sets :full_description" do
95
+ parse_options('--example','foo').should include(:full_description => /foo/)
96
+ parse_options('-e','bar').should include(:full_description => /bar/)
95
97
  end
96
98
  end
97
99
 
98
- describe "files_or_directories_to_run" do
99
- it "parses files from '-c file.rb dir/file.rb'" do
100
- options_from_args("-c", "file.rb", "dir/file.rb").should include(:files_or_directories_to_run => ["file.rb", "dir/file.rb"])
101
- end
102
-
103
- it "parses dir from 'dir'" do
104
- options_from_args("dir").should include(:files_or_directories_to_run => ["dir"])
105
- end
106
-
107
- it "parses dir and files from 'spec/file1_spec.rb, spec/file2_spec.rb'" do
108
- options_from_args("dir", "spec/file1_spec.rb", "spec/file2_spec.rb").should include(:files_or_directories_to_run => ["dir", "spec/file1_spec.rb", "spec/file2_spec.rb"])
100
+ describe "--backtrace, -b" do
101
+ it "sets full_backtrace on config" do
102
+ parse_options("--backtrace").should include(:full_backtrace => true)
103
+ parse_options("-b").should include(:full_backtrace => true)
109
104
  end
105
+ end
110
106
 
111
- it "provides no files or directories if spec directory does not exist" do
112
- FileTest.stub(:directory?).with("spec").and_return false
113
- options_from_args().should include(:files_or_directories_to_run => [])
107
+ describe "--debug, -d" do
108
+ it "sets :debug => true" do
109
+ parse_options("--debug").should include(:debug => true)
110
+ parse_options("-d").should include(:debug => true)
114
111
  end
112
+ end
115
113
 
116
- it "parses dir and files from 'spec/file1_spec.rb, spec/file2_spec.rb'" do
117
- options_from_args("dir", "spec/file1_spec.rb", "spec/file2_spec.rb").should include(:files_or_directories_to_run => ["dir", "spec/file1_spec.rb", "spec/file2_spec.rb"])
118
-
114
+ describe "--fail-fast" do
115
+ it "defaults to false" do
116
+ parse_options[:fail_fast].should be_false
119
117
  end
120
118
 
121
- end
122
-
123
- describe "--backtrace (-b)" do
124
- it "sets full_backtrace on config" do
125
- options_from_args("--backtrace").should include(:full_backtrace => true)
126
- options_from_args("-b").should include(:full_backtrace => true)
119
+ it "sets fail_fast on config" do
120
+ parse_options("--fail-fast")[:fail_fast].should be_true
127
121
  end
128
122
  end
129
123
 
130
- describe "--debug (-d)" do
131
- it "sets debug on config" do
132
- options_from_args("--debug").should include(:debug => true)
133
- options_from_args("-d").should include(:debug => true)
124
+ describe "--options" do
125
+ it "sets :custom_options_file" do
126
+ parse_options(*%w[-O my.opts]).should include(:custom_options_file => "my.opts")
127
+ parse_options(*%w[--options my.opts]).should include(:custom_options_file => "my.opts")
134
128
  end
135
129
  end
136
130
 
137
- describe "--drb (-X)" do
131
+ describe "--drb, -X" do
138
132
  context "combined with --debug" do
139
133
  it "turns off the debugger if --drb is specified first" do
140
134
  config_options_object("--drb", "--debug").drb_argv.should_not include("--debug")
@@ -170,8 +164,32 @@ describe RSpec::Core::ConfigurationOptions do
170
164
  end
171
165
  end
172
166
 
167
+ describe "files_or_directories_to_run" do
168
+ it "parses files from '-c file.rb dir/file.rb'" do
169
+ parse_options("-c", "file.rb", "dir/file.rb").should include(:files_or_directories_to_run => ["file.rb", "dir/file.rb"])
170
+ end
171
+
172
+ it "parses dir from 'dir'" do
173
+ parse_options("dir").should include(:files_or_directories_to_run => ["dir"])
174
+ end
175
+
176
+ it "parses dir and files from 'spec/file1_spec.rb, spec/file2_spec.rb'" do
177
+ parse_options("dir", "spec/file1_spec.rb", "spec/file2_spec.rb").should include(:files_or_directories_to_run => ["dir", "spec/file1_spec.rb", "spec/file2_spec.rb"])
178
+ end
179
+
180
+ it "provides no files or directories if spec directory does not exist" do
181
+ FileTest.stub(:directory?).with("spec").and_return false
182
+ parse_options().should include(:files_or_directories_to_run => [])
183
+ end
184
+
185
+ it "parses dir and files from 'spec/file1_spec.rb, spec/file2_spec.rb'" do
186
+ parse_options("dir", "spec/file1_spec.rb", "spec/file2_spec.rb").should include(:files_or_directories_to_run => ["dir", "spec/file1_spec.rb", "spec/file2_spec.rb"])
187
+
188
+ end
189
+
190
+ end
191
+
173
192
  # TODO ensure all options are output
174
- # TODO check if we need to spec that the short options are "expanded" ("-v" becomes "--version" currently)
175
193
  describe "#drb_argv" do
176
194
  it "preserves extra arguments" do
177
195
  File.stub(:exist?) { false }
@@ -182,10 +200,14 @@ describe RSpec::Core::ConfigurationOptions do
182
200
  config_options_object(*%w[--fail-fast]).drb_argv.should include("--fail-fast")
183
201
  end
184
202
 
203
+ it "includes --options" do
204
+ config_options_object(*%w[--options custom.opts]).drb_argv.should include("--options", "custom.opts")
205
+ end
206
+
185
207
  context "--drb specified in ARGV" do
186
208
  it "renders all the original arguments except --drb" do
187
209
  config_options_object(*%w[ --drb --color --format s --line_number 1 --example pattern --profile --backtrace -I path/a -I path/b --require path/c --require path/d]).
188
- drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern -I path/a -I path/b --require path/c --require path/d])
210
+ drb_argv.should eq(%w[ --color --profile --backtrace --line_number 1 --example pattern --format s -I path/a -I path/b --require path/c --require path/d])
189
211
  end
190
212
  end
191
213
 
@@ -194,7 +216,7 @@ describe RSpec::Core::ConfigurationOptions do
194
216
  File.stub(:exist?) { true }
195
217
  IO.stub(:read) { "--drb --color" }
196
218
  config_options_object(*%w[ --tty --format s --line_number 1 --example pattern --profile --backtrace ]).
197
- drb_argv.should eq(%w[ --color --profile --backtrace --tty --format s --line_number 1 --example pattern ])
219
+ drb_argv.should eq(%w[ --color --profile --backtrace --tty --line_number 1 --example pattern --format s])
198
220
  end
199
221
  end
200
222
 
@@ -203,7 +225,7 @@ describe RSpec::Core::ConfigurationOptions do
203
225
  File.stub(:exist?) { true }
204
226
  IO.stub(:read) { "--drb --color" }
205
227
  config_options_object(*%w[ --drb --format s --line_number 1 --example pattern --profile --backtrace]).
206
- drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern ])
228
+ drb_argv.should eq(%w[ --color --profile --backtrace --line_number 1 --example pattern --format s])
207
229
  end
208
230
  end
209
231
 
@@ -212,102 +234,76 @@ describe RSpec::Core::ConfigurationOptions do
212
234
  File.stub(:exist?) { true }
213
235
  IO.stub(:read) { "--drb --color" }
214
236
  config_options_object(*%w[ --drb --format s --line_number 1 --example pattern --profile --backtrace]).
215
- drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern ])
237
+ drb_argv.should eq(%w[ --color --profile --backtrace --line_number 1 --example pattern --format s ])
216
238
  end
217
239
  end
218
240
  end
219
241
 
220
- describe "--fail-fast" do
221
- it "sets fail_fast on config" do
222
- options_from_args("--fail-fast").should include(:fail_fast => true)
223
- end
224
- end
225
-
226
- describe "options file (override)" do
227
- let(:config) { OpenStruct.new }
228
-
229
- it "loads automatically" do
230
- File.stub(:exist?) { true }
231
- IO.stub(:read) { "--format doc" }
232
-
233
- config_options = RSpec::Core::ConfigurationOptions.new([])
234
- config_options.parse_options
235
- config_options.configure(config)
236
- config.formatter.should == 'doc'
237
- end
238
-
239
- it "merges options from the global and local .rspec and the command line" do
240
- File.stub(:exist?){ true }
241
- IO.stub(:read) do |path|
242
- case path
243
- when ".rspec"
244
- "--format documentation"
245
- when /\.rspec/
246
- "--line 37"
247
- else
248
- raise "Unexpected path: #{path}"
249
- end
250
- end
251
- config_options = RSpec::Core::ConfigurationOptions.new(["--no-color"])
252
- config_options.parse_options
253
-
254
- config_options.configure(config)
255
-
256
- config.formatter.should == "documentation"
257
- config.line_number.should == "37"
258
- config.color_enabled.should be_false
259
- end
260
-
261
- it "prefers local options over global" do
262
- File.stub(:exist?){ true }
263
- IO.stub(:read) do |path|
264
- case path
265
- when ".rspec"
266
- "--format local"
267
- when /\.rspec/
268
- "--format global"
269
- else
270
- raise "Unexpected path: #{path}"
271
- end
272
- end
273
- config_options = RSpec::Core::ConfigurationOptions.new([])
274
- config_options.parse_options
275
-
276
- config_options.configure(config)
242
+ describe "sources: ~/.rspec, ./.rspec, custom, SPEC_OPTS, and CLI" do
243
+ let(:local_options_file) { File.join(Dir.tmpdir, ".rspec-local") }
244
+ let(:global_options_file) { File.join(Dir.tmpdir, ".rspec-global") }
245
+ let(:custom_options_file) { File.join(Dir.tmpdir, "custom.options") }
277
246
 
278
- config.formatter.should == "local"
247
+ before do
248
+ @orig_spec_opts = ENV["SPEC_OPTS"]
249
+ @orig_global_options_file = RSpec::Core::ConfigurationOptions::GLOBAL_OPTIONS_FILE
250
+ @orig_local_options_file = RSpec::Core::ConfigurationOptions::LOCAL_OPTIONS_FILE
251
+ RSpec::Core::ConfigurationOptions::__send__ :remove_const, :GLOBAL_OPTIONS_FILE
252
+ RSpec::Core::ConfigurationOptions::__send__ :remove_const, :LOCAL_OPTIONS_FILE
253
+ RSpec::Core::ConfigurationOptions::GLOBAL_OPTIONS_FILE = global_options_file
254
+ RSpec::Core::ConfigurationOptions::LOCAL_OPTIONS_FILE = local_options_file
255
+ FileUtils.rm local_options_file if File.exist? local_options_file
256
+ FileUtils.rm global_options_file if File.exist? global_options_file
257
+ FileUtils.rm custom_options_file if File.exist? custom_options_file
279
258
  end
280
259
 
281
- it "prefers CLI options over file options" do
282
- config_options = RSpec::Core::ConfigurationOptions.new(['--format', 'progress'])
283
- config_options.stub(:parse_options_file).and_return(:formatter => 'documentation')
284
-
285
- config_options.parse_options
286
- config_options.configure(config)
260
+ after do
261
+ ENV["SPEC_OPTS"] = @orig_spec_opts
262
+ RSpec::Core::ConfigurationOptions::__send__ :remove_const, :GLOBAL_OPTIONS_FILE
263
+ RSpec::Core::ConfigurationOptions::__send__ :remove_const, :LOCAL_OPTIONS_FILE
264
+ RSpec::Core::ConfigurationOptions::GLOBAL_OPTIONS_FILE = @orig_global_options_file
265
+ RSpec::Core::ConfigurationOptions::LOCAL_OPTIONS_FILE = @orig_local_options_file
266
+ end
287
267
 
288
- config.formatter.should == 'progress'
268
+ def write_options(scope, options)
269
+ File.open(send("#{scope}_options_file"), 'w') { |f| f.write(options) }
289
270
  end
290
271
 
291
- context "with SPEC_OPTS" do
292
- before do
293
- @orig_spec_opts = ENV["SPEC_OPTS"]
294
- end
272
+ it "merges global, local, SPEC_OPTS, and CLI" do
273
+ write_options(:global, "--color")
274
+ write_options(:local, "--line 37")
275
+ ENV["SPEC_OPTS"] = "--debug"
276
+ options = parse_options("--drb")
277
+ options[:color_enabled].should be_true
278
+ options[:line_number].should eq("37")
279
+ options[:debug].should be_true
280
+ options[:drb].should be_true
281
+ end
295
282
 
296
- after do
297
- ENV["SPEC_OPTS"] = @orig_spec_opts
298
- end
283
+ it "prefers CLI over SPEC_OPTS" do
284
+ ENV["SPEC_OPTS"] = "--format spec_opts"
285
+ parse_options("--format", "cli")[:formatters].should eq([['cli']])
286
+ end
299
287
 
300
- it "prefers SPEC_OPTS options over file options" do
301
- config = OpenStruct.new
302
- ENV["SPEC_OPTS"] = "--format documentation"
303
- config_options = RSpec::Core::ConfigurationOptions.new(['--format', 'progress'])
288
+ it "prefers SPEC_OPTS over file options" do
289
+ write_options(:local, "--format local")
290
+ write_options(:global, "--format global")
291
+ ENV["SPEC_OPTS"] = "--format spec_opts"
292
+ parse_options[:formatters].should eq([['spec_opts']])
293
+ end
304
294
 
305
- config_options.parse_options
306
- config_options.configure(config)
295
+ it "prefers local file options over global" do
296
+ write_options(:local, "--format local")
297
+ write_options(:global, "--format global")
298
+ parse_options[:formatters].should eq([['local']])
299
+ end
307
300
 
308
- config.formatter.should == 'documentation'
301
+ context "with custom options file" do
302
+ it "ignores local and global options files" do
303
+ write_options(:local, "--color")
304
+ write_options(:global, "--color")
305
+ parse_options("-O", custom_options_file)[:color_enabled].should be_false
309
306
  end
310
307
  end
311
308
  end
312
309
  end
313
-