rspec-core 2.7.1 → 2.8.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/README.md +1 -1
  2. data/features/command_line/order.feature +29 -0
  3. data/features/command_line/tag.feature +10 -9
  4. data/features/configuration/default_path.feature +2 -2
  5. data/features/filtering/exclusion_filters.feature +1 -1
  6. data/features/filtering/run_all_when_everything_filtered.feature +1 -1
  7. data/features/subject/attribute_of_subject.feature +1 -1
  8. data/lib/rspec/core.rb +148 -12
  9. data/lib/rspec/core/command_line.rb +2 -2
  10. data/lib/rspec/core/configuration.rb +300 -155
  11. data/lib/rspec/core/configuration_options.rb +34 -53
  12. data/lib/rspec/core/deprecation.rb +4 -0
  13. data/lib/rspec/core/drb_options.rb +72 -0
  14. data/lib/rspec/core/example.rb +58 -24
  15. data/lib/rspec/core/example_group.rb +10 -5
  16. data/lib/rspec/core/extensions.rb +1 -0
  17. data/lib/rspec/core/extensions/ordered.rb +16 -0
  18. data/lib/rspec/core/filter_manager.rb +170 -0
  19. data/lib/rspec/core/formatters/base_formatter.rb +3 -1
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +6 -0
  21. data/lib/rspec/core/formatters/snippet_extractor.rb +1 -1
  22. data/lib/rspec/core/hooks.rb +197 -1
  23. data/lib/rspec/core/let.rb +3 -2
  24. data/lib/rspec/core/metadata.rb +25 -4
  25. data/lib/rspec/core/option_parser.rb +89 -54
  26. data/lib/rspec/core/pending.rb +41 -0
  27. data/lib/rspec/core/rake_task.rb +9 -25
  28. data/lib/rspec/core/reporter.rb +43 -19
  29. data/lib/rspec/core/shared_context.rb +35 -0
  30. data/lib/rspec/core/shared_example_group.rb +0 -1
  31. data/lib/rspec/core/subject.rb +4 -4
  32. data/lib/rspec/core/version.rb +1 -1
  33. data/lib/rspec/core/world.rb +34 -52
  34. data/spec/autotest/failed_results_re_spec.rb +2 -2
  35. data/spec/command_line/order_spec.rb +131 -0
  36. data/spec/rspec/core/command_line_spec.rb +2 -1
  37. data/spec/rspec/core/configuration_options_spec.rb +83 -163
  38. data/spec/rspec/core/configuration_spec.rb +311 -139
  39. data/spec/rspec/core/drb_options_spec.rb +131 -0
  40. data/spec/rspec/core/example_group_spec.rb +22 -11
  41. data/spec/rspec/core/example_spec.rb +1 -2
  42. data/spec/rspec/core/filter_manager_spec.rb +175 -0
  43. data/spec/rspec/core/formatters/helpers_spec.rb +1 -1
  44. data/spec/rspec/core/formatters/html_formatter_spec.rb +3 -2
  45. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +1 -1
  46. data/spec/rspec/core/metadata_spec.rb +21 -6
  47. data/spec/rspec/core/option_parser_spec.rb +74 -0
  48. data/spec/rspec/core/reporter_spec.rb +18 -1
  49. data/spec/rspec/core/shared_context_spec.rb +54 -17
  50. data/spec/rspec/core/subject_spec.rb +1 -1
  51. data/spec/rspec/core/world_spec.rb +7 -188
  52. data/spec/spec_helper.rb +47 -43
  53. data/spec/support/config_options_helper.rb +27 -0
  54. metadata +28 -12
  55. data/lib/rspec/core/expecting/with_rspec.rb +0 -9
  56. data/lib/rspec/core/expecting/with_stdlib.rb +0 -9
@@ -0,0 +1,131 @@
1
+ require "spec_helper"
2
+
3
+ describe RSpec::Core::DrbOptions do
4
+ include ConfigOptionsHelper
5
+
6
+ # TODO ensure all options are output
7
+ describe "#drb_argv" do
8
+ it "preserves extra arguments" do
9
+ File.stub(:exist?) { false }
10
+ config_options_object(*%w[ a --drb b --color c ]).drb_argv.should =~ %w[ --color a b c ]
11
+ end
12
+
13
+ it "includes --fail-fast" do
14
+ config_options_object(*%w[--fail-fast]).drb_argv.should include("--fail-fast")
15
+ end
16
+
17
+ it "includes --options" do
18
+ config_options_object(*%w[--options custom.opts]).drb_argv.should include("--options", "custom.opts")
19
+ end
20
+
21
+ it "includes --order" do
22
+ config_options_object(*%w[--order random]).drb_argv.should include('--order', 'random')
23
+ end
24
+
25
+ context "with --example" do
26
+ it "includes --example" do
27
+ config_options_object(*%w[--example foo]).drb_argv.should include("--example", "foo")
28
+ end
29
+
30
+ it "unescapes characters which were escaped upon storing --example originally" do
31
+ config_options_object("--example", "foo\\ bar").drb_argv.should include("--example", "foo bar")
32
+ end
33
+ end
34
+
35
+ context "with tags" do
36
+ it "includes the inclusion tags" do
37
+ coo = config_options_object("--tag", "tag")
38
+ coo.drb_argv.should eq(["--tag", "tag"])
39
+ end
40
+
41
+ it "includes the inclusion tags with values" do
42
+ coo = config_options_object("--tag", "tag:foo")
43
+ coo.drb_argv.should eq(["--tag", "tag:foo"])
44
+ end
45
+
46
+ it "leaves inclusion tags intact" do
47
+ coo = config_options_object("--tag", "tag")
48
+ coo.drb_argv
49
+ coo.filter_manager.inclusions.should eq( {:tag=>true} )
50
+ end
51
+
52
+ it "leaves inclusion tags with values intact" do
53
+ coo = config_options_object("--tag", "tag:foo")
54
+ coo.drb_argv
55
+ coo.filter_manager.inclusions.should eq( {:tag=>'foo'} )
56
+ end
57
+
58
+ it "includes the exclusion tags" do
59
+ coo = config_options_object("--tag", "~tag")
60
+ coo.drb_argv.should eq(["--tag", "~tag"])
61
+ end
62
+
63
+ it "includes the exclusion tags with values" do
64
+ coo = config_options_object("--tag", "~tag:foo")
65
+ coo.drb_argv.should eq(["--tag", "~tag:foo"])
66
+ end
67
+
68
+ it "leaves exclusion tags intact" do
69
+ coo = config_options_object("--tag", "~tag")
70
+ coo.drb_argv
71
+ coo.filter_manager.exclusions.should include(:tag=>true)
72
+ end
73
+
74
+ it "leaves exclusion tags with values intact" do
75
+ coo = config_options_object("--tag", "~tag:foo")
76
+ coo.drb_argv
77
+ coo.filter_manager.exclusions.should include(:tag=>'foo')
78
+ end
79
+ end
80
+
81
+ context "with formatters" do
82
+ it "includes the formatters" do
83
+ coo = config_options_object("--format", "d")
84
+ coo.drb_argv.should eq(["--format", "d"])
85
+ end
86
+
87
+ it "leaves formatters intact" do
88
+ coo = config_options_object("--format", "d")
89
+ coo.drb_argv
90
+ coo.options[:formatters].should eq([["d"]])
91
+ end
92
+
93
+ it "leaves output intact" do
94
+ coo = config_options_object("--format", "p", "--out", "foo.txt", "--format", "d")
95
+ coo.drb_argv
96
+ coo.options[:formatters].should eq([["p","foo.txt"],["d"]])
97
+ end
98
+ end
99
+
100
+ context "--drb specified in ARGV" do
101
+ it "renders all the original arguments except --drb" do
102
+ config_options_object(*%w[ --drb --color --format s --example pattern --line_number 1 --profile --backtrace -I path/a -I path/b --require path/c --require path/d]).
103
+ drb_argv.should eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s -I path/a -I path/b --require path/c --require path/d])
104
+ end
105
+ end
106
+
107
+ context "--drb specified in the options file" do
108
+ it "renders all the original arguments except --drb" do
109
+ File.open("./.rspec", "w") {|f| f << "--drb --color"}
110
+ config_options_object(*%w[ --tty --format s --example pattern --line_number 1 --profile --backtrace ]).
111
+ drb_argv.should eq(%w[ --color --profile --backtrace --tty --example pattern --line_number 1 --format s])
112
+ end
113
+ end
114
+
115
+ context "--drb specified in ARGV and the options file" do
116
+ it "renders all the original arguments except --drb" do
117
+ File.open("./.rspec", "w") {|f| f << "--drb --color"}
118
+ config_options_object(*%w[ --drb --format s --example pattern --line_number 1 --profile --backtrace]).
119
+ drb_argv.should eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s])
120
+ end
121
+ end
122
+
123
+ context "--drb specified in ARGV and in as ARGV-specified --options file" do
124
+ it "renders all the original arguments except --drb and --options" do
125
+ File.open("./.rspec", "w") {|f| f << "--drb --color"}
126
+ config_options_object(*%w[ --drb --format s --example pattern --line_number 1 --profile --backtrace]).
127
+ drb_argv.should eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s ])
128
+ end
129
+ end
130
+ end
131
+ end
@@ -111,7 +111,7 @@ module RSpec::Core
111
111
  world = RSpec::Core::World.new
112
112
  parent = ExampleGroup.describe
113
113
  world.register(parent)
114
- child = parent.describe
114
+ parent.describe
115
115
  world.example_groups.should eq([parent])
116
116
  end
117
117
  end
@@ -121,7 +121,11 @@ module RSpec::Core
121
121
 
122
122
  shared_examples "matching filters" do
123
123
  context "inclusion" do
124
- before { world.stub(:inclusion_filter).and_return(filter_metadata) }
124
+ before do
125
+ filter_manager = FilterManager.new
126
+ filter_manager.include filter_metadata
127
+ world.stub(:filter_manager => filter_manager)
128
+ end
125
129
 
126
130
  it "includes examples in groups matching filter" do
127
131
  group = ExampleGroup.describe("does something", spec_metadata)
@@ -145,11 +149,16 @@ module RSpec::Core
145
149
  end
146
150
 
147
151
  context "exclusion" do
148
- before { world.stub(:exclusion_filter).and_return(filter_metadata) }
152
+ before do
153
+ filter_manager = FilterManager.new
154
+ filter_manager.exclude filter_metadata
155
+ world.stub(:filter_manager => filter_manager)
156
+ end
157
+
149
158
  it "excludes examples in groups matching filter" do
150
159
  group = ExampleGroup.describe("does something", spec_metadata)
151
160
  group.stub(:world) { world }
152
- all_examples = [ group.example("first"), group.example("second") ]
161
+ [ group.example("first"), group.example("second") ]
153
162
 
154
163
  group.filtered_examples.should be_empty
155
164
  end
@@ -157,7 +166,7 @@ module RSpec::Core
157
166
  it "excludes examples directly matching filter" do
158
167
  group = ExampleGroup.describe("does something")
159
168
  group.stub(:world) { world }
160
- filtered_examples = [
169
+ [
161
170
  group.example("first", spec_metadata),
162
171
  group.example("second", spec_metadata)
163
172
  ]
@@ -245,10 +254,12 @@ module RSpec::Core
245
254
 
246
255
  context "with no examples or groups that match filters" do
247
256
  it "returns none" do
248
- world.stub(:inclusion_filter).and_return({ :awesome => false })
257
+ filter_manager = FilterManager.new
258
+ filter_manager.include :awesome => false
259
+ world.stub(:filter_manager => filter_manager)
249
260
  group = ExampleGroup.describe
250
261
  group.stub(:world) { world }
251
- example = group.example("does something")
262
+ group.example("does something")
252
263
  group.filtered_examples.should eq([])
253
264
  end
254
265
  end
@@ -683,7 +694,7 @@ module RSpec::Core
683
694
  example('ex 1') { 1.should eq(1) }
684
695
  example('ex 2') { 1.should eq(1) }
685
696
  end
686
- group.stub(:filtered_examples) { group.examples }
697
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
687
698
  group.run(reporter).should be_true
688
699
  end
689
700
 
@@ -692,7 +703,7 @@ module RSpec::Core
692
703
  example('ex 1') { 1.should eq(1) }
693
704
  example('ex 2') { 1.should eq(2) }
694
705
  end
695
- group.stub(:filtered_examples) { group.examples }
706
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
696
707
  group.run(reporter).should be_false
697
708
  end
698
709
 
@@ -701,7 +712,7 @@ module RSpec::Core
701
712
  example('ex 1') { 1.should eq(2) }
702
713
  example('ex 2') { 1.should eq(1) }
703
714
  end
704
- group.stub(:filtered_examples) { group.examples }
715
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
705
716
  group.filtered_examples.each do |example|
706
717
  example.should_receive(:run)
707
718
  end
@@ -1008,7 +1019,7 @@ module RSpec::Core
1008
1019
  eval_count = 0
1009
1020
  shared_examples_for("thing") { |p| eval_count += 1 }
1010
1021
  group = ExampleGroup.describe('fake group')
1011
- shared_group = group.it_should_behave_like("thing", :a)
1022
+ group.it_should_behave_like("thing", :a)
1012
1023
  eval_count.should eq(1)
1013
1024
  end
1014
1025
  end
@@ -103,7 +103,7 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
103
103
 
104
104
  describe "accessing options within a running example" do
105
105
  it "can look up option values by key", :demo => :data do
106
- example.options[:demo].should eq(:data)
106
+ example.metadata[:demo].should eq(:data)
107
107
  end
108
108
  end
109
109
 
@@ -285,5 +285,4 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
285
285
  end
286
286
 
287
287
  end
288
-
289
288
  end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ module RSpec::Core
4
+ describe FilterManager do
5
+ %w[inclusions include exclusions exclude].each_slice(2) do |type, name|
6
+ it "merges #{type}" do
7
+ filter_manager = FilterManager.new
8
+ filter_manager.exclusions.clear # defaults
9
+ filter_manager.send name, :foo => :bar
10
+ filter_manager.send name, :baz => :bam
11
+ filter_manager.send(type).should eq(:foo => :bar, :baz => :bam)
12
+ end
13
+
14
+ it "overrides previous #{type} (via merge)" do
15
+ filter_manager = FilterManager.new
16
+ filter_manager.exclusions.clear # defaults
17
+ filter_manager.send name, :foo => 1
18
+ filter_manager.send name, :foo => 2
19
+ filter_manager.send(type).should eq(:foo => 2)
20
+ end
21
+
22
+ it "ignores new #{type} if same key exists and priority is low" do
23
+ filter_manager = FilterManager.new
24
+ filter_manager.exclusions.clear # defaults
25
+ filter_manager.send name, :foo => 1
26
+ filter_manager.send name, :weak, :foo => 2
27
+ filter_manager.send(type).should eq(:foo => 1)
28
+ end
29
+ end
30
+
31
+ describe "#prune" do
32
+ it "includes objects with tags matching inclusions" do
33
+ included = RSpec::Core::Metadata.new({:foo => :bar})
34
+ excluded = RSpec::Core::Metadata.new
35
+ filter_manager = FilterManager.new
36
+ filter_manager.include :foo => :bar
37
+ filter_manager.prune([included, excluded]).should eq([included])
38
+ end
39
+
40
+ it "excludes objects with tags matching exclusions" do
41
+ included = RSpec::Core::Metadata.new
42
+ excluded = RSpec::Core::Metadata.new({:foo => :bar})
43
+ filter_manager = FilterManager.new
44
+ filter_manager.exclude :foo => :bar
45
+ filter_manager.prune([included, excluded]).should eq([included])
46
+ end
47
+
48
+ it "prefers exclusion when matches previously set inclusion" do
49
+ included = RSpec::Core::Metadata.new
50
+ excluded = RSpec::Core::Metadata.new({:foo => :bar})
51
+ filter_manager = FilterManager.new
52
+ filter_manager.include :foo => :bar
53
+ filter_manager.exclude :foo => :bar
54
+ filter_manager.prune([included, excluded]).should eq([included])
55
+ end
56
+
57
+ it "prefers inclusion when matches previously set exclusion" do
58
+ included = RSpec::Core::Metadata.new({:foo => :bar})
59
+ excluded = RSpec::Core::Metadata.new
60
+ filter_manager = FilterManager.new
61
+ filter_manager.exclude :foo => :bar
62
+ filter_manager.include :foo => :bar
63
+ filter_manager.prune([included, excluded]).should eq([included])
64
+ end
65
+
66
+ it "prefers previously set inclusion when exclusion matches but has lower priority" do
67
+ included = RSpec::Core::Metadata.new({:foo => :bar})
68
+ excluded = RSpec::Core::Metadata.new
69
+ filter_manager = FilterManager.new
70
+ filter_manager.include :foo => :bar
71
+ filter_manager.exclude :low, :foo => :bar
72
+ filter_manager.prune([included, excluded]).should eq([included])
73
+ end
74
+
75
+ it "prefers previously set exclusion when inclusion matches but has lower priority" do
76
+ included = RSpec::Core::Metadata.new
77
+ excluded = RSpec::Core::Metadata.new({:foo => :bar})
78
+ filter_manager = FilterManager.new
79
+ filter_manager.exclude :foo => :bar
80
+ filter_manager.include :low, :foo => :bar
81
+ filter_manager.prune([included, excluded]).should eq([included])
82
+ end
83
+ end
84
+
85
+ describe "#inclusions#description" do
86
+ it 'cleans up the description' do
87
+ project_dir = File.expand_path('.')
88
+ lambda { }.inspect.should include(project_dir)
89
+ lambda { }.inspect.should include(' (lambda)') if RUBY_VERSION > '1.9'
90
+ lambda { }.inspect.should include('0x')
91
+
92
+ filter_manager = FilterManager.new
93
+ filter_manager.include :foo => lambda { }
94
+
95
+ filter_manager.inclusions.description.should_not include(project_dir)
96
+ filter_manager.inclusions.description.should_not include(' (lambda)')
97
+ filter_manager.inclusions.description.should_not include('0x')
98
+ end
99
+ end
100
+
101
+ describe "#exclusions#description" do
102
+ it 'cleans up the description' do
103
+ project_dir = File.expand_path('.')
104
+ lambda { }.inspect.should include(project_dir)
105
+ lambda { }.inspect.should include(' (lambda)') if RUBY_VERSION > '1.9'
106
+ lambda { }.inspect.should include('0x')
107
+
108
+ filter_manager = FilterManager.new
109
+ filter_manager.exclude :foo => lambda { }
110
+
111
+ filter_manager.exclusions.description.should_not include(project_dir)
112
+ filter_manager.exclusions.description.should_not include(' (lambda)')
113
+ filter_manager.exclusions.description.should_not include('0x')
114
+ end
115
+
116
+ it 'returns `{}` when it only contains the default filters' do
117
+ filter_manager = FilterManager.new
118
+ filter_manager.exclusions.description.should eq({}.inspect)
119
+ end
120
+
121
+ it 'includes other filters' do
122
+ filter_manager = FilterManager.new
123
+ filter_manager.exclude :foo => :bar
124
+ filter_manager.exclusions.description.should eq({ :foo => :bar }.inspect)
125
+ end
126
+
127
+ it 'deprecates an overridden :if filter' do
128
+ RSpec.should_receive(:warn_deprecation).with(/exclude\(:if.*is deprecated/)
129
+ filter_manager = FilterManager.new
130
+ filter_manager.exclude :if => :custom_filter
131
+ end
132
+
133
+ it 'deprecates an overridden :unless filter' do
134
+ RSpec.should_receive(:warn_deprecation).with(/exclude\(:unless.*is deprecated/)
135
+ filter_manager = FilterManager.new
136
+ filter_manager.exclude :unless => :custom_filter
137
+ end
138
+
139
+ it 'includes an overriden :if filter' do
140
+ RSpec.stub(:warn_deprecation)
141
+ filter_manager = FilterManager.new
142
+ filter_manager.exclude :if => :custom_filter
143
+ filter_manager.exclusions.description.should eq({ :if => :custom_filter }.inspect)
144
+ end
145
+
146
+ it 'includes an overriden :unless filter' do
147
+ RSpec.stub(:warn_deprecation)
148
+ filter_manager = FilterManager.new
149
+ filter_manager.exclude :unless => :custom_filter
150
+ filter_manager.exclusions.description.should eq({ :unless => :custom_filter }.inspect)
151
+ end
152
+ end
153
+
154
+ it "clears the inclusion filter on include :line_numbers" do
155
+ filter_manager = FilterManager.new
156
+ filter_manager.include :foo => :bar
157
+ filter_manager.include :line_numbers => [100]
158
+ filter_manager.inclusions.should eq(:line_numbers => [100])
159
+ end
160
+
161
+ it "clears the inclusion filter on include :locations" do
162
+ filter_manager = FilterManager.new
163
+ filter_manager.include :foo => :bar
164
+ filter_manager.include :locations => { "path/to/file.rb" => [37] }
165
+ filter_manager.inclusions.should eq(:locations => { "path/to/file.rb" => [37] })
166
+ end
167
+
168
+ it "clears the inclusion filter on include :full_description" do
169
+ filter_manager = FilterManager.new
170
+ filter_manager.include :foo => :bar
171
+ filter_manager.include :full_description => "this and that"
172
+ filter_manager.inclusions.should eq(:full_description => "this and that")
173
+ end
174
+ end
175
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'rspec/core/formatters/helpers'
3
3
 
4
4
  describe RSpec::Core::Formatters::Helpers do
5
- let(:helper) { helper = Object.new.extend(RSpec::Core::Formatters::Helpers) }
5
+ let(:helper) { Object.new.extend(RSpec::Core::Formatters::Helpers) }
6
6
 
7
7
  describe "format seconds" do
8
8
  context "sub second times" do
@@ -16,7 +16,7 @@ module RSpec
16
16
 
17
17
  let(:generated_html) do
18
18
  options = RSpec::Core::ConfigurationOptions.new(
19
- %w[spec/rspec/core/resources/formatter_specs.rb --format html]
19
+ %w[spec/rspec/core/resources/formatter_specs.rb --format html --order default]
20
20
  )
21
21
  options.parse_options
22
22
  err, out = StringIO.new, StringIO.new
@@ -49,7 +49,7 @@ module RSpec
49
49
  end
50
50
 
51
51
  def extract_backtrace_from(doc)
52
- backtrace = doc.search("div.backtrace").
52
+ doc.search("div.backtrace").
53
53
  collect {|e| e.at("pre").inner_html}.
54
54
  collect {|e| e.split("\n")}.flatten.
55
55
  select {|e| e =~ /formatter_specs\.rb/}
@@ -72,6 +72,7 @@ module RSpec
72
72
  actual_path, actual_line_number, actual_suffix = actual_backtraces[i].split(':')
73
73
  File.expand_path(actual_path).should eq(File.expand_path(expected_path))
74
74
  actual_line_number.should eq(expected_line_number)
75
+ actual_suffix.should eq(expected_suffix)
75
76
  end
76
77
  end
77
78
  end