rspec-core 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/Gemfile +8 -3
  2. data/Guardfile +5 -0
  3. data/History.markdown +32 -2
  4. data/README.markdown +10 -3
  5. data/Rakefile +12 -13
  6. data/Upgrade.markdown +175 -121
  7. data/bin/autospec +13 -0
  8. data/bin/rspec +24 -1
  9. data/features/command_line/line_number_appended_to_path.feature +3 -1
  10. data/features/command_line/line_number_option.feature +3 -1
  11. data/features/command_line/tag.feature +74 -0
  12. data/features/filtering/exclusion_filters.feature +1 -1
  13. data/features/filtering/implicit_filters.feature +166 -0
  14. data/features/hooks/around_hooks.feature +51 -44
  15. data/features/metadata/described_class.feature +3 -0
  16. data/features/pending/pending_examples.feature +76 -0
  17. data/features/step_definitions/additional_cli_steps.rb +11 -0
  18. data/features/subject/attribute_of_subject.feature +8 -0
  19. data/features/subject/explicit_subject.feature +8 -13
  20. data/features/subject/implicit_receiver.feature +29 -0
  21. data/features/subject/implicit_subject.feature +6 -7
  22. data/lib/rspec/core.rb +3 -21
  23. data/lib/rspec/core/backward_compatibility.rb +22 -3
  24. data/lib/rspec/core/command_line.rb +1 -0
  25. data/lib/rspec/core/configuration.rb +34 -6
  26. data/lib/rspec/core/configuration_options.rb +1 -3
  27. data/lib/rspec/core/example.rb +0 -5
  28. data/lib/rspec/core/example_group.rb +9 -8
  29. data/lib/rspec/core/expecting/with_rspec.rb +11 -0
  30. data/lib/rspec/core/extensions/object.rb +1 -1
  31. data/lib/rspec/core/formatters/base_formatter.rb +1 -6
  32. data/lib/rspec/core/hooks.rb +1 -1
  33. data/lib/rspec/core/metadata.rb +15 -5
  34. data/lib/rspec/core/option_parser.rb +17 -0
  35. data/lib/rspec/core/pending.rb +10 -1
  36. data/lib/rspec/core/rake_task.rb +32 -10
  37. data/lib/rspec/core/reporter.rb +1 -0
  38. data/lib/rspec/core/subject.rb +58 -59
  39. data/lib/rspec/core/version.rb +1 -1
  40. data/lib/rspec/core/world.rb +9 -4
  41. data/rspec-core.gemspec +4 -11
  42. data/spec/rspec/core/command_line_spec.rb +16 -5
  43. data/spec/rspec/core/configuration_options_spec.rb +6 -0
  44. data/spec/rspec/core/configuration_spec.rb +89 -6
  45. data/spec/rspec/core/deprecations_spec.rb +17 -1
  46. data/spec/rspec/core/example_group_spec.rb +29 -14
  47. data/spec/rspec/core/example_spec.rb +0 -7
  48. data/spec/rspec/core/formatters/html_formatted-1.8.6.html +49 -33
  49. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +5 -5
  50. data/spec/rspec/core/formatters/html_formatted-1.9.1.html +46 -26
  51. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +5 -5
  52. data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +49 -33
  53. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +19 -19
  54. data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +56 -33
  55. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +26 -38
  56. data/spec/rspec/core/metadata_spec.rb +153 -132
  57. data/spec/rspec/core/pending_example_spec.rb +133 -25
  58. data/spec/rspec/core/rake_task_spec.rb +25 -32
  59. data/spec/rspec/core/subject_spec.rb +15 -0
  60. data/spec/rspec/core/world_spec.rb +72 -61
  61. data/spec/spec_helper.rb +0 -14
  62. metadata +25 -135
  63. data/features/hooks/halt.feature +0 -26
@@ -212,22 +212,18 @@ a {
212
212
  <span class="failed_spec_name">fails</span>
213
213
  <div class="failure" id="failure_0">
214
214
  <div class="message"><pre>RSpec::Core::PendingExampleFixedError</pre></div>
215
- <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=19">./spec/rspec/core/resources/formatter_specs.rb:19</a> :in `block (3 levels) in <top (required)>'
216
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
217
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
218
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
219
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
220
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
221
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'
222
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (3 levels) in <top (required)>'
223
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `instance_eval'
224
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `sandboxed'
225
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (2 levels) in <top (required)>'</pre></div>
226
- <pre class="ruby"><code><span class="linenum">11</span> <span class="keyword">rescue</span> <span class="constant">Exception</span> <span class="punct">=&gt;</span> <span class="ident">e</span>
227
- <span class="linenum">12</span> <span class="keyword">end</span>
228
- <span class="offending"><span class="linenum">13</span> <span class="keyword">raise</span> <span class="constant">RSpec</span><span class="punct">::</span><span class="constant">Core</span><span class="punct">::</span><span class="constant">PendingExampleFixedError</span><span class="punct">.</span><span class="ident">new</span> <span class="keyword">if</span> <span class="ident">result</span></span>
229
- <span class="linenum">14</span> <span class="keyword">end</span>
230
- <span class="linenum">15</span> <span class="ident">throw</span> <span class="symbol">:pending_declared_in_example</span><span class="punct">,</span> <span class="ident">message</span></code></pre>
215
+ <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=18">./spec/rspec/core/resources/formatter_specs.rb:18</a> :in `block (3 levels) in <top (required)>'
216
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
217
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
218
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
219
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
220
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
221
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
222
+ <pre class="ruby"><code><span class="linenum">20</span> <span class="keyword">rescue</span> <span class="constant">Exception</span> <span class="punct">=&gt;</span> <span class="ident">e</span>
223
+ <span class="linenum">21</span> <span class="keyword">end</span>
224
+ <span class="offending"><span class="linenum">22</span> <span class="keyword">raise</span> <span class="constant">RSpec</span><span class="punct">::</span><span class="constant">Core</span><span class="punct">::</span><span class="constant">PendingExampleFixedError</span><span class="punct">.</span><span class="ident">new</span> <span class="keyword">if</span> <span class="ident">result</span></span>
225
+ <span class="linenum">23</span> <span class="keyword">end</span>
226
+ <span class="linenum">24</span> <span class="ident">throw</span> <span class="symbol">:pending_declared_in_example</span><span class="punct">,</span> <span class="ident">message</span></code></pre>
231
227
  </div>
232
228
  </dd>
233
229
  </dl>
@@ -253,17 +249,13 @@ expected 2
253
249
 
254
250
  (compared using ==)
255
251
  </pre></div>
256
- <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=34">./spec/rspec/core/resources/formatter_specs.rb:34</a> :in `block (2 levels) in <top (required)>'
257
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
258
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
259
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
260
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
261
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
262
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'
263
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (3 levels) in <top (required)>'
264
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `instance_eval'
265
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `sandboxed'
266
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (2 levels) in <top (required)>'</pre></div>
252
+ <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=33">./spec/rspec/core/resources/formatter_specs.rb:33</a> :in `block (2 levels) in <top (required)>'
253
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
254
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
255
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
256
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
257
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
258
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
267
259
  <pre class="ruby"><code><span class="linenum">27</span> <span class="keyword">end</span>
268
260
  <span class="linenum">28</span>
269
261
  <span class="offending"><span class="linenum">29</span> <span class="keyword">raise</span><span class="punct">(</span><span class="constant">RSpec</span><span class="punct">::</span><span class="constant">Expectations</span><span class="punct">::</span><span class="constant">ExpectationNotMetError</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">message</span><span class="punct">))</span></span>
@@ -282,17 +274,13 @@ expected 2
282
274
  <div class="failure" id="failure_0">
283
275
  <div class="message"><pre>foo</pre></div>
284
276
  <div class="backtrace"><pre>(erb):1:in `<main>'
285
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=42">./spec/rspec/core/resources/formatter_specs.rb:42</a> :in `block (2 levels) in <top (required)>'
286
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
287
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
288
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
289
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
290
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
291
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'
292
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (3 levels) in <top (required)>'
293
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `instance_eval'
294
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=45">./spec/spec_helper.rb:45</a> :in `sandboxed'
295
- <a href="txmt://open?url=file:///Users/alex/code/ruby/rspec-core/spec/spec_helper.rb&line=71">./spec/spec_helper.rb:71</a> :in `block (2 levels) in <top (required)>'</pre></div>
277
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=41">./spec/rspec/core/resources/formatter_specs.rb:41</a> :in `block (2 levels) in <top (required)>'
278
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=24">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:24</a> :in `block (2 levels) in <module:Formatters>'
279
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (5 levels) in <module:Formatters>'
280
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `open'
281
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=47">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:47</a> :in `block (4 levels) in <module:Formatters>'
282
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `chdir'
283
+ <a href="txmt://open?url=file:///Users/mmarston/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=46">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:46</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
296
284
  <pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for (erb)</span></code></pre>
297
285
  </div>
298
286
  </dd>
@@ -4,7 +4,7 @@ module RSpec
4
4
  module Core
5
5
  describe Metadata do
6
6
 
7
- describe "process" do
7
+ describe "#process" do
8
8
  Metadata::RESERVED_KEYS.each do |key|
9
9
  it "prohibits :#{key} as a hash key" do
10
10
  m = Metadata.new
@@ -13,19 +13,121 @@ module RSpec
13
13
  end.to raise_error(/:#{key} is not allowed/)
14
14
  end
15
15
  end
16
- end
17
16
 
18
- describe "description" do
19
- it "just has the example description" do
17
+ it "uses :caller if passed as part of the user metadata" do
20
18
  m = Metadata.new
21
- m.process('group')
19
+ m.process('group', :caller => ['example_file:42'])
20
+ m[:example_group][:location].should == 'example_file:42'
21
+ end
22
+ end
22
23
 
23
- m = m.for_example("example", {})
24
- m[:description].should == "example"
24
+ describe "#apply_condition" do
25
+
26
+ let(:parent_group_metadata) { Metadata.new.process('parent group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
27
+ let(:parent_group_line_number) { parent_group_metadata[:example_group][:line_number] }
28
+ let(:group_metadata) { Metadata.new(parent_group_metadata).process('group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
29
+ let(:group_line_number) { group_metadata[:example_group][:line_number] }
30
+ let(:example_metadata) { group_metadata.for_example('example', :caller => ["foo_spec.rb:#{__LINE__}"], :if => true) }
31
+ let(:example_line_number) { example_metadata[:line_number] }
32
+ let(:next_example_metadata) { group_metadata.for_example('next_example', :caller => ["foo_spec.rb:#{example_line_number + 2}"]) }
33
+ let(:world) { World.new }
34
+
35
+ before { RSpec.stub(:world) { world } }
36
+
37
+ it "matches the group when the line_number is the example group line number" do
38
+ world.should_receive(:preceding_declaration_line).and_return(group_line_number)
39
+ # this call doesn't really make sense since apply_condition is only called
40
+ # for example metadata not group metadata
41
+ group_metadata.apply_condition(:line_number, group_line_number).should be_true
42
+ end
43
+
44
+ it "matches the example when the line_number is the grandparent example group line number" do
45
+ world.should_receive(:preceding_declaration_line).and_return(parent_group_line_number)
46
+ example_metadata.apply_condition(:line_number, parent_group_line_number).should be_true
47
+ end
48
+
49
+ it "matches the example when the line_number is the parent example group line number" do
50
+ world.should_receive(:preceding_declaration_line).and_return(group_line_number)
51
+ example_metadata.apply_condition(:line_number, group_line_number).should be_true
52
+ end
53
+
54
+ it "matches the example when the line_number is the example line number" do
55
+ world.should_receive(:preceding_declaration_line).and_return(example_line_number)
56
+ example_metadata.apply_condition(:line_number, example_line_number).should be_true
57
+ end
58
+
59
+ it "matches when the line number is between this example and the next" do
60
+ world.should_receive(:preceding_declaration_line).and_return(example_line_number)
61
+ example_metadata.apply_condition(:line_number, example_line_number + 1).should be_true
62
+ end
63
+
64
+ it "does not match when the line number matches the next example" do
65
+ world.should_receive(:preceding_declaration_line).and_return(example_line_number + 2)
66
+ example_metadata.apply_condition(:line_number, example_line_number + 2).should be_false
67
+ end
68
+
69
+ it "matches a proc that evaluates to true" do
70
+ example_metadata.apply_condition(:if, lambda { |v| v }).should be_true
71
+ end
72
+
73
+ it "does not match a proc that evaluates to false" do
74
+ example_metadata.apply_condition(:if, lambda { |v| !v }).should be_false
75
+ end
76
+
77
+ it "passes the metadata hash as the second argument if a given proc expects 2 args" do
78
+ passed_metadata = nil
79
+ example_metadata.apply_condition(:if, lambda { |v, m| passed_metadata = m })
80
+ passed_metadata.should == example_metadata
25
81
  end
26
82
  end
27
83
 
28
- describe "describes" do
84
+ describe "#for_example" do
85
+ let(:metadata) { Metadata.new.process("group description") }
86
+ let(:mfe) { metadata.for_example("example description", {:arbitrary => :options}) }
87
+ let(:line_number) { __LINE__ - 1 }
88
+
89
+ it "stores the description" do
90
+ mfe[:description].should == "example description"
91
+ end
92
+
93
+ it "stores the full_description (group description + example description)" do
94
+ mfe[:full_description].should == "group description example description"
95
+ end
96
+
97
+ it "creates an empty execution result" do
98
+ mfe[:execution_result].should == {}
99
+ end
100
+
101
+ it "extracts file path from caller" do
102
+ mfe[:file_path].should == __FILE__
103
+ end
104
+
105
+ it "extracts line number from caller" do
106
+ mfe[:line_number].should == line_number
107
+ end
108
+
109
+ it "extracts location from caller" do
110
+ mfe[:location].should == "#{__FILE__}:#{line_number}"
111
+ end
112
+
113
+ it "uses :caller if passed as an option" do
114
+ example_metadata = metadata.for_example('example description', {:caller => ['example_file:42']})
115
+ example_metadata[:location].should == 'example_file:42'
116
+ end
117
+
118
+ it "merges arbitrary options" do
119
+ mfe[:arbitrary].should == :options
120
+ end
121
+
122
+ it "points :example_group to the same hash object" do
123
+ a = metadata.for_example("foo", {})[:example_group]
124
+ b = metadata.for_example("bar", {})[:example_group]
125
+ a[:description] = "new description"
126
+ b[:description].should == "new description"
127
+ end
128
+ end
129
+
130
+ describe ":describes" do
29
131
  context "with a String" do
30
132
  it "returns nil" do
31
133
  m = Metadata.new
@@ -57,37 +159,15 @@ module RSpec
57
159
  end
58
160
  end
59
161
 
60
- describe "full description" do
61
- it "concats the example group name and description" do
162
+ describe ":description" do
163
+ it "just has the example description" do
62
164
  m = Metadata.new
63
165
  m.process('group')
64
166
 
65
167
  m = m.for_example("example", {})
66
- m[:full_description].should == "group example"
67
- end
68
-
69
- %w[# . ::].each do |char|
70
- context "with a 2nd arg starting with #{char}" do
71
- it "removes the space" do
72
- m = Metadata.new
73
- m.process(Array, "#{char}method")
74
- m[:example_group][:full_description].should eq("Array#{char}method")
75
- end
76
- end
77
-
78
- context "with a nested description starting with #" do
79
- it "removes the space" do
80
- m = Metadata.new
81
- m.process("Object")
82
- m = Metadata.new(m)
83
- m.process("#{char}method")
84
- m[:example_group][:full_description].should eq("Object#{char}method")
85
- end
86
- end
168
+ m[:description].should == "example"
87
169
  end
88
- end
89
170
 
90
- describe "description" do
91
171
  context "with a string" do
92
172
  it "provides the submitted description" do
93
173
  m = Metadata.new
@@ -116,8 +196,16 @@ module RSpec
116
196
  end
117
197
  end
118
198
 
119
- describe "full description" do
120
- it "concats the nested example group descriptions" do
199
+ describe ":full_description" do
200
+ it "concats example group name and description" do
201
+ group_metadata = Metadata.new
202
+ group_metadata.process('group')
203
+
204
+ example_metadata = group_metadata.for_example("example", {})
205
+ example_metadata[:full_description].should == "group example"
206
+ end
207
+
208
+ it "concats nested example group descriptions" do
121
209
  parent = Metadata.new
122
210
  parent.process(Object, 'parent')
123
211
 
@@ -126,32 +214,42 @@ module RSpec
126
214
 
127
215
  child[:example_group][:full_description].should == "Object parent child"
128
216
  end
129
- end
130
-
131
- describe "parent example group" do
132
- it "nests the parent's example group metadata" do
133
- parent = Metadata.new
134
- parent.process(Object, 'parent')
135
217
 
136
- child = Metadata.new(parent)
137
- child.process()
218
+ %w[# . ::].each do |char|
219
+ context "with a 2nd arg starting with #{char}" do
220
+ it "removes the space" do
221
+ m = Metadata.new
222
+ m.process(Array, "#{char}method")
223
+ m[:example_group][:full_description].should eq("Array#{char}method")
224
+ end
225
+ end
226
+ end
138
227
 
139
- child[:example_group][:example_group].should == parent[:example_group]
228
+ %w[# . ::].each do |char|
229
+ context "with a nested description starting with #{char}" do
230
+ it "removes the space" do
231
+ parent = Metadata.new
232
+ parent.process("Object")
233
+ child = Metadata.new(parent)
234
+ child.process("#{char}method")
235
+ child[:example_group][:full_description].should eq("Object#{char}method")
236
+ end
237
+ end
140
238
  end
141
239
  end
142
240
 
143
- describe "file path" do
241
+ describe ":file_path" do
144
242
  it "finds the first non-rspec lib file in the caller array" do
145
243
  m = Metadata.new
146
244
  m.process(:caller => [
147
- "./lib/rspec/core/foo.rb",
148
- "#{__FILE__}:#{__LINE__}"
245
+ "./lib/rspec/core/foo.rb",
246
+ "#{__FILE__}:#{__LINE__}"
149
247
  ])
150
248
  m[:example_group][:file_path].should == __FILE__
151
249
  end
152
250
  end
153
251
 
154
- describe "line number" do
252
+ describe ":line_number" do
155
253
  it "finds the line number with the first non-rspec lib file in the backtrace" do
156
254
  m = Metadata.new
157
255
  m.process({})
@@ -171,94 +269,17 @@ module RSpec
171
269
  end
172
270
  end
173
271
 
174
- describe "metadata for example" do
175
- let(:metadata) { Metadata.new.process("group description") }
176
- let(:mfe) { metadata.for_example("example description", {:arbitrary => :options}) }
177
- let(:line_number) { __LINE__ - 1 }
178
-
179
- it "stores the description" do
180
- mfe[:description].should == "example description"
181
- end
182
-
183
- it "stores the full_description (group description + example description)" do
184
- mfe[:full_description].should == "group description example description"
185
- end
186
-
187
- it "creates an empty execution result" do
188
- mfe[:execution_result].should == {}
189
- end
190
-
191
- it "extracts file path from caller" do
192
- mfe[:file_path].should == __FILE__
193
- end
194
-
195
- it "extracts line number from caller" do
196
- mfe[:line_number].should == line_number
197
- end
198
-
199
- it "extracts location from caller" do
200
- mfe[:location].should == "#{__FILE__}:#{line_number}"
201
- end
202
-
203
- it "merges arbitrary options" do
204
- mfe[:arbitrary].should == :options
205
- end
206
-
207
- it "points :example_group to the same hash object" do
208
- a = metadata.for_example("foo", {})[:example_group]
209
- b = metadata.for_example("bar", {})[:example_group]
210
- a[:description] = "new description"
211
- b[:description].should == "new description"
212
- end
213
- end
214
-
215
- describe "apply_condition" do
216
-
217
-
218
- let(:parent_group_metadata) { Metadata.new.process('parent group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
219
- let(:parent_group_line_number) { __LINE__ -1 }
220
- let(:group_metadata) { Metadata.new(parent_group_metadata).process('group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
221
- let(:group_line_number) { __LINE__ -1 }
222
- let(:example_metadata) { group_metadata.for_example('example', :caller => ["foo_spec.rb:#{__LINE__}"]) }
223
- let(:example_line_number) { __LINE__ -1 }
224
- let(:next_example_metadata) {group_metadata.for_example('next_example',
225
- :caller => ["foo_spec.rb:#{example_line_number + 2}"])}
226
- let(:world) { RSpec.world }
227
-
228
- it "matches the group when the line_number is the example group line number" do
229
- world.should_receive(:preceding_declaration_line).and_return(group_line_number)
230
- # this call doesn't really make sense since apply_condition is only called
231
- # for example metadata not group metadata
232
- group_metadata.apply_condition(:line_number, group_line_number).should be_true
233
- end
234
-
235
- it "matches the example when the line_number is the grandparent example group line number" do
236
- world.should_receive(:preceding_declaration_line).and_return(parent_group_line_number)
237
- example_metadata.apply_condition(:line_number, parent_group_line_number).should be_true
238
- end
239
-
240
- it "matches the example when the line_number is the parent example group line number" do
241
- world.should_receive(:preceding_declaration_line).and_return(group_line_number)
242
- example_metadata.apply_condition(:line_number, group_line_number).should be_true
243
- end
244
-
245
- it "matches the example when the line_number is the example line number" do
246
- world.should_receive(:preceding_declaration_line).and_return(example_line_number)
247
- example_metadata.apply_condition(:line_number, example_line_number).should be_true
248
- end
272
+ describe "child example group" do
273
+ it "nests the parent's example group metadata" do
274
+ parent = Metadata.new
275
+ parent.process(Object, 'parent')
249
276
 
250
- it "matches when the line number is between this example and the next" do
251
- world.should_receive(:preceding_declaration_line).and_return(example_line_number)
252
- example_metadata.apply_condition(:line_number, example_line_number + 1).should be_true
253
- end
277
+ child = Metadata.new(parent)
278
+ child.process()
254
279
 
255
- it "does not match when the line number matches the next example" do
256
- world.should_receive(:preceding_declaration_line).and_return(example_line_number + 2)
257
- example_metadata.apply_condition(:line_number, example_line_number + 2).should be_false
280
+ child[:example_group][:example_group].should == parent[:example_group]
258
281
  end
259
-
260
282
  end
261
-
262
283
  end
263
284
  end
264
285
  end
@@ -10,6 +10,45 @@ RSpec::Matchers.define :be_pending_with do |message|
10
10
  end
11
11
  end
12
12
 
13
+ RSpec::Matchers.define :fail_with do |exception_klass|
14
+ match do |example|
15
+ failure_reason(example, exception_klass).nil?
16
+ end
17
+
18
+ failure_message_for_should do |example|
19
+ "expected example to fail with a #{exception_klass} exception, but #{failure_reason(example, exception_klass)}"
20
+ end
21
+
22
+ def failure_reason(example, exception_klass)
23
+ result = example.metadata[:execution_result]
24
+ case
25
+ when example.metadata[:pending] then "was pending"
26
+ when result[:status] != 'failed' then result[:status]
27
+ when !result[:exception_encountered].is_a?(exception_klass) then "failed with a #{result[:exception_encountered].class}"
28
+ else nil
29
+ end
30
+ end
31
+ end
32
+
33
+ RSpec::Matchers.define :pass do
34
+ match do |example|
35
+ failure_reason(example).nil?
36
+ end
37
+
38
+ failure_message_for_should do |example|
39
+ "expected example to pass, but #{failure_reason(example)}"
40
+ end
41
+
42
+ def failure_reason(example)
43
+ result = example.metadata[:execution_result]
44
+ case
45
+ when example.metadata[:pending] then "was pending"
46
+ when result[:status] != 'passed' then result[:status]
47
+ else nil
48
+ end
49
+ end
50
+ end
51
+
13
52
  describe "an example" do
14
53
  context "with no block" do
15
54
  it "is listed as pending with 'Not Yet Implemented'" do
@@ -23,7 +62,7 @@ describe "an example" do
23
62
  end
24
63
 
25
64
  context "with no args" do
26
- it "is listed as pending with 'No reason given'" do
65
+ it "is listed as pending with the default message" do
27
66
  group = RSpec::Core::ExampleGroup.describe('group') do
28
67
  it "does something" do
29
68
  pending
@@ -31,7 +70,7 @@ describe "an example" do
31
70
  end
32
71
  example = group.examples.first
33
72
  example.run(group.new, stub.as_null_object)
34
- example.should be_pending_with('No reason given')
73
+ example.should be_pending_with(RSpec::Core::Pending::DEFAULT_MESSAGE)
35
74
  end
36
75
  end
37
76
 
@@ -82,37 +121,106 @@ describe "an example" do
82
121
  end
83
122
 
84
123
  context "with a block" do
124
+ def run_example(*pending_args)
125
+ group = RSpec::Core::ExampleGroup.describe('group') do
126
+ it "does something" do
127
+ pending(*pending_args) { yield }
128
+ end
129
+ end
130
+ example = group.examples.first
131
+ example.run(group.new, stub.as_null_object)
132
+ example
133
+ end
134
+
85
135
  context "that fails" do
86
- it "is listed as pending with the supplied message" do
87
- group = RSpec::Core::ExampleGroup.describe('group') do
88
- it "does something" do
89
- pending("just because") do
90
- 3.should == 4
91
- end
92
- end
136
+ def run_example(*pending_args)
137
+ super(*pending_args) { raise ArgumentError.new }
138
+ end
139
+
140
+ context "when given no options" do
141
+ it "is listed as pending with the supplied message" do
142
+ run_example("just because").should be_pending_with("just because")
143
+ end
144
+
145
+ it "is listed as pending with the default message when no message is given" do
146
+ run_example.should be_pending_with(RSpec::Core::Pending::DEFAULT_MESSAGE)
147
+ end
148
+ end
149
+
150
+ context "when given a truthy :if option" do
151
+ it "is listed as pending with the supplied message" do
152
+ run_example("just because", :if => true).should be_pending_with("just because")
153
+ end
154
+
155
+ it "is listed as pending with the default message when no message is given" do
156
+ run_example(:if => true).should be_pending_with(RSpec::Core::Pending::DEFAULT_MESSAGE)
157
+ end
158
+ end
159
+
160
+ context "when given a falsey :if option" do
161
+ it "runs the example and fails" do
162
+ run_example( :if => false).should fail_with(ArgumentError)
163
+ run_example("just because", :if => false).should fail_with(ArgumentError)
164
+ end
165
+ end
166
+
167
+ context "when given a truthy :unless option" do
168
+ it "runs the example and fails" do
169
+ run_example( :unless => true).should fail_with(ArgumentError)
170
+ run_example("just because", :unless => true).should fail_with(ArgumentError)
171
+ end
172
+ end
173
+
174
+ context "when given a falsey :unless option" do
175
+ it "is listed as pending with the supplied message" do
176
+ run_example("just because", :unless => false).should be_pending_with("just because")
177
+ end
178
+
179
+ it "is listed as pending with the default message when no message is given" do
180
+ run_example(:unless => false).should be_pending_with(RSpec::Core::Pending::DEFAULT_MESSAGE)
93
181
  end
94
- example = group.examples.first
95
- example.run(group.new, stub.as_null_object)
96
- example.should be_pending_with('just because')
97
182
  end
98
183
  end
99
184
 
100
185
  context "that passes" do
101
- it "raises a PendingExampleFixedError" do
102
- group = RSpec::Core::ExampleGroup.describe('group') do
103
- it "does something" do
104
- pending("just because") do
105
- 3.should == 3
106
- end
107
- end
186
+ def run_example(*pending_args)
187
+ super(*pending_args) { 3.should == 3 }
188
+ end
189
+
190
+ context "when given no options" do
191
+ it "fails with a PendingExampleFixedError" do
192
+ run_example("just because").should fail_with(RSpec::Core::PendingExampleFixedError)
193
+ run_example.should fail_with(RSpec::Core::PendingExampleFixedError)
194
+ end
195
+ end
196
+
197
+ context "when given a truthy :if option" do
198
+ it "fails with a PendingExampleFixedError" do
199
+ run_example("just because", :if => true).should fail_with(RSpec::Core::PendingExampleFixedError)
200
+ run_example( :if => true).should fail_with(RSpec::Core::PendingExampleFixedError)
201
+ end
202
+ end
203
+
204
+ context "when given a falsey :if option" do
205
+ it "runs the example and it passes" do
206
+ run_example( :if => false).should pass
207
+ run_example("just because", :if => false).should pass
208
+ end
209
+ end
210
+
211
+ context "when given a truthy :unless option" do
212
+ it "runs the example and it passes" do
213
+ run_example( :unless => true).should pass
214
+ run_example("just because", :unless => true).should pass
215
+ end
216
+ end
217
+
218
+ context "when given a falsey :unless option" do
219
+ it "fails with a PendingExampleFixedError" do
220
+ run_example("just because", :unless => false).should fail_with(RSpec::Core::PendingExampleFixedError)
221
+ run_example( :unless => false).should fail_with(RSpec::Core::PendingExampleFixedError)
108
222
  end
109
- example = group.examples.first
110
- example.run(group.new, stub.as_null_object)
111
- example.metadata[:pending].should be_false
112
- example.metadata[:execution_result][:status].should == 'failed'
113
- example.metadata[:execution_result][:exception_encountered].should be_a(RSpec::Core::PendingExampleFixedError)
114
223
  end
115
224
  end
116
225
  end
117
-
118
226
  end