rspec-core 2.0.0.a5 → 2.0.0.a6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/example_specs/failing/diffing_spec.rb +3 -1
  2. data/example_specs/spec_helper.rb +1 -1
  3. data/features/configuration/spec_opts.feature +7 -7
  4. data/features/example_groups/describe_aliases.feature +1 -1
  5. data/features/example_groups/nested_groups.feature +3 -6
  6. data/features/{before_and_after_blocks/around.feature → hooks/around_hook.feature} +1 -1
  7. data/features/{before_and_after_blocks/before_and_after_blocks.feature → hooks/before_and_after_hooks.feature} +3 -3
  8. data/features/hooks/halt.feature +27 -0
  9. data/features/mock_framework_integration/use_flexmock.feature +1 -1
  10. data/features/mock_framework_integration/use_mocha.feature +1 -1
  11. data/features/mock_framework_integration/use_rr.feature +1 -1
  12. data/features/mock_framework_integration/use_rspec.feature +1 -1
  13. data/features/mocks/block_local_expectations.feature +2 -2
  14. data/features/mocks/mix_stubs_and_mocks.feature +1 -1
  15. data/lib/rspec/core.rb +6 -0
  16. data/lib/rspec/core/around_proxy.rb +14 -0
  17. data/lib/rspec/core/deprecation.rb +25 -26
  18. data/lib/rspec/core/example.rb +11 -21
  19. data/lib/rspec/core/example_group.rb +27 -22
  20. data/lib/rspec/core/runner.rb +12 -12
  21. data/lib/rspec/core/version.rb +1 -1
  22. data/rspec-core.gemspec +13 -11
  23. data/spec/rspec/core/configuration_spec.rb +2 -4
  24. data/spec/rspec/core/example_group_spec.rb +263 -292
  25. data/spec/rspec/core/example_group_subject_spec.rb +26 -31
  26. data/spec/rspec/core/mocha_spec.rb +8 -10
  27. data/spec/rspec/core/pending_example_spec.rb +1 -1
  28. data/spec/rspec/core/runner_spec.rb +2 -2
  29. data/spec/rspec/core/shared_example_group_spec.rb +120 -129
  30. data/spec/rspec/core/world_spec.rb +111 -116
  31. data/spec/rspec/core_spec.rb +2 -2
  32. data/spec/spec_helper.rb +2 -23
  33. metadata +9 -7
@@ -1,3 +1,5 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
1
3
  describe "Running specs with --diff" do
2
4
  it "should print diff of different strings" do
3
5
  uk = <<-EOF
@@ -31,6 +33,6 @@ species=#{@species}
31
33
  it "should print diff of different objects' pretty representation" do
32
34
  expected = Animal.new "bob", "giraffe"
33
35
  actual = Animal.new "bob", "tortoise"
34
- expected.should eql(actual)
36
+ expected.should eq(actual)
35
37
  end
36
38
  end
@@ -4,7 +4,7 @@ $LOAD_PATH << File.expand_path('../../../rspec-mocks/lib', __FILE__)
4
4
  require 'rspec/expectations'
5
5
  require 'rspec/autorun'
6
6
 
7
- Rspec::Core.configure do |c|
7
+ Rspec.configure do |c|
8
8
  c.mock_with :rspec
9
9
  c.include Rspec::Matchers
10
10
  end
@@ -5,15 +5,15 @@ Feature: spec/spec.opts
5
5
  automatically.
6
6
 
7
7
  Options declared in spec/spec.opts will override configuration
8
- set up in Rspec::Core.configure blocks.
8
+ set up in Rspec.configure blocks.
9
9
 
10
10
  Background:
11
11
  Given a directory named "spec"
12
12
 
13
- Scenario: color set in Rspec::Core.configure
13
+ Scenario: color set in Rspec.configure
14
14
  Given a file named "spec/spec_helper.rb" with:
15
15
  """
16
- Rspec::Core.configure do |c|
16
+ Rspec.configure do |c|
17
17
  c.color_enabled = true
18
18
  end
19
19
  """
@@ -21,7 +21,7 @@ Feature: spec/spec.opts
21
21
  """
22
22
  require "spec_helper"
23
23
  describe "color_enabled" do
24
- context "when set with Rspec::Core.configure" do
24
+ context "when set with Rspec.configure" do
25
25
  it "is true" do
26
26
  Rspec::Core.configuration.color_enabled?.should be_true
27
27
  end
@@ -39,7 +39,7 @@ Feature: spec/spec.opts
39
39
  And a file named "spec/example_spec.rb" with:
40
40
  """
41
41
  describe "color_enabled" do
42
- context "when set with Rspec::Core.configure" do
42
+ context "when set with Rspec.configure" do
43
43
  it "is true" do
44
44
  Rspec::Core.configuration.color_enabled?.should be_true
45
45
  end
@@ -57,14 +57,14 @@ Feature: spec/spec.opts
57
57
 
58
58
  And a file named "spec/spec_helper.rb" with:
59
59
  """
60
- Rspec::Core.configure do |c|
60
+ Rspec.configure do |c|
61
61
  c.formatter = 'pretty'
62
62
  end
63
63
  """
64
64
  And a file named "spec/example_spec.rb" with:
65
65
  """
66
66
  describe "formatter" do
67
- context "when set with Rspec::Core.configure and in spec.opts" do
67
+ context "when set with Rspec.configure and in spec.opts" do
68
68
  it "takes the value set in spec.opts" do
69
69
  Rspec::Core.configuration.formatter.should be_an(Rspec::Core::Formatters::DocumentationFormatter)
70
70
  end
@@ -4,7 +4,7 @@ Feature: Nested example groups
4
4
  I want to use alternate names for describe
5
5
  So that I can better organize my examples
6
6
 
7
- Scenario Outline: Using context
7
+ Scenario: Using context
8
8
  Given a file named "context_instead_of_describe_spec.rb" with:
9
9
  """
10
10
  context "Using context" do
@@ -4,13 +4,10 @@ Feature: Nested example groups
4
4
  I want to nest examples groups
5
5
  So that I can better organize my examples
6
6
 
7
- Scenario Outline: Nested example groups
7
+ @wip
8
+ Scenario: Nested example groups
8
9
  Given a file named "nested_example_groups.rb" with:
9
10
  """
10
- require 'rspec/autorun'
11
- require 'rspec/expectations'
12
- Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
13
-
14
11
  describe "Some Object" do
15
12
  describe "with some more context" do
16
13
  it "should do this" do
@@ -24,7 +21,7 @@ Feature: Nested example groups
24
21
  end
25
22
  end
26
23
  """
27
- When I run "rspec nested_example_groups.rb -fn"
24
+ When I run "rspec nested_example_groups.rb -fdoc"
28
25
  Then the stdout should match /^Some Object/
29
26
  And the stdout should match /^\s+with some more context/
30
27
  And the stdout should match /^\s+with some other context/
@@ -1,4 +1,4 @@
1
- Feature: before and after blocks
1
+ Feature: around hook
2
2
 
3
3
  Scenario: define around(:each) block in example group
4
4
  Given a file named "around_each_in_example_group_spec.rb" with:
@@ -1,4 +1,4 @@
1
- Feature: before and after blocks
1
+ Feature: before and after hooks
2
2
 
3
3
  As a developer using RSpec
4
4
  I want to execute arbitrary code before and after each example
@@ -96,7 +96,7 @@ Feature: before and after blocks
96
96
  Scenario: define before and after blocks in configuration
97
97
  Given a file named "befores_in_configuration_spec.rb" with:
98
98
  """
99
- Rspec::Core.configure do |config|
99
+ Rspec.configure do |config|
100
100
  config.before(:suite) do
101
101
  $before_suite = "before suite"
102
102
  end
@@ -133,7 +133,7 @@ Feature: before and after blocks
133
133
  Scenario: before/after blocks are run in order
134
134
  Given a file named "ensure_block_order_spec.rb" with:
135
135
  """
136
- Rspec::Core.configure do |config|
136
+ Rspec.configure do |config|
137
137
  config.before(:suite) do
138
138
  puts "before suite"
139
139
  end
@@ -0,0 +1,27 @@
1
+ Feature: halt
2
+
3
+ In an example, before hook, after hook, or around hook, you can
4
+ halt the current example, group, or suite based on arbitrary
5
+ criteria.
6
+
7
+ @wip
8
+ Scenario: halt group on failure
9
+ Given a directory named "spec"
10
+ And a file named "spec/example_spec.rb" with:
11
+ """
12
+ Rspec.configure do |c|
13
+ c.after(:each) do
14
+ running_example.halt(:group, :status => 'failed')
15
+ end
16
+ end
17
+ describe "something" do
18
+ it "fails" do
19
+ fail
20
+ end
21
+
22
+ it "does not run this example" do
23
+ end
24
+ end
25
+ """
26
+ When I run "rspec spec/example_spec.rb"
27
+ Then the stdout should match "1 example, 1 failure"
@@ -6,7 +6,7 @@ Feature: mock with flexmock
6
6
  Scenario: Mock with flexmock
7
7
  Given a file named "flexmock_example_spec.rb" with:
8
8
  """
9
- Rspec::Core.configure do |config|
9
+ Rspec.configure do |config|
10
10
  config.mock_framework = :flexmock
11
11
  end
12
12
 
@@ -6,7 +6,7 @@ Feature: mock with mocha
6
6
  Scenario: Mock with mocha
7
7
  Given a file named "mocha_example_spec.rb" with:
8
8
  """
9
- Rspec::Core.configure do |config|
9
+ Rspec.configure do |config|
10
10
  config.mock_framework = :mocha
11
11
  end
12
12
 
@@ -6,7 +6,7 @@ Feature: mock with rr
6
6
  Scenario: Mock with rr
7
7
  Given a file named "rr_example_spec.rb" with:
8
8
  """
9
- Rspec::Core.configure do |config|
9
+ Rspec.configure do |config|
10
10
  config.mock_framework = :rr
11
11
  end
12
12
 
@@ -6,7 +6,7 @@ Feature: mock with rspec
6
6
  Scenario: Mock with rspec
7
7
  Given a file named "rspec_example_spec.rb" with:
8
8
  """
9
- Rspec::Core.configure do |config|
9
+ Rspec.configure do |config|
10
10
  config.mock_framework = :rspec
11
11
  end
12
12
 
@@ -22,7 +22,7 @@ Feature: block local expectations
22
22
  """
23
23
  require 'account'
24
24
 
25
- Rspec::Core.configure do |config|
25
+ Rspec.configure do |config|
26
26
  config.mock_framework = :rspec
27
27
  end
28
28
 
@@ -47,7 +47,7 @@ Feature: block local expectations
47
47
  """
48
48
  require 'account'
49
49
 
50
- Rspec::Core.configure do |config|
50
+ Rspec.configure do |config|
51
51
  config.mock_framework = :rspec
52
52
  end
53
53
 
@@ -8,7 +8,7 @@ Feature: Spec and test together
8
8
  """
9
9
  require 'rspec/expectations'
10
10
 
11
- Rspec::Core.configure do |config|
11
+ Rspec.configure do |config|
12
12
  config.mock_framework = :rspec
13
13
  end
14
14
 
@@ -1,6 +1,7 @@
1
1
  require 'rspec/core/load_path'
2
2
  require 'rspec/core/deprecation'
3
3
  require 'rspec/core/mocking/with_absolutely_nothing'
4
+ require 'rspec/core/around_proxy'
4
5
  require 'rspec/core/world'
5
6
  require 'rspec/core/configuration'
6
7
  require 'rspec/core/command_line_options'
@@ -27,6 +28,7 @@ module Rspec
27
28
  end
28
29
 
29
30
  def self.configure
31
+ Rspec.deprecate('Rspec::Core.configure', 'Rspec.configure', '2.0.0')
30
32
  yield configuration if block_given?
31
33
  end
32
34
 
@@ -35,4 +37,8 @@ module Rspec
35
37
  end
36
38
 
37
39
  end
40
+
41
+ def self.configure
42
+ yield Core.configuration if block_given?
43
+ end
38
44
  end
@@ -0,0 +1,14 @@
1
+ module Rspec
2
+ module Core
3
+ class AroundProxy
4
+ def initialize(example_group_instance, &example_block)
5
+ @example_group_instance, @example_block = example_group_instance, example_block
6
+ end
7
+
8
+ def run
9
+ @example_group_instance.instance_eval(&@example_block)
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -1,47 +1,46 @@
1
1
  module Rspec
2
- module Core
3
2
 
4
- class << self
5
- def deprecate(method, alternate_method=nil)
6
- message = <<-NOTICE
3
+ class << self
4
+ def deprecate(method, alternate_method=nil, version=nil)
5
+ version_string = version ? "rspec-#{version}" : "a future version of Rspec"
6
+
7
+ message = <<-NOTICE
7
8
 
8
9
  *****************************************************************
9
10
  DEPRECATION WARNING: you are using deprecated behaviour that will
10
- be removed from a future version of RSpec.
11
+ be removed from #{version_string}.
11
12
 
12
13
  #{caller(0)[2]}
13
14
 
14
15
  * #{method} is deprecated.
15
16
  NOTICE
16
- if alternate_method
17
- message << <<-ADDITIONAL
17
+ if alternate_method
18
+ message << <<-ADDITIONAL
18
19
  * please use #{alternate_method} instead.
19
20
  ADDITIONAL
20
- end
21
-
22
- message << "*****************************************************************"
23
- warn(message)
24
21
  end
25
22
 
26
- def warn(message)
27
- Kernel.warn(message)
28
- end
23
+ message << "*****************************************************************"
24
+ warn(message)
25
+ end
29
26
 
27
+ def warn(message)
28
+ Kernel.warn(message)
30
29
  end
31
30
 
32
- class HashWithDeprecationNotice < Hash
33
-
34
- def initialize(method, alternate_method=nil, &block)
35
- @method, @alternate_method = method, alternate_method
36
- end
37
-
38
- def []=(k,v)
39
- Rspec.deprecate(@method, @alternate_method)
40
- super
41
- end
42
-
31
+ end
32
+
33
+ class HashWithDeprecationNotice < Hash
34
+
35
+ def initialize(method, alternate_method=nil, &block)
36
+ @method, @alternate_method = method, alternate_method
37
+ end
38
+
39
+ def []=(k,v)
40
+ Rspec.deprecate(@method, @alternate_method)
41
+ super
43
42
  end
44
43
 
45
44
  end
46
45
 
47
- end
46
+ end
@@ -35,23 +35,23 @@ module Rspec
35
35
  record_results :started_at => Time.now
36
36
  end
37
37
 
38
- def run_passed
39
- run_finished 'passed'
38
+ def run_passed(reporter=nil)
39
+ run_finished reporter, 'passed'
40
40
  end
41
41
 
42
- def run_pending(message='Not yet implemented')
43
- run_finished 'pending', :pending_message => message
42
+ def run_pending(reporter=nil, message='Not yet implemented')
43
+ run_finished reporter, 'pending', :pending_message => message
44
44
  end
45
45
 
46
- def run_failed(exception)
47
- run_finished 'failed', :exception_encountered => exception
46
+ def run_failed(reporter, exception)
47
+ run_finished reporter, 'failed', :exception_encountered => exception
48
48
  end
49
49
 
50
- def run_finished(status, results={})
50
+ def run_finished(reporter, status, results={})
51
51
  record_results results.update(:status => status)
52
52
  finish_time = Time.now
53
53
  record_results :finished_at => finish_time, :run_time => (finish_time - execution_result[:started_at])
54
- Rspec::Core.configuration.formatter.example_finished(self)
54
+ reporter.example_finished(self)
55
55
  end
56
56
 
57
57
  def run_before_each
@@ -73,21 +73,11 @@ module Rspec
73
73
  end
74
74
  end
75
75
 
76
- class AroundProxy
77
- def initialize(example_group_instance, &example_block)
78
- @example_group_instance, @example_block = example_group_instance, example_block
79
- end
80
-
81
- def run
82
- @example_group_instance.instance_eval(&@example_block)
83
- end
84
- end
85
-
86
76
  def runnable?
87
77
  !metadata[:pending]
88
78
  end
89
79
 
90
- def run(example_group_instance)
80
+ def run(example_group_instance, reporter)
91
81
  @example_group_instance = example_group_instance
92
82
  @example_group_instance.running_example = self
93
83
 
@@ -120,9 +110,9 @@ module Rspec
120
110
  end
121
111
 
122
112
  if exception_encountered
123
- run_failed(exception_encountered)
113
+ run_failed(reporter, exception_encountered)
124
114
  else
125
- runnable? ? run_passed : run_pending
115
+ runnable? ? run_passed(reporter) : run_pending(reporter)
126
116
  end
127
117
 
128
118
  all_systems_nominal
@@ -8,7 +8,7 @@ module Rspec
8
8
  extend Advice
9
9
  include ExampleGroupSubject
10
10
 
11
- attr_accessor :running_example, :reporter
11
+ attr_accessor :running_example
12
12
 
13
13
  def self.inherited(klass)
14
14
  super
@@ -58,8 +58,12 @@ module Rspec
58
58
  @_examples_to_run ||= []
59
59
  end
60
60
 
61
+ def self.superclass_metadata
62
+ self.superclass.respond_to?(:metadata) ? self.superclass.metadata : nil
63
+ end
64
+
61
65
  def self.set_it_up(*args)
62
- @metadata = Rspec::Core::Metadata.process(self.superclass.metadata, *args)
66
+ @metadata = Rspec::Core::Metadata.process(superclass_metadata, *args)
63
67
 
64
68
  Rspec::Core.configuration.find_modules(self).each do |include_or_extend, mod, opts|
65
69
  if include_or_extend == :extend
@@ -97,15 +101,24 @@ module Rspec
97
101
  def self.describe(*args, &example_group_block)
98
102
  raise(ArgumentError, "No arguments given. You must a least supply a type or description") if args.empty?
99
103
  raise(ArgumentError, "You must supply a block when calling describe") if example_group_block.nil?
104
+ @_subclass_count ||= 0
105
+ @_subclass_count += 1
106
+ const_set(
107
+ "NestedLevel_#{@_subclass_count}",
108
+ _build(Class.new(self), caller, args, &example_group_block)
109
+ )
110
+ end
100
111
 
101
- # TODO: Pull out the below into a metadata object, that we can defer the subclassing if necessary
102
- # describe 'foo', :shared => true will need this to be completed first
103
- subclass('NestedLevel') do
104
- args << {} unless args.last.is_a?(Hash)
105
- args.last.update(:example_group_block => example_group_block, :caller => caller)
106
- set_it_up(*args)
107
- module_eval(&example_group_block)
108
- end
112
+ def self.create(*args, &example_group_block)
113
+ _build(dup, caller, args, &example_group_block)
114
+ end
115
+
116
+ def self._build(klass, given_caller, args, &example_group_block)
117
+ args << {} unless args.last.is_a?(Hash)
118
+ args.last.update(:example_group_block => example_group_block, :caller => given_caller)
119
+ klass.set_it_up(*args)
120
+ klass.module_eval(&example_group_block) if example_group_block
121
+ klass
109
122
  end
110
123
 
111
124
  class << self
@@ -137,7 +150,9 @@ module Rspec
137
150
  end
138
151
 
139
152
  def self.eval_before_alls(running_example)
140
- superclass.before_all_ivars.each { |ivar, val| running_example.instance_variable_set(ivar, val) }
153
+ if superclass.respond_to?(:before_all_ivars)
154
+ superclass.before_all_ivars.each { |ivar, val| running_example.instance_variable_set(ivar, val) }
155
+ end
141
156
  Rspec::Core.configuration.find_advice(:before, :all, self).each { |blk| running_example.instance_eval(&blk) }
142
157
 
143
158
  before_alls.each { |blk| running_example.instance_eval(&blk) }
@@ -173,23 +188,13 @@ module Rspec
173
188
  # Runs all examples, returning true only if all of them pass
174
189
  def self.run_examples(example_world, reporter)
175
190
  examples_to_run.map do |ex|
176
- result = ex.run(example_world)
191
+ result = ex.run(example_world, reporter)
177
192
  example_world.__reset__
178
193
  before_all_ivars.each { |k, v| example_world.instance_variable_set(k, v) }
179
194
  result
180
195
  end.all?
181
196
  end
182
197
 
183
- def self.subclass(base_name, &body) # :nodoc:
184
- @_subclass_count ||= 0
185
- @_subclass_count += 1
186
- klass = Class.new(self)
187
- class_name = "#{base_name}_#{@_subclass_count}"
188
- const_set(class_name, klass)
189
- klass.instance_eval(&body)
190
- klass
191
- end
192
-
193
198
  def self.to_s
194
199
  self == Rspec::Core::ExampleGroup ? 'Rspec::Core::ExampleGroup' : name
195
200
  end