rspec-core 2.99.2 → 3.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. checksums.yaml +14 -6
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +0 -0
  4. data/Changelog.md +103 -191
  5. data/License.txt +1 -0
  6. data/README.md +4 -25
  7. data/features/Upgrade.md +2 -14
  8. data/features/command_line/dry_run.feature +29 -0
  9. data/features/command_line/example_name_option.feature +1 -1
  10. data/features/command_line/fail_fast.feature +26 -0
  11. data/features/command_line/format_option.feature +3 -3
  12. data/features/command_line/line_number_option.feature +16 -11
  13. data/features/command_line/order.feature +2 -3
  14. data/features/command_line/pattern_option.feature +3 -3
  15. data/features/command_line/randomization.feature +63 -0
  16. data/features/command_line/require_option.feature +2 -2
  17. data/features/command_line/ruby.feature +1 -1
  18. data/features/configuration/alias_example_to.feature +13 -22
  19. data/features/configuration/{backtrace_clean_patterns.feature → backtrace_exclusion_patterns.feature} +17 -14
  20. data/features/configuration/custom_settings.feature +11 -11
  21. data/features/configuration/overriding_global_ordering.feature +93 -0
  22. data/features/configuration/profile.feature +13 -13
  23. data/features/configuration/read_options_from_file.feature +7 -7
  24. data/features/example_groups/basic_structure.feature +1 -1
  25. data/features/example_groups/shared_context.feature +8 -8
  26. data/features/example_groups/shared_examples.feature +6 -14
  27. data/features/expectation_framework_integration/configure_expectation_framework.feature +27 -122
  28. data/features/filtering/exclusion_filters.feature +2 -5
  29. data/features/filtering/inclusion_filters.feature +1 -5
  30. data/features/formatters/json_formatter.feature +2 -2
  31. data/features/formatters/text_formatter.feature +4 -4
  32. data/features/helper_methods/arbitrary_methods.feature +2 -2
  33. data/features/helper_methods/let.feature +5 -5
  34. data/features/helper_methods/modules.feature +5 -8
  35. data/features/hooks/around_hooks.feature +2 -2
  36. data/features/hooks/before_and_after_hooks.feature +14 -14
  37. data/features/hooks/filtering.feature +12 -14
  38. data/features/metadata/described_class.feature +1 -1
  39. data/features/metadata/user_defined.feature +16 -29
  40. data/features/mock_framework_integration/use_flexmock.feature +1 -1
  41. data/features/mock_framework_integration/use_mocha.feature +1 -1
  42. data/features/mock_framework_integration/use_rr.feature +1 -1
  43. data/features/mock_framework_integration/use_rspec.feature +5 -5
  44. data/features/pending/pending_examples.feature +5 -5
  45. data/features/spec_files/arbitrary_file_suffix.feature +1 -1
  46. data/features/step_definitions/additional_cli_steps.rb +3 -3
  47. data/features/subject/explicit_subject.feature +8 -8
  48. data/features/subject/implicit_receiver.feature +29 -0
  49. data/features/subject/implicit_subject.feature +4 -4
  50. data/features/support/env.rb +10 -3
  51. data/features/support/require_expect_syntax_in_aruba_specs.rb +16 -0
  52. data/lib/rspec/core.rb +11 -48
  53. data/lib/rspec/core/backport_random.rb +302 -0
  54. data/lib/rspec/core/backtrace_formatter.rb +65 -0
  55. data/lib/rspec/core/command_line.rb +7 -18
  56. data/lib/rspec/core/configuration.rb +202 -507
  57. data/lib/rspec/core/configuration_options.rb +17 -30
  58. data/lib/rspec/core/example.rb +29 -39
  59. data/lib/rspec/core/example_group.rb +166 -259
  60. data/lib/rspec/core/filter_manager.rb +30 -47
  61. data/lib/rspec/core/flat_map.rb +17 -0
  62. data/lib/rspec/core/formatters.rb +0 -138
  63. data/lib/rspec/core/formatters/base_formatter.rb +46 -1
  64. data/lib/rspec/core/formatters/base_text_formatter.rb +38 -61
  65. data/lib/rspec/core/formatters/deprecation_formatter.rb +21 -52
  66. data/lib/rspec/core/formatters/helpers.rb +0 -28
  67. data/lib/rspec/core/formatters/html_formatter.rb +1 -1
  68. data/lib/rspec/core/formatters/json_formatter.rb +38 -9
  69. data/lib/rspec/core/formatters/snippet_extractor.rb +14 -5
  70. data/lib/rspec/core/hooks.rb +55 -39
  71. data/lib/rspec/core/memoized_helpers.rb +17 -167
  72. data/lib/rspec/core/metadata.rb +16 -64
  73. data/lib/rspec/core/option_parser.rb +30 -39
  74. data/lib/rspec/core/ordering.rb +154 -0
  75. data/lib/rspec/core/pending.rb +12 -69
  76. data/lib/rspec/core/project_initializer.rb +12 -10
  77. data/lib/rspec/core/rake_task.rb +5 -108
  78. data/lib/rspec/core/reporter.rb +15 -18
  79. data/lib/rspec/core/runner.rb +16 -30
  80. data/lib/rspec/core/shared_context.rb +3 -5
  81. data/lib/rspec/core/shared_example_group.rb +3 -51
  82. data/lib/rspec/core/shared_example_group/collection.rb +1 -19
  83. data/lib/rspec/core/version.rb +1 -1
  84. data/lib/rspec/core/warnings.rb +22 -0
  85. data/lib/rspec/core/world.rb +12 -8
  86. data/spec/command_line/order_spec.rb +20 -23
  87. data/spec/rspec/core/backtrace_formatter_spec.rb +216 -0
  88. data/spec/rspec/core/command_line_spec.rb +32 -48
  89. data/spec/rspec/core/configuration_options_spec.rb +19 -50
  90. data/spec/rspec/core/configuration_spec.rb +142 -713
  91. data/spec/rspec/core/drb_command_line_spec.rb +2 -0
  92. data/spec/rspec/core/dsl_spec.rb +0 -1
  93. data/spec/rspec/core/example_group_spec.rb +192 -223
  94. data/spec/rspec/core/example_spec.rb +40 -16
  95. data/spec/rspec/core/filter_manager_spec.rb +2 -2
  96. data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -41
  97. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +5 -123
  98. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +2 -87
  99. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +2 -3
  100. data/spec/rspec/core/formatters/{text_mate_formatted.html → html_formatted-1.8.7-jruby.html} +44 -25
  101. data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +477 -0
  102. data/spec/rspec/core/formatters/{html_formatted.html → html_formatted-1.8.7.html} +42 -25
  103. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +425 -0
  104. data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +416 -0
  105. data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +477 -0
  106. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +419 -0
  107. data/spec/rspec/core/formatters/html_formatted-2.0.0.html +425 -0
  108. data/spec/rspec/core/formatters/html_formatter_spec.rb +21 -46
  109. data/spec/rspec/core/formatters/json_formatter_spec.rb +97 -8
  110. data/spec/rspec/core/hooks_filtering_spec.rb +5 -5
  111. data/spec/rspec/core/hooks_spec.rb +61 -47
  112. data/spec/rspec/core/memoized_helpers_spec.rb +20 -322
  113. data/spec/rspec/core/metadata_spec.rb +1 -24
  114. data/spec/rspec/core/option_parser_spec.rb +20 -62
  115. data/spec/rspec/core/ordering_spec.rb +102 -0
  116. data/spec/rspec/core/pending_example_spec.rb +0 -40
  117. data/spec/rspec/core/project_initializer_spec.rb +1 -25
  118. data/spec/rspec/core/rake_task_spec.rb +5 -72
  119. data/spec/rspec/core/random_spec.rb +47 -0
  120. data/spec/rspec/core/reporter_spec.rb +23 -48
  121. data/spec/rspec/core/runner_spec.rb +31 -39
  122. data/spec/rspec/core/shared_context_spec.rb +3 -15
  123. data/spec/rspec/core/shared_example_group/collection_spec.rb +4 -17
  124. data/spec/rspec/core/shared_example_group_spec.rb +12 -45
  125. data/spec/rspec/core/{deprecation_spec.rb → warnings_spec.rb} +3 -1
  126. data/spec/rspec/core_spec.rb +4 -21
  127. data/spec/spec_helper.rb +41 -5
  128. data/spec/support/helper_methods.rb +0 -29
  129. data/spec/support/sandboxed_mock_space.rb +0 -16
  130. data/spec/support/shared_example_groups.rb +7 -36
  131. data/spec/support/stderr_splitter.rb +36 -0
  132. metadata +163 -157
  133. metadata.gz.sig +1 -0
  134. data/exe/autospec +0 -13
  135. data/features/Autotest.md +0 -38
  136. data/features/configuration/treat_symbols_as_metadata_keys_with_true_values.feature +0 -52
  137. data/features/subject/attribute_of_subject.feature +0 -124
  138. data/features/subject/one_liner_syntax.feature +0 -71
  139. data/lib/autotest/discover.rb +0 -10
  140. data/lib/autotest/rspec2.rb +0 -77
  141. data/lib/rspec/core/backtrace_cleaner.rb +0 -46
  142. data/lib/rspec/core/backward_compatibility.rb +0 -55
  143. data/lib/rspec/core/caller_filter.rb +0 -60
  144. data/lib/rspec/core/deprecated_mutable_array_proxy.rb +0 -32
  145. data/lib/rspec/core/deprecation.rb +0 -26
  146. data/lib/rspec/core/extensions/instance_eval_with_args.rb +0 -44
  147. data/lib/rspec/core/extensions/kernel.rb +0 -9
  148. data/lib/rspec/core/extensions/module_eval_with_args.rb +0 -38
  149. data/lib/rspec/core/extensions/ordered.rb +0 -27
  150. data/lib/rspec/core/formatters/console_codes.rb +0 -42
  151. data/lib/rspec/core/formatters/text_mate_formatter.rb +0 -34
  152. data/lib/rspec/core/metadata_hash_builder.rb +0 -97
  153. data/lib/rspec/core/minitest_assertions_adapter.rb +0 -28
  154. data/lib/rspec/core/test_unit_assertions_adapter.rb +0 -30
  155. data/spec/autotest/discover_spec.rb +0 -49
  156. data/spec/autotest/failed_results_re_spec.rb +0 -45
  157. data/spec/autotest/rspec_spec.rb +0 -133
  158. data/spec/rspec/core/backtrace_cleaner_spec.rb +0 -68
  159. data/spec/rspec/core/caller_filter_spec.rb +0 -58
  160. data/spec/rspec/core/deprecations_spec.rb +0 -59
  161. data/spec/rspec/core/formatters/console_codes_spec.rb +0 -50
  162. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +0 -107
  163. data/spec/rspec/core/kernel_extensions_spec.rb +0 -9
  164. data/spec/rspec/core/pending_spec.rb +0 -27
  165. data/spec/support/silence_dsl_deprecations.rb +0 -32
@@ -6,46 +6,32 @@ require 'nokogiri'
6
6
  module RSpec
7
7
  module Core
8
8
  module Formatters
9
- describe HtmlFormatter do
9
+ describe HtmlFormatter, :if => RUBY_VERSION =~ /^(1.8.7|1.9.2|1.9.3|2.0.0)$/ do
10
+ let(:suffix) {
11
+ if ::RUBY_PLATFORM == 'java'
12
+ "-jruby"
13
+ elsif defined?(Rubinius)
14
+ "-rbx"
15
+ else
16
+ ""
17
+ end
18
+ }
10
19
 
11
20
  let(:root) { File.expand_path("#{File.dirname(__FILE__)}/../../../..") }
12
21
  let(:expected_file) do
13
- "#{File.dirname(__FILE__)}/html_formatted.html"
22
+ "#{File.dirname(__FILE__)}/html_formatted-#{::RUBY_VERSION}#{suffix}.html"
14
23
  end
15
24
 
16
25
  let(:generated_html) do
17
- options = RSpec::Core::ConfigurationOptions.new(
18
- %w[spec/rspec/core/resources/formatter_specs.rb --format html --order defined]
19
- )
20
- options.parse_options
26
+ options = %w[spec/rspec/core/resources/formatter_specs.rb --format html --order defined]
21
27
 
22
28
  err, out = StringIO.new, StringIO.new
23
29
  err.set_encoding("utf-8") if err.respond_to?(:set_encoding)
24
- out.set_encoding("utf-8") if out.respond_to?(:set_encoding)
25
-
26
- runner = RSpec::Core::Runner.new(options)
27
- configuration = runner.instance_variable_get(:@configuration)
28
-
29
- configuration.backtrace_formatter.inclusion_patterns = []
30
- configuration.output_stream = out
31
- configuration.deprecation_stream = err
32
-
33
- runner.run(err, out)
34
-
35
- html = out.string.gsub(/\d+\.\d+(s| seconds)/, "n.nnnn\\1")
36
30
 
37
- actual_doc = Nokogiri::HTML(html)
38
- actual_doc.css("div.backtrace pre").each do |elem|
39
- # This is to minimize churn on backtrace lines that we do not
40
- # assert on anyway.
41
- backtrace = elem.inner_html.lines.
42
- select {|e| e =~ /formatter_specs\.rb/ }.
43
- map {|x| x.chomp.split(":")[0..1].join(':') }.
44
- join("\n")
45
-
46
- elem.inner_html = backtrace
47
- end
48
- actual_doc.inner_html
31
+ command_line = RSpec::Core::CommandLine.new(options)
32
+ command_line.instance_variable_get("@configuration").backtrace_formatter.inclusion_patterns = []
33
+ command_line.run(err, out)
34
+ out.string.gsub(/\d+\.\d+(s| seconds)/, "n.nnnn\\1")
49
35
  end
50
36
 
51
37
  let(:expected_html) do
@@ -56,7 +42,7 @@ module RSpec
56
42
  end
57
43
 
58
44
  before do
59
- RSpec.configuration.stub(:load_spec_files) do
45
+ allow(RSpec.configuration).to receive(:load_spec_files) do
60
46
  RSpec.configuration.files_to_run.map {|f| load File.expand_path(f) }
61
47
  end
62
48
  end
@@ -78,18 +64,7 @@ module RSpec
78
64
  select {|e| e =~ /formatter_specs\.rb/}
79
65
  end
80
66
 
81
- describe 'produced HTML', :if => RUBY_VERSION <= '2.0.0' do
82
- # Rubies before 2 are a wild west of different outputs, and it's not
83
- # worth the effort to maintain accurate fixtures for all of them.
84
- # Since we are verifying fixtures on other rubies, if this code at
85
- # least runs we can be reasonably confident the output is right since
86
- # behaviour variances that we care about across versions is neglible.
87
- it 'is present' do
88
- expect(generated_html).to be
89
- end
90
- end
91
-
92
- describe 'produced HTML', :slow, :if => RUBY_VERSION >= '2.0.0' do
67
+ describe 'produced HTML' do
93
68
  def build_and_verify_formatter_output
94
69
  Dir.chdir(root) do
95
70
  actual_doc = Nokogiri::HTML(generated_html)
@@ -113,15 +88,15 @@ module RSpec
113
88
  end
114
89
  end
115
90
 
116
- it "is identical to the one we designed manually" do
91
+ it "produces HTML identical to the one we designed manually" do
117
92
  build_and_verify_formatter_output
118
93
  end
119
94
 
120
95
  context 'with mathn loaded' do
121
96
  include MathnIntegrationSupport
122
97
 
123
- it "is identical to the one we designed manually", :slow do
124
- with_mathn_loaded { build_and_verify_formatter_output }
98
+ it "produces HTML identical to the one we designed manually" do
99
+ with_mathn_loaded{ build_and_verify_formatter_output }
125
100
  end
126
101
  end
127
102
  end
@@ -14,7 +14,8 @@ require 'rspec/core/reporter'
14
14
  describe RSpec::Core::Formatters::JsonFormatter do
15
15
  let(:output) { StringIO.new }
16
16
  let(:formatter) { RSpec::Core::Formatters::JsonFormatter.new(output) }
17
- let(:reporter) { RSpec::Core::Reporter.new(formatter) }
17
+ let(:config) { RSpec::Core::Configuration.new }
18
+ let(:reporter) { RSpec::Core::Reporter.new(config, formatter) }
18
19
 
19
20
  it "outputs json (brittle high level functional test)" do
20
21
  group = RSpec::Core::ExampleGroup.describe("one apiece") do
@@ -97,19 +98,107 @@ describe RSpec::Core::Formatters::JsonFormatter do
97
98
 
98
99
  describe "#dump_summary" do
99
100
  it "adds summary info to the output hash" do
100
- duration, example_count, failure_count, pending_count = 1.0, 2, 1, 1
101
- formatter.dump_summary(duration, example_count, failure_count, pending_count)
101
+ values = { :duration => 1.0, :example_count => 2, :failure_count => 1, :pending_count => 1 }
102
+ formatter.dump_summary(values[:duration], values[:example_count], values[:failure_count], values[:pending_count])
102
103
  summary = formatter.output_hash[:summary]
103
- %w(duration example_count failure_count pending_count).each do |key|
104
- expect(summary[key.to_sym]).to eq eval(key)
104
+ values.each do |key,value|
105
+ expect(summary[key]).to eq value
105
106
  end
106
107
  summary_line = formatter.output_hash[:summary_line]
107
108
  expect(summary_line).to eq "2 examples, 1 failure, 1 pending"
108
109
  end
110
+ end
111
+
112
+ describe "#dump_profile_slowest_examples" do
113
+
114
+ before do
115
+ group = RSpec::Core::ExampleGroup.describe("group") do
116
+ # Use a sleep so there is some measurable time, to ensure
117
+ # the reported percent is 100%, not 0%.
118
+ example("example") { sleep 0.001 }
119
+ end
120
+ group.run(double('reporter').as_null_object)
121
+
122
+ formatter.stub(:examples) { group.examples }
123
+ RSpec.configuration.stub(:profile_examples) { 10 }
124
+ end
125
+
126
+ it "names the example" do
127
+ formatter.dump_profile_slowest_examples
128
+ expect(formatter.output_hash[:profile][:examples].first[:full_description]).to eq("group example")
129
+ end
130
+
131
+ it "provides example execution time" do
132
+ formatter.dump_profile_slowest_examples
133
+ expect(formatter.output_hash[:profile][:examples].first[:run_time]).not_to be_nil
134
+ end
135
+
136
+ it "has the summary of profile information" do
137
+ formatter.dump_profile_slowest_examples
138
+ expect(formatter.output_hash[:profile].keys).to match_array([:examples, :slowest, :total])
139
+ end
140
+ end
141
+
142
+ describe "#dump_profile_slowest_example_groups" do
143
+ let(:group) do
144
+ RSpec::Core::ExampleGroup.describe("slow group") do
145
+ # Use a sleep so there is some measurable time, to ensure
146
+ # the reported percent is 100%, not 0%.
147
+ example("example") { sleep 0.01 }
148
+ end
149
+ end
150
+ let(:rpt) { double('reporter').as_null_object }
151
+
152
+ before do
153
+ RSpec.configuration.stub(:profile_examples) { 10 }
154
+ group.run(rpt)
155
+ end
156
+
157
+ context "with one example group" do
158
+ before { formatter.stub(:examples) { group.examples } }
159
+
160
+ it "doesn't profile a single example group" do
161
+ formatter.dump_profile_slowest_example_groups
162
+ expect(formatter.output_hash[:profile][:groups]).to be_empty
163
+ end
164
+ end
165
+
166
+ context "with multiple example groups" do
167
+ before do
168
+ group2 = RSpec::Core::ExampleGroup.describe("fast group") do
169
+ example("example 1") { sleep 0.004 }
170
+ example("example 2") { sleep 0.007 }
171
+ end
172
+ group2.run(rpt)
173
+
174
+ formatter.stub(:examples) { group.examples + group2.examples }
175
+ end
176
+
177
+ it "provides the slowest example groups" do
178
+ formatter.dump_profile_slowest_example_groups
179
+ expect(formatter.output_hash).not_to be_empty
180
+ end
181
+
182
+ it "provides information" do
183
+ formatter.dump_profile_slowest_example_groups
184
+ expect(formatter.output_hash[:profile][:groups].first.keys).to match_array([:total_time, :count, :description, :average, :location])
185
+ end
186
+
187
+ it "ranks the example groups by average time" do
188
+ formatter.dump_profile_slowest_example_groups
189
+ expect(formatter.output_hash[:profile][:groups].first[:description]).to eq("slow group")
190
+ end
191
+ end
192
+
193
+ it "depends on parent_groups to get the top level example group" do
194
+ ex = ""
195
+ group.describe("group 2") do
196
+ describe "group 3" do
197
+ ex = example("nested example 1")
198
+ end
199
+ end
109
200
 
110
- it "ignores --profile" do
111
- allow(RSpec.configuration).to receive(:profile_examples).and_return(true)
112
- formatter.dump_summary(1.0, 2, 1, 1)
201
+ expect(ex.example_group.parent_groups.last).to eq(group)
113
202
  end
114
203
  end
115
204
  end
@@ -35,7 +35,7 @@ module RSpec::Core
35
35
  c.before(:match => true) { filters << "before each in config"}
36
36
  c.after(:match => true) { filters << "after each in config"}
37
37
  end
38
- group = ExampleGroup.describe("group", :match => true)
38
+ group = ExampleGroup.describe(:match => true)
39
39
  group.example("example") {}
40
40
  group.run
41
41
  expect(filters).to eq([
@@ -55,7 +55,7 @@ module RSpec::Core
55
55
  c.after(:each, :match => true) { filters << "after each in config"}
56
56
  c.after(:all, :match => true) { filters << "after all in config"}
57
57
  end
58
- group = ExampleGroup.describe("group", :match => true)
58
+ group = ExampleGroup.describe(:match => true)
59
59
  group.example("example") {}
60
60
  group.run
61
61
  expect(filters).to eq([
@@ -125,7 +125,7 @@ module RSpec::Core
125
125
  c.after(:each, :match => false) { filters << "after each in config"}
126
126
  c.after(:all, :match => false) { filters << "after all in config"}
127
127
  end
128
- group = ExampleGroup.describe("group", :match => true)
128
+ group = ExampleGroup.describe(:match => true)
129
129
  group.example("example") {}
130
130
  group.run
131
131
  expect(filters).to eq([])
@@ -196,7 +196,7 @@ module RSpec::Core
196
196
  c.after(:each, :one => 1, :two => 2, :three => 3) { filters << "after each in config"}
197
197
  c.after(:all, :one => 1, :three => 3) { filters << "after all in config"}
198
198
  end
199
- group = ExampleGroup.describe("group", :one => 1, :two => 2, :three => 3)
199
+ group = ExampleGroup.describe(:one => 1, :two => 2, :three => 3)
200
200
  group.example("example") {}
201
201
  group.run
202
202
  expect(filters).to eq([
@@ -217,7 +217,7 @@ module RSpec::Core
217
217
  c.after(:each, :one => 1, :two => 2, :three => 3, :four => 4) { filters << "after each in config"}
218
218
  c.after(:all, :one => 1, :three => 3, :four => 4) { filters << "after all in config"}
219
219
  end
220
- group = ExampleGroup.describe("group", :one => 1, :two => 2, :three => 3)
220
+ group = ExampleGroup.describe(:one => 1, :two => 2, :three => 3)
221
221
  group.example("example") {}
222
222
  group.run
223
223
  expect(filters).to eq([])
@@ -4,6 +4,10 @@ module RSpec::Core
4
4
  describe Hooks do
5
5
  class HooksHost
6
6
  include Hooks
7
+
8
+ def parent_groups
9
+ []
10
+ end
7
11
  end
8
12
 
9
13
  [:before, :after, :around].each do |type|
@@ -22,61 +26,51 @@ module RSpec::Core
22
26
  end
23
27
  end
24
28
 
25
- [true, false].each do |config_value|
26
- context "when RSpec.configuration.treat_symbols_as_metadata_keys_with_true_values is set to #{config_value}" do
27
- before(:each) do
28
- Kernel.stub(:warn)
29
- allow_deprecation unless config_value
30
- RSpec.configure { |c| c.treat_symbols_as_metadata_keys_with_true_values = config_value }
31
- end
32
-
33
- describe "##{type}(no scope)" do
34
- let(:instance) { HooksHost.new }
29
+ describe "##{type}(no scope)" do
30
+ let(:instance) { HooksHost.new }
35
31
 
36
- it "defaults to :each scope if no arguments are given" do
37
- hooks = instance.send(type) {}
38
- hook = hooks.first
39
- expect(instance.hooks[type][:each]).to include(hook)
40
- end
32
+ it "defaults to :each scope if no arguments are given" do
33
+ hooks = instance.send(type) {}
34
+ hook = hooks.first
35
+ expect(instance.hooks[type][:each]).to include(hook)
36
+ end
41
37
 
42
- it "defaults to :each scope if the only argument is a metadata hash" do
43
- hooks = instance.send(type, :foo => :bar) {}
44
- hook = hooks.first
45
- expect(instance.hooks[type][:each]).to include(hook)
46
- end
38
+ it "defaults to :each scope if the only argument is a metadata hash" do
39
+ hooks = instance.send(type, :foo => :bar) {}
40
+ hook = hooks.first
41
+ expect(instance.hooks[type][:each]).to include(hook)
42
+ end
47
43
 
48
- it "raises an error if only metadata symbols are given as arguments" do
49
- expect { instance.send(type, :foo, :bar) {} }.to raise_error(ArgumentError)
50
- end
51
- end
44
+ it "raises an error if only metadata symbols are given as arguments" do
45
+ expect { instance.send(type, :foo, :bar) {} }.to raise_error(ArgumentError)
52
46
  end
53
47
  end
54
48
  end
55
49
 
56
50
  [:before, :after].each do |type|
57
51
  [:each, :all, :suite].each do |scope|
58
- [true, false].each do |config_value|
59
- context "when RSpec.configuration.treat_symbols_as_metadata_keys_with_true_values is set to #{config_value}" do
60
- before(:each) do
61
- allow_deprecation unless config_value
62
- RSpec.configure { |c| c.treat_symbols_as_metadata_keys_with_true_values = config_value }
63
- end
52
+ describe "##{type}(#{scope.inspect})" do
53
+ let(:instance) { HooksHost.new }
54
+ let!(:hook) do
55
+ hooks = instance.send(type, scope) {}
56
+ hooks.first
57
+ end
64
58
 
65
- describe "##{type}(#{scope.inspect})" do
66
- let(:instance) { HooksHost.new }
67
- let!(:hook) do
68
- hooks = instance.send(type, scope) {}
69
- hooks.first
70
- end
59
+ it "does not make #{scope.inspect} a metadata key" do
60
+ expect(hook.options).to be_empty
61
+ end
71
62
 
72
- it "does not make #{scope.inspect} a metadata key" do
73
- expect(hook.options).to be_empty
74
- end
63
+ it "is scoped to #{scope.inspect}" do
64
+ expect(instance.hooks[type][scope]).to include(hook)
65
+ end
75
66
 
76
- it "is scoped to #{scope.inspect}" do
77
- expect(instance.hooks[type][scope]).to include(hook)
78
- end
79
- end
67
+ it 'does not run when in dry run mode' do
68
+ RSpec.configuration.dry_run = true
69
+
70
+ expect { |b|
71
+ instance.send(type, scope, &b)
72
+ instance.run_hook(type, scope)
73
+ }.not_to yield_control
80
74
  end
81
75
  end
82
76
  end
@@ -87,14 +81,14 @@ module RSpec::Core
87
81
  it "does not run the example" do
88
82
  examples = []
89
83
  group = ExampleGroup.describe do
90
- around do |example|
84
+ around do
91
85
  end
92
86
  it "foo" do
93
87
  examples << self
94
88
  end
95
89
  end
96
90
  group.run
97
- expect(examples).to have(0).example
91
+ expect(examples).to eq([])
98
92
  end
99
93
  end
100
94
 
@@ -110,7 +104,26 @@ module RSpec::Core
110
104
  end
111
105
  end
112
106
  group.run
113
- expect(examples).to have(1).example
107
+ expect(examples.count).to eq(1)
108
+ end
109
+
110
+ it "exposes example metadata to each around hook" do
111
+ foos = {}
112
+ group = ExampleGroup.describe do
113
+ around do |ex|
114
+ foos[:first] = ex.metadata[:foo]
115
+ ex.run
116
+ end
117
+ around do |ex|
118
+ foos[:second] = ex.metadata[:foo]
119
+ ex.run
120
+ end
121
+ it "does something", :foo => :bar do
122
+ end
123
+ end
124
+
125
+ group.run
126
+ expect(foos).to eq({:first => :bar, :second => :bar})
114
127
  end
115
128
  end
116
129
 
@@ -125,12 +138,13 @@ module RSpec::Core
125
138
  around do |example|
126
139
  yielder { example.run }
127
140
  end
141
+
128
142
  it "foo" do
129
143
  examples << self
130
144
  end
131
145
  end
132
146
  group.run
133
- expect(examples).to have(1).example
147
+ expect(examples.count).to eq(1)
134
148
  end
135
149
  end
136
150
  end
@@ -37,44 +37,6 @@ module RSpec::Core
37
37
  end
38
38
  end
39
39
 
40
- describe "with a symbol" do
41
- it "returns the string form and issues a deprecation warning" do
42
- the_subject = :unset
43
- deprecations = []
44
- allow(RSpec).to receive(:warn_deprecation) { |msg| deprecations << msg }
45
-
46
- line = __LINE__ + 1
47
- ExampleGroup.describe :symbol do
48
- example { the_subject = subject }
49
- end.run
50
-
51
- expect(the_subject).to eq("symbol")
52
- expect(deprecations.size).to eq(1)
53
- deprecation = deprecations.first
54
- expect(deprecation).to match(/describe <a Symbol>/)
55
- expect(deprecation).to include("#{__FILE__}:#{line}")
56
- end
57
- end
58
-
59
- describe "with a hash" do
60
- it "returns a blank string and issues a deprecation warning" do
61
- the_subject = :unset
62
- deprecations = []
63
- allow(RSpec).to receive(:warn_deprecation) { |msg| deprecations << msg }
64
-
65
- line = __LINE__ + 1
66
- ExampleGroup.describe :foo => 3 do
67
- example { the_subject = subject }
68
- end.run
69
-
70
- expect(the_subject).to eq("")
71
- expect(deprecations.size).to eq(1)
72
- deprecation = deprecations.first
73
- expect(deprecation).to match(/describe <a Hash>/)
74
- expect(deprecation).to include("#{__FILE__}:#{line}")
75
- end
76
- end
77
-
78
40
  it "can be overriden and super'd to from a nested group" do
79
41
  outer_subject_value = inner_subject_value = nil
80
42
 
@@ -106,18 +68,6 @@ module RSpec::Core
106
68
  expect(example_yielded_to_subject).to eq example_yielded_to_example
107
69
  end
108
70
 
109
- context "doesn't issue a deprecation when used with doubles" do
110
- subject do
111
- Struct.new(:value) do
112
- def working_with?(double)
113
- double.value >= value
114
- end
115
- end.new 1
116
- end
117
-
118
- it { should be_working_with double(:value => 10) }
119
- end
120
-
121
71
  [false, nil].each do |falsy_value|
122
72
  context "with a value of #{falsy_value.inspect}" do
123
73
  it "is evaluated once per example" do
@@ -183,64 +133,19 @@ module RSpec::Core
183
133
  expect(subject_value).to eq([4, 5, 6, :override])
184
134
  end
185
135
 
186
- context 'when referenced in a `before(:all)` hook' do
187
- before do
188
- expect(::RSpec).to respond_to(:warn_deprecation)
189
- ::RSpec.stub(:warn_deprecation)
190
- end
191
-
192
- def define_and_run_group
193
- values = { :reference_lines => [] }
136
+ [:before, :after].each do |hook|
137
+ it "raises an error when referenced from `#{hook}(:all)`" do
138
+ result = nil
139
+ line = nil
194
140
 
195
141
  ExampleGroup.describe do
196
- subject { [1, 2] }
197
- let(:list) { %w[ a b ] }
198
-
199
- before(:all) do
200
- subject << 3; values[:reference_lines] << __LINE__
201
- values[:final_subject_value_in_before_all] = subject; values[:reference_lines] << __LINE__
202
- end
203
-
204
- example do
205
- list << '1'
206
- values[:list_in_ex_1] = list
207
- values[:subject_value_in_example] = subject
208
- end
209
-
210
- example do
211
- list << '2'
212
- values[:list_in_ex_2] = list
213
- end
142
+ subject { nil }
143
+ send(hook, :all) { result = (subject rescue $!) }; line = __LINE__
144
+ example { }
214
145
  end.run
215
146
 
216
- values
217
- end
218
-
219
- it 'memoizes the value within the before(:all) hook' do
220
- values = define_and_run_group
221
- expect(values.fetch(:final_subject_value_in_before_all)).to eq([1, 2, 3])
222
- end
223
-
224
- it 'preserves the memoization into the individual examples' do
225
- values = define_and_run_group
226
- expect(values.fetch(:subject_value_in_example)).to eq([1, 2, 3])
227
- end
228
-
229
- it 'does not cause other lets to be shared across examples' do
230
- values = define_and_run_group
231
- expect(values.fetch(:list_in_ex_1)).to eq(%w[ a b 1 ])
232
- expect(values.fetch(:list_in_ex_2)).to eq(%w[ a b 2 ])
233
- end
234
-
235
- it 'prints a warning since `subject` declarations are not intended to be used in :all hooks' do
236
- msgs = []
237
- ::RSpec.stub(:warn_deprecation) { |msg| msgs << msg }
238
-
239
- values = define_and_run_group
240
-
241
- expect(msgs).to include(*values[:reference_lines].map { |line|
242
- match(/subject accessed.*#{__FILE__}:#{line}/m)
243
- })
147
+ expect(result).to be_an(Exception)
148
+ expect(result.message).to match(/subject accessed.*#{hook}\(:all\).*#{__FILE__}:#{line}/m)
244
149
  end
245
150
  end
246
151
  end
@@ -393,169 +298,7 @@ module RSpec::Core
393
298
  it { should_not be_not_ok }
394
299
  end
395
300
 
396
- expect(group.run).to be true
397
- end
398
-
399
- it 'supports a new expect-based syntax' do
400
- group = ExampleGroup.describe([1, 2, 3]) do
401
- it { is_expected.to be_an Array }
402
- it { is_expected.not_to include 4 }
403
- end
404
-
405
- expect(group.run).to be true
406
- end
407
- end
408
-
409
- describe "#its" do
410
- extend SilenceDSLDeprecations
411
- silence_dsl_deprecations do
412
- it "should issue deprecation warning" do
413
- expect_deprecation_with_call_site(__FILE__, __LINE__+1, '`its` method')
414
- RSpec::Core::ExampleGroup.its(nil) {}
415
- end
416
-
417
- subject do
418
- Class.new do
419
- def initialize
420
- @call_count = 0
421
- end
422
-
423
- def call_count
424
- @call_count += 1
425
- end
426
- end.new
427
- end
428
-
429
- context "with a call counter" do
430
- its(:call_count) { should eq(1) }
431
- end
432
-
433
- context "with nil value" do
434
- subject do
435
- Class.new do
436
- def nil_value
437
- nil
438
- end
439
- end.new
440
- end
441
- its(:nil_value) { should be_nil }
442
- end
443
-
444
- context "with nested attributes" do
445
- subject do
446
- Class.new do
447
- def name
448
- "John"
449
- end
450
- end.new
451
- end
452
- its("name") { should eq("John") }
453
- its("name.size") { should eq(4) }
454
- its("name.size.class") { should eq(Fixnum) }
455
- end
456
-
457
- context "when it responds to #[]" do
458
- subject do
459
- Class.new do
460
- def [](*objects)
461
- objects.map do |object|
462
- "#{object.class}: #{object.to_s}"
463
- end.join("; ")
464
- end
465
-
466
- def name
467
- "George"
468
- end
469
- end.new
470
- end
471
- its([:a]) { should eq("Symbol: a") }
472
- its(['a']) { should eq("String: a") }
473
- its([:b, 'c', 4]) { should eq("Symbol: b; String: c; Fixnum: 4") }
474
- its(:name) { should eq("George") }
475
- context "when referring to an attribute without the proper array syntax" do
476
- context "it raises an error" do
477
- its(:age) do
478
- expect do
479
- should eq(64)
480
- end.to raise_error(NoMethodError)
481
- end
482
- end
483
- end
484
- end
485
-
486
- context "when it does not respond to #[]" do
487
- subject { Object.new }
488
-
489
- context "it raises an error" do
490
- its([:a]) do
491
- expect do
492
- should eq("Symbol: a")
493
- end.to raise_error(NoMethodError)
494
- end
495
- end
496
- end
497
-
498
- context "calling and overriding super" do
499
- it "calls to the subject defined in the parent group" do
500
- group = ExampleGroup.describe(Array) do
501
- subject { [1, 'a'] }
502
-
503
- its(:last) { should eq("a") }
504
-
505
- describe '.first' do
506
- def subject; super().first; end
507
-
508
- its(:next) { should eq(2) }
509
- end
510
- end
511
-
512
- expect(group.run).to be_truthy
513
- end
514
- end
515
-
516
- context "with nil subject" do
517
- subject do
518
- Class.new do
519
- def initialize
520
- @counter = -1
521
- end
522
- def nil_if_first_time
523
- @counter += 1
524
- @counter == 0 ? nil : true
525
- end
526
- end.new
527
- end
528
- its(:nil_if_first_time) { should be(nil) }
529
- end
530
-
531
- context "with false subject" do
532
- subject do
533
- Class.new do
534
- def initialize
535
- @counter = -1
536
- end
537
- def false_if_first_time
538
- @counter += 1
539
- @counter > 0
540
- end
541
- end.new
542
- end
543
- its(:false_if_first_time) { should be(false) }
544
- end
545
-
546
- describe 'accessing `subject` in `before` and `let`' do
547
- subject { 'my subject' }
548
- before { @subject_in_before = subject }
549
- let(:subject_in_let) { subject }
550
- let!(:eager_loaded_subject_in_let) { subject }
551
-
552
- # These examples read weird, because we're actually
553
- # specifying the behaviour of `its` itself
554
- its(nil) { expect(subject).to eq('my subject') }
555
- its(nil) { expect(@subject_in_before).to eq('my subject') }
556
- its(nil) { expect(subject_in_let).to eq('my subject') }
557
- its(nil) { expect(eager_loaded_subject_in_let).to eq('my subject') }
558
- end
301
+ expect(group.run).to be_truthy
559
302
  end
560
303
  end
561
304
 
@@ -656,64 +399,19 @@ module RSpec::Core
656
399
  end
657
400
  end
658
401
 
659
- context 'when referenced in a `before(:all)` hook' do
660
- before do
661
- expect(::RSpec).to respond_to(:warn_deprecation)
662
- ::RSpec.stub(:warn_deprecation)
663
- end
664
-
665
- def define_and_run_group
666
- values = { :reference_lines => [] }
402
+ [:before, :after].each do |hook|
403
+ it "raises an error when referenced from `#{hook}(:all)`" do
404
+ result = nil
405
+ line = nil
667
406
 
668
407
  ExampleGroup.describe do
669
- let(:list) { [1, 2] }
670
- subject { %w[ a b ] }
671
-
672
- before(:all) do
673
- list << 3; values[:reference_lines] << __LINE__
674
- values[:final_list_value_in_before_all] = list; values[:reference_lines] << __LINE__
675
- end
676
-
677
- example do
678
- subject << "1"
679
- values[:subject_in_ex_1] = subject
680
- values[:list_value_in_example] = list
681
- end
682
-
683
- example do
684
- subject << "2"
685
- values[:subject_in_ex_2] = subject
686
- end
408
+ let(:foo) { nil }
409
+ send(hook, :all) { result = (foo rescue $!) }; line = __LINE__
410
+ example { }
687
411
  end.run
688
412
 
689
- values
690
- end
691
-
692
- it 'memoizes the value within the before(:all) hook' do
693
- values = define_and_run_group
694
- expect(values.fetch(:final_list_value_in_before_all)).to eq([1, 2, 3])
695
- end
696
-
697
- it 'preserves the memoized value into the examples' do
698
- values = define_and_run_group
699
- expect(values.fetch(:list_value_in_example)).to eq([1, 2, 3])
700
- end
701
-
702
- it 'does not cause the subject to be shared across examples' do
703
- values = define_and_run_group
704
- expect(values.fetch(:subject_in_ex_1)).to eq(%w[ a b 1 ])
705
- expect(values.fetch(:subject_in_ex_2)).to eq(%w[ a b 2 ])
706
- end
707
-
708
- it 'prints a warning since `let` declarations are not intended to be used in :all hooks' do
709
- msgs = []
710
- ::RSpec.stub(:warn_deprecation) { |msg| msgs << msg }
711
-
712
- values = define_and_run_group
713
-
714
- expect(msgs).to include(*values[:reference_lines].map { |line|
715
- match(/let declaration `list` accessed.*#{__FILE__}:#{line}/m)
716
- })
413
+ expect(result).to be_an(Exception)
414
+ expect(result.message).to match(/let declaration `foo` accessed.*#{hook}\(:all\).*#{__FILE__}:#{line}/m)
717
415
  end
718
416
  end
719
417
 
@@ -758,7 +456,7 @@ module RSpec::Core
758
456
  expect(subject_id_in_let).to eq(@subject_id_in_before)
759
457
  end
760
458
 
761
- it { is_expected.to eq(subject) }
459
+ it { should eq(subject) }
762
460
  end
763
461
 
764
462
  describe Object do